diff mbox series

[v2,3/3] ARM: dts: lpc32xx: Update spi clock properties

Message ID 20220311093800.18778-4-singh.kuldeep87k@gmail.com (mailing list archive)
State Accepted
Commit dc89633b8a1c57662f44298e680799fac8053410
Headers show
Series PL022 DT fixes for seattle, lg and lpc platform | expand

Commit Message

Kuldeep Singh March 11, 2022, 9:38 a.m. UTC
PL022 binding require two clocks to be defined but lpc platform doesn't
comply with bindings and define only one clock i.e apb_pclk.

Update spi clocks and clocks-names property by adding appropriate clock
reference to make it compliant with bindings.

CC: Vladimir Zapolskiy <vz@mleia.com>
Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
---
v2:
- New patch with similar changeset
- Send to soc ML

 arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Vladimir Zapolskiy March 11, 2022, 1:20 p.m. UTC | #1
On 3/11/22 11:38 AM, Kuldeep Singh wrote:
> PL022 binding require two clocks to be defined but lpc platform doesn't
> comply with bindings and define only one clock i.e apb_pclk.
> 
> Update spi clocks and clocks-names property by adding appropriate clock
> reference to make it compliant with bindings.
> 
> CC: Vladimir Zapolskiy <vz@mleia.com>
> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
> ---
> v2:
> - New patch with similar changeset
> - Send to soc ML
> 
>   arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>   1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi
> index c87066d6c995..30958e02d5e2 100644
> --- a/arch/arm/boot/dts/lpc32xx.dtsi
> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>   				compatible = "arm,pl022", "arm,primecell";
>   				reg = <0x20084000 0x1000>;
>   				interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
> -				clocks = <&clk LPC32XX_CLK_SSP0>;
> -				clock-names = "apb_pclk";
> +				clocks = <&clk LPC32XX_CLK_SSP0>, <&clk LPC32XX_CLK_SSP0>;
> +				clock-names = "sspclk", "apb_pclk";

In fact I'm uncertain if it is the right change, could it happen that the commit
cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema") sets a wrong
schema pattern?

Apparently just one clock is wanted on all observed platforms and cases, this
is implicitly confirmed by clock handling in the drivers/spi/spi-pl022.c :

	pl022->clk = devm_clk_get(&adev->dev, NULL);

So, I would vote to fix the device tree bindings schema.

