[PATCH 05/11] pinctrl: aw9523: Simplify locking with guard()
Krzysztof Kozlowski
krzysztof.kozlowski at oss.qualcomm.com
Thu Jan 15 02:30:06 AEDT 2026
Simplify error handling (less gotos) over locks with guard() which also
removes possibility (at least by reading the code) of returning
uninitialized rc/ret value in aw9523_pconf_set() and
aw9523_gpio_get_multiple() functions.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at oss.qualcomm.com>
---
drivers/pinctrl/pinctrl-aw9523.c | 53 +++++++++++++++++-----------------------
1 file changed, 23 insertions(+), 30 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-aw9523.c b/drivers/pinctrl/pinctrl-aw9523.c
index 479553a79216..02a24ac87ea4 100644
--- a/drivers/pinctrl/pinctrl-aw9523.c
+++ b/drivers/pinctrl/pinctrl-aw9523.c
@@ -291,14 +291,14 @@ static int aw9523_pconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
unsigned int mask, val;
int i, rc;
- mutex_lock(&awi->i2c_lock);
+ guard(mutex)(&awi->i2c_lock);
for (i = 0; i < num_configs; i++) {
param = pinconf_to_config_param(configs[i]);
arg = pinconf_to_config_argument(configs[i]);
rc = aw9523_pcfg_param_to_reg(param, pin, ®);
if (rc)
- goto end;
+ return rc;
switch (param) {
case PIN_CONFIG_LEVEL:
@@ -307,7 +307,7 @@ static int aw9523_pconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
AW9523_REG_CONF_STATE(pin),
BIT(regbit), 0);
if (rc)
- goto end;
+ return rc;
/* Then, fall through to config output level */
fallthrough;
@@ -323,10 +323,9 @@ static int aw9523_pconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
break;
case PIN_CONFIG_DRIVE_OPEN_DRAIN:
/* Open-Drain is supported only on port 0 */
- if (pin >= AW9523_PINS_PER_PORT) {
- rc = -ENOTSUPP;
- goto end;
- }
+ if (pin >= AW9523_PINS_PER_PORT)
+ return -ENOTSUPP;
+
mask = AW9523_GCR_GPOMD_MASK;
val = 0;
break;
@@ -341,17 +340,15 @@ static int aw9523_pconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
val = AW9523_GCR_GPOMD_MASK;
break;
default:
- rc = -ENOTSUPP;
- goto end;
+ return -ENOTSUPP;
}
rc = regmap_update_bits(awi->regmap, reg, mask, val);
if (rc)
- goto end;
+ return rc;
}
-end:
- mutex_unlock(&awi->i2c_lock);
- return rc;
+
+ return 0;
}
static const struct pinconf_ops aw9523_pinconf_ops = {
@@ -599,14 +596,14 @@ static int aw9523_gpio_get_multiple(struct gpio_chip *chip,
u8 m, state = 0;
int ret;
- mutex_lock(&awi->i2c_lock);
+ guard(mutex)(&awi->i2c_lock);
/* Port 0 (gpio 0-7) */
m = *mask;
if (m) {
ret = _aw9523_gpio_get_multiple(awi, 0, &state, m);
if (ret)
- goto out;
+ return ret;
}
*bits = state;
@@ -616,13 +613,12 @@ static int aw9523_gpio_get_multiple(struct gpio_chip *chip,
ret = _aw9523_gpio_get_multiple(awi, AW9523_PINS_PER_PORT,
&state, m);
if (ret)
- goto out;
+ return ret;
*bits |= (state << 8);
}
-out:
- mutex_unlock(&awi->i2c_lock);
- return ret;
+
+ return 0;
}
static int aw9523_gpio_set_multiple(struct gpio_chip *chip,
@@ -632,30 +628,28 @@ static int aw9523_gpio_set_multiple(struct gpio_chip *chip,
struct aw9523 *awi = gpiochip_get_data(chip);
u8 mask_lo, mask_hi, bits_lo, bits_hi;
unsigned int reg;
- int ret = 0;
+ int ret;
mask_lo = *mask;
mask_hi = *mask >> 8;
bits_lo = *bits;
bits_hi = *bits >> 8;
- mutex_lock(&awi->i2c_lock);
+ guard(mutex)(&awi->i2c_lock);
if (mask_hi) {
reg = AW9523_REG_OUT_STATE(AW9523_PINS_PER_PORT);
ret = regmap_write_bits(awi->regmap, reg, mask_hi, bits_hi);
if (ret)
- goto out;
+ return ret;
}
if (mask_lo) {
reg = AW9523_REG_OUT_STATE(0);
ret = regmap_write_bits(awi->regmap, reg, mask_lo, bits_lo);
if (ret)
- goto out;
+ return ret;
}
-out:
- mutex_unlock(&awi->i2c_lock);
- return ret;
+ return 0;
}
static int aw9523_gpio_set(struct gpio_chip *chip, unsigned int offset,
@@ -695,16 +689,15 @@ static int aw9523_direction_output(struct gpio_chip *chip,
u8 regbit = offset % AW9523_PINS_PER_PORT;
int ret;
- mutex_lock(&awi->i2c_lock);
+ guard(mutex)(&awi->i2c_lock);
ret = regmap_update_bits(awi->regmap, AW9523_REG_OUT_STATE(offset),
BIT(regbit), value ? BIT(regbit) : 0);
if (ret)
- goto end;
+ return ret;
ret = regmap_update_bits(awi->regmap, AW9523_REG_CONF_STATE(offset),
BIT(regbit), 0);
-end:
- mutex_unlock(&awi->i2c_lock);
+
return ret;
}
--
2.51.0
More information about the openbmc
mailing list