summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Xiwen <[email protected]>2025-06-17 01:01:17 +0800
committerNeil Armstrong <[email protected]>2025-09-30 20:32:15 +0200
commit033dbc7f9ec969168a2f48766cb16aa26fa381d8 (patch)
treefea500fb4879d8647b15939aba7f7c8b2659cc6c
parent1a367adfd66c28d8d2fdb2957dfba5434b987de1 (diff)
pinctrl: meson: support gpio toggle command
meson_gpio_get() always assumes gpio is configured to input mode. This is incorrect and breaks `gpio toggle` command: gpio: pin aobus-banks2 (gpio 2) value is 0 Warning: value of pin is still 1 Fix it by adding the logic to handle both input and output mode. Fixes: 2009a8d03fe5 ("pinctrl: meson: add GPIO support") Signed-off-by: Yang Xiwen <[email protected]> Reviewed-by: Neil Armstrong <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Neil Armstrong <[email protected]>
-rw-r--r--drivers/pinctrl/meson/pinctrl-meson.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
index babf1bccc96..7dbaf966f93 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -117,8 +117,26 @@ int meson_gpio_get(struct udevice *dev, unsigned int offset)
struct meson_pinctrl *priv = dev_get_priv(dev->parent);
unsigned int reg, bit;
int ret;
+ enum gpio_func_t direction;
+ enum meson_reg_type reg_type;
- ret = meson_gpio_calc_reg_and_bit(dev->parent, offset, REG_IN, &reg,
+ direction = meson_gpio_get_direction(dev, offset);
+
+ switch (direction) {
+ case GPIOF_INPUT:
+ reg_type = REG_IN;
+ break;
+
+ case GPIOF_OUTPUT:
+ reg_type = REG_OUT;
+ break;
+
+ default:
+ dev_warn(dev, "Failed to get current direction of Pin %u\n", offset);
+ return -EINVAL;
+ }
+
+ ret = meson_gpio_calc_reg_and_bit(dev->parent, offset, reg_type, &reg,
&bit);
if (ret)
return ret;