* [PATCH 01/15] gpio: 74x164: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 02/15] gpio: adnp: use lock guards for the I2C lock Bartosz Golaszewski
` (13 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-74x164.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
index 640ac24b72a2..4dd5c2c330bb 100644
--- a/drivers/gpio/gpio-74x164.c
+++ b/drivers/gpio/gpio-74x164.c
@@ -50,8 +50,8 @@ static int gen_74x164_get_value(struct gpio_chip *gc, unsigned offset)
return !!(chip->buffer[bank] & BIT(pin));
}
-static void gen_74x164_set_value(struct gpio_chip *gc,
- unsigned offset, int val)
+static int gen_74x164_set_value(struct gpio_chip *gc,
+ unsigned int offset, int val)
{
struct gen_74x164_chip *chip = gpiochip_get_data(gc);
u8 bank = chip->registers - 1 - offset / 8;
@@ -64,11 +64,11 @@ static void gen_74x164_set_value(struct gpio_chip *gc,
else
chip->buffer[bank] &= ~BIT(pin);
- __gen_74x164_write_config(chip);
+ return __gen_74x164_write_config(chip);
}
-static void gen_74x164_set_multiple(struct gpio_chip *gc, unsigned long *mask,
- unsigned long *bits)
+static int gen_74x164_set_multiple(struct gpio_chip *gc, unsigned long *mask,
+ unsigned long *bits)
{
struct gen_74x164_chip *chip = gpiochip_get_data(gc);
unsigned long offset;
@@ -85,7 +85,7 @@ static void gen_74x164_set_multiple(struct gpio_chip *gc, unsigned long *mask,
chip->buffer[bank] &= ~bankmask;
chip->buffer[bank] |= bitmask;
}
- __gen_74x164_write_config(chip);
+ return __gen_74x164_write_config(chip);
}
static int gen_74x164_direction_output(struct gpio_chip *gc,
@@ -141,8 +141,8 @@ static int gen_74x164_probe(struct spi_device *spi)
chip->gpio_chip.label = spi->modalias;
chip->gpio_chip.direction_output = gen_74x164_direction_output;
chip->gpio_chip.get = gen_74x164_get_value;
- chip->gpio_chip.set = gen_74x164_set_value;
- chip->gpio_chip.set_multiple = gen_74x164_set_multiple;
+ chip->gpio_chip.set_rv = gen_74x164_set_value;
+ chip->gpio_chip.set_multiple_rv = gen_74x164_set_multiple;
chip->gpio_chip.base = -1;
chip->gpio_chip.ngpio = GEN_74X164_NUMBER_GPIOS * chip->registers;
chip->gpio_chip.can_sleep = true;
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 02/15] gpio: adnp: use lock guards for the I2C lock
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 01/15] gpio: 74x164: use new line value setter callbacks Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-04 9:07 ` kernel test robot
2025-03-03 13:18 ` [PATCH 03/15] gpio: adnp: use devm_mutex_init() Bartosz Golaszewski
` (12 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reduce the code complexity by using automatic lock guards with the I2C
mutex.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-adnp.c | 118 +++++++++++++++++++----------------------------
1 file changed, 47 insertions(+), 71 deletions(-)
diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c
index 6dafab0cf964..dc87768276ec 100644
--- a/drivers/gpio/gpio-adnp.c
+++ b/drivers/gpio/gpio-adnp.c
@@ -3,6 +3,7 @@
* Copyright (C) 2011-2012 Avionic Design GmbH
*/
+#include <linux/cleanup.h>
#include <linux/gpio/driver.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
@@ -101,9 +102,9 @@ static void adnp_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
{
struct adnp *adnp = gpiochip_get_data(chip);
- mutex_lock(&adnp->i2c_lock);
+ guard(mutex)(&adnp->i2c_lock);
+
__adnp_gpio_set(adnp, offset, value);
- mutex_unlock(&adnp->i2c_lock);
}
static int adnp_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
@@ -114,32 +115,26 @@ static int adnp_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
u8 value;
int err;
- mutex_lock(&adnp->i2c_lock);
+ guard(mutex)(&adnp->i2c_lock);
err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &value);
if (err < 0)
- goto out;
+ return err;
value &= ~BIT(pos);
err = adnp_write(adnp, GPIO_DDR(adnp) + reg, value);
if (err < 0)
- goto out;
+ return err;
err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &value);
if (err < 0)
- goto out;
+ return err;
- if (value & BIT(pos)) {
- err = -EPERM;
- goto out;
- }
+ if (value & BIT(pos))
+ return -EPERM;
- err = 0;
-
-out:
- mutex_unlock(&adnp->i2c_lock);
- return err;
+ return 0;
}
static int adnp_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
@@ -151,33 +146,28 @@ static int adnp_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
int err;
u8 val;
- mutex_lock(&adnp->i2c_lock);
+ guard(mutex)(&adnp->i2c_lock);
err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &val);
if (err < 0)
- goto out;
+ return err;
val |= BIT(pos);
err = adnp_write(adnp, GPIO_DDR(adnp) + reg, val);
if (err < 0)
- goto out;
+ return err;
err = adnp_read(adnp, GPIO_DDR(adnp) + reg, &val);
if (err < 0)
- goto out;
+ return err;
- if (!(val & BIT(pos))) {
- err = -EPERM;
- goto out;
- }
+ if (!(val & BIT(pos)))
+ return -EPERM;
__adnp_gpio_set(adnp, offset, value);
- err = 0;
-out:
- mutex_unlock(&adnp->i2c_lock);
- return err;
+ return 0;
}
static void adnp_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
@@ -189,25 +179,24 @@ static void adnp_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
for (i = 0; i < num_regs; i++) {
u8 ddr, plr, ier, isr;
- mutex_lock(&adnp->i2c_lock);
+ scoped_guard(mutex, &adnp->i2c_lock) {
+ err = adnp_read(adnp, GPIO_DDR(adnp) + i, &ddr);
+ if (err < 0)
+ return;
- err = adnp_read(adnp, GPIO_DDR(adnp) + i, &ddr);
- if (err < 0)
- goto unlock;
+ err = adnp_read(adnp, GPIO_PLR(adnp) + i, &plr);
+ if (err < 0)
+ return;
- err = adnp_read(adnp, GPIO_PLR(adnp) + i, &plr);
- if (err < 0)
- goto unlock;
+ err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier);
+ if (err < 0)
+ return;
- err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier);
- if (err < 0)
- goto unlock;
+ err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr);
+ if (err < 0)
+ return;
- err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr);
- if (err < 0)
- goto unlock;
-
- mutex_unlock(&adnp->i2c_lock);
+ }
for (j = 0; j < 8; j++) {
unsigned int bit = (i << adnp->reg_shift) + j;
@@ -232,11 +221,6 @@ static void adnp_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
direction, level, interrupt, pending);
}
}
-
- return;
-
-unlock:
- mutex_unlock(&adnp->i2c_lock);
}
static irqreturn_t adnp_irq(int irq, void *data)
@@ -252,28 +236,20 @@ static irqreturn_t adnp_irq(int irq, void *data)
unsigned long pending;
int err;
- mutex_lock(&adnp->i2c_lock);
+ scoped_guard(mutex, &adnp->i2c_lock) {
+ err = adnp_read(adnp, GPIO_PLR(adnp) + i, &level);
+ if (err < 0)
+ continue;
- err = adnp_read(adnp, GPIO_PLR(adnp) + i, &level);
- if (err < 0) {
- mutex_unlock(&adnp->i2c_lock);
- continue;
+ err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr);
+ if (err < 0)
+ continue;
+
+ err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier);
+ if (err < 0)
+ continue;
}
- err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr);
- if (err < 0) {
- mutex_unlock(&adnp->i2c_lock);
- continue;
- }
-
- err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier);
- if (err < 0) {
- mutex_unlock(&adnp->i2c_lock);
- continue;
- }
-
- mutex_unlock(&adnp->i2c_lock);
-
/* determine pins that changed levels */
changed = level ^ adnp->irq_level[i];
@@ -365,12 +341,12 @@ static void adnp_irq_bus_unlock(struct irq_data *d)
struct adnp *adnp = gpiochip_get_data(gc);
unsigned int num_regs = 1 << adnp->reg_shift, i;
- mutex_lock(&adnp->i2c_lock);
+ scoped_guard(mutex, &adnp->i2c_lock) {
+ for (i = 0; i < num_regs; i++)
+ adnp_write(adnp, GPIO_IER(adnp) + i,
+ adnp->irq_enable[i]);
+ }
- for (i = 0; i < num_regs; i++)
- adnp_write(adnp, GPIO_IER(adnp) + i, adnp->irq_enable[i]);
-
- mutex_unlock(&adnp->i2c_lock);
mutex_unlock(&adnp->irq_lock);
}
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 02/15] gpio: adnp: use lock guards for the I2C lock
2025-03-03 13:18 ` [PATCH 02/15] gpio: adnp: use lock guards for the I2C lock Bartosz Golaszewski
@ 2025-03-04 9:07 ` kernel test robot
0 siblings, 0 replies; 24+ messages in thread
From: kernel test robot @ 2025-03-04 9:07 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: llvm, oe-kbuild-all, linux-gpio, linux-kernel, linux-pwm, patches,
linux-arm-kernel, linux-aspeed
Hi Bartosz,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 9778568dede2166c7bd124d473f9ec365f782935]
url: https://github.com/intel-lab-lkp/linux/commits/Bartosz-Golaszewski/gpio-74x164-use-new-line-value-setter-callbacks/20250303-212738
base: 9778568dede2166c7bd124d473f9ec365f782935
patch link: https://lore.kernel.org/r/20250303-gpiochip-set-conversion-v1-2-1d5cceeebf8b%40linaro.org
patch subject: [PATCH 02/15] gpio: adnp: use lock guards for the I2C lock
config: x86_64-buildonly-randconfig-001-20250304 (https://download.01.org/0day-ci/archive/20250304/202503041612.G8O0Bdrg-lkp@intel.com/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250304/202503041612.G8O0Bdrg-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503041612.G8O0Bdrg-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/gpio/gpio-adnp.c:241:8: warning: variable 'isr' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
241 | if (err < 0)
| ^~~~~~~
drivers/gpio/gpio-adnp.c:265:14: note: uninitialized use occurs here
265 | pending &= isr & ier;
| ^~~
drivers/gpio/gpio-adnp.c:241:4: note: remove the 'if' if its condition is always false
241 | if (err < 0)
| ^~~~~~~~~~~~
242 | continue;
| ~~~~~~~~
drivers/gpio/gpio-adnp.c:235:25: note: initialize the variable 'isr' to silence this warning
235 | u8 changed, level, isr, ier;
| ^
| = '\0'
>> drivers/gpio/gpio-adnp.c:245:8: warning: variable 'ier' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
245 | if (err < 0)
| ^~~~~~~
drivers/gpio/gpio-adnp.c:265:20: note: uninitialized use occurs here
265 | pending &= isr & ier;
| ^~~
drivers/gpio/gpio-adnp.c:245:4: note: remove the 'if' if its condition is always false
245 | if (err < 0)
| ^~~~~~~~~~~~
246 | continue;
| ~~~~~~~~
drivers/gpio/gpio-adnp.c:241:8: warning: variable 'ier' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
241 | if (err < 0)
| ^~~~~~~
drivers/gpio/gpio-adnp.c:265:20: note: uninitialized use occurs here
265 | pending &= isr & ier;
| ^~~
drivers/gpio/gpio-adnp.c:241:4: note: remove the 'if' if its condition is always false
241 | if (err < 0)
| ^~~~~~~~~~~~
242 | continue;
| ~~~~~~~~
drivers/gpio/gpio-adnp.c:235:30: note: initialize the variable 'ier' to silence this warning
235 | u8 changed, level, isr, ier;
| ^
| = '\0'
3 warnings generated.
vim +241 drivers/gpio/gpio-adnp.c
225
226 static irqreturn_t adnp_irq(int irq, void *data)
227 {
228 struct adnp *adnp = data;
229 unsigned int num_regs, i;
230
231 num_regs = 1 << adnp->reg_shift;
232
233 for (i = 0; i < num_regs; i++) {
234 unsigned int base = i << adnp->reg_shift, bit;
235 u8 changed, level, isr, ier;
236 unsigned long pending;
237 int err;
238
239 scoped_guard(mutex, &adnp->i2c_lock) {
240 err = adnp_read(adnp, GPIO_PLR(adnp) + i, &level);
> 241 if (err < 0)
242 continue;
243
244 err = adnp_read(adnp, GPIO_ISR(adnp) + i, &isr);
> 245 if (err < 0)
246 continue;
247
248 err = adnp_read(adnp, GPIO_IER(adnp) + i, &ier);
249 if (err < 0)
250 continue;
251 }
252
253 /* determine pins that changed levels */
254 changed = level ^ adnp->irq_level[i];
255
256 /* compute edge-triggered interrupts */
257 pending = changed & ((adnp->irq_fall[i] & ~level) |
258 (adnp->irq_rise[i] & level));
259
260 /* add in level-triggered interrupts */
261 pending |= (adnp->irq_high[i] & level) |
262 (adnp->irq_low[i] & ~level);
263
264 /* mask out non-pending and disabled interrupts */
265 pending &= isr & ier;
266
267 for_each_set_bit(bit, &pending, 8) {
268 unsigned int child_irq;
269 child_irq = irq_find_mapping(adnp->gpio.irq.domain,
270 base + bit);
271 handle_nested_irq(child_irq);
272 }
273 }
274
275 return IRQ_HANDLED;
276 }
277
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 03/15] gpio: adnp: use devm_mutex_init()
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 01/15] gpio: 74x164: use new line value setter callbacks Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 02/15] gpio: adnp: use lock guards for the I2C lock Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 04/15] gpio: adnp: use new line value setter callbacks Bartosz Golaszewski
` (11 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
The mutex initialized in probe() is never cleaned up. Use
devm_mutex_init() to do it automatically.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-adnp.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c
index dc87768276ec..d6ae9cf1eb54 100644
--- a/drivers/gpio/gpio-adnp.c
+++ b/drivers/gpio/gpio-adnp.c
@@ -9,6 +9,7 @@
#include <linux/interrupt.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
+#include <linux/mutex.h>
#include <linux/property.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
@@ -482,7 +483,10 @@ static int adnp_i2c_probe(struct i2c_client *client)
if (!adnp)
return -ENOMEM;
- mutex_init(&adnp->i2c_lock);
+ err = devm_mutex_init(&client->dev, &adnp->i2c_lock);
+ if (err)
+ return err;
+
adnp->client = client;
err = adnp_gpio_setup(adnp, num_gpios, device_property_read_bool(dev, "interrupt-controller"));
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 04/15] gpio: adnp: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (2 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 03/15] gpio: adnp: use devm_mutex_init() Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 05/15] gpio: adp5520: " Bartosz Golaszewski
` (10 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-adnp.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c
index d6ae9cf1eb54..b31ce0e337ae 100644
--- a/drivers/gpio/gpio-adnp.c
+++ b/drivers/gpio/gpio-adnp.c
@@ -80,7 +80,7 @@ static int adnp_gpio_get(struct gpio_chip *chip, unsigned offset)
return (value & BIT(pos)) ? 1 : 0;
}
-static void __adnp_gpio_set(struct adnp *adnp, unsigned offset, int value)
+static int __adnp_gpio_set(struct adnp *adnp, unsigned int offset, int value)
{
unsigned int reg = offset >> adnp->reg_shift;
unsigned int pos = offset & 7;
@@ -89,23 +89,23 @@ static void __adnp_gpio_set(struct adnp *adnp, unsigned offset, int value)
err = adnp_read(adnp, GPIO_PLR(adnp) + reg, &val);
if (err < 0)
- return;
+ return err;
if (value)
val |= BIT(pos);
else
val &= ~BIT(pos);
- adnp_write(adnp, GPIO_PLR(adnp) + reg, val);
+ return adnp_write(adnp, GPIO_PLR(adnp) + reg, val);
}
-static void adnp_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+static int adnp_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
{
struct adnp *adnp = gpiochip_get_data(chip);
guard(mutex)(&adnp->i2c_lock);
- __adnp_gpio_set(adnp, offset, value);
+ return __adnp_gpio_set(adnp, offset, value);
}
static int adnp_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
@@ -430,7 +430,7 @@ static int adnp_gpio_setup(struct adnp *adnp, unsigned int num_gpios,
chip->direction_input = adnp_gpio_direction_input;
chip->direction_output = adnp_gpio_direction_output;
chip->get = adnp_gpio_get;
- chip->set = adnp_gpio_set;
+ chip->set_rv = adnp_gpio_set;
chip->can_sleep = true;
if (IS_ENABLED(CONFIG_DEBUG_FS))
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 05/15] gpio: adp5520: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (3 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 04/15] gpio: adnp: use new line value setter callbacks Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:47 ` Hennerich, Michael
2025-03-03 13:18 ` [PATCH 06/15] gpio: adp5585: " Bartosz Golaszewski
` (9 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-adp5520.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/gpio/gpio-adp5520.c b/drivers/gpio/gpio-adp5520.c
index c55e821c63b6..57d12c10cbda 100644
--- a/drivers/gpio/gpio-adp5520.c
+++ b/drivers/gpio/gpio-adp5520.c
@@ -40,16 +40,18 @@ static int adp5520_gpio_get_value(struct gpio_chip *chip, unsigned off)
return !!(reg_val & dev->lut[off]);
}
-static void adp5520_gpio_set_value(struct gpio_chip *chip,
- unsigned off, int val)
+static int adp5520_gpio_set_value(struct gpio_chip *chip,
+ unsigned int off, int val)
{
struct adp5520_gpio *dev;
dev = gpiochip_get_data(chip);
if (val)
- adp5520_set_bits(dev->master, ADP5520_GPIO_OUT, dev->lut[off]);
+ return adp5520_set_bits(dev->master, ADP5520_GPIO_OUT,
+ dev->lut[off]);
else
- adp5520_clr_bits(dev->master, ADP5520_GPIO_OUT, dev->lut[off]);
+ return adp5520_clr_bits(dev->master, ADP5520_GPIO_OUT,
+ dev->lut[off]);
}
static int adp5520_gpio_direction_input(struct gpio_chip *chip, unsigned off)
@@ -120,7 +122,7 @@ static int adp5520_gpio_probe(struct platform_device *pdev)
gc->direction_input = adp5520_gpio_direction_input;
gc->direction_output = adp5520_gpio_direction_output;
gc->get = adp5520_gpio_get_value;
- gc->set = adp5520_gpio_set_value;
+ gc->set_rv = adp5520_gpio_set_value;
gc->can_sleep = true;
gc->base = pdata->gpio_start;
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* RE: [PATCH 05/15] gpio: adp5520: use new line value setter callbacks
2025-03-03 13:18 ` [PATCH 05/15] gpio: adp5520: " Bartosz Golaszewski
@ 2025-03-03 13:47 ` Hennerich, Michael
0 siblings, 0 replies; 24+ messages in thread
From: Hennerich, Michael @ 2025-03-03 13:47 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Laurent Pinchart,
Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-pwm@vger.kernel.org, patches@opensource.cirrus.com,
linux-arm-kernel@lists.infradead.org,
linux-aspeed@lists.ozlabs.org, Bartosz Golaszewski
> -----Original Message-----
> From: Bartosz Golaszewski <brgl@bgdev.pl>
> Sent: Monday, March 3, 2025 2:19 PM
> To: Linus Walleij <linus.walleij@linaro.org>; Bartosz Golaszewski
> <brgl@bgdev.pl>; Hennerich, Michael <Michael.Hennerich@analog.com>;
> Laurent Pinchart <laurent.pinchart@ideasonboard.com>; Mun Yew Tham
> <mun.yew.tham@intel.com>; Joel Stanley <joel@jms.id.au>; Andrew Jeffery
> <andrew@codeconstruct.com.au>
> Cc: linux-gpio@vger.kernel.org; linux-kernel@vger.kernel.org; linux-
> pwm@vger.kernel.org; patches@opensource.cirrus.com; linux-arm-
> kernel@lists.infradead.org; linux-aspeed@lists.ozlabs.org; Bartosz Golaszewski
> <bartosz.golaszewski@linaro.org>
> Subject: [PATCH 05/15] gpio: adp5520: use new line value setter callbacks
>
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> struct gpio_chip now has callbacks for setting line values that return an
> integer, allowing to indicate failures. Convert the driver to using them.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Acked-by: Michael Hennerich <michael.hennerich@analog.com>
> ---
> drivers/gpio/gpio-adp5520.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpio/gpio-adp5520.c b/drivers/gpio/gpio-adp5520.c index
> c55e821c63b6..57d12c10cbda 100644
> --- a/drivers/gpio/gpio-adp5520.c
> +++ b/drivers/gpio/gpio-adp5520.c
> @@ -40,16 +40,18 @@ static int adp5520_gpio_get_value(struct gpio_chip
> *chip, unsigned off)
> return !!(reg_val & dev->lut[off]);
> }
>
> -static void adp5520_gpio_set_value(struct gpio_chip *chip,
> - unsigned off, int val)
> +static int adp5520_gpio_set_value(struct gpio_chip *chip,
> + unsigned int off, int val)
> {
> struct adp5520_gpio *dev;
> dev = gpiochip_get_data(chip);
>
> if (val)
> - adp5520_set_bits(dev->master, ADP5520_GPIO_OUT, dev-
> >lut[off]);
> + return adp5520_set_bits(dev->master, ADP5520_GPIO_OUT,
> + dev->lut[off]);
> else
> - adp5520_clr_bits(dev->master, ADP5520_GPIO_OUT, dev-
> >lut[off]);
> + return adp5520_clr_bits(dev->master, ADP5520_GPIO_OUT,
> + dev->lut[off]);
> }
>
> static int adp5520_gpio_direction_input(struct gpio_chip *chip, unsigned off)
> @@ -120,7 +122,7 @@ static int adp5520_gpio_probe(struct platform_device
> *pdev)
> gc->direction_input = adp5520_gpio_direction_input;
> gc->direction_output = adp5520_gpio_direction_output;
> gc->get = adp5520_gpio_get_value;
> - gc->set = adp5520_gpio_set_value;
> + gc->set_rv = adp5520_gpio_set_value;
> gc->can_sleep = true;
>
> gc->base = pdata->gpio_start;
>
> --
> 2.45.2
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 06/15] gpio: adp5585: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (4 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 05/15] gpio: adp5520: " Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:46 ` Hennerich, Michael
2025-03-03 13:18 ` [PATCH 07/15] gpio: altera-a10sr: " Bartosz Golaszewski
` (8 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-adp5585.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/gpio/gpio-adp5585.c b/drivers/gpio/gpio-adp5585.c
index 000d31f09671..d5c0f1b267c8 100644
--- a/drivers/gpio/gpio-adp5585.c
+++ b/drivers/gpio/gpio-adp5585.c
@@ -86,14 +86,16 @@ static int adp5585_gpio_get_value(struct gpio_chip *chip, unsigned int off)
return !!(val & bit);
}
-static void adp5585_gpio_set_value(struct gpio_chip *chip, unsigned int off, int val)
+static int adp5585_gpio_set_value(struct gpio_chip *chip, unsigned int off,
+ int val)
{
struct adp5585_gpio_dev *adp5585_gpio = gpiochip_get_data(chip);
unsigned int bank = ADP5585_BANK(off);
unsigned int bit = ADP5585_BIT(off);
- regmap_update_bits(adp5585_gpio->regmap, ADP5585_GPO_DATA_OUT_A + bank,
- bit, val ? bit : 0);
+ return regmap_update_bits(adp5585_gpio->regmap,
+ ADP5585_GPO_DATA_OUT_A + bank,
+ bit, val ? bit : 0);
}
static int adp5585_gpio_set_bias(struct adp5585_gpio_dev *adp5585_gpio,
@@ -192,7 +194,7 @@ static int adp5585_gpio_probe(struct platform_device *pdev)
gc->direction_input = adp5585_gpio_direction_input;
gc->direction_output = adp5585_gpio_direction_output;
gc->get = adp5585_gpio_get_value;
- gc->set = adp5585_gpio_set_value;
+ gc->set_rv = adp5585_gpio_set_value;
gc->set_config = adp5585_gpio_set_config;
gc->can_sleep = true;
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* RE: [PATCH 06/15] gpio: adp5585: use new line value setter callbacks
2025-03-03 13:18 ` [PATCH 06/15] gpio: adp5585: " Bartosz Golaszewski
@ 2025-03-03 13:46 ` Hennerich, Michael
0 siblings, 0 replies; 24+ messages in thread
From: Hennerich, Michael @ 2025-03-03 13:46 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Laurent Pinchart,
Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-pwm@vger.kernel.org, patches@opensource.cirrus.com,
linux-arm-kernel@lists.infradead.org,
linux-aspeed@lists.ozlabs.org, Bartosz Golaszewski
> -----Original Message-----
> From: Bartosz Golaszewski <brgl@bgdev.pl>
> Sent: Monday, March 3, 2025 2:19 PM
> To: Linus Walleij <linus.walleij@linaro.org>; Bartosz Golaszewski
> <brgl@bgdev.pl>; Hennerich, Michael <Michael.Hennerich@analog.com>;
> Laurent Pinchart <laurent.pinchart@ideasonboard.com>; Mun Yew Tham
> <mun.yew.tham@intel.com>; Joel Stanley <joel@jms.id.au>; Andrew Jeffery
> <andrew@codeconstruct.com.au>
> Cc: linux-gpio@vger.kernel.org; linux-kernel@vger.kernel.org; linux-
> pwm@vger.kernel.org; patches@opensource.cirrus.com; linux-arm-
> kernel@lists.infradead.org; linux-aspeed@lists.ozlabs.org; Bartosz Golaszewski
> <bartosz.golaszewski@linaro.org>
> Subject: [PATCH 06/15] gpio: adp5585: use new line value setter callbacks
>
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> struct gpio_chip now has callbacks for setting line values that return an
> integer, allowing to indicate failures. Convert the driver to using them.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Acked-by: Michael Hennerich <michael.hennerich@analog.com>
> ---
> drivers/gpio/gpio-adp5585.c | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpio/gpio-adp5585.c b/drivers/gpio/gpio-adp5585.c index
> 000d31f09671..d5c0f1b267c8 100644
> --- a/drivers/gpio/gpio-adp5585.c
> +++ b/drivers/gpio/gpio-adp5585.c
> @@ -86,14 +86,16 @@ static int adp5585_gpio_get_value(struct gpio_chip
> *chip, unsigned int off)
> return !!(val & bit);
> }
>
> -static void adp5585_gpio_set_value(struct gpio_chip *chip, unsigned int off,
> int val)
> +static int adp5585_gpio_set_value(struct gpio_chip *chip, unsigned int off,
> + int val)
> {
> struct adp5585_gpio_dev *adp5585_gpio = gpiochip_get_data(chip);
> unsigned int bank = ADP5585_BANK(off);
> unsigned int bit = ADP5585_BIT(off);
>
> - regmap_update_bits(adp5585_gpio->regmap,
> ADP5585_GPO_DATA_OUT_A + bank,
> - bit, val ? bit : 0);
> + return regmap_update_bits(adp5585_gpio->regmap,
> + ADP5585_GPO_DATA_OUT_A + bank,
> + bit, val ? bit : 0);
> }
>
> static int adp5585_gpio_set_bias(struct adp5585_gpio_dev *adp5585_gpio,
> @@ -192,7 +194,7 @@ static int adp5585_gpio_probe(struct platform_device
> *pdev)
> gc->direction_input = adp5585_gpio_direction_input;
> gc->direction_output = adp5585_gpio_direction_output;
> gc->get = adp5585_gpio_get_value;
> - gc->set = adp5585_gpio_set_value;
> + gc->set_rv = adp5585_gpio_set_value;
> gc->set_config = adp5585_gpio_set_config;
> gc->can_sleep = true;
>
>
> --
> 2.45.2
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 07/15] gpio: altera-a10sr: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (5 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 06/15] gpio: adp5585: " Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 08/15] gpio: altera: " Bartosz Golaszewski
` (7 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-altera-a10sr.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/gpio/gpio-altera-a10sr.c b/drivers/gpio/gpio-altera-a10sr.c
index 11edf1fe6c90..77a674cf99e4 100644
--- a/drivers/gpio/gpio-altera-a10sr.c
+++ b/drivers/gpio/gpio-altera-a10sr.c
@@ -35,15 +35,15 @@ static int altr_a10sr_gpio_get(struct gpio_chip *chip, unsigned int offset)
return !!(val & BIT(offset - ALTR_A10SR_LED_VALID_SHIFT));
}
-static void altr_a10sr_gpio_set(struct gpio_chip *chip, unsigned int offset,
- int value)
+static int altr_a10sr_gpio_set(struct gpio_chip *chip, unsigned int offset,
+ int value)
{
struct altr_a10sr_gpio *gpio = gpiochip_get_data(chip);
- regmap_update_bits(gpio->regmap, ALTR_A10SR_LED_REG,
- BIT(ALTR_A10SR_LED_VALID_SHIFT + offset),
- value ? BIT(ALTR_A10SR_LED_VALID_SHIFT + offset)
- : 0);
+ return regmap_update_bits(gpio->regmap, ALTR_A10SR_LED_REG,
+ BIT(ALTR_A10SR_LED_VALID_SHIFT + offset),
+ value ?
+ BIT(ALTR_A10SR_LED_VALID_SHIFT + offset) : 0);
}
static int altr_a10sr_gpio_direction_input(struct gpio_chip *gc,
@@ -69,7 +69,7 @@ static const struct gpio_chip altr_a10sr_gc = {
.label = "altr_a10sr_gpio",
.owner = THIS_MODULE,
.get = altr_a10sr_gpio_get,
- .set = altr_a10sr_gpio_set,
+ .set_rv = altr_a10sr_gpio_set,
.direction_input = altr_a10sr_gpio_direction_input,
.direction_output = altr_a10sr_gpio_direction_output,
.can_sleep = true,
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 08/15] gpio: altera: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (6 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 07/15] gpio: altera-a10sr: " Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 09/15] gpio: amd8111: " Bartosz Golaszewski
` (6 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-altera.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/gpio/gpio-altera.c b/drivers/gpio/gpio-altera.c
index 17ab039c7413..1b28525726d7 100644
--- a/drivers/gpio/gpio-altera.c
+++ b/drivers/gpio/gpio-altera.c
@@ -113,7 +113,7 @@ static int altera_gpio_get(struct gpio_chip *gc, unsigned offset)
return !!(readl(altera_gc->regs + ALTERA_GPIO_DATA) & BIT(offset));
}
-static void altera_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
+static int altera_gpio_set(struct gpio_chip *gc, unsigned int offset, int value)
{
struct altera_gpio_chip *altera_gc = gpiochip_get_data(gc);
unsigned long flags;
@@ -127,6 +127,8 @@ static void altera_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
data_reg &= ~BIT(offset);
writel(data_reg, altera_gc->regs + ALTERA_GPIO_DATA);
raw_spin_unlock_irqrestore(&altera_gc->gpio_lock, flags);
+
+ return 0;
}
static int altera_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
@@ -257,7 +259,7 @@ static int altera_gpio_probe(struct platform_device *pdev)
altera_gc->gc.direction_input = altera_gpio_direction_input;
altera_gc->gc.direction_output = altera_gpio_direction_output;
altera_gc->gc.get = altera_gpio_get;
- altera_gc->gc.set = altera_gpio_set;
+ altera_gc->gc.set_rv = altera_gpio_set;
altera_gc->gc.owner = THIS_MODULE;
altera_gc->gc.parent = &pdev->dev;
altera_gc->gc.base = -1;
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 09/15] gpio: amd8111: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (7 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 08/15] gpio: altera: " Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 10/15] gpio: amd-fch: " Bartosz Golaszewski
` (5 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-amd8111.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/gpio/gpio-amd8111.c b/drivers/gpio/gpio-amd8111.c
index 3377667a28de..425d8472f744 100644
--- a/drivers/gpio/gpio-amd8111.c
+++ b/drivers/gpio/gpio-amd8111.c
@@ -94,7 +94,7 @@ static void amd_gpio_free(struct gpio_chip *chip, unsigned offset)
iowrite8(agp->orig[offset], agp->pm + AMD_REG_GPIO(offset));
}
-static void amd_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+static int amd_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
{
struct amd_gpio *agp = gpiochip_get_data(chip);
u8 temp;
@@ -107,6 +107,8 @@ static void amd_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
spin_unlock_irqrestore(&agp->lock, flags);
dev_dbg(&agp->pdev->dev, "Setting gpio %d, value %d, reg=%02x\n", offset, !!value, temp);
+
+ return 0;
}
static int amd_gpio_get(struct gpio_chip *chip, unsigned offset)
@@ -163,7 +165,7 @@ static struct amd_gpio gp = {
.ngpio = 32,
.request = amd_gpio_request,
.free = amd_gpio_free,
- .set = amd_gpio_set,
+ .set_rv = amd_gpio_set,
.get = amd_gpio_get,
.direction_output = amd_gpio_dirout,
.direction_input = amd_gpio_dirin,
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 10/15] gpio: amd-fch: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (8 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 09/15] gpio: amd8111: " Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 11/15] gpio: arizona: " Bartosz Golaszewski
` (4 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-amd-fch.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/gpio/gpio-amd-fch.c b/drivers/gpio/gpio-amd-fch.c
index 2a21354ed6a0..f8d0cea46049 100644
--- a/drivers/gpio/gpio-amd-fch.c
+++ b/drivers/gpio/gpio-amd-fch.c
@@ -95,8 +95,7 @@ static int amd_fch_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
return ret ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN;
}
-static void amd_fch_gpio_set(struct gpio_chip *gc,
- unsigned int gpio, int value)
+static int amd_fch_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value)
{
unsigned long flags;
struct amd_fch_gpio_priv *priv = gpiochip_get_data(gc);
@@ -113,6 +112,8 @@ static void amd_fch_gpio_set(struct gpio_chip *gc,
writel_relaxed(mask, ptr);
spin_unlock_irqrestore(&priv->lock, flags);
+
+ return 0;
}
static int amd_fch_gpio_get(struct gpio_chip *gc,
@@ -164,7 +165,7 @@ static int amd_fch_gpio_probe(struct platform_device *pdev)
priv->gc.direction_output = amd_fch_gpio_direction_output;
priv->gc.get_direction = amd_fch_gpio_get_direction;
priv->gc.get = amd_fch_gpio_get;
- priv->gc.set = amd_fch_gpio_set;
+ priv->gc.set_rv = amd_fch_gpio_set;
spin_lock_init(&priv->lock);
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 11/15] gpio: arizona: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (9 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 10/15] gpio: amd-fch: " Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-03 13:33 ` Richard Fitzgerald
2025-03-03 13:18 ` [PATCH 12/15] gpio: aspeed: use lock guards Bartosz Golaszewski
` (3 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-arizona.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/gpio/gpio-arizona.c b/drivers/gpio/gpio-arizona.c
index c15fda99120a..e530c94dcce8 100644
--- a/drivers/gpio/gpio-arizona.c
+++ b/drivers/gpio/gpio-arizona.c
@@ -121,7 +121,8 @@ static int arizona_gpio_direction_out(struct gpio_chip *chip,
ARIZONA_GPN_DIR | ARIZONA_GPN_LVL, value);
}
-static void arizona_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+static int arizona_gpio_set(struct gpio_chip *chip, unsigned int offset,
+ int value)
{
struct arizona_gpio *arizona_gpio = gpiochip_get_data(chip);
struct arizona *arizona = arizona_gpio->arizona;
@@ -129,8 +130,8 @@ static void arizona_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
if (value)
value = ARIZONA_GPN_LVL;
- regmap_update_bits(arizona->regmap, ARIZONA_GPIO1_CTRL + offset,
- ARIZONA_GPN_LVL, value);
+ return regmap_update_bits(arizona->regmap, ARIZONA_GPIO1_CTRL + offset,
+ ARIZONA_GPN_LVL, value);
}
static const struct gpio_chip template_chip = {
@@ -139,7 +140,7 @@ static const struct gpio_chip template_chip = {
.direction_input = arizona_gpio_direction_in,
.get = arizona_gpio_get,
.direction_output = arizona_gpio_direction_out,
- .set = arizona_gpio_set,
+ .set_rv = arizona_gpio_set,
.can_sleep = true,
};
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 11/15] gpio: arizona: use new line value setter callbacks
2025-03-03 13:18 ` [PATCH 11/15] gpio: arizona: " Bartosz Golaszewski
@ 2025-03-03 13:33 ` Richard Fitzgerald
0 siblings, 0 replies; 24+ messages in thread
From: Richard Fitzgerald @ 2025-03-03 13:33 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
On 03/03/2025 1:18 pm, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> struct gpio_chip now has callbacks for setting line values that return
> an integer, allowing to indicate failures. Convert the driver to using
> them.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
> drivers/gpio/gpio-arizona.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpio/gpio-arizona.c b/drivers/gpio/gpio-arizona.c
> index c15fda99120a..e530c94dcce8 100644
> --- a/drivers/gpio/gpio-arizona.c
> +++ b/drivers/gpio/gpio-arizona.c
> @@ -121,7 +121,8 @@ static int arizona_gpio_direction_out(struct gpio_chip *chip,
> ARIZONA_GPN_DIR | ARIZONA_GPN_LVL, value);
> }
>
> -static void arizona_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
> +static int arizona_gpio_set(struct gpio_chip *chip, unsigned int offset,
> + int value)
> {
> struct arizona_gpio *arizona_gpio = gpiochip_get_data(chip);
> struct arizona *arizona = arizona_gpio->arizona;
> @@ -129,8 +130,8 @@ static void arizona_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
> if (value)
> value = ARIZONA_GPN_LVL;
>
> - regmap_update_bits(arizona->regmap, ARIZONA_GPIO1_CTRL + offset,
> - ARIZONA_GPN_LVL, value);
> + return regmap_update_bits(arizona->regmap, ARIZONA_GPIO1_CTRL + offset,
> + ARIZONA_GPN_LVL, value);
> }
>
> static const struct gpio_chip template_chip = {
> @@ -139,7 +140,7 @@ static const struct gpio_chip template_chip = {
> .direction_input = arizona_gpio_direction_in,
> .get = arizona_gpio_get,
> .direction_output = arizona_gpio_direction_out,
> - .set = arizona_gpio_set,
> + .set_rv = arizona_gpio_set,
> .can_sleep = true,
> };
>
>
Reviewed-by: Richard Fitzgerald <rf@opensource.cirrus.com>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 12/15] gpio: aspeed: use lock guards
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (10 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 11/15] gpio: arizona: " Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-18 1:24 ` Andrew Jeffery
2025-03-03 13:18 ` [PATCH 13/15] gpio: aspeed: use new line value setter callbacks Bartosz Golaszewski
` (2 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reduce the code complexity by using automatic lock guards with the raw
spinlock.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-aspeed.c | 101 +++++++++++++++++----------------------------
1 file changed, 38 insertions(+), 63 deletions(-)
diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c
index 40c1bd80f8b0..e2535aad1026 100644
--- a/drivers/gpio/gpio-aspeed.c
+++ b/drivers/gpio/gpio-aspeed.c
@@ -5,6 +5,7 @@
* Joel Stanley <joel@jms.id.au>
*/
+#include <linux/cleanup.h>
#include <linux/clk.h>
#include <linux/gpio/aspeed.h>
#include <linux/gpio/driver.h>
@@ -427,37 +428,33 @@ static void aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
int val)
{
struct aspeed_gpio *gpio = gpiochip_get_data(gc);
- unsigned long flags;
bool copro = false;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
+
copro = aspeed_gpio_copro_request(gpio, offset);
__aspeed_gpio_set(gc, offset, val);
if (copro)
aspeed_gpio_copro_release(gpio, offset);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
}
static int aspeed_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
{
struct aspeed_gpio *gpio = gpiochip_get_data(gc);
- unsigned long flags;
bool copro = false;
if (!have_input(gpio, offset))
return -ENOTSUPP;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
copro = aspeed_gpio_copro_request(gpio, offset);
gpio->config->llops->reg_bit_set(gpio, offset, reg_dir, 0);
if (copro)
aspeed_gpio_copro_release(gpio, offset);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
-
return 0;
}
@@ -465,13 +462,12 @@ static int aspeed_gpio_dir_out(struct gpio_chip *gc,
unsigned int offset, int val)
{
struct aspeed_gpio *gpio = gpiochip_get_data(gc);
- unsigned long flags;
bool copro = false;
if (!have_output(gpio, offset))
return -ENOTSUPP;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
copro = aspeed_gpio_copro_request(gpio, offset);
__aspeed_gpio_set(gc, offset, val);
@@ -479,7 +475,6 @@ static int aspeed_gpio_dir_out(struct gpio_chip *gc,
if (copro)
aspeed_gpio_copro_release(gpio, offset);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
return 0;
}
@@ -487,7 +482,6 @@ static int aspeed_gpio_dir_out(struct gpio_chip *gc,
static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
{
struct aspeed_gpio *gpio = gpiochip_get_data(gc);
- unsigned long flags;
u32 val;
if (!have_input(gpio, offset))
@@ -496,12 +490,10 @@ static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
if (!have_output(gpio, offset))
return GPIO_LINE_DIRECTION_IN;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
val = gpio->config->llops->reg_bit_get(gpio, offset, reg_dir);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
-
return val ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN;
}
@@ -527,7 +519,6 @@ static inline int irqd_to_aspeed_gpio_data(struct irq_data *d,
static void aspeed_gpio_irq_ack(struct irq_data *d)
{
struct aspeed_gpio *gpio;
- unsigned long flags;
int rc, offset;
bool copro = false;
@@ -535,20 +526,19 @@ static void aspeed_gpio_irq_ack(struct irq_data *d)
if (rc)
return;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
+
copro = aspeed_gpio_copro_request(gpio, offset);
gpio->config->llops->reg_bit_set(gpio, offset, reg_irq_status, 1);
if (copro)
aspeed_gpio_copro_release(gpio, offset);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
}
static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
{
struct aspeed_gpio *gpio;
- unsigned long flags;
int rc, offset;
bool copro = false;
@@ -560,14 +550,14 @@ static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
if (set)
gpiochip_enable_irq(&gpio->chip, irqd_to_hwirq(d));
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
+
copro = aspeed_gpio_copro_request(gpio, offset);
gpio->config->llops->reg_bit_set(gpio, offset, reg_irq_enable, set);
if (copro)
aspeed_gpio_copro_release(gpio, offset);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
/* Masking the IRQ */
if (!set)
@@ -591,7 +581,6 @@ static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)
u32 type2 = 0;
irq_flow_handler_t handler;
struct aspeed_gpio *gpio;
- unsigned long flags;
int rc, offset;
bool copro = false;
@@ -620,16 +609,19 @@ static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)
return -EINVAL;
}
- raw_spin_lock_irqsave(&gpio->lock, flags);
- copro = aspeed_gpio_copro_request(gpio, offset);
+ scoped_guard(raw_spinlock_irqsave, &gpio->lock) {
+ copro = aspeed_gpio_copro_request(gpio, offset);
- gpio->config->llops->reg_bit_set(gpio, offset, reg_irq_type0, type0);
- gpio->config->llops->reg_bit_set(gpio, offset, reg_irq_type1, type1);
- gpio->config->llops->reg_bit_set(gpio, offset, reg_irq_type2, type2);
+ gpio->config->llops->reg_bit_set(gpio, offset, reg_irq_type0,
+ type0);
+ gpio->config->llops->reg_bit_set(gpio, offset, reg_irq_type1,
+ type1);
+ gpio->config->llops->reg_bit_set(gpio, offset, reg_irq_type2,
+ type2);
- if (copro)
- aspeed_gpio_copro_release(gpio, offset);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
+ if (copro)
+ aspeed_gpio_copro_release(gpio, offset);
+ }
irq_set_handler_locked(d, handler);
@@ -686,17 +678,16 @@ static int aspeed_gpio_reset_tolerance(struct gpio_chip *chip,
unsigned int offset, bool enable)
{
struct aspeed_gpio *gpio = gpiochip_get_data(chip);
- unsigned long flags;
bool copro = false;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
+
copro = aspeed_gpio_copro_request(gpio, offset);
gpio->config->llops->reg_bit_set(gpio, offset, reg_tolerance, enable);
if (copro)
aspeed_gpio_copro_release(gpio, offset);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
return 0;
}
@@ -798,7 +789,6 @@ static int enable_debounce(struct gpio_chip *chip, unsigned int offset,
{
struct aspeed_gpio *gpio = gpiochip_get_data(chip);
u32 requested_cycles;
- unsigned long flags;
int rc;
int i;
@@ -812,12 +802,12 @@ static int enable_debounce(struct gpio_chip *chip, unsigned int offset,
return rc;
}
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
if (timer_allocation_registered(gpio, offset)) {
rc = unregister_allocated_timer(gpio, offset);
if (rc < 0)
- goto out;
+ return rc;
}
/* Try to find a timer already configured for the debounce period */
@@ -855,7 +845,7 @@ static int enable_debounce(struct gpio_chip *chip, unsigned int offset,
* consistency.
*/
configure_timer(gpio, offset, 0);
- goto out;
+ return rc;
}
i = j;
@@ -863,34 +853,26 @@ static int enable_debounce(struct gpio_chip *chip, unsigned int offset,
iowrite32(requested_cycles, gpio->base + gpio->config->debounce_timers_array[i]);
}
- if (WARN(i == 0, "Cannot register index of disabled timer\n")) {
- rc = -EINVAL;
- goto out;
- }
+ if (WARN(i == 0, "Cannot register index of disabled timer\n"))
+ return -EINVAL;
register_allocated_timer(gpio, offset, i);
configure_timer(gpio, offset, i);
-out:
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
-
return rc;
}
static int disable_debounce(struct gpio_chip *chip, unsigned int offset)
{
struct aspeed_gpio *gpio = gpiochip_get_data(chip);
- unsigned long flags;
int rc;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
rc = unregister_allocated_timer(gpio, offset);
if (!rc)
configure_timer(gpio, offset, 0);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
-
return rc;
}
@@ -961,7 +943,6 @@ int aspeed_gpio_copro_grab_gpio(struct gpio_desc *desc,
struct aspeed_gpio *gpio = gpiochip_get_data(chip);
int rc = 0, bindex, offset = gpio_chip_hwgpio(desc);
const struct aspeed_gpio_bank *bank = to_bank(offset);
- unsigned long flags;
if (!aspeed_gpio_support_copro(gpio))
return -EOPNOTSUPP;
@@ -974,13 +955,12 @@ int aspeed_gpio_copro_grab_gpio(struct gpio_desc *desc,
return -EINVAL;
bindex = offset >> 3;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
/* Sanity check, this shouldn't happen */
- if (gpio->cf_copro_bankmap[bindex] == 0xff) {
- rc = -EIO;
- goto bail;
- }
+ if (gpio->cf_copro_bankmap[bindex] == 0xff)
+ return -EIO;
+
gpio->cf_copro_bankmap[bindex]++;
/* Switch command source */
@@ -994,8 +974,6 @@ int aspeed_gpio_copro_grab_gpio(struct gpio_desc *desc,
*dreg_offset = bank->rdata_reg;
if (bit)
*bit = GPIO_OFFSET(offset);
- bail:
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
return rc;
}
EXPORT_SYMBOL_GPL(aspeed_gpio_copro_grab_gpio);
@@ -1009,7 +987,6 @@ int aspeed_gpio_copro_release_gpio(struct gpio_desc *desc)
struct gpio_chip *chip = gpiod_to_chip(desc);
struct aspeed_gpio *gpio = gpiochip_get_data(chip);
int rc = 0, bindex, offset = gpio_chip_hwgpio(desc);
- unsigned long flags;
if (!aspeed_gpio_support_copro(gpio))
return -EOPNOTSUPP;
@@ -1021,21 +998,19 @@ int aspeed_gpio_copro_release_gpio(struct gpio_desc *desc)
return -EINVAL;
bindex = offset >> 3;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
/* Sanity check, this shouldn't happen */
- if (gpio->cf_copro_bankmap[bindex] == 0) {
- rc = -EIO;
- goto bail;
- }
+ if (gpio->cf_copro_bankmap[bindex] == 0)
+ return -EIO;
+
gpio->cf_copro_bankmap[bindex]--;
/* Switch command source */
if (gpio->cf_copro_bankmap[bindex] == 0)
aspeed_gpio_change_cmd_source(gpio, offset,
GPIO_CMDSRC_ARM);
- bail:
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
+
return rc;
}
EXPORT_SYMBOL_GPL(aspeed_gpio_copro_release_gpio);
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 12/15] gpio: aspeed: use lock guards
2025-03-03 13:18 ` [PATCH 12/15] gpio: aspeed: use lock guards Bartosz Golaszewski
@ 2025-03-18 1:24 ` Andrew Jeffery
0 siblings, 0 replies; 24+ messages in thread
From: Andrew Jeffery @ 2025-03-18 1:24 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
On Mon, 2025-03-03 at 14:18 +0100, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> Reduce the code complexity by using automatic lock guards with the raw
> spinlock.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Nice!
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 13/15] gpio: aspeed: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (11 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 12/15] gpio: aspeed: use lock guards Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-18 1:25 ` Andrew Jeffery
2025-03-03 13:18 ` [PATCH 14/15] gpio: aspeed-sgpio: use lock guards Bartosz Golaszewski
2025-03-03 13:18 ` [PATCH 15/15] gpio: aspeed-sgpio: use new line value setter callbacks Bartosz Golaszewski
14 siblings, 1 reply; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-aspeed.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c
index e2535aad1026..2d340a343a17 100644
--- a/drivers/gpio/gpio-aspeed.c
+++ b/drivers/gpio/gpio-aspeed.c
@@ -424,8 +424,7 @@ static void __aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
gpio->config->llops->reg_bit_get(gpio, offset, reg_val);
}
-static void aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
- int val)
+static int aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset, int val)
{
struct aspeed_gpio *gpio = gpiochip_get_data(gc);
bool copro = false;
@@ -438,6 +437,8 @@ static void aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
if (copro)
aspeed_gpio_copro_release(gpio, offset);
+
+ return 0;
}
static int aspeed_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
@@ -1351,7 +1352,7 @@ static int aspeed_gpio_probe(struct platform_device *pdev)
gpio->chip.request = aspeed_gpio_request;
gpio->chip.free = aspeed_gpio_free;
gpio->chip.get = aspeed_gpio_get;
- gpio->chip.set = aspeed_gpio_set;
+ gpio->chip.set_rv = aspeed_gpio_set;
gpio->chip.set_config = aspeed_gpio_set_config;
gpio->chip.label = dev_name(&pdev->dev);
gpio->chip.base = -1;
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 13/15] gpio: aspeed: use new line value setter callbacks
2025-03-03 13:18 ` [PATCH 13/15] gpio: aspeed: use new line value setter callbacks Bartosz Golaszewski
@ 2025-03-18 1:25 ` Andrew Jeffery
0 siblings, 0 replies; 24+ messages in thread
From: Andrew Jeffery @ 2025-03-18 1:25 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
On Mon, 2025-03-03 at 14:18 +0100, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> struct gpio_chip now has callbacks for setting line values that return
> an integer, allowing to indicate failures. Convert the driver to using
> them.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 14/15] gpio: aspeed-sgpio: use lock guards
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (12 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 13/15] gpio: aspeed: use new line value setter callbacks Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-18 1:26 ` Andrew Jeffery
2025-03-03 13:18 ` [PATCH 15/15] gpio: aspeed-sgpio: use new line value setter callbacks Bartosz Golaszewski
14 siblings, 1 reply; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reduce the code complexity by using automatic lock guards with the raw
spinlock.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-aspeed-sgpio.c | 76 +++++++++++++++-------------------------
1 file changed, 29 insertions(+), 47 deletions(-)
diff --git a/drivers/gpio/gpio-aspeed-sgpio.c b/drivers/gpio/gpio-aspeed-sgpio.c
index 34eb26298e32..5ce86de22563 100644
--- a/drivers/gpio/gpio-aspeed-sgpio.c
+++ b/drivers/gpio/gpio-aspeed-sgpio.c
@@ -6,6 +6,7 @@
*/
#include <linux/bitfield.h>
+#include <linux/cleanup.h>
#include <linux/clk.h>
#include <linux/gpio/driver.h>
#include <linux/hashtable.h>
@@ -170,17 +171,14 @@ static int aspeed_sgpio_get(struct gpio_chip *gc, unsigned int offset)
{
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
const struct aspeed_sgpio_bank *bank = to_bank(offset);
- unsigned long flags;
enum aspeed_sgpio_reg reg;
int rc = 0;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
reg = aspeed_sgpio_is_input(offset) ? reg_val : reg_rdata;
rc = !!(ioread32(bank_reg(gpio, bank, reg)) & GPIO_BIT(offset));
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
-
return rc;
}
@@ -214,13 +212,10 @@ static int sgpio_set_value(struct gpio_chip *gc, unsigned int offset, int val)
static void aspeed_sgpio_set(struct gpio_chip *gc, unsigned int offset, int val)
{
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
- unsigned long flags;
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
sgpio_set_value(gc, offset, val);
-
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
}
static int aspeed_sgpio_dir_in(struct gpio_chip *gc, unsigned int offset)
@@ -231,15 +226,14 @@ static int aspeed_sgpio_dir_in(struct gpio_chip *gc, unsigned int offset)
static int aspeed_sgpio_dir_out(struct gpio_chip *gc, unsigned int offset, int val)
{
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
- unsigned long flags;
int rc;
/* No special action is required for setting the direction; we'll
* error-out in sgpio_set_value if this isn't an output GPIO */
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
+
rc = sgpio_set_value(gc, offset, val);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
return rc;
}
@@ -269,7 +263,6 @@ static void aspeed_sgpio_irq_ack(struct irq_data *d)
{
const struct aspeed_sgpio_bank *bank;
struct aspeed_sgpio *gpio;
- unsigned long flags;
void __iomem *status_addr;
int offset;
u32 bit;
@@ -278,18 +271,15 @@ static void aspeed_sgpio_irq_ack(struct irq_data *d)
status_addr = bank_reg(gpio, bank, reg_irq_status);
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
iowrite32(bit, status_addr);
-
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
}
static void aspeed_sgpio_irq_set_mask(struct irq_data *d, bool set)
{
const struct aspeed_sgpio_bank *bank;
struct aspeed_sgpio *gpio;
- unsigned long flags;
u32 reg, bit;
void __iomem *addr;
int offset;
@@ -301,17 +291,15 @@ static void aspeed_sgpio_irq_set_mask(struct irq_data *d, bool set)
if (set)
gpiochip_enable_irq(&gpio->chip, irqd_to_hwirq(d));
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ scoped_guard(raw_spinlock_irqsave, &gpio->lock) {
+ reg = ioread32(addr);
+ if (set)
+ reg |= bit;
+ else
+ reg &= ~bit;
- reg = ioread32(addr);
- if (set)
- reg |= bit;
- else
- reg &= ~bit;
-
- iowrite32(reg, addr);
-
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
+ iowrite32(reg, addr);
+ }
/* Masking the IRQ */
if (!set)
@@ -339,7 +327,6 @@ static int aspeed_sgpio_set_type(struct irq_data *d, unsigned int type)
const struct aspeed_sgpio_bank *bank;
irq_flow_handler_t handler;
struct aspeed_sgpio *gpio;
- unsigned long flags;
void __iomem *addr;
int offset;
@@ -366,24 +353,22 @@ static int aspeed_sgpio_set_type(struct irq_data *d, unsigned int type)
return -EINVAL;
}
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ scoped_guard(raw_spinlock_irqsave, &gpio->lock) {
+ addr = bank_reg(gpio, bank, reg_irq_type0);
+ reg = ioread32(addr);
+ reg = (reg & ~bit) | type0;
+ iowrite32(reg, addr);
- addr = bank_reg(gpio, bank, reg_irq_type0);
- reg = ioread32(addr);
- reg = (reg & ~bit) | type0;
- iowrite32(reg, addr);
+ addr = bank_reg(gpio, bank, reg_irq_type1);
+ reg = ioread32(addr);
+ reg = (reg & ~bit) | type1;
+ iowrite32(reg, addr);
- addr = bank_reg(gpio, bank, reg_irq_type1);
- reg = ioread32(addr);
- reg = (reg & ~bit) | type1;
- iowrite32(reg, addr);
-
- addr = bank_reg(gpio, bank, reg_irq_type2);
- reg = ioread32(addr);
- reg = (reg & ~bit) | type2;
- iowrite32(reg, addr);
-
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
+ addr = bank_reg(gpio, bank, reg_irq_type2);
+ reg = ioread32(addr);
+ reg = (reg & ~bit) | type2;
+ iowrite32(reg, addr);
+ }
irq_set_handler_locked(d, handler);
@@ -487,13 +472,12 @@ static int aspeed_sgpio_reset_tolerance(struct gpio_chip *chip,
unsigned int offset, bool enable)
{
struct aspeed_sgpio *gpio = gpiochip_get_data(chip);
- unsigned long flags;
void __iomem *reg;
u32 val;
reg = bank_reg(gpio, to_bank(offset), reg_tolerance);
- raw_spin_lock_irqsave(&gpio->lock, flags);
+ guard(raw_spinlock_irqsave)(&gpio->lock);
val = readl(reg);
@@ -504,8 +488,6 @@ static int aspeed_sgpio_reset_tolerance(struct gpio_chip *chip,
writel(val, reg);
- raw_spin_unlock_irqrestore(&gpio->lock, flags);
-
return 0;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 14/15] gpio: aspeed-sgpio: use lock guards
2025-03-03 13:18 ` [PATCH 14/15] gpio: aspeed-sgpio: use lock guards Bartosz Golaszewski
@ 2025-03-18 1:26 ` Andrew Jeffery
0 siblings, 0 replies; 24+ messages in thread
From: Andrew Jeffery @ 2025-03-18 1:26 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
On Mon, 2025-03-03 at 14:18 +0100, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> Reduce the code complexity by using automatic lock guards with the raw
> spinlock.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 15/15] gpio: aspeed-sgpio: use new line value setter callbacks
2025-03-03 13:18 [PATCH 00/15] gpio: convert more drivers to using the new value setters Bartosz Golaszewski
` (13 preceding siblings ...)
2025-03-03 13:18 ` [PATCH 14/15] gpio: aspeed-sgpio: use lock guards Bartosz Golaszewski
@ 2025-03-03 13:18 ` Bartosz Golaszewski
2025-03-18 1:27 ` Andrew Jeffery
14 siblings, 1 reply; 24+ messages in thread
From: Bartosz Golaszewski @ 2025-03-03 13:18 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley, Andrew Jeffery
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpio-aspeed-sgpio.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpio/gpio-aspeed-sgpio.c b/drivers/gpio/gpio-aspeed-sgpio.c
index 5ce86de22563..00b31497ecff 100644
--- a/drivers/gpio/gpio-aspeed-sgpio.c
+++ b/drivers/gpio/gpio-aspeed-sgpio.c
@@ -209,13 +209,13 @@ static int sgpio_set_value(struct gpio_chip *gc, unsigned int offset, int val)
return 0;
}
-static void aspeed_sgpio_set(struct gpio_chip *gc, unsigned int offset, int val)
+static int aspeed_sgpio_set(struct gpio_chip *gc, unsigned int offset, int val)
{
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
guard(raw_spinlock_irqsave)(&gpio->lock);
- sgpio_set_value(gc, offset, val);
+ return sgpio_set_value(gc, offset, val);
}
static int aspeed_sgpio_dir_in(struct gpio_chip *gc, unsigned int offset)
@@ -596,7 +596,7 @@ static int __init aspeed_sgpio_probe(struct platform_device *pdev)
gpio->chip.request = NULL;
gpio->chip.free = NULL;
gpio->chip.get = aspeed_sgpio_get;
- gpio->chip.set = aspeed_sgpio_set;
+ gpio->chip.set_rv = aspeed_sgpio_set;
gpio->chip.set_config = aspeed_sgpio_set_config;
gpio->chip.label = dev_name(&pdev->dev);
gpio->chip.base = -1;
--
2.45.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 15/15] gpio: aspeed-sgpio: use new line value setter callbacks
2025-03-03 13:18 ` [PATCH 15/15] gpio: aspeed-sgpio: use new line value setter callbacks Bartosz Golaszewski
@ 2025-03-18 1:27 ` Andrew Jeffery
0 siblings, 0 replies; 24+ messages in thread
From: Andrew Jeffery @ 2025-03-18 1:27 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Michael Hennerich,
Laurent Pinchart, Mun Yew Tham, Joel Stanley
Cc: linux-gpio, linux-kernel, linux-pwm, patches, linux-arm-kernel,
linux-aspeed, Bartosz Golaszewski
On Mon, 2025-03-03 at 14:18 +0100, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> struct gpio_chip now has callbacks for setting line values that return
> an integer, allowing to indicate failures. Convert the driver to using
> them.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
^ permalink raw reply [flat|nested] 24+ messages in thread