On 16/06/2025 19:01, Yang Xiwen via B4 Relay wrote:
From: Yang Xiwen <[email protected]>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]> --- Changes in v3: - remove unused reg_type assignment. - Link to v2: https://lore.kernel.org/r/[email protected] Changes in v2: - return -EINVAL directly in case of error. (Neil Armstrong <[email protected]>) - Link to v1: https://lore.kernel.org/r/[email protected] --- drivers/pinctrl/meson/pinctrl-meson.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c index babf1bccc969..7dbaf966f93f 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, ®,+ 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, ®, &bit); if (ret) return ret; --- base-commit: c5afa1fef49f55146e78d6157470520391c40eca change-id: 20250617-meson_ppinctrl-5139ca06b828 Best regards,
Reviewed-by: Neil Armstrong <[email protected]>

