|
|
@@ -0,0 +1,58 @@
|
|
|
+From e6ebd4942981f8ad37189bbb36a3c8495e21ef4c Mon Sep 17 00:00:00 2001
|
|
|
+From: Gabor Juhos <[email protected]>
|
|
|
+Date: Wed, 14 May 2025 21:18:33 +0200
|
|
|
+Subject: [PATCH 2/7] pinctrl: armada-37xx: set GPIO output value before
|
|
|
+ setting direction
|
|
|
+
|
|
|
+Changing the direction before updating the output value in the
|
|
|
+OUTPUT_VAL register may result in a glitch on the output line
|
|
|
+if the previous value in the OUTPUT_VAL register is different
|
|
|
+from the one we want to set.
|
|
|
+
|
|
|
+In order to avoid that, update the output value before changing
|
|
|
+the direction.
|
|
|
+
|
|
|
+Cc: [email protected]
|
|
|
+Fixes: 6702abb3bf23 ("pinctrl: armada-37xx: Fix direction_output() callback behavior")
|
|
|
+Signed-off-by: Imre Kaloz <[email protected]>
|
|
|
+Reviewed-by: Andrew Lunn <[email protected]>
|
|
|
+Signed-off-by: Gabor Juhos <[email protected]>
|
|
|
+Link: https://lore.kernel.org/[email protected]
|
|
|
+Signed-off-by: Linus Walleij <[email protected]>
|
|
|
+---
|
|
|
+ drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 15 +++++++--------
|
|
|
+ 1 file changed, 7 insertions(+), 8 deletions(-)
|
|
|
+
|
|
|
+--- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
|
|
|
++++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
|
|
|
+@@ -417,23 +417,22 @@ static int armada_37xx_gpio_direction_ou
|
|
|
+ unsigned int offset, int value)
|
|
|
+ {
|
|
|
+ struct armada_37xx_pinctrl *info = gpiochip_get_data(chip);
|
|
|
+- unsigned int val_offset = offset;
|
|
|
+- unsigned int reg = OUTPUT_EN;
|
|
|
++ unsigned int en_offset = offset;
|
|
|
++ unsigned int reg = OUTPUT_VAL;
|
|
|
+ unsigned int mask, val, ret;
|
|
|
+
|
|
|
+ armada_37xx_update_reg(®, &offset);
|
|
|
+ mask = BIT(offset);
|
|
|
++ val = value ? mask : 0;
|
|
|
+
|
|
|
+- ret = regmap_update_bits(info->regmap, reg, mask, mask);
|
|
|
+-
|
|
|
++ ret = regmap_update_bits(info->regmap, reg, mask, val);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+- reg = OUTPUT_VAL;
|
|
|
+- armada_37xx_update_reg(®, &val_offset);
|
|
|
++ reg = OUTPUT_EN;
|
|
|
++ armada_37xx_update_reg(®, &en_offset);
|
|
|
+
|
|
|
+- val = value ? mask : 0;
|
|
|
+- regmap_update_bits(info->regmap, reg, mask, val);
|
|
|
++ regmap_update_bits(info->regmap, reg, mask, mask);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|