]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
pinctrl: meson: amlogic-a4: fix gpio output glitch
authorXianwei Zhao <xianwei.zhao@amlogic.com>
Mon, 18 May 2026 08:26:20 +0000 (08:26 +0000)
committerLinus Walleij <linusw@kernel.org>
Tue, 26 May 2026 09:53:55 +0000 (11:53 +0200)
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: 6e9be3abb78c ("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>
drivers/pinctrl/meson/pinctrl-amlogic-a4.c

index e2293a872dcb7ff4ae3609504bee4398caf6cfa3..4c88ea1de9092bf4c4f81c845364bfab3c0ebc24 100644 (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)