2021-02-24 10:14:41

by Álvaro Fernández Rojas

[permalink] [raw]
Subject: [PATCH v2 0/2] leds: bcm63x8: improve read and write functions

This code is proven to work in BMIPS BE/LE and ARM BE/LE.
See bcm2835-rng and bcmgenet.c:
https://github.com/torvalds/linux/blob/3b9cdafb5358eb9f3790de2f728f765fef100731/drivers/char/hw_random/bcm2835-rng.c#L42-L60
https://github.com/torvalds/linux/blob/3b9cdafb5358eb9f3790de2f728f765fef100731/drivers/net/ethernet/broadcom/genet/bcmgenet.c#L71-L88

v2: fix comments style.

Álvaro Fernández Rojas (2):
leds: bcm6328: improve write and read functions
leds: bcm6358: improve write and read functions

drivers/leds/leds-bcm6328.c | 26 ++++++++++++++------------
drivers/leds/leds-bcm6358.c | 26 ++++++++++++++------------
2 files changed, 28 insertions(+), 24 deletions(-)

--
2.20.1


2021-02-24 10:16:01

by Álvaro Fernández Rojas

[permalink] [raw]
Subject: [PATCH v2 2/2] leds: bcm6358: improve write and read functions

This is proven to work in BMIPS BE/LE and ARM BE/LE, as used in bcm2835-rng
and bcmgenet drivers.
Both should also be inline functions.

Signed-off-by: Álvaro Fernández Rojas <[email protected]>
---
v2: Fix comment style.

drivers/leds/leds-bcm6358.c | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/drivers/leds/leds-bcm6358.c b/drivers/leds/leds-bcm6358.c
index 9d2e487fa08a..37d27b7c58a8 100644
--- a/drivers/leds/leds-bcm6358.c
+++ b/drivers/leds/leds-bcm6358.c
@@ -43,22 +43,24 @@ struct bcm6358_led {
bool active_low;
};

-static void bcm6358_led_write(void __iomem *reg, unsigned long data)
+static inline void bcm6358_led_write(void __iomem *reg, unsigned long data)
{
-#ifdef CONFIG_CPU_BIG_ENDIAN
- iowrite32be(data, reg);
-#else
- writel(data, reg);
-#endif
+ /*
+ * MIPS chips strapped for BE will automagically configure the
+ * peripheral registers for CPU-native byte order.
+ */
+ if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
+ __raw_writel(data, reg);
+ else
+ writel_relaxed(data, reg);
}

-static unsigned long bcm6358_led_read(void __iomem *reg)
+static inline unsigned long bcm6358_led_read(void __iomem *reg)
{
-#ifdef CONFIG_CPU_BIG_ENDIAN
- return ioread32be(reg);
-#else
- return readl(reg);
-#endif
+ if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
+ return __raw_readl(reg);
+ else
+ return readl_relaxed(reg);
}

static unsigned long bcm6358_led_busy(void __iomem *mem)
--
2.20.1

2021-02-24 16:03:22

by Florian Fainelli

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] leds: bcm6358: improve write and read functions



On 2/24/2021 2:11 AM, Álvaro Fernández Rojas wrote:
> This is proven to work in BMIPS BE/LE and ARM BE/LE, as used in bcm2835-rng
> and bcmgenet drivers.
> Both should also be inline functions.
>
> Signed-off-by: Álvaro Fernández Rojas <[email protected]>

Acked-by: Florian Fainelli <[email protected]>
--
Florian

2021-02-24 16:05:16

by Florian Fainelli

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] leds: bcm63x8: improve read and write functions



On 2/24/2021 2:11 AM, Álvaro Fernández Rojas wrote:
> This code is proven to work in BMIPS BE/LE and ARM BE/LE.
> See bcm2835-rng and bcmgenet.c:
> https://github.com/torvalds/linux/blob/3b9cdafb5358eb9f3790de2f728f765fef100731/drivers/char/hw_random/bcm2835-rng.c#L42-L60
> https://github.com/torvalds/linux/blob/3b9cdafb5358eb9f3790de2f728f765fef100731/drivers/net/ethernet/broadcom/genet/bcmgenet.c#L71-L88

What is the motivation for doing this? bcm2835-rng and bcmgenet are used
across MIPS and ARM platforms therefore they need to be compatible with
both, but these two LEDs drivers are super specialized, are you working
on porting the 6328 LED driver to the newer ARM-based DSL SoCs such as
63138 and 63148?
--
Florian

2021-02-24 16:09:35

by Álvaro Fernández Rojas

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] leds: bcm63x8: improve read and write functions

Hi Florian,

> El 24 feb 2021, a las 16:45, Florian Fainelli <[email protected]> escribió:
>
>
>
> On 2/24/2021 2:11 AM, Álvaro Fernández Rojas wrote:
>> This code is proven to work in BMIPS BE/LE and ARM BE/LE.
>> See bcm2835-rng and bcmgenet.c:
>> https://github.com/torvalds/linux/blob/3b9cdafb5358eb9f3790de2f728f765fef100731/drivers/char/hw_random/bcm2835-rng.c#L42-L60
>> https://github.com/torvalds/linux/blob/3b9cdafb5358eb9f3790de2f728f765fef100731/drivers/net/ethernet/broadcom/genet/bcmgenet.c#L71-L88
>
> What is the motivation for doing this? bcm2835-rng and bcmgenet are used
> across MIPS and ARM platforms therefore they need to be compatible with
> both, but these two LEDs drivers are super specialized, are you working
> on porting the 6328 LED driver to the newer ARM-based DSL SoCs such as
> 63138 and 63148?

I just wanted to have all bmips drivers in line (at least regarding read/write).
If I remember correctly someone told me that this controller was also present on some little endian SoCs, but you can confirm that :).
Unfortunately I haven’t got any devices with ARM-based DSL SoCs, so the answer is no.

> --
> Florian

Best regards,
Álvaro.

2021-02-24 17:45:53

by Florian Fainelli

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] leds: bcm63x8: improve read and write functions



On 2/24/2021 7:54 AM, Álvaro Fernández Rojas wrote:
> Hi Florian,
>
>> El 24 feb 2021, a las 16:45, Florian Fainelli <[email protected]> escribió:
>>
>>
>>
>> On 2/24/2021 2:11 AM, Álvaro Fernández Rojas wrote:
>>> This code is proven to work in BMIPS BE/LE and ARM BE/LE.
>>> See bcm2835-rng and bcmgenet.c:
>>> https://github.com/torvalds/linux/blob/3b9cdafb5358eb9f3790de2f728f765fef100731/drivers/char/hw_random/bcm2835-rng.c#L42-L60
>>> https://github.com/torvalds/linux/blob/3b9cdafb5358eb9f3790de2f728f765fef100731/drivers/net/ethernet/broadcom/genet/bcmgenet.c#L71-L88
>>
>> What is the motivation for doing this? bcm2835-rng and bcmgenet are used
>> across MIPS and ARM platforms therefore they need to be compatible with
>> both, but these two LEDs drivers are super specialized, are you working
>> on porting the 6328 LED driver to the newer ARM-based DSL SoCs such as
>> 63138 and 63148?
>
> I just wanted to have all bmips drivers in line (at least regarding read/write).
> If I remember correctly someone told me that this controller was also present on some little endian SoCs, but you can confirm that :).
> Unfortunately I haven’t got any devices with ARM-based DSL SoCs, so the answer is no.

The 6328 LED controller could be utilized on the ARM-based DSL SoCs,
however 6358 will not, so changing the I/O accessors for that driver
sounds like just code churn to me.
--
Florian