gpio: pca953x: Use bitmap API over implicit GCC extension
PATCH 1/2 gpio: pca953x: Use bitmap API over implicit GCC extension
In IRQ handler we have to clear bitmap before use. Currently the GCC extension has been used for that. For sake of the consistency switch to bitmap API. As expected bloat-o-meter shows no difference in the object size.
--- drivers/gpio/gpio-pca953x.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpio/gpio-pca953x.c +3 -1
@@ -814,10 +814,12 @@ static irqreturn_t pca953x_irq_handler(int irq, void *devid) {struct pca953x_chip *chip = devid;struct gpio_chip *gc = &chip->gpio_chip; - DECLARE_BITMAP(pending, MAX_LINE) = {}; +DECLARE_BITMAP (pending,MAX_LINE );int level;bool ret; +bitmap_zero (pending,MAX_LINE ); +mutex_lock (&chip->i2c_lock); ret =pca953x_irq_pending (chip, pending);mutex_unlock (&chip->i2c_lock);
Signature · 1 line
2.28.0
PATCH 2/2 gpio: pca953x: Correctly initialize registers 6 and 7 for PCA957x
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.
--- drivers/gpio/gpio-pca953x.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpio/gpio-pca953x.c +4 -1
@@ -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;
Signature · 1 line
2.28.0
Re: [PATCH v1 2/2] gpio: pca953x: Correctly initialize registers 6 and 7 for PCA957x
Quoted 40 lines · Andy Shevchenko
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 <[email protected]>--- drivers/gpio/gpio-pca953x.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)drivers/gpio/gpio-pca953x.c +4
-2@@ -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; --
Quoted 2 lines
2.28.0
Quoted 30 lines · Andy Shevchenko
In IRQ handler we have to clear bitmap before use. Currently the GCC extension has been used for that. For sake of the consistency switch to bitmap API. As expected bloat-o-meter shows no difference in the object size.
Signed-off-by Andy Shevchenko <[email protected]>--- drivers/gpio/gpio-pca953x.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)drivers/gpio/gpio-pca953x.c +3
-2@@ -814,10 +814,12 @@ static irqreturn_t pca953x_irq_handler(int irq, void *devid) {struct pca953x_chip *chip = devid;struct gpio_chip *gc = &chip->gpio_chip; - DECLARE_BITMAP(pending, MAX_LINE) = {}; +DECLARE_BITMAP (pending,MAX_LINE );int level;bool ret; +bitmap_zero (pending,MAX_LINE ); +mutex_lock (&chip->i2c_lock); ret =pca953x_irq_pending (chip, pending);mutex_unlock (&chip->i2c_lock); --
Quoted 2 lines
2.28.0
Makes sense.
Quoted 6 lines · Andy Shevchenko
In IRQ handler we have to clear bitmap before use. Currently the GCC extension has been used for that. For sake of the consistency switch to bitmap API. As expected bloat-o-meter shows no difference in the object size.
Signed-off-by Andy Shevchenko <[email protected]>
Both patches applied!
Yours,
Linus Walleij