>   				#address-cells = <1>;
>   				#size-cells = <0>;
>   				status = "disabled";
> @@ -202,8 +202,8 @@ ssp1: spi@2008c000 {
>   				compatible = "arm,pl022", "arm,primecell";
>   				reg = <0x2008c000 0x1000>;
>   				interrupts = <21 IRQ_TYPE_LEVEL_HIGH>;
> -				clocks = <&clk LPC32XX_CLK_SSP1>;
> -				clock-names = "apb_pclk";
> +				clocks = <&clk LPC32XX_CLK_SSP1>, <&clk LPC32XX_CLK_SSP1>;
> +				clock-names = "sspclk", "apb_pclk";
>   				#address-cells = <1>;
>   				#size-cells = <0>;
>   				status = "disabled";
> 

--
Best wishes,
Vladimir
Arnd Bergmann March 11, 2022, 1:38 p.m. UTC | #2
On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com> wrote:
>
> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
> > PL022 binding require two clocks to be defined but lpc platform doesn't
> > comply with bindings and define only one clock i.e apb_pclk.
> >
> > Update spi clocks and clocks-names property by adding appropriate clock
> > reference to make it compliant with bindings.
> >
> > CC: Vladimir Zapolskiy <vz@mleia.com>
> > Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
> > ---
> > v2:
> > - New patch with similar changeset
> > - Send to soc ML
> >
> >   arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
> >   1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi
> > index c87066d6c995..30958e02d5e2 100644
> > --- a/arch/arm/boot/dts/lpc32xx.dtsi
> > +++ b/arch/arm/boot/dts/lpc32xx.dtsi
> > @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
> >                               compatible = "arm,pl022", "arm,primecell";
> >                               reg = <0x20084000 0x1000>;
> >                               interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
> > -                             clocks = <&clk LPC32XX_CLK_SSP0>;
> > -                             clock-names = "apb_pclk";
> > +                             clocks = <&clk LPC32XX_CLK_SSP0>, <&clk LPC32XX_CLK_SSP0>;
> > +                             clock-names = "sspclk", "apb_pclk";
>
> In fact I'm uncertain if it is the right change, could it happen that the commit
> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema") sets a wrong
> schema pattern?

Good pointm this doesn't quite seem right: it is unlikely that the same clock
is used for both the SPI bus and the APB bus.

> Apparently just one clock is wanted on all observed platforms and cases, this
> is implicitly confirmed by clock handling in the drivers/spi/spi-pl022.c :
>
>         pl022->clk = devm_clk_get(&adev->dev, NULL);
>
> So, I would vote to fix the device tree bindings schema.

Isn't this just using the wrong name? The name of the macro
LPC32XX_CLK_SSP0 might indicate that this is indeed the SPI clock
rather than the APB clock, so we only need to change clock-names
property here and leave it unchanged otherwise.

Looking at the driver, I also see that this refers to the clock as
"SSP/SPI bus clock", and it reads the rate from that.

In case of the LG platform, my impression is that the clocks listed
in DT don't reflect the system at all, they all refer to the same
fixed clock node at 198000000HZ, which is also used as for the
UART and timer nodes. Changing the name on that one doesn't
really make it correct, but should not hurt either.

        Arnd
Vladimir Zapolskiy March 11, 2022, 2:07 p.m. UTC | #3
On 3/11/22 3:38 PM, Arnd Bergmann wrote:
> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com> wrote:
>>
>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>>> PL022 binding require two clocks to be defined but lpc platform doesn't
>>> comply with bindings and define only one clock i.e apb_pclk.
>>>
>>> Update spi clocks and clocks-names property by adding appropriate clock
>>> reference to make it compliant with bindings.
>>>
>>> CC: Vladimir Zapolskiy <vz@mleia.com>
>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
>>> ---
>>> v2:
>>> - New patch with similar changeset
>>> - Send to soc ML
>>>
>>>    arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>>>    1 file changed, 4 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi
>>> index c87066d6c995..30958e02d5e2 100644
>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>>>                                compatible = "arm,pl022", "arm,primecell";
>>>                                reg = <0x20084000 0x1000>;
>>>                                interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>>> -                             clock-names = "apb_pclk";
>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>, <&clk LPC32XX_CLK_SSP0>;
>>> +                             clock-names = "sspclk", "apb_pclk";
>>
>> In fact I'm uncertain if it is the right change, could it happen that the commit
>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema") sets a wrong
>> schema pattern?
> 
> Good pointm this doesn't quite seem right: it is unlikely that the same clock
> is used for both the SPI bus and the APB bus.
> 
>> Apparently just one clock is wanted on all observed platforms and cases, this
>> is implicitly confirmed by clock handling in the drivers/spi/spi-pl022.c :
>>
>>          pl022->clk = devm_clk_get(&adev->dev, NULL);
>>
>> So, I would vote to fix the device tree bindings schema.
> 
> Isn't this just using the wrong name? The name of the macro
> LPC32XX_CLK_SSP0 might indicate that this is indeed the SPI clock
> rather than the APB clock, so we only need to change clock-names
> property here and leave it unchanged otherwise.

Yes, the name is wrong, here I'm ready to take the blame:

Fixes: 93898eb775e5 ("arm: dts: lpc32xx: add clock properties to device nodes")

Noteworthy the commit above presets the same clock name to other PrimeCell
controllers, namely pl110 (LCD), pl080 (DMA), pl175 (EMC) and pl18x (SD),
plus this one pl022 (SSP), and all but SSP and SD are AHB slaves in fact.

On LPC32xx the bus clock source and function clock source for SSP is HCLK.

My guess is that the misnamed "apb_pclk" migrated into the schema from
the lpc32xx.dtsi, so I'd suggest, unless some platform really needs it,
firstly fix the schema by removing "apb_pclk" clock. It will leave just one
clock, so "clock-names" property can be set as optional, and the drop
the property from the lpc32xx.dtsi.

> Looking at the driver, I also see that this refers to the clock as
> "SSP/SPI bus clock", and it reads the rate from that.

Yes, that's correct, it's a SPI bus clock with an option to set a rate.

> In case of the LG platform, my impression is that the clocks listed
> in DT don't reflect the system at all, they all refer to the same
> fixed clock node at 198000000HZ, which is also used as for the
> UART and timer nodes. Changing the name on that one doesn't
> really make it correct, but should not hurt either.
> 
>          Arnd
> 

--
Best wishes,
Vladimir
Krzysztof Kozlowski March 11, 2022, 2:33 p.m. UTC | #4
On 11/03/2022 15:07, Vladimir Zapolskiy wrote:
> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com> wrote:
>>>
>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>>>> PL022 binding require two clocks to be defined but lpc platform doesn't
>>>> comply with bindings and define only one clock i.e apb_pclk.
>>>>
>>>> Update spi clocks and clocks-names property by adding appropriate clock
>>>> reference to make it compliant with bindings.
>>>>
>>>> CC: Vladimir Zapolskiy <vz@mleia.com>
>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
>>>> ---
>>>> v2:
>>>> - New patch with similar changeset
>>>> - Send to soc ML
>>>>
>>>>    arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>>>>    1 file changed, 4 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi
>>>> index c87066d6c995..30958e02d5e2 100644
>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>>>>                                compatible = "arm,pl022", "arm,primecell";
>>>>                                reg = <0x20084000 0x1000>;
>>>>                                interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>>>> -                             clock-names = "apb_pclk";
>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>, <&clk LPC32XX_CLK_SSP0>;
>>>> +                             clock-names = "sspclk", "apb_pclk";
>>>
>>> In fact I'm uncertain if it is the right change, could it happen that the commit
>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema") sets a wrong
>>> schema pattern?
>>
>> Good pointm this doesn't quite seem right: it is unlikely that the same clock
>> is used for both the SPI bus and the APB bus.
>>
>>> Apparently just one clock is wanted on all observed platforms and cases, this
>>> is implicitly confirmed by clock handling in the drivers/spi/spi-pl022.c :
>>>
>>>          pl022->clk = devm_clk_get(&adev->dev, NULL);
>>>
>>> So, I would vote to fix the device tree bindings schema.

Drivers do not describe the hardware. Bindings should not be modeled on
drivers, but on actual hardware, so the example is not convincing.

>>
>> Isn't this just using the wrong name? The name of the macro
>> LPC32XX_CLK_SSP0 might indicate that this is indeed the SPI clock
>> rather than the APB clock, so we only need to change clock-names
>> property here and leave it unchanged otherwise.
> 
> Yes, the name is wrong, here I'm ready to take the blame:
> 
> Fixes: 93898eb775e5 ("arm: dts: lpc32xx: add clock properties to device nodes")
> 
> Noteworthy the commit above presets the same clock name to other PrimeCell
> controllers, namely pl110 (LCD), pl080 (DMA), pl175 (EMC) and pl18x (SD),
> plus this one pl022 (SSP), and all but SSP and SD are AHB slaves in fact.
> 
> On LPC32xx the bus clock source and function clock source for SSP is HCLK.
> 
> My guess is that the misnamed "apb_pclk" migrated into the schema from
> the lpc32xx.dtsi, so I'd suggest, unless some platform really needs it,
> firstly fix the schema by removing "apb_pclk" clock. It will leave just one
> clock, so "clock-names" property can be set as optional, and the drop
> the property from the lpc32xx.dtsi.
> 
>> Looking at the driver, I also see that this refers to the clock as
>> "SSP/SPI bus clock", and it reads the rate from that.
> 
> Yes, that's correct, it's a SPI bus clock with an option to set a rate.

It seems versioning of this patchset lacks proper references to previous
discussions:
https://lore.kernel.org/linux-devicetree/Yip2MZdQNjMz%2FCos@robh.at.kernel.org/


Best regards,
Krzysztof
Vladimir Zapolskiy March 11, 2022, 9:26 p.m. UTC | #5
On 3/11/22 4:33 PM, Krzysztof Kozlowski wrote:
> On 11/03/2022 15:07, Vladimir Zapolskiy wrote:
>> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
>>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com> wrote:
>>>>
>>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>>>>> PL022 binding require two clocks to be defined but lpc platform doesn't
>>>>> comply with bindings and define only one clock i.e apb_pclk.
>>>>>
>>>>> Update spi clocks and clocks-names property by adding appropriate clock
>>>>> reference to make it compliant with bindings.
>>>>>
>>>>> CC: Vladimir Zapolskiy <vz@mleia.com>
>>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
>>>>> ---
>>>>> v2:
>>>>> - New patch with similar changeset
>>>>> - Send to soc ML
>>>>>
>>>>>     arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>>>>>     1 file changed, 4 insertions(+), 4 deletions(-)
>>>>>
>>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>> index c87066d6c995..30958e02d5e2 100644
>>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>>>>>                                 compatible = "arm,pl022", "arm,primecell";
>>>>>                                 reg = <0x20084000 0x1000>;
>>>>>                                 interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
>>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>>>>> -                             clock-names = "apb_pclk";
>>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>, <&clk LPC32XX_CLK_SSP0>;
>>>>> +                             clock-names = "sspclk", "apb_pclk";
>>>>
>>>> In fact I'm uncertain if it is the right change, could it happen that the commit
>>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema") sets a wrong
>>>> schema pattern?
>>>
>>> Good pointm this doesn't quite seem right: it is unlikely that the same clock
>>> is used for both the SPI bus and the APB bus.
>>>
>>>> Apparently just one clock is wanted on all observed platforms and cases, this
>>>> is implicitly confirmed by clock handling in the drivers/spi/spi-pl022.c :
>>>>
>>>>           pl022->clk = devm_clk_get(&adev->dev, NULL);
>>>>
>>>> So, I would vote to fix the device tree bindings schema.
> 
> Drivers do not describe the hardware. Bindings should not be modeled on
> drivers, but on actual hardware, so the example is not convincing.

My concern is that fixing the bindings can break the driver and all its users,
is it clear enough how it can happen in assumption that the driver uses just
one clock at the moment?

--
Best wishes,
Vladimir
Krzysztof Kozlowski March 12, 2022, 10:23 a.m. UTC | #6
On 11/03/2022 22:26, Vladimir Zapolskiy wrote:
> On 3/11/22 4:33 PM, Krzysztof Kozlowski wrote:
>> On 11/03/2022 15:07, Vladimir Zapolskiy wrote:
>>> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
>>>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com> wrote:
>>>>>
>>>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>>>>>> PL022 binding require two clocks to be defined but lpc platform doesn't
>>>>>> comply with bindings and define only one clock i.e apb_pclk.
>>>>>>
>>>>>> Update spi clocks and clocks-names property by adding appropriate clock
>>>>>> reference to make it compliant with bindings.
>>>>>>
>>>>>> CC: Vladimir Zapolskiy <vz@mleia.com>
>>>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
>>>>>> ---
>>>>>> v2:
>>>>>> - New patch with similar changeset
>>>>>> - Send to soc ML
>>>>>>
>>>>>>     arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>>>>>>     1 file changed, 4 insertions(+), 4 deletions(-)
>>>>>>
>>>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>> index c87066d6c995..30958e02d5e2 100644
>>>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>>>>>>                                 compatible = "arm,pl022", "arm,primecell";
>>>>>>                                 reg = <0x20084000 0x1000>;
>>>>>>                                 interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
>>>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>>>>>> -                             clock-names = "apb_pclk";
>>>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>, <&clk LPC32XX_CLK_SSP0>;
>>>>>> +                             clock-names = "sspclk", "apb_pclk";
>>>>>
>>>>> In fact I'm uncertain if it is the right change, could it happen that the commit
>>>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema") sets a wrong
>>>>> schema pattern?
>>>>
>>>> Good pointm this doesn't quite seem right: it is unlikely that the same clock
>>>> is used for both the SPI bus and the APB bus.
>>>>
>>>>> Apparently just one clock is wanted on all observed platforms and cases, this
>>>>> is implicitly confirmed by clock handling in the drivers/spi/spi-pl022.c :
>>>>>
>>>>>           pl022->clk = devm_clk_get(&adev->dev, NULL);
>>>>>
>>>>> So, I would vote to fix the device tree bindings schema.
>>
>> Drivers do not describe the hardware. Bindings should not be modeled on
>> drivers, but on actual hardware, so the example is not convincing.
> 
> My concern is that fixing the bindings can break the driver and all its users,
> is it clear enough how it can happen in assumption that the driver uses just
> one clock at the moment?

You meant fixing the DTS? We do not consider here "fixing bindings"
because they look correct. About DTS, using the same clock twice should
not cause negative effect.


Best regards,
Krzysztof
Vladimir Zapolskiy March 12, 2022, 12:26 p.m. UTC | #7
On 3/12/22 12:23 PM, Krzysztof Kozlowski wrote:
> On 11/03/2022 22:26, Vladimir Zapolskiy wrote:
>> On 3/11/22 4:33 PM, Krzysztof Kozlowski wrote:
>>> On 11/03/2022 15:07, Vladimir Zapolskiy wrote:
>>>> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
>>>>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com> wrote:
>>>>>>
>>>>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>>>>>>> PL022 binding require two clocks to be defined but lpc platform doesn't
>>>>>>> comply with bindings and define only one clock i.e apb_pclk.
>>>>>>>
>>>>>>> Update spi clocks and clocks-names property by adding appropriate clock
>>>>>>> reference to make it compliant with bindings.
>>>>>>>
>>>>>>> CC: Vladimir Zapolskiy <vz@mleia.com>
>>>>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
>>>>>>> ---
>>>>>>> v2:
>>>>>>> - New patch with similar changeset
>>>>>>> - Send to soc ML
>>>>>>>
>>>>>>>      arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>>>>>>>      1 file changed, 4 insertions(+), 4 deletions(-)
>>>>>>>
>>>>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>>> index c87066d6c995..30958e02d5e2 100644
>>>>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>>>>>>>                                  compatible = "arm,pl022", "arm,primecell";
>>>>>>>                                  reg = <0x20084000 0x1000>;
>>>>>>>                                  interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
>>>>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>>>>>>> -                             clock-names = "apb_pclk";
>>>>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>, <&clk LPC32XX_CLK_SSP0>;
>>>>>>> +                             clock-names = "sspclk", "apb_pclk";
>>>>>>
>>>>>> In fact I'm uncertain if it is the right change, could it happen that the commit
>>>>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema") sets a wrong
>>>>>> schema pattern?
>>>>>
>>>>> Good pointm this doesn't quite seem right: it is unlikely that the same clock
>>>>> is used for both the SPI bus and the APB bus.
>>>>>
>>>>>> Apparently just one clock is wanted on all observed platforms and cases, this
>>>>>> is implicitly confirmed by clock handling in the drivers/spi/spi-pl022.c :
>>>>>>
>>>>>>            pl022->clk = devm_clk_get(&adev->dev, NULL);
>>>>>>
>>>>>> So, I would vote to fix the device tree bindings schema.
>>>
>>> Drivers do not describe the hardware. Bindings should not be modeled on
>>> drivers, but on actual hardware, so the example is not convincing.
>>
>> My concern is that fixing the bindings can break the driver and all its users,
>> is it clear enough how it can happen in assumption that the driver uses just
>> one clock at the moment?
> 
> You meant fixing the DTS? We do not consider here "fixing bindings"

Yes, I meant fixing the DTS, sorry for confusion.

> because they look correct. About DTS, using the same clock twice should
> not cause negative effect.

But it is erroneous to specify the SSP clock as APB clock, so this v2 is
incorrect, and I've mentioned above in the discussion that the APB clock
shall be HCLK on the platform.

To avoid any unpleasant uncertainties I expect to get a change in the
driver firstly, the driver shall work according to the bindings, at
the moment it is obviously broken.

--
Best wishes,
Vladimir
Robin Murphy March 14, 2022, 11:43 a.m. UTC | #8
On 2022-03-11 14:07, Vladimir Zapolskiy wrote:
> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com> wrote:
>>>
>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>>>> PL022 binding require two clocks to be defined but lpc platform doesn't
>>>> comply with bindings and define only one clock i.e apb_pclk.
>>>>
>>>> Update spi clocks and clocks-names property by adding appropriate clock
>>>> reference to make it compliant with bindings.
>>>>
>>>> CC: Vladimir Zapolskiy <vz@mleia.com>
>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
>>>> ---
>>>> v2:
>>>> - New patch with similar changeset
>>>> - Send to soc ML
>>>>
>>>>    arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>>>>    1 file changed, 4 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi 
>>>> b/arch/arm/boot/dts/lpc32xx.dtsi
>>>> index c87066d6c995..30958e02d5e2 100644
>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>>>>                                compatible = "arm,pl022", 
>>>> "arm,primecell";
>>>>                                reg = <0x20084000 0x1000>;
>>>>                                interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>>>> -                             clock-names = "apb_pclk";
>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>, 
>>>> <&clk LPC32XX_CLK_SSP0>;
>>>> +                             clock-names = "sspclk", "apb_pclk";
>>>
>>> In fact I'm uncertain if it is the right change, could it happen that 
>>> the commit
>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema") 
>>> sets a wrong
>>> schema pattern?
>>
>> Good pointm this doesn't quite seem right: it is unlikely that the 
>> same clock
>> is used for both the SPI bus and the APB bus.
>>
>>> Apparently just one clock is wanted on all observed platforms and 
>>> cases, this
>>> is implicitly confirmed by clock handling in the 
>>> drivers/spi/spi-pl022.c :
>>>
>>>          pl022->clk = devm_clk_get(&adev->dev, NULL);
>>>
>>> So, I would vote to fix the device tree bindings schema.
>>
>> Isn't this just using the wrong name? The name of the macro
>> LPC32XX_CLK_SSP0 might indicate that this is indeed the SPI clock
>> rather than the APB clock, so we only need to change clock-names
>> property here and leave it unchanged otherwise.
> 
> Yes, the name is wrong, here I'm ready to take the blame:
> 
> Fixes: 93898eb775e5 ("arm: dts: lpc32xx: add clock properties to device 
> nodes")
> 
> Noteworthy the commit above presets the same clock name to other PrimeCell
> controllers, namely pl110 (LCD), pl080 (DMA), pl175 (EMC) and pl18x (SD),
> plus this one pl022 (SSP), and all but SSP and SD are AHB slaves in fact.
> 
> On LPC32xx the bus clock source and function clock source for SSP is HCLK.
> 
> My guess is that the misnamed "apb_pclk" migrated into the schema from
> the lpc32xx.dtsi, so I'd suggest, unless some platform really needs it,
> firstly fix the schema by removing "apb_pclk" clock. It will leave just one
> clock, so "clock-names" property can be set as optional, and the drop
> the property from the lpc32xx.dtsi.

No, "apb_pclk" is part of the common AMBA binding, and is required by 
the "arm,primecell" compatible. You won't (usually) find it referenced 
in drivers because it's dealt with by amba_get_enable_pclk() via 
amba_probe().

Robin.
Vladimir Zapolskiy March 14, 2022, 11:50 a.m. UTC | #9
On 3/14/22 1:43 PM, Robin Murphy wrote:
> On 2022-03-11 14:07, Vladimir Zapolskiy wrote:
>> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
>>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com> wrote:
>>>>
>>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>>>>> PL022 binding require two clocks to be defined but lpc platform doesn't
>>>>> comply with bindings and define only one clock i.e apb_pclk.
>>>>>
>>>>> Update spi clocks and clocks-names property by adding appropriate clock
>>>>> reference to make it compliant with bindings.
>>>>>
>>>>> CC: Vladimir Zapolskiy <vz@mleia.com>
>>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
>>>>> ---
>>>>> v2:
>>>>> - New patch with similar changeset
>>>>> - Send to soc ML
>>>>>
>>>>>     arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>>>>>     1 file changed, 4 insertions(+), 4 deletions(-)
>>>>>
>>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi
>>>>> b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>> index c87066d6c995..30958e02d5e2 100644
>>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>>>>>                                 compatible = "arm,pl022",
>>>>> "arm,primecell";
>>>>>                                 reg = <0x20084000 0x1000>;
>>>>>                                 interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
>>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>>>>> -                             clock-names = "apb_pclk";
>>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>,
>>>>> <&clk LPC32XX_CLK_SSP0>;
>>>>> +                             clock-names = "sspclk", "apb_pclk";
>>>>
>>>> In fact I'm uncertain if it is the right change, could it happen that
>>>> the commit
>>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema")
>>>> sets a wrong
>>>> schema pattern?
>>>
>>> Good pointm this doesn't quite seem right: it is unlikely that the
>>> same clock
>>> is used for both the SPI bus and the APB bus.
>>>
>>>> Apparently just one clock is wanted on all observed platforms and
>>>> cases, this
>>>> is implicitly confirmed by clock handling in the
>>>> drivers/spi/spi-pl022.c :
>>>>
>>>>           pl022->clk = devm_clk_get(&adev->dev, NULL);
>>>>
>>>> So, I would vote to fix the device tree bindings schema.
>>>
>>> Isn't this just using the wrong name? The name of the macro
>>> LPC32XX_CLK_SSP0 might indicate that this is indeed the SPI clock
>>> rather than the APB clock, so we only need to change clock-names
>>> property here and leave it unchanged otherwise.
>>
>> Yes, the name is wrong, here I'm ready to take the blame:
>>
>> Fixes: 93898eb775e5 ("arm: dts: lpc32xx: add clock properties to device
>> nodes")
>>
>> Noteworthy the commit above presets the same clock name to other PrimeCell
>> controllers, namely pl110 (LCD), pl080 (DMA), pl175 (EMC) and pl18x (SD),
>> plus this one pl022 (SSP), and all but SSP and SD are AHB slaves in fact.
>>
>> On LPC32xx the bus clock source and function clock source for SSP is HCLK.
>>
>> My guess is that the misnamed "apb_pclk" migrated into the schema from
>> the lpc32xx.dtsi, so I'd suggest, unless some platform really needs it,
>> firstly fix the schema by removing "apb_pclk" clock. It will leave just one
>> clock, so "clock-names" property can be set as optional, and the drop
>> the property from the lpc32xx.dtsi.
> 
> No, "apb_pclk" is part of the common AMBA binding, and is required by
> the "arm,primecell" compatible. You won't (usually) find it referenced
> in drivers because it's dealt with by amba_get_enable_pclk() via
> amba_probe().
> 

Thank you, it explains, why "apb_pclk" is required for all PrimeCell
controllers on the SoC. Nevertheless, in commit 93898eb775e5 it was
misidentified with the sspclk clock, the latter one is the only clock
explicitly utilized by the driver in 2015 and till today. Fixes in dts
files should be preceded by a fix in the driver.

--
Best wishes,
Vladimir
Robin Murphy March 14, 2022, 12:20 p.m. UTC | #10
On 2022-03-14 11:50, Vladimir Zapolskiy wrote:
> On 3/14/22 1:43 PM, Robin Murphy wrote:
>> On 2022-03-11 14:07, Vladimir Zapolskiy wrote:
>>> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
>>>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com> 
>>>> wrote:
>>>>>
>>>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>>>>>> PL022 binding require two clocks to be defined but lpc platform 
>>>>>> doesn't
>>>>>> comply with bindings and define only one clock i.e apb_pclk.
>>>>>>
>>>>>> Update spi clocks and clocks-names property by adding appropriate 
>>>>>> clock
>>>>>> reference to make it compliant with bindings.
>>>>>>
>>>>>> CC: Vladimir Zapolskiy <vz@mleia.com>
>>>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
>>>>>> ---
>>>>>> v2:
>>>>>> - New patch with similar changeset
>>>>>> - Send to soc ML
>>>>>>
>>>>>>     arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>>>>>>     1 file changed, 4 insertions(+), 4 deletions(-)
>>>>>>
>>>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>> b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>> index c87066d6c995..30958e02d5e2 100644
>>>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>>>>>>                                 compatible = "arm,pl022",
>>>>>> "arm,primecell";
>>>>>>                                 reg = <0x20084000 0x1000>;
>>>>>>                                 interrupts = <20 
>>>>>> IRQ_TYPE_LEVEL_HIGH>;
>>>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>>>>>> -                             clock-names = "apb_pclk";
>>>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>,
>>>>>> <&clk LPC32XX_CLK_SSP0>;
>>>>>> +                             clock-names = "sspclk", "apb_pclk";
>>>>>
>>>>> In fact I'm uncertain if it is the right change, could it happen that
>>>>> the commit
>>>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema")
>>>>> sets a wrong
>>>>> schema pattern?
>>>>
>>>> Good pointm this doesn't quite seem right: it is unlikely that the
>>>> same clock
>>>> is used for both the SPI bus and the APB bus.
>>>>
>>>>> Apparently just one clock is wanted on all observed platforms and
>>>>> cases, this
>>>>> is implicitly confirmed by clock handling in the
>>>>> drivers/spi/spi-pl022.c :
>>>>>
>>>>>           pl022->clk = devm_clk_get(&adev->dev, NULL);
>>>>>
>>>>> So, I would vote to fix the device tree bindings schema.
>>>>
>>>> Isn't this just using the wrong name? The name of the macro
>>>> LPC32XX_CLK_SSP0 might indicate that this is indeed the SPI clock
>>>> rather than the APB clock, so we only need to change clock-names
>>>> property here and leave it unchanged otherwise.
>>>
>>> Yes, the name is wrong, here I'm ready to take the blame:
>>>
>>> Fixes: 93898eb775e5 ("arm: dts: lpc32xx: add clock properties to device
>>> nodes")
>>>
>>> Noteworthy the commit above presets the same clock name to other 
>>> PrimeCell
>>> controllers, namely pl110 (LCD), pl080 (DMA), pl175 (EMC) and pl18x 
>>> (SD),
>>> plus this one pl022 (SSP), and all but SSP and SD are AHB slaves in 
>>> fact.
>>>
>>> On LPC32xx the bus clock source and function clock source for SSP is 
>>> HCLK.
>>>
>>> My guess is that the misnamed "apb_pclk" migrated into the schema from
>>> the lpc32xx.dtsi, so I'd suggest, unless some platform really needs it,
>>> firstly fix the schema by removing "apb_pclk" clock. It will leave 
>>> just one
>>> clock, so "clock-names" property can be set as optional, and the drop
>>> the property from the lpc32xx.dtsi.
>>
>> No, "apb_pclk" is part of the common AMBA binding, and is required by
>> the "arm,primecell" compatible. You won't (usually) find it referenced
>> in drivers because it's dealt with by amba_get_enable_pclk() via
>> amba_probe().
>>
> 
> Thank you, it explains, why "apb_pclk" is required for all PrimeCell
> controllers on the SoC. Nevertheless, in commit 93898eb775e5 it was
> misidentified with the sspclk clock, the latter one is the only clock
> explicitly utilized by the driver in 2015 and till today. Fixes in dts
> files should be preceded by a fix in the driver.

There's nothing to fix in the driver, though. In fact it can only be 
working today because the Linux driver isn't very strict and simply 
assumes that the first clock entry is SSPCLK *without* considering its 
name (other consumers of the binding might be stricter; I don't know), 
and because presumably the HCLK happens to be enabled already anyway. 
Changing the driver behaviour would only stand to cause functional 
regressions.

There are effectively two bugs in the DTS here, firstly that it only has 
one clock entry when it should have two, and secondly that the clock 
entry which *is* present has the wrong name (or the wrong clock 
specifier, depending on how you look at it). Kuldeep's patch merely 
fixes the first one by fully describing the way it's currently working 
in practice, so it's really just a choice of whether to treat "respect 
the binding" and "describe the hardware correctly" as separate issues 
and have a follow-up patch to correctly reference HCLK as the second 
clock, or whether they're trivial enough to squash together.

Robin.
Arnd Bergmann March 14, 2022, 12:32 p.m. UTC | #11
On Mon, Mar 14, 2022 at 1:20 PM Robin Murphy <robin.murphy@arm.com> wrote:
> On 2022-03-14 11:50, Vladimir Zapolskiy wrote:
> > On 3/14/22 1:43 PM, Robin Murphy wrote:

> >
> > Thank you, it explains, why "apb_pclk" is required for all PrimeCell
> > controllers on the SoC. Nevertheless, in commit 93898eb775e5 it was
> > misidentified with the sspclk clock, the latter one is the only clock
> > explicitly utilized by the driver in 2015 and till today. Fixes in dts
> > files should be preceded by a fix in the driver.
>
> There's nothing to fix in the driver, though. In fact it can only be
> working today because the Linux driver isn't very strict and simply
> assumes that the first clock entry is SSPCLK *without* considering its
> name (other consumers of the binding might be stricter; I don't know),
> and because presumably the HCLK happens to be enabled already anyway.
> Changing the driver behaviour would only stand to cause functional
> regressions.

We can change the driver to look for an sspclk by name first, and
then fall back to the first clk if none is found. This would be backwards
compatible and allow new dts files to have an arbitrary order, though
we still need to be careful about changing the existing dts files after
that, to avoid breaking older kernels.

       Arnd
Vladimir Zapolskiy March 14, 2022, 12:34 p.m. UTC | #12
On 3/14/22 2:20 PM, Robin Murphy wrote:
> On 2022-03-14 11:50, Vladimir Zapolskiy wrote:
>> On 3/14/22 1:43 PM, Robin Murphy wrote:
>>> On 2022-03-11 14:07, Vladimir Zapolskiy wrote:
>>>> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
>>>>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com>
>>>>> wrote:
>>>>>>
>>>>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>>>>>>> PL022 binding require two clocks to be defined but lpc platform
>>>>>>> doesn't
>>>>>>> comply with bindings and define only one clock i.e apb_pclk.
>>>>>>>
>>>>>>> Update spi clocks and clocks-names property by adding appropriate
>>>>>>> clock
>>>>>>> reference to make it compliant with bindings.
>>>>>>>
>>>>>>> CC: Vladimir Zapolskiy <vz@mleia.com>
>>>>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
>>>>>>> ---
>>>>>>> v2:
>>>>>>> - New patch with similar changeset
>>>>>>> - Send to soc ML
>>>>>>>
>>>>>>>      arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>>>>>>>      1 file changed, 4 insertions(+), 4 deletions(-)
>>>>>>>
>>>>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>>> b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>>> index c87066d6c995..30958e02d5e2 100644
>>>>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>>>>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>>>>>>>                                  compatible = "arm,pl022",
>>>>>>> "arm,primecell";
>>>>>>>                                  reg = <0x20084000 0x1000>;
>>>>>>>                                  interrupts = <20
>>>>>>> IRQ_TYPE_LEVEL_HIGH>;
>>>>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>>>>>>> -                             clock-names = "apb_pclk";
>>>>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>,
>>>>>>> <&clk LPC32XX_CLK_SSP0>;
>>>>>>> +                             clock-names = "sspclk", "apb_pclk";
>>>>>>
>>>>>> In fact I'm uncertain if it is the right change, could it happen that
>>>>>> the commit
>>>>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema")
>>>>>> sets a wrong
>>>>>> schema pattern?
>>>>>
>>>>> Good pointm this doesn't quite seem right: it is unlikely that the
>>>>> same clock
>>>>> is used for both the SPI bus and the APB bus.
>>>>>
>>>>>> Apparently just one clock is wanted on all observed platforms and
>>>>>> cases, this
>>>>>> is implicitly confirmed by clock handling in the
>>>>>> drivers/spi/spi-pl022.c :
>>>>>>
>>>>>>            pl022->clk = devm_clk_get(&adev->dev, NULL);
>>>>>>
>>>>>> So, I would vote to fix the device tree bindings schema.
>>>>>
>>>>> Isn't this just using the wrong name? The name of the macro
>>>>> LPC32XX_CLK_SSP0 might indicate that this is indeed the SPI clock
>>>>> rather than the APB clock, so we only need to change clock-names
>>>>> property here and leave it unchanged otherwise.
>>>>
>>>> Yes, the name is wrong, here I'm ready to take the blame:
>>>>
>>>> Fixes: 93898eb775e5 ("arm: dts: lpc32xx: add clock properties to device
>>>> nodes")
>>>>
>>>> Noteworthy the commit above presets the same clock name to other
>>>> PrimeCell
>>>> controllers, namely pl110 (LCD), pl080 (DMA), pl175 (EMC) and pl18x
>>>> (SD),
>>>> plus this one pl022 (SSP), and all but SSP and SD are AHB slaves in
>>>> fact.
>>>>
>>>> On LPC32xx the bus clock source and function clock source for SSP is
>>>> HCLK.
>>>>
>>>> My guess is that the misnamed "apb_pclk" migrated into the schema from
>>>> the lpc32xx.dtsi, so I'd suggest, unless some platform really needs it,
>>>> firstly fix the schema by removing "apb_pclk" clock. It will leave
>>>> just one
>>>> clock, so "clock-names" property can be set as optional, and the drop
>>>> the property from the lpc32xx.dtsi.
>>>
>>> No, "apb_pclk" is part of the common AMBA binding, and is required by
>>> the "arm,primecell" compatible. You won't (usually) find it referenced
>>> in drivers because it's dealt with by amba_get_enable_pclk() via
>>> amba_probe().
>>>
>>
>> Thank you, it explains, why "apb_pclk" is required for all PrimeCell
>> controllers on the SoC. Nevertheless, in commit 93898eb775e5 it was
>> misidentified with the sspclk clock, the latter one is the only clock
>> explicitly utilized by the driver in 2015 and till today. Fixes in dts
>> files should be preceded by a fix in the driver.
> 
> There's nothing to fix in the driver, though. In fact it can only be
> working today because the Linux driver isn't very strict and simply
> assumes that the first clock entry is SSPCLK *without* considering its
> name (other consumers of the binding might be stricter; I don't know),

Here I'm a bit ignorant, would it be totally reliable to assume that
clk_get(dev, NULL) gets the first clock from the list, and will it never
happen that one day it takes e.g. the last entry?

I'm kind of surprised that the asked fix in the driver meets such a
resistance.

> and because presumably the HCLK happens to be enabled already anyway.

Yes, that's the case here.

> Changing the driver behaviour would only stand to cause functional
> regressions.
> 
> There are effectively two bugs in the DTS here, firstly that it only has
> one clock entry when it should have two, and secondly that the clock
> entry which *is* present has the wrong name (or the wrong clock
> specifier, depending on how you look at it). Kuldeep's patch merely
> fixes the first one by fully describing the way it's currently working
> in practice, so it's really just a choice of whether to treat "respect
> the binding" and "describe the hardware correctly" as separate issues
> and have a follow-up patch to correctly reference HCLK as the second
> clock, or whether they're trivial enough to squash together.
> 

The two problems in the DTS are not argued, the chosen way to correct them
is questionable though. Well, I won't object to see it split into two
changes, but please send them at least in one series then, so that it
won't be left forgotten.

--
Best wishes,
Vladimir
Robin Murphy March 14, 2022, 5:55 p.m. UTC | #13
On 2022-03-14 12:32, Arnd Bergmann wrote:
> On Mon, Mar 14, 2022 at 1:20 PM Robin Murphy <robin.murphy@arm.com> wrote:
>> On 2022-03-14 11:50, Vladimir Zapolskiy wrote:
>>> On 3/14/22 1:43 PM, Robin Murphy wrote:
> 
>>>
>>> Thank you, it explains, why "apb_pclk" is required for all PrimeCell
>>> controllers on the SoC. Nevertheless, in commit 93898eb775e5 it was
>>> misidentified with the sspclk clock, the latter one is the only clock
>>> explicitly utilized by the driver in 2015 and till today. Fixes in dts
>>> files should be preceded by a fix in the driver.
>>
>> There's nothing to fix in the driver, though. In fact it can only be
>> working today because the Linux driver isn't very strict and simply
>> assumes that the first clock entry is SSPCLK *without* considering its
>> name (other consumers of the binding might be stricter; I don't know),
>> and because presumably the HCLK happens to be enabled already anyway.
>> Changing the driver behaviour would only stand to cause functional
>> regressions.
> 
> We can change the driver to look for an sspclk by name first, and
> then fall back to the first clk if none is found. This would be backwards
> compatible and allow new dts files to have an arbitrary order, though
> we still need to be careful about changing the existing dts files after
> that, to avoid breaking older kernels.

Yeah, I discounted that since schema is strict about the order of 
entries even when they're named, so we'd have nothing to gain except the 
potential to break compatibility in one direction and annoy users in the 
other. There's little point in having code to look up a clock by name 
when we know that for compatibility reasons it has to be the first 
clock, so it would be functionally identical to the fallback code that 
we also still have to have. All it could offer is additionally printing 
a message about it, and experience says that that achieves little except 
the aforementioned annoyance of users - I look as far as my Rockchip 
boards that have all been screaming an error at me every boot for nearly 
4 years now, where the ethernet driver fails to get a clock that only 
exists on some SoCs *other* than the ones I have :(

Robin.
Trevor Woerner March 27, 2022, 2:57 a.m. UTC | #14
On Tue, Mar 15, 2022 at 2:00 AM Vladimir Zapolskiy <vz@mleia.com> wrote:

> On 3/14/22 2:20 PM, Robin Murphy wrote:
> > On 2022-03-14 11:50, Vladimir Zapolskiy wrote:
> >> On 3/14/22 1:43 PM, Robin Murphy wrote:
> >>> On 2022-03-11 14:07, Vladimir Zapolskiy wrote:
> >>>> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
> >>>>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com>
> >>>>> wrote:
> >>>>>>
> >>>>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
> >>>>>>> PL022 binding require two clocks to be defined but lpc platform
> >>>>>>> doesn't
> >>>>>>> comply with bindings and define only one clock i.e apb_pclk.
> >>>>>>>
> >>>>>>> Update spi clocks and clocks-names property by adding appropriate
> >>>>>>> clock
> >>>>>>> reference to make it compliant with bindings.
> >>>>>>>
> >>>>>>> CC: Vladimir Zapolskiy <vz@mleia.com>
> >>>>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com>
> >>>>>>> ---
> >>>>>>> v2:
> >>>>>>> - New patch with similar changeset
> >>>>>>> - Send to soc ML
> >>>>>>>
> >>>>>>>      arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
> >>>>>>>      1 file changed, 4 insertions(+), 4 deletions(-)
> >>>>>>>
> >>>>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi
> >>>>>>> b/arch/arm/boot/dts/lpc32xx.dtsi
> >>>>>>> index c87066d6c995..30958e02d5e2 100644
> >>>>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
> >>>>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
> >>>>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
> >>>>>>>                                  compatible = "arm,pl022",
> >>>>>>> "arm,primecell";
> >>>>>>>                                  reg = <0x20084000 0x1000>;
> >>>>>>>                                  interrupts = <20
> >>>>>>> IRQ_TYPE_LEVEL_HIGH>;
> >>>>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
> >>>>>>> -                             clock-names = "apb_pclk";
> >>>>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>,
> >>>>>>> <&clk LPC32XX_CLK_SSP0>;
> >>>>>>> +                             clock-names = "sspclk", "apb_pclk";
> >>>>>>
> >>>>>> In fact I'm uncertain if it is the right change, could it happen
> that
> >>>>>> the commit
> >>>>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema")
> >>>>>> sets a wrong
> >>>>>> schema pattern?
> >>>>>
> >>>>> Good pointm this doesn't quite seem right: it is unlikely that the
> >>>>> same clock
> >>>>> is used for both the SPI bus and the APB bus.
> >>>>>
> >>>>>> Apparently just one clock is wanted on all observed platforms and
> >>>>>> cases, this
> >>>>>> is implicitly confirmed by clock handling in the
> >>>>>> drivers/spi/spi-pl022.c :
> >>>>>>
> >>>>>>            pl022->clk = devm_clk_get(&adev->dev, NULL);
> >>>>>>
> >>>>>> So, I would vote to fix the device tree bindings schema.
> >>>>>
> >>>>> Isn't this just using the wrong name? The name of the macro
> >>>>> LPC32XX_CLK_SSP0 might indicate that this is indeed the SPI clock
> >>>>> rather than the APB clock, so we only need to change clock-names
> >>>>> property here and leave it unchanged otherwise.
> >>>>
> >>>> Yes, the name is wrong, here I'm ready to take the blame:
> >>>>
> >>>> Fixes: 93898eb775e5 ("arm: dts: lpc32xx: add clock properties to
> device
> >>>> nodes")
> >>>>
> >>>> Noteworthy the commit above presets the same clock name to other
> >>>> PrimeCell
> >>>> controllers, namely pl110 (LCD), pl080 (DMA), pl175 (EMC) and pl18x
> >>>> (SD),
> >>>> plus this one pl022 (SSP), and all but SSP and SD are AHB slaves in
> >>>> fact.
> >>>>
> >>>> On LPC32xx the bus clock source and function clock source for SSP is
> >>>> HCLK.
> >>>>
> >>>> My guess is that the misnamed "apb_pclk" migrated into the schema from
> >>>> the lpc32xx.dtsi, so I'd suggest, unless some platform really needs
> it,
> >>>> firstly fix the schema by removing "apb_pclk" clock. It will leave
> >>>> just one
> >>>> clock, so "clock-names" property can be set as optional, and the drop
> >>>> the property from the lpc32xx.dtsi.
> >>>
> >>> No, "apb_pclk" is part of the common AMBA binding, and is required by
> >>> the "arm,primecell" compatible. You won't (usually) find it referenced
> >>> in drivers because it's dealt with by amba_get_enable_pclk() via
> >>> amba_probe().
> >>>
> >>
> >> Thank you, it explains, why "apb_pclk" is required for all PrimeCell
> >> controllers on the SoC. Nevertheless, in commit 93898eb775e5 it was
> >> misidentified with the sspclk clock, the latter one is the only clock
> >> explicitly utilized by the driver in 2015 and till today. Fixes in dts
> >> files should be preceded by a fix in the driver.
> >
> > There's nothing to fix in the driver, though. In fact it can only be
> > working today because the Linux driver isn't very strict and simply
> > assumes that the first clock entry is SSPCLK *without* considering its
> > name (other consumers of the binding might be stricter; I don't know),
>
> Here I'm a bit ignorant, would it be totally reliable to assume that
> clk_get(dev, NULL) gets the first clock from the list, and will it never
> happen that one day it takes e.g. the last entry?
>
> I'm kind of surprised that the asked fix in the driver meets such a
> resistance.
>
> > and because presumably the HCLK happens to be enabled already anyway.
>
> Yes, that's the case here.
>
> > Changing the driver behaviour would only stand to cause functional
> > regressions.
> >
> > There are effectively two bugs in the DTS here, firstly that it only has
> > one clock entry when it should have two, and secondly that the clock
> > entry which *is* present has the wrong name (or the wrong clock
> > specifier, depending on how you look at it). Kuldeep's patch merely
> > fixes the first one by fully describing the way it's currently working
> > in practice, so it's really just a choice of whether to treat "respect
> > the binding" and "describe the hardware correctly" as separate issues
> > and have a follow-up patch to correctly reference HCLK as the second
> > clock, or whether they're trivial enough to squash together.
> >
>
> The two problems in the DTS are not argued, the chosen way to correct them
> is questionable though. Well, I won't object to see it split into two
> changes, but please send them at least in one series then, so that it
> won't be left forgotten.
>
> --
> Best wishes,
> Vladimir
>

On the lpc32xx both the SPI and SSP peripherals are APB devices (low-speed)

[image: lpc32xx-apb-peripherals.png]
The APB devices on this SoC are driven by the PERIPH_CLK which can be
derived from either the HCLK or the SYSCLK.

[image: lpc32xx-clock.png]
The default on reset is for PERIPH_CLK to be derived from the SYSCLK but
both U-Boot and Linux run in "normal" mode, which is to say that
PERIPH_CLK, HCLK, ARM_CLK, and DDRAM_CLK are derived from the HCLK PLL.

There is no separate SSP clock, the SSP is driven by one clock: the
PERIPH_CLK (or "apb_pclk").
Vladimir Zapolskiy March 27, 2022, 4:27 p.m. UTC | #15
Hi Trevor,

On 3/27/22 5:57 AM, Trevor Woerner wrote:
> 
> On Tue, Mar 15, 2022 at 2:00 AM Vladimir Zapolskiy <vz@mleia.com <mailto:vz@mleia.com>> wrote:
> 
>     On 3/14/22 2:20 PM, Robin Murphy wrote:
>      > On 2022-03-14 11:50, Vladimir Zapolskiy wrote:
>      >> On 3/14/22 1:43 PM, Robin Murphy wrote:
>      >>> On 2022-03-11 14:07, Vladimir Zapolskiy wrote:
>      >>>> On 3/11/22 3:38 PM, Arnd Bergmann wrote:
>      >>>>> On Fri, Mar 11, 2022 at 2:20 PM Vladimir Zapolskiy <vz@mleia.com <mailto:vz@mleia.com>>
>      >>>>> wrote:
>      >>>>>>
>      >>>>>> On 3/11/22 11:38 AM, Kuldeep Singh wrote:
>      >>>>>>> PL022 binding require two clocks to be defined but lpc platform
>      >>>>>>> doesn't
>      >>>>>>> comply with bindings and define only one clock i.e apb_pclk.
>      >>>>>>>
>      >>>>>>> Update spi clocks and clocks-names property by adding appropriate
>      >>>>>>> clock
>      >>>>>>> reference to make it compliant with bindings.
>      >>>>>>>
>      >>>>>>> CC: Vladimir Zapolskiy <vz@mleia.com <mailto:vz@mleia.com>>
>      >>>>>>> Signed-off-by: Kuldeep Singh <singh.kuldeep87k@gmail.com <mailto:singh.kuldeep87k@gmail.com>>
>      >>>>>>> ---
>      >>>>>>> v2:
>      >>>>>>> - New patch with similar changeset
>      >>>>>>> - Send to soc ML
>      >>>>>>>
>      >>>>>>>      arch/arm/boot/dts/lpc32xx.dtsi | 8 ++++----
>      >>>>>>>      1 file changed, 4 insertions(+), 4 deletions(-)
>      >>>>>>>
>      >>>>>>> diff --git a/arch/arm/boot/dts/lpc32xx.dtsi
>      >>>>>>> b/arch/arm/boot/dts/lpc32xx.dtsi
>      >>>>>>> index c87066d6c995..30958e02d5e2 100644
>      >>>>>>> --- a/arch/arm/boot/dts/lpc32xx.dtsi
>      >>>>>>> +++ b/arch/arm/boot/dts/lpc32xx.dtsi
>      >>>>>>> @@ -178,8 +178,8 @@ ssp0: spi@20084000 {
>      >>>>>>>                                  compatible = "arm,pl022",
>      >>>>>>> "arm,primecell";
>      >>>>>>>                                  reg = <0x20084000 0x1000>;
>      >>>>>>>                                  interrupts = <20
>      >>>>>>> IRQ_TYPE_LEVEL_HIGH>;
>      >>>>>>> -                             clocks = <&clk LPC32XX_CLK_SSP0>;
>      >>>>>>> -                             clock-names = "apb_pclk";
>      >>>>>>> +                             clocks = <&clk LPC32XX_CLK_SSP0>,
>      >>>>>>> <&clk LPC32XX_CLK_SSP0>;
>      >>>>>>> +                             clock-names = "sspclk", "apb_pclk";
>      >>>>>>
>      >>>>>> In fact I'm uncertain if it is the right change, could it happen that
>      >>>>>> the commit
>      >>>>>> cc0f6e96c4fd ("spi: dt-bindings: Convert Arm pl022 to json-schema")
>      >>>>>> sets a wrong
>      >>>>>> schema pattern?
>      >>>>>
>      >>>>> Good pointm this doesn't quite seem right: it is unlikely that the
>      >>>>> same clock
>      >>>>> is used for both the SPI bus and the APB bus.
>      >>>>>
>      >>>>>> Apparently just one clock is wanted on all observed platforms and
>      >>>>>> cases, this
>      >>>>>> is implicitly confirmed by clock handling in the
>      >>>>>> drivers/spi/spi-pl022.c :
>      >>>>>>
>      >>>>>>            pl022->clk = devm_clk_get(&adev->dev, NULL);
>      >>>>>>
>      >>>>>> So, I would vote to fix the device tree bindings schema.
>      >>>>>
>      >>>>> Isn't this just using the wrong name? The name of the macro
>      >>>>> LPC32XX_CLK_SSP0 might indicate that this is indeed the SPI clock
>      >>>>> rather than the APB clock, so we only need to change clock-names
>      >>>>> property here and leave it unchanged otherwise.
>      >>>>
>      >>>> Yes, the name is wrong, here I'm ready to take the blame:
>      >>>>
>      >>>> Fixes: 93898eb775e5 ("arm: dts: lpc32xx: add clock properties to device
>      >>>> nodes")
>      >>>>
>      >>>> Noteworthy the commit above presets the same clock name to other
>      >>>> PrimeCell
>      >>>> controllers, namely pl110 (LCD), pl080 (DMA), pl175 (EMC) and pl18x
>      >>>> (SD),
>      >>>> plus this one pl022 (SSP), and all but SSP and SD are AHB slaves in
>      >>>> fact.
>      >>>>
>      >>>> On LPC32xx the bus clock source and function clock source for SSP is
>      >>>> HCLK.
>      >>>>
>      >>>> My guess is that the misnamed "apb_pclk" migrated into the schema from
>      >>>> the lpc32xx.dtsi, so I'd suggest, unless some platform really needs it,
>      >>>> firstly fix the schema by removing "apb_pclk" clock. It will leave
>      >>>> just one
>      >>>> clock, so "clock-names" property can be set as optional, and the drop
>      >>>> the property from the lpc32xx.dtsi.
>      >>>
>      >>> No, "apb_pclk" is part of the common AMBA binding, and is required by
>      >>> the "arm,primecell" compatible. You won't (usually) find it referenced
>      >>> in drivers because it's dealt with by amba_get_enable_pclk() via
>      >>> amba_probe().
>      >>>
>      >>
>      >> Thank you, it explains, why "apb_pclk" is required for all PrimeCell
>      >> controllers on the SoC. Nevertheless, in commit 93898eb775e5 it was
>      >> misidentified with the sspclk clock, the latter one is the only clock
>      >> explicitly utilized by the driver in 2015 and till today. Fixes in dts
>      >> files should be preceded by a fix in the driver.
>      >
>      > There's nothing to fix in the driver, though. In fact it can only be
>      > working today because the Linux driver isn't very strict and simply
>      > assumes that the first clock entry is SSPCLK *without* considering its
>      > name (other consumers of the binding might be stricter; I don't know),
> 
>     Here I'm a bit ignorant, would it be totally reliable to assume that
>     clk_get(dev, NULL) gets the first clock from the list, and will it never
>     happen that one day it takes e.g. the last entry?
> 
>     I'm kind of surprised that the asked fix in the driver meets such a
>     resistance.
> 
>      > and because presumably the HCLK happens to be enabled already anyway.
> 
>     Yes, that's the case here.
> 
>      > Changing the driver behaviour would only stand to cause functional
>      > regressions.
>      >
>      > There are effectively two bugs in the DTS here, firstly that it only has
>      > one clock entry when it should have two, and secondly that the clock
>      > entry which *is* present has the wrong name (or the wrong clock
>      > specifier, depending on how you look at it). Kuldeep's patch merely
>      > fixes the first one by fully describing the way it's currently working
>      > in practice, so it's really just a choice of whether to treat "respect
>      > the binding" and "describe the hardware correctly" as separate issues
>      > and have a follow-up patch to correctly reference HCLK as the second
>      > clock, or whether they're trivial enough to squash together.
>      >
> 
>     The two problems in the DTS are not argued, the chosen way to correct them
>     is questionable though. Well, I won't object to see it split into two
>     changes, but please send them at least in one series then, so that it
>     won't be left forgotten.
> 
>     --
>     Best wishes,
>     Vladimir
> 
> On the lpc32xx both the SPI and SSP peripherals are APB devices (low-speed)
> 
> lpc32xx-apb-peripherals.png
> The APB devices on this SoC are driven by the PERIPH_CLK which can be
> derived from either the HCLK or the SYSCLK.

thank you for the data, I'd like to reference to Table 14, which says that
both bus clock source and function clock source for SSP0 and SSP1 are a
non-selectable HCLK. I'm unsure if for instance PERIPH_CLK can be set as
a function clock source for SSPx.

> lpc32xx-clock.png
> The default on reset is for PERIPH_CLK to be derived from the SYSCLK but
> both U-Boot and Linux run in "normal" mode, which is to say that
> PERIPH_CLK, HCLK, ARM_CLK, and DDRAM_CLK are derived from the HCLK PLL.> 
> There is no separate SSP clock, the SSP is driven by one clock: the
> PERIPH_CLK (or "apb_pclk").

Right, there is no separate SSP clock in sense of a bus clock, it is
correct to get HCLK clock (or equally its child SSP clock) rate as a bus
clock rate, and the reason for introduction of SSP0/SSP1 clocks is that
these clocks are gated.

If I'm correct above, what does it mean in connection to LPC32xx device
tree bindings? The first or single clock source shall remain to be SSPx
clock, either the former is "sspclk" or "apb_pclk".

--
Best wishes,
Vladimir
Trevor Woerner March 27, 2022, 6:32 p.m. UTC | #16
Hi Vladimir,

On Sun 2022-03-27 @ 07:27:00 PM, Vladimir Zapolskiy wrote:
> Hi Trevor,
> 
> On 3/27/22 5:57 AM, Trevor Woerner wrote:
> > On the lpc32xx both the SPI and SSP peripherals are APB devices (low-speed)
> > 
> > lpc32xx-apb-peripherals.png
> > The APB devices on this SoC are driven by the PERIPH_CLK which can be
> > derived from either the HCLK or the SYSCLK.
> 
> thank you for the data, I'd like to reference to Table 14, which says that
> both bus clock source and function clock source for SSP0 and SSP1 are a
> non-selectable HCLK. I'm unsure if for instance PERIPH_CLK can be set as
> a function clock source for SSPx.

Interesting. I see that I had assumed that all APB peripherals would be driven
by the PERIPH_CLK since the diagram shows that clock as going to all APB
peripherals.

In the SSP chapter, for example, there is a clock prescale register, which
says:

	This register controls the factor by which the prescaler divides the AHB clock
	HCLK to yield the prescaler clock that is, in turn, divided by the SCR factor
	in SSPnCR0, to determine the bit clock.

So that confirms that the clock driving the SSP (an APB peripheral) is the
AHB's HCLK!

Section 21.7 of the SPI chapter also clearly shows the SPI clock as being
derived from the HCLK as well.

Thanks for the clarification :-)

> > lpc32xx-clock.png
> > The default on reset is for PERIPH_CLK to be derived from the SYSCLK but
> > both U-Boot and Linux run in "normal" mode, which is to say that
> > PERIPH_CLK, HCLK, ARM_CLK, and DDRAM_CLK are derived from the HCLK PLL.>
> > There is no separate SSP clock, the SSP is driven by one clock: the
> > PERIPH_CLK (or "apb_pclk").
> 
> Right, there is no separate SSP clock in sense of a bus clock, it is
> correct to get HCLK clock (or equally its child SSP clock) rate as a bus
> clock rate, and the reason for introduction of SSP0/SSP1 clocks is that
> these clocks are gated.
> 
> If I'm correct above, what does it mean in connection to LPC32xx device
> tree bindings? The first or single clock source shall remain to be SSPx
> clock, either the former is "sspclk" or "apb_pclk".

Doesn't this mean the apb_pclk should not be specified as the SSP/SPI clock?
If sspclk is a synonym for HCLK, then sspclk and apb_pclk are completely
different clocks. On my device HCLK is 260MHz and PERIPH_CLK is 13MHz.
diff mbox series

Patch

diff --git a/arch/arm/boot/dts/lpc32xx.dtsi b/arch/arm/boot/dts/lpc32xx.dtsi
index c87066d6c995..30958e02d5e2 100644
--- a/arch/arm/boot/dts/lpc32xx.dtsi
+++ b/arch/arm/boot/dts/lpc32xx.dtsi
@@ -178,8 +178,8 @@  ssp0: spi@20084000 {
 				compatible = "arm,pl022", "arm,primecell";
 				reg = <0x20084000 0x1000>;
 				interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
-				clocks = <&clk LPC32XX_CLK_SSP0>;
-				clock-names = "apb_pclk";
+				clocks = <&clk LPC32XX_CLK_SSP0>, <&clk LPC32XX_CLK_SSP0>;
+				clock-names = "sspclk", "apb_pclk";
 				#address-cells = <1>;
 				#size-cells = <0>;
 				status = "disabled";
@@ -202,8 +202,8 @@  ssp1: spi@2008c000 {
 				compatible = "arm,pl022", "arm,primecell";
 				reg = <0x2008c000 0x1000>;
 				interrupts = <21 IRQ_TYPE_LEVEL_HIGH>;
-				clocks = <&clk LPC32XX_CLK_SSP1>;
-				clock-names = "apb_pclk";
+				clocks = <&clk LPC32XX_CLK_SSP1>, <&clk LPC32XX_CLK_SSP1>;
+				clock-names = "sspclk", "apb_pclk";
 				#address-cells = <1>;
 				#size-cells = <0>;
 				status = "disabled";