From: Ben Dooks <ben.dooks@codethink.co.uk>
To: linux-sh@vger.kernel.org
Subject: Re: Maybe this is CCF bug
Date: Fri, 21 Feb 2014 13:42:10 +0000 [thread overview]
Message-ID: <530757B2.6050207@codethink.co.uk> (raw)
In-Reply-To: <87zjlkq1v1.wl%kuninori.morimoto.gx@gmail.com>
On 21/02/14 13:30, Laurent Pinchart wrote:
> Hi Morimoto-san,
>
> (CC'ing Mike and Ben)
>
> On Friday 21 February 2014 11:20:06 Geert Uytterhoeven wrote:
>> On Fri, Feb 21, 2014 at 9:58 AM, Kuninori Morimoto wrote:
>>> Now, I'm working for sound DT support,
>>> and I noticed common clock setting's strange behavior.
>>> I guess this is bug, but 50% my misunderstanding.
>>>
>>> Now, we have clock index on
>>> ${LINUX}/include/dt-bindings/clock/r8a7790-clock.h For example, r8a7790's
>>> MSTP9 case, like this
>>>
>>> /* MSTP9 */
>>> #define R8A7790_CLK_GPIO5 7
>>> #define R8A7790_CLK_GPIO4 8
>>> #define R8A7790_CLK_GPIO3 9
>>> #define R8A7790_CLK_GPIO2 10
>>> #define R8A7790_CLK_GPIO1 11
>>> #define R8A7790_CLK_GPIO0 12
>>> #define R8A7790_CLK_RCAN1 15
>>> #define R8A7790_CLK_RCAN0 16
>>> #define R8A7790_CLK_QSPI_MOD 17
>>> #define R8A7790_CLK_IICDVFS 26
>>> #define R8A7790_CLK_I2C3 28
>>> #define R8A7790_CLK_I2C2 29
>>> #define R8A7790_CLK_I2C1 30
>>> #define R8A7790_CLK_I2C0 31
>>>
>>> and MSTP9 is like this
>>>
>>> mstp9_clks: mstp9_clks@e6150994 {
>>> compatible = "renesas,r8a7790-mstp-clocks",
>>> "renesas,cpg-mstp-clocks";
>>> reg = <0 0xe6150994 0 4>, <0 0xe61509a4 0 4>;
>>> clocks = <&p_clk>, <&p_clk>, <&cpg_clocks
>>> R8A7790_CLK_QSPI>,
>>> <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>;
>>>
>>> #clock-cells = <1>;
>>> renesas,clock-indices = <
>>> R8A7790_CLK_RCAN1 R8A7790_CLK_RCAN0
>>> R8A7790_CLK_QSPI_MOD
>>> R8A7790_CLK_I2C3 R8A7790_CLK_I2C2 R8A7790_CLK_I2C1
>>> R8A7790_CLK_I2C0
>>> >;
>>>
>>> clock-output-names >>> "rcan1", "rcan0", "qspi_mod", "i2c3", "i2c2",
>>> "i2c1", "i2c0";
>>> };
>>>
>>> And, now, spi parent is MSTP9 QSPI MOD
>>>
>>> spi: spi@e6b10000 {
>>> ...
>>> clocks = <&mstp9_clks R8A7790_CLK_QSPI_MOD>;
>>> ...
>>> };
>>>
>>> This SPI would like to use MSTP9's 17th (= R8A7790_CLK_QSPI_MOD) clock as
>>> its parent. But, mstp9_clks has 7 clocks only.
>>> R8A7790_CLK_xxx means "bit shift", not "index" on DT clock.
>>
>> Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt says:
>>
>> The MSTP groups are sparsely populated. Unimplemented
>> gate clocks must not be declared.
>>
>>> On ${LINUX}/drivers/clk/shmobile/clk-mstp.c,
>>> it try to get parent name by
>>>
>>> parent_name = of_clk_get_parent_name(np, i);
>>>
>>> and it returns "mstp9_clks" in this case.
>>> Maybe SPI would like to get "qspi_mod" ?
>
> I wouldn't call that a bug in CCF, but it's definitely a non-intuitive
> behaviour. CCF lets OF clock providers implement their own method to translate
> clock specifiers into clocks (see the second and third arguments passed to
> of_clk_add_provider). In practice the vast majority (if not all) of the
> drivers implementing support for multiple clocks use an index as their first
> clock cell. That index can be a direct index into the list of clocks provided
> by the CCF device, but doesn't have to be. In the case of the clk-mstp driver
> the first clock cell represents the clock hardware index, which is different
> than the index into the software list of clocks as clocks are sparsely
> populated.
>
> The of_clk_get_parent_name() function behaves differently. It first looks up
> the parent clock node in DT and parses the clock specifier cells, and then
> uses the first cell as a direct index into the clock-names property of the
> parent clock node. This bypasses the parent clock driver clock lookup
> mechanism, and thus leads to confusion as the meaning of the clock specifier
> in DT will depend on whether you're referencing a clock from an end-user
> driver (which will in that case use clk_get() and go through the clock
> provider driver for clock lookup), or from another clock provider (which will
> in that case call of_clk_get_parent_name() and use direct index lookup). This
> has bitten me several weeks ago when I tried to add SSI clocks to DT. With the
> MSTP indices defined as
>
> /* MSTP10 */
> #define R8A7790_CLK_SSI 5
> #define R8A7790_CLK_SSI9 6
> #define R8A7790_CLK_SSI8 7
> #define R8A7790_CLK_SSI7 8
> #define R8A7790_CLK_SSI6 9
> #define R8A7790_CLK_SSI5 10
> #define R8A7790_CLK_SSI4 11
> #define R8A7790_CLK_SSI3 12
> #define R8A7790_CLK_SSI2 13
> #define R8A7790_CLK_SSI1 14
> #define R8A7790_CLK_SSI0 15
>
> my naive approach was
>
> mstp10_clks: mstp10_clks@e6150998 {
> compatible = "renesas,r8a7790-mstp-clocks", "renesas,cpg-mstp-clocks";
> reg = <0 0xe6150998 0 4>, <0 0xe61509a8 0 4>;
> clocks = <&p_clk>, <&mstp10_clks R8A7790_CLK_SSI>,
> <&mstp10_clks R8A7790_CLK_SSI>,
> <&mstp10_clks R8A7790_CLK_SSI>,
> <&mstp10_clks R8A7790_CLK_SSI>,
> <&mstp10_clks R8A7790_CLK_SSI>,
> <&mstp10_clks R8A7790_CLK_SSI>,
> <&mstp10_clks R8A7790_CLK_SSI>,
> <&mstp10_clks R8A7790_CLK_SSI>,
> <&mstp10_clks R8A7790_CLK_SSI>,
> <&mstp10_clks R8A7790_CLK_SSI>;
> #clock-cells = <1>;
> renesas,clock-indices = <
> R8A7790_CLK_SSI R8A7790_CLK_SSI9 R8A7790_CLK_SSI8
> R8A7790_CLK_SSI7 R8A7790_CLK_SSI6 R8A7790_CLK_SSI5
> R8A7790_CLK_SSI4 R8A7790_CLK_SSI3 R8A7790_CLK_SSI2
> R8A7790_CLK_SSI1 R8A7790_CLK_SSI0
> >;
> clock-output-names > "ssi", "ssi9", "ssi8", "ssi7", "ssi6", "ssi5",
> "ssi4", "ssi3", "ssi2", "ssi1", "ssi0";
> }
>
> However, this resulted in all SSI clocks but the master one referencing "ssi5"
> as their parent instead of "ssi".
>
> The simple fix was to change the parent clocks to
>
> clocks = <&p_clk>, <&mstp10_clks 0>, <&mstp10_clks 0>,
> <&mstp10_clks 0>, <&mstp10_clks 0>, <&mstp10_clks 0>,
> <&mstp10_clks 0>, <&mstp10_clks 0>, <&mstp10_clks 0>,
> <&mstp10_clks 0>, <&mstp10_clks 0>;
>
> I understand this difference in behaviour is necessary, as the parent clock
> device might not have been probed yet when a child clock driver looks up the
> parent clock name. We thus can't rely on the parent clock driver to perform
> the clock specifier to clock translation.
In this case the problem is worse as even if we could defer clock
lookups until the driver had been probed, we have a case where this
is self-referential.
> Another approach to fix the problem was proposed by Ben Dooks in his "[PATCH
> 1/3] clk: add clock-indices support" patch series was to standardize the
> reneses,clock-indices property into a clock-indices property, usable by
> of_clk_get_parent_name() without requiring the parent clock driver to have
> probed the device yet. That's more complex but would have the added benefit of
> making the clock specifier translation consistent, at least in this case. I'm
> not sure whether we'll always be able to achieve consistency as some exotic
> clock providers might require a really weird translation mechanism.
I think there is a couple of issues here, the first is that
of_clk_get_parent_name() exists at-all. It would be nicer just
to be able to pass a set of 'struct clk *' to the clock registration
code. Although this may also still have an issue where we cannot
use self-referential clocks (I added a hack to allow the mstp driver
to use sub-nodes for each mstp clock group to get around that as
a first implementation)
I have not seen any comments on my clock-indices patch yet, I wonder
if anyone has had a chance to review it.
--
Ben Dooks http://www.codethink.co.uk/
Senior Engineer Codethink - Providing Genius
next prev parent reply other threads:[~2014-02-21 13:42 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-21 8:58 Maybe this is CCF bug Kuninori Morimoto
2014-02-21 10:20 ` Geert Uytterhoeven
2014-02-21 13:30 ` Laurent Pinchart
2014-02-21 13:42 ` Ben Dooks [this message]
2014-02-21 13:45 ` Ben Dooks
2014-02-21 14:04 ` Laurent Pinchart
2014-02-24 0:35 ` Mike Turquette
2014-02-24 0:50 ` Kuninori Morimoto
2014-02-25 17:59 ` Laurent Pinchart
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=530757B2.6050207@codethink.co.uk \
--to=ben.dooks@codethink.co.uk \
--cc=linux-sh@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox