pinctrl: meson: amlogic-a4: fix gpio output glitch

When the system transitions from bootloader to kernel, the GPIO is
expected to keep driving high.

However, the Linux kernel first configures the pin direction and then
sets the output value. This may cause a brief low-level glitch on the
GPIO line, which can be problematic for regulator control.

By configuring the output value before switching the pin direction to
output, the glitch can be avoided.

This commit fixes the issue by swapping the configuration order.

Fixes: 6e9be3abb7 ("pinctrl: Add driver support for Amlogic SoCs")
Signed-off-by: Xianwei Zhao <xianwei.zhao@amlogic.com>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Linus Walleij <linusw@kernel.org>
This commit is contained in:
Xianwei Zhao 2026-05-18 08:26:20 +00:00 committed by Linus Walleij
parent 09c816e5c4
commit 45ad4de324

View File

@ -548,11 +548,11 @@ static int aml_pinconf_set_output_drive(struct aml_pinctrl *info,
{
int ret;
ret = aml_pinconf_set_output(info, pin, true);
ret = aml_pinconf_set_drive(info, pin, high);
if (ret)
return ret;
return aml_pinconf_set_drive(info, pin, high);
return aml_pinconf_set_output(info, pin, true);
}
static int aml_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
@ -921,15 +921,14 @@ static int aml_gpio_direction_output(struct gpio_chip *chip, unsigned int gpio,
unsigned int bit, reg;
int ret;
aml_gpio_calc_reg_and_bit(bank, AML_REG_DIR, gpio, &reg, &bit);
ret = regmap_update_bits(bank->reg_gpio, reg, BIT(bit), 0);
aml_gpio_calc_reg_and_bit(bank, AML_REG_OUT, gpio, &reg, &bit);
ret = regmap_update_bits(bank->reg_gpio, reg, BIT(bit),
value ? BIT(bit) : 0);
if (ret < 0)
return ret;
aml_gpio_calc_reg_and_bit(bank, AML_REG_OUT, gpio, &reg, &bit);
return regmap_update_bits(bank->reg_gpio, reg, BIT(bit),
value ? BIT(bit) : 0);
aml_gpio_calc_reg_and_bit(bank, AML_REG_DIR, gpio, &reg, &bit);
return regmap_update_bits(bank->reg_gpio, reg, BIT(bit), 0);
}
static int aml_gpio_set(struct gpio_chip *chip, unsigned int gpio, int value)