Message ID | 1456737661-20538-2-git-send-email-ramesh.shanmugasundaram@bp.renesas.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Geert Uytterhoeven |
Headers | show |
On 02/29/2016 10:21 AM, Ramesh Shanmugasundaram wrote: > Added r8a7795 SoC support. > > For smoother bit timing calculation, the rounded clock frequency is used. Why this? From my point of view this introduces a clock error. Marc
Hi Ramesh, On Mon, Feb 29, 2016 at 10:21 AM, Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com> wrote: > --- a/drivers/net/can/rcar_can.c > +++ b/drivers/net/can/rcar_can.c > @@ -808,6 +808,10 @@ static int rcar_can_probe(struct platform_device *pdev) > priv->regs = addr; > priv->clock_select = clock_select; > priv->can.clock.freq = clk_get_rate(priv->can_clk); > + > + /* Use the rounded clock value (nearest kHz) */ > + priv->can.clock.freq = 1000 * DIV_ROUND_UP(priv->can.clock.freq, 1000); The comment and the implementation don't match. To get the nearest kHz, you have to useDIV_ROUND_CLOSEST(). Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
Hi Marc, > On 02/29/2016 10:21 AM, Ramesh Shanmugasundaram wrote: > > Added r8a7795 SoC support. > > > > For smoother bit timing calculation, the rounded clock frequency is > used. > > Why this? From my point of view this introduces a clock error. Thanks for the comments. Without the rounded clock, can_calc_bittiming returns different BRP values and reports high sampling error percentage. However, the rounded clock shows no such issues and it works fine for all bitrates. Below is an e.g. from my board for an input clock differs by 2Hz. root@salvator-x:~# can-calc-bit-timing -c 39999998 rcar_can Bit timing parameters for rcar_can with 39.999998 MHz ref clock nominal real Bitrt nom real SampP Bitrate TQ[ns] PrS PhS1 PhS2 SJW BRP Bitrate Error SampP SampP Error CiBCR 1000000 125 2 3 2 1 5 999999 0.0% 75.0% 75.0% 0.0% 0x40040100 800000 125 3 4 2 1 5 799999 0.0% 80.0% 80.0% 0.0% 0x60040100 500000 250 2 3 2 1 10 499999 0.0% 87.5% 75.0% 14.3% 0x40090100 250000 500 2 3 2 1 20 249999 0.0% 87.5% 75.0% 14.3% 0x40130100 125000 1000 2 3 2 1 40 124999 0.0% 87.5% 75.0% 14.3% 0x40270100 100000 1250 2 3 2 1 50 99999 0.0% 87.5% 75.0% 14.3% 0x40310100 50000 2500 2 3 2 1 100 49999 0.0% 87.5% 75.0% 14.3% 0x40630100 20000 6250 2 3 2 1 250 19999 0.0% 87.5% 75.0% 14.3% 0x40f90100 10000 12500 2 3 2 1 500 9999 0.0% 87.5% 75.0% 14.3% 0x41f30100 root@salvator-x:~# can-calc-bit-timing -c 40000000 rcar_can Bit timing parameters for rcar_can with 40.000000 MHz ref clock nominal real Bitrt nom real SampP Bitrate TQ[ns] PrS PhS1 PhS2 SJW BRP Bitrate Error SampP SampP Error CiBCR 1000000 50 7 7 5 1 2 1000000 0.0% 75.0% 75.0% 0.0% 0xd0010400 800000 125 3 4 2 1 5 800000 0.0% 80.0% 80.0% 0.0% 0x60040100 500000 125 6 7 2 1 5 500000 0.0% 87.5% 87.5% 0.0% 0xc0040100 250000 250 6 7 2 1 10 250000 0.0% 87.5% 87.5% 0.0% 0xc0090100 125000 500 6 7 2 1 20 125000 0.0% 87.5% 87.5% 0.0% 0xc0130100 100000 625 6 7 2 1 25 100000 0.0% 87.5% 87.5% 0.0% 0xc0180100 50000 1250 6 7 2 1 50 50000 0.0% 87.5% 87.5% 0.0% 0xc0310100 20000 3125 6 7 2 1 125 20000 0.0% 87.5% 87.5% 0.0% 0xc07c0100 10000 6250 6 7 2 1 250 10000 0.0% 87.5% 87.5% 0.0% 0xc0f90100 Thanks, Ramesh
On 02/29/2016 10:56 AM, Ramesh Shanmugasundaram wrote: >> On 02/29/2016 10:21 AM, Ramesh Shanmugasundaram wrote: >>> Added r8a7795 SoC support. >>> >>> For smoother bit timing calculation, the rounded clock frequency is >> used. >> >> Why this? From my point of view this introduces a clock error. > > Thanks for the comments. > > Without the rounded clock, can_calc_bittiming returns different BRP > values and reports high sampling error percentage. However, the > rounded clock shows no such issues and it works fine for all > bitrates. > > Below is an e.g. from my board for an input clock differs by 2Hz. I think it's better to fix the algorithm. I'll look into it. Marc
On 02/29/2016 10:56 AM, Ramesh Shanmugasundaram wrote:
> root@salvator-x:~# can-calc-bit-timing -c 39999998 rcar_can
Can you send me the patches to support the rcar_can. On the linux-can ML
or github pull request.
Thanks,
Marc
Hi Geert, > On Mon, Feb 29, 2016 at 10:21 AM, Ramesh Shanmugasundaram > <ramesh.shanmugasundaram@bp.renesas.com> wrote: > > --- a/drivers/net/can/rcar_can.c > > +++ b/drivers/net/can/rcar_can.c > > @@ -808,6 +808,10 @@ static int rcar_can_probe(struct platform_device > *pdev) > > priv->regs = addr; > > priv->clock_select = clock_select; > > priv->can.clock.freq = clk_get_rate(priv->can_clk); > > + > > + /* Use the rounded clock value (nearest kHz) */ > > + priv->can.clock.freq = 1000 * > > + DIV_ROUND_UP(priv->can.clock.freq, 1000); > > The comment and the implementation don't match. > To get the nearest kHz, you have to useDIV_ROUND_CLOSEST(). Thanks Geert. Yes, DIV_ROUND_CLOSEST() would be apt as you pointed out. I'll be removing this hack when I rebase, as Marc is fixing the algorithm. Thanks, Ramesh
On 02/29/2016 11:00 AM, Marc Kleine-Budde wrote: > I think it's better to fix the algorithm. I'll look into it. What about: > ./can-calc-bit-timing -c 39999998 rcar_can > Bit timing parameters for rcar_can with 39.999998 MHz ref clock > nominal real Bitrt nom real SampP > Bitrate TQ[ns] PrS PhS1 PhS2 SJW BRP Bitrate Error SampP SampP Error CiBCR > 1000000 125 2 3 2 1 5 999999 0.0% 75.0% 75.0% 0.0% 0x40040100 > 800000 125 3 4 2 1 5 799999 0.0% 80.0% 80.0% 0.0% 0x60040100 > 500000 125 6 7 2 1 5 499999 0.0% 87.5% 87.5% 0.0% 0xc0040100 > 250000 250 6 7 2 1 10 249999 0.0% 87.5% 87.5% 0.0% 0xc0090100 > 125000 500 6 7 2 1 20 124999 0.0% 87.5% 87.5% 0.0% 0xc0130100 > 100000 625 6 7 2 1 25 99999 0.0% 87.5% 87.5% 0.0% 0xc0180100 > 50000 1250 6 7 2 1 50 49999 0.0% 87.5% 87.5% 0.0% 0xc0310100 > 20000 3125 6 7 2 1 125 19999 0.0% 87.5% 87.5% 0.0% 0xc07c0100 > 10000 6250 6 7 2 1 250 9999 0.0% 87.5% 87.5% 0.0% 0xc0f90100 But I've to port the algorithm from can-calc-bit-timing to the kernel. Marc
Hi Marc, > On 02/29/2016 11:00 AM, Marc Kleine-Budde wrote: > > I think it's better to fix the algorithm. I'll look into it. > > What about: > > > ./can-calc-bit-timing -c 39999998 rcar_can > > Bit timing parameters for rcar_can with 39.999998 MHz ref clock > > nominal real Bitrt nom real SampP > > Bitrate TQ[ns] PrS PhS1 PhS2 SJW BRP Bitrate Error SampP SampP Error > CiBCR > > 1000000 125 2 3 2 1 5 999999 0.0% 75.0% 75.0% 0.0% > 0x40040100 > > 800000 125 3 4 2 1 5 799999 0.0% 80.0% 80.0% 0.0% > 0x60040100 > > 500000 125 6 7 2 1 5 499999 0.0% 87.5% 87.5% 0.0% > 0xc0040100 > > 250000 250 6 7 2 1 10 249999 0.0% 87.5% 87.5% 0.0% > 0xc0090100 > > 125000 500 6 7 2 1 20 124999 0.0% 87.5% 87.5% 0.0% > 0xc0130100 > > 100000 625 6 7 2 1 25 99999 0.0% 87.5% 87.5% 0.0% > 0xc0180100 > > 50000 1250 6 7 2 1 50 49999 0.0% 87.5% 87.5% 0.0% > 0xc0310100 > > 20000 3125 6 7 2 1 125 19999 0.0% 87.5% 87.5% 0.0% > 0xc07c0100 > > 10000 6250 6 7 2 1 250 9999 0.0% 87.5% 87.5% 0.0% > 0xc0f90100 > I think, it should be correct. Can I have the patch please(can-utils or kernel)? I'll give it a go. Manual e.g. shows, for 1Mbps and 40MHz clock, two settings are possible 10Tq -> BRP 4 20Tq -> BRP 2 Condition is TSEG1 > TSEG2 >= SJW & bitrate = clock freq/(brp * number of Tq) Your e.g. satisfies the condition and hopefully it should be OK. Thanks, Ramesh
diff --git a/Documentation/devicetree/bindings/net/can/rcar_can.txt b/Documentation/devicetree/bindings/net/can/rcar_can.txt index 002d844..7f1305f 100644 --- a/Documentation/devicetree/bindings/net/can/rcar_can.txt +++ b/Documentation/devicetree/bindings/net/can/rcar_can.txt @@ -6,6 +6,9 @@ Required properties: "renesas,can-r8a7779" if CAN controller is a part of R8A7779 SoC. "renesas,can-r8a7790" if CAN controller is a part of R8A7790 SoC. "renesas,can-r8a7791" if CAN controller is a part of R8A7791 SoC. + "renesas,can-r8a7795" if CAN controller is a part of R8A7795 SoC. + "renesas,rcar-gen3-can" for a generic R-Car Gen3 compatible device. + - reg: physical base address and size of the R-Car CAN register map. - interrupts: interrupt specifier for the sole interrupt. - clocks: phandles and clock specifiers for 3 CAN clock inputs. @@ -13,6 +16,15 @@ Required properties: - pinctrl-0: pin control group to be used for this controller. - pinctrl-names: must be "default". +Required properties for "renesas,can-r8a7795" compatible: +In R8A7795 SoC, "clkp2" can be CANFD clock. This is a div6 clock and can be +used by both CAN and CAN FD controller at the same time. It needs to be scaled +to maximum frequency if any of these controllers use it. This is done using +the below properties. + +- assigned-clocks: phandle of clkp2(CANFD) clock. +- assigned-clock-rates: maximum frequency of this clock. + Optional properties: - renesas,can-clock-select: R-Car CAN Clock Source Select. Valid values are: <0x0> (default) : Peripheral clock (clkp1) diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig index 164ccde..0d40aef 100644 --- a/drivers/net/can/Kconfig +++ b/drivers/net/can/Kconfig @@ -106,7 +106,7 @@ config CAN_JANZ_ICAN3 config CAN_RCAR tristate "Renesas R-Car CAN controller" - depends on ARM + depends on ARCH_RENESAS || ARM ---help--- Say Y here if you want to use CAN controller found on Renesas R-Car SoCs. diff --git a/drivers/net/can/rcar_can.c b/drivers/net/can/rcar_can.c index bc46be3..55e34de 100644 --- a/drivers/net/can/rcar_can.c +++ b/drivers/net/can/rcar_can.c @@ -808,6 +808,10 @@ static int rcar_can_probe(struct platform_device *pdev) priv->regs = addr; priv->clock_select = clock_select; priv->can.clock.freq = clk_get_rate(priv->can_clk); + + /* Use the rounded clock value (nearest kHz) */ + priv->can.clock.freq = 1000 * DIV_ROUND_UP(priv->can.clock.freq, 1000); + priv->can.bittiming_const = &rcar_can_bittiming_const; priv->can.do_set_mode = rcar_can_do_set_mode; priv->can.do_get_berr_counter = rcar_can_get_berr_counter; @@ -904,7 +908,8 @@ static const struct of_device_id rcar_can_of_table[] __maybe_unused = { { .compatible = "renesas,can-r8a7779" }, { .compatible = "renesas,can-r8a7790" }, { .compatible = "renesas,can-r8a7791" }, - { } + { .compatible = "renesas,rcar-gen3-can" }, + { }, }; MODULE_DEVICE_TABLE(of, rcar_can_of_table);
Added r8a7795 SoC support. For smoother bit timing calculation, the rounded clock frequency is used. Signed-off-by: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com> --- Documentation/devicetree/bindings/net/can/rcar_can.txt | 12 ++++++++++++ drivers/net/can/Kconfig | 2 +- drivers/net/can/rcar_can.c | 7 ++++++- 3 files changed, 19 insertions(+), 2 deletions(-)