Commit 6fe3b96b authored by Krzysztof Kozlowski's avatar Krzysztof Kozlowski Committed by Linus Walleij
Browse files

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: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Signed-off-by: default avatarLinus Walleij <linusw@kernel.org>
parent b4b224ec
Loading
Loading
Loading
Loading
+23 −30
Original line number Diff line number Diff line
@@ -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,19 +340,17 @@ 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;
	}
end:
	mutex_unlock(&awi->i2c_lock);
			return rc;
	}

	return 0;
}

static const struct pinconf_ops aw9523_pinconf_ops = {
	.pin_config_get = aw9523_pconf_get,
	.pin_config_set = aw9523_pconf_set,
@@ -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;
}