mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:44:45 +01:00
pinctrl: aw9523: Simplify locking with guard()
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>
This commit is contained in:
parent
b4b224ec05
commit
6fe3b96b05
1 changed files with 23 additions and 30 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue