| From fbbe0e3da405e3c355407b027d16892627fb284b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 7 Aug 2025 14:20:38 +0800 |
| Subject: pinctrl: single: fix bias pull up/down handling in pin_config_set |
| |
| From: Chi Zhang <chizhang@asrmicro.com> |
| |
| [ Upstream commit 236152dd9b1675a35eee912e79e6c57ca6b6732f ] |
| |
| In the pin_config_set function, when handling PIN_CONFIG_BIAS_PULL_DOWN or |
| PIN_CONFIG_BIAS_PULL_UP, the function calls pcs_pinconf_clear_bias() |
| which writes the register. However, the subsequent operations continue |
| using the stale 'data' value from before the register write, effectively |
| causing the bias clear operation to be overwritten and not take effect. |
| |
| Fix this by reading the 'data' value from the register after calling |
| pcs_pinconf_clear_bias(). |
| |
| This bug seems to have existed when this code was first merged in commit |
| 9dddb4df90d1 ("pinctrl: single: support generic pinconf"). |
| |
| Signed-off-by: Chi Zhang <chizhang@asrmicro.com> |
| Link: https://lore.kernel.org/20250807062038.13610-1-chizhang@asrmicro.com |
| Signed-off-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/pinctrl/pinctrl-single.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c |
| index 2ec599e383e4b..1df0a00ae1ee8 100644 |
| --- a/drivers/pinctrl/pinctrl-single.c |
| +++ b/drivers/pinctrl/pinctrl-single.c |
| @@ -589,8 +589,10 @@ static int pcs_pinconf_set(struct pinctrl_dev *pctldev, |
| /* 4 parameters */ |
| case PIN_CONFIG_BIAS_PULL_DOWN: |
| case PIN_CONFIG_BIAS_PULL_UP: |
| - if (arg) |
| + if (arg) { |
| pcs_pinconf_clear_bias(pctldev, pin); |
| + data = pcs->read(pcs->base + offset); |
| + } |
| fallthrough; |
| case PIN_CONFIG_INPUT_SCHMITT_ENABLE: |
| data &= ~func->conf[i].mask; |
| -- |
| 2.51.0 |
| |