| From foo@baz Sat Nov 10 11:24:34 PST 2018 |
| From: Douglas Anderson <dianders@chromium.org> |
| Date: Thu, 30 Aug 2018 08:23:38 -0700 |
| Subject: pinctrl: ssbi-gpio: Fix pm8xxx_pin_config_get() to be compliant |
| |
| From: Douglas Anderson <dianders@chromium.org> |
| |
| [ Upstream commit b432414b996d32a1bd9afe2bd595bd5729c1477f ] |
| |
| If you look at "pinconf-groups" in debugfs for ssbi-gpio you'll notice |
| it looks like nonsense. |
| |
| The problem is fairly well described in commit 1cf86bc21257 ("pinctrl: |
| qcom: spmi-gpio: Fix pmic_gpio_config_get() to be compliant") and |
| commit 05e0c828955c ("pinctrl: msm: Fix msm_config_group_get() to be |
| compliant"), but it was pointed out that ssbi-gpio has the same |
| problem. Let's fix it there too. |
| |
| Fixes: b4c45fe974bc ("pinctrl: qcom: ssbi: Family A gpio & mpp drivers") |
| Signed-off-by: Douglas Anderson <dianders@chromium.org> |
| Reviewed-by: Stephen Boyd <sboyd@kernel.org> |
| Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> |
| Signed-off-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c | 28 +++++++++++++++++++++------- |
| 1 file changed, 21 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c |
| +++ b/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c |
| @@ -260,22 +260,32 @@ static int pm8xxx_pin_config_get(struct |
| |
| switch (param) { |
| case PIN_CONFIG_BIAS_DISABLE: |
| - arg = pin->bias == PM8XXX_GPIO_BIAS_NP; |
| + if (pin->bias != PM8XXX_GPIO_BIAS_NP) |
| + return -EINVAL; |
| + arg = 1; |
| break; |
| case PIN_CONFIG_BIAS_PULL_DOWN: |
| - arg = pin->bias == PM8XXX_GPIO_BIAS_PD; |
| + if (pin->bias != PM8XXX_GPIO_BIAS_PD) |
| + return -EINVAL; |
| + arg = 1; |
| break; |
| case PIN_CONFIG_BIAS_PULL_UP: |
| - arg = pin->bias <= PM8XXX_GPIO_BIAS_PU_1P5_30; |
| + if (pin->bias > PM8XXX_GPIO_BIAS_PU_1P5_30) |
| + return -EINVAL; |
| + arg = 1; |
| break; |
| case PM8XXX_QCOM_PULL_UP_STRENGTH: |
| arg = pin->pull_up_strength; |
| break; |
| case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: |
| - arg = pin->disable; |
| + if (!pin->disable) |
| + return -EINVAL; |
| + arg = 1; |
| break; |
| case PIN_CONFIG_INPUT_ENABLE: |
| - arg = pin->mode == PM8XXX_GPIO_MODE_INPUT; |
| + if (pin->mode != PM8XXX_GPIO_MODE_INPUT) |
| + return -EINVAL; |
| + arg = 1; |
| break; |
| case PIN_CONFIG_OUTPUT: |
| if (pin->mode & PM8XXX_GPIO_MODE_OUTPUT) |
| @@ -290,10 +300,14 @@ static int pm8xxx_pin_config_get(struct |
| arg = pin->output_strength; |
| break; |
| case PIN_CONFIG_DRIVE_PUSH_PULL: |
| - arg = !pin->open_drain; |
| + if (pin->open_drain) |
| + return -EINVAL; |
| + arg = 1; |
| break; |
| case PIN_CONFIG_DRIVE_OPEN_DRAIN: |
| - arg = pin->open_drain; |
| + if (!pin->open_drain) |
| + return -EINVAL; |
| + arg = 1; |
| break; |
| default: |
| return -EINVAL; |