]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pinctrl: aw9523: Simplify locking with guard()
authorKrzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Sun, 18 Jan 2026 18:09:28 +0000 (19:09 +0100)
committerLinus Walleij <linusw@kernel.org>
Mon, 19 Jan 2026 00:11:46 +0000 (01:11 +0100)
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@oss.qualcomm.com>
Signed-off-by: Linus Walleij <linusw@kernel.org>
drivers/pinctrl/pinctrl-aw9523.c

index 479553a79216145acf036ea2f6ae70410215999f..02a24ac87ea4b915d552e06fcb764d44fcca4e88 100644 (file)
@@ -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, &reg);
                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;
 }