diff mbox series

[v1,2/2] gpio: pca953x: Correctly initialize registers 6 and 7 for PCA957x

Message ID 20200930142013.59247-2-andriy.shevchenko@linux.intel.com
State New
Headers show
Series [v1,1/2] gpio: pca953x: Use bitmap API over implicit GCC extension | expand

Commit Message

Andy Shevchenko Sept. 30, 2020, 2:20 p.m. UTC
When driver has been converted to the bitmap API the non-bitmap functions
started behaving differently on 32-bit BE architectures since the bytes in
two consequent unsigned longs are in different order in comparison to byte
array. Hence if the chip had had more than 32 lines the memset() call over
it would have not set up upper lines correctly.
Although it's currently a theoretical case (no supported chips of this type
has 32+ lines), it's better to provide a clean code to avoid people thinking
this is okay and potentially producing not fully working things.

Fixes: 35d13d94893f ("gpio: pca953x: convert to use bitmap API")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/gpio/gpio-pca953x.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Bartosz Golaszewski Oct. 1, 2020, 7:27 a.m. UTC | #1
On Wed, Sep 30, 2020 at 4:20 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> When driver has been converted to the bitmap API the non-bitmap functions
> started behaving differently on 32-bit BE architectures since the bytes in
> two consequent unsigned longs are in different order in comparison to byte
> array. Hence if the chip had had more than 32 lines the memset() call over
> it would have not set up upper lines correctly.
> Although it's currently a theoretical case (no supported chips of this type
> has 32+ lines), it's better to provide a clean code to avoid people thinking
> this is okay and potentially producing not fully working things.
>
> Fixes: 35d13d94893f ("gpio: pca953x: convert to use bitmap API")
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/gpio/gpio-pca953x.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
> index 3f24cfabb1d7..6263a4d55f8b 100644
> --- a/drivers/gpio/gpio-pca953x.c
> +++ b/drivers/gpio/gpio-pca953x.c
> @@ -942,6 +942,7 @@ static int device_pca95xx_init(struct pca953x_chip *chip, u32 invert)
>  static int device_pca957x_init(struct pca953x_chip *chip, u32 invert)
>  {
>         DECLARE_BITMAP(val, MAX_LINE);
> +       unsigned int i;
>         int ret;
>
>         ret = device_pca95xx_init(chip, invert);
> @@ -949,7 +950,9 @@ static int device_pca957x_init(struct pca953x_chip *chip, u32 invert)
>                 goto out;
>
>         /* To enable register 6, 7 to control pull up and pull down */
> -       memset(val, 0x02, NBANK(chip));
> +       for (i = 0; i < NBANK(chip); i++)
> +               bitmap_set_value8(val, 0x02, i * BANK_SZ);
> +
>         ret = pca953x_write_regs(chip, PCA957X_BKEN, val);
>         if (ret)
>                 goto out;
> --
> 2.28.0
>

Reviewed-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
diff mbox series

Patch

diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
index 3f24cfabb1d7..6263a4d55f8b 100644
--- a/drivers/gpio/gpio-pca953x.c
+++ b/drivers/gpio/gpio-pca953x.c
@@ -942,6 +942,7 @@  static int device_pca95xx_init(struct pca953x_chip *chip, u32 invert)
 static int device_pca957x_init(struct pca953x_chip *chip, u32 invert)
 {
 	DECLARE_BITMAP(val, MAX_LINE);
+	unsigned int i;
 	int ret;
 
 	ret = device_pca95xx_init(chip, invert);
@@ -949,7 +950,9 @@  static int device_pca957x_init(struct pca953x_chip *chip, u32 invert)
 		goto out;
 
 	/* To enable register 6, 7 to control pull up and pull down */
-	memset(val, 0x02, NBANK(chip));
+	for (i = 0; i < NBANK(chip); i++)
+		bitmap_set_value8(val, 0x02, i * BANK_SZ);
+
 	ret = pca953x_write_regs(chip, PCA957X_BKEN, val);
 	if (ret)
 		goto out;