diff mbox series

clk: renesas: r8a77980-cpg-mssr: fix RPC-IF module clock's parent

Message ID ebc41558-2a0a-bf6d-05df-077e3c769344@cogentembedded.com (mailing list archive)
State Accepted
Delegated to: Geert Uytterhoeven
Headers show
Series clk: renesas: r8a77980-cpg-mssr: fix RPC-IF module clock's parent | expand

Commit Message

Sergei Shtylyov March 7, 2019, 7:53 p.m. UTC
Testing has shown that the RPC-IF module clock's parent is the RPCD2 clock,
not the RPC one -- the RPC-IF register reads stall otherwise...

Fixes: 94e3935b5756 ("clk: renesas: r8a77980: Add RPC clocks")
Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>

---
This patch is against the 'clk-renesas' branch of Geert Uytterhoeven's
'renesas-drivers.git' repo.

 drivers/clk/renesas/r8a77980-cpg-mssr.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Geert Uytterhoeven March 11, 2019, 9:30 a.m. UTC | #1
Hi Sergei,

Thanks for your patch!

On Thu, Mar 7, 2019 at 8:53 PM Sergei Shtylyov
<sergei.shtylyov@cogentembedded.com> wrote:
> Testing has shown that the RPC-IF module clock's parent is the RPCD2 clock,
> not the RPC one -- the RPC-IF register reads stall otherwise...

Perhaps... Or something else is wrong with how the RPC driver uses the
clock hierarchy.
According to the docs, RPC clocks RPC-PHY, and RPCD2 clocks RPC-LINK.
Currently nothing references RPCD2, so it is disabled automatically.
If you make RPC -> RPCD2 -> RPC-IF, enabling RPC-IF indeed enables
both RPC and RPCD2.

Perhaps the RPC device node does need a reference to RPCD2?

Is this also the case on R-Car V3M, where RPCD2 is not controlled by the
CPG, but by the DIVREG register in the RPC-IF module itself?

See also section 62.4.7 (Frequency change), which does not have a
subsection for V3H, but it may be impacted (changing RPCD2 causes
an additional read of RPCCKR, satisfying the read-after-write requirement
documented there).

> Fixes: 94e3935b5756 ("clk: renesas: r8a77980: Add RPC clocks")
> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>

> --- renesas-drivers.orig/drivers/clk/renesas/r8a77980-cpg-mssr.c
> +++ renesas-drivers/drivers/clk/renesas/r8a77980-cpg-mssr.c
> @@ -171,7 +171,7 @@ static const struct mssr_mod_clk r8a7798
>         DEF_MOD("gpio1",                 911,   R8A77980_CLK_CP),
>         DEF_MOD("gpio0",                 912,   R8A77980_CLK_CP),
>         DEF_MOD("can-fd",                914,   R8A77980_CLK_S3D2),
> -       DEF_MOD("rpc-if",                917,   R8A77980_CLK_RPC),
> +       DEF_MOD("rpc-if",                917,   R8A77980_CLK_RPCD2),
>         DEF_MOD("i2c4",                  927,   R8A77980_CLK_S0D6),
>         DEF_MOD("i2c3",                  928,   R8A77980_CLK_S0D6),
>         DEF_MOD("i2c2",                  929,   R8A77980_CLK_S3D2),

Gr{oetje,eeting}s,

                        Geert
Sergei Shtylyov March 11, 2019, 5:14 p.m. UTC | #2
On 03/11/2019 12:30 PM, Geert Uytterhoeven wrote:

>> Testing has shown that the RPC-IF module clock's parent is the RPCD2 clock,
>> not the RPC one -- the RPC-IF register reads stall otherwise...
> 
> Perhaps... Or something else is wrong with how the RPC driver uses the
> clock hierarchy.

   Yes, explicitly enabling RPCD2 did help as well.

> According to the docs, RPC clocks RPC-PHY, and RPCD2 clocks RPC-LINK.

   I've also read the manual. Note it's not that reading a PHY register
hangs the kernel but reading CMNCR...

> Currently nothing references RPCD2, so it is disabled automatically.

  Only on V3H.

> If you make RPC -> RPCD2 -> RPC-IF, enabling RPC-IF indeed enables
> both RPC and RPCD2.

   Sure, it does. :-)

> Perhaps the RPC device node does need a reference to RPCD2?

   Looks like that wouldn't hurt either...

> Is this also the case on R-Car V3M, where RPCD2 is not controlled by the
> CPG, but by the DIVREG register in the RPC-IF module itself?

   No hangs were seen on V3M, despite the RPCD2 clock remained disabled.
The RPC clocks on both V3H and V3M suffer from a lack of clear documentation...

> See also section 62.4.7 (Frequency change), which does not have a
> subsection for V3H, but it may be impacted (changing RPCD2 causes
> an additional read of RPCCKR, satisfying the read-after-write requirement
> documented there).

   Hmm, haven't seen this item before; it looks like we can't use the standard
divider component. BTW, this section in the 1.50 manual tells to use the soft
reset on V3MOK. OK, I'll investigate this...

>> Fixes: 94e3935b5756 ("clk: renesas: r8a77980: Add RPC clocks")
>> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
[...]

MBR, Sergei
Sergei Shtylyov March 11, 2019, 7:10 p.m. UTC | #3
On 03/11/2019 08:14 PM, Sergei Shtylyov wrote:

[...]

>    No hangs were seen on V3M, despite the RPCD2 clock remained disabled.
> The RPC clocks on both V3H and V3M suffer from a lack of clear documentation...
> 
>> See also section 62.4.7 (Frequency change), which does not have a
>> subsection for V3H, but it may be impacted (changing RPCD2 causes
>> an additional read of RPCCKR, satisfying the read-after-write requirement
>> documented there).
> 
>    Hmm, haven't seen this item before; it looks like we can't use the standard
> divider component. BTW, this section in the 1.50 manual tells to use the soft
> reset on V3MOK. OK, I'll investigate this...

   Now I have: the frequency change didn't seem to  happen, and without RPCD2 enabled
the CMNCR read still hangs, even when I added readl() call into clk_writel(). So I
think my patch was correct.

>>> Fixes:  94e3935b5756 ("clk: renesas: r8a77980: Add RPC clocks")
>>> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
> [...]

MBR, Sergei
diff mbox series

Patch

Index: renesas-drivers/drivers/clk/renesas/r8a77980-cpg-mssr.c
===================================================================
--- renesas-drivers.orig/drivers/clk/renesas/r8a77980-cpg-mssr.c
+++ renesas-drivers/drivers/clk/renesas/r8a77980-cpg-mssr.c
@@ -171,7 +171,7 @@  static const struct mssr_mod_clk r8a7798
 	DEF_MOD("gpio1",		 911,	R8A77980_CLK_CP),
 	DEF_MOD("gpio0",		 912,	R8A77980_CLK_CP),
 	DEF_MOD("can-fd",		 914,	R8A77980_CLK_S3D2),
-	DEF_MOD("rpc-if",		 917,	R8A77980_CLK_RPC),
+	DEF_MOD("rpc-if",		 917,	R8A77980_CLK_RPCD2),
 	DEF_MOD("i2c4",			 927,	R8A77980_CLK_S0D6),
 	DEF_MOD("i2c3",			 928,	R8A77980_CLK_S0D6),
 	DEF_MOD("i2c2",			 929,	R8A77980_CLK_S3D2),