diff options
author | Heiko Stübner <heiko@sntech.de> | 2013-06-16 17:41:16 +0200 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2013-06-17 18:18:34 +0200 |
commit | 44b6d93043ab6775cb8e190a82ae79afd121e944 (patch) | |
tree | 57955b50c5b015e1a17bf77ef2ab44eec83bbec0 /drivers/pinctrl | |
parent | 0f9bc4bcdf4fd8fe768a47e25efdf709192e4de1 (diff) |
pinctrl: rockchip: correctly handle arguments of pinconf options
Change the rockchip pinctrl driver to handle the arguments to the pull
pinconfig options correctly. So only accept non-0 values for the
pull options as the rockchip pin-controller can only turn pulls on and
off (this via BIAS_DISABLE).
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/pinctrl-rockchip.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index c605b63b5a6..427564f552b 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c @@ -563,6 +563,25 @@ static const struct pinmux_ops rockchip_pmx_ops = { * Pinconf_ops handling */ +static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, + enum pin_config_param pull) +{ + /* rk3066b does support any pulls */ + if (!ctrl->pull_offset) + return pull ? false : true; + + if (ctrl->pull_auto) { + if (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT && + pull != PIN_CONFIG_BIAS_DISABLE) + return false; + } else { + if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT) + return false; + } + + return true; +} + /* set the pin config settings for a specified pin */ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, unsigned long config) @@ -570,12 +589,21 @@ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); struct rockchip_pin_bank *bank = pin_to_bank(info, pin); enum pin_config_param param = pinconf_to_config_param(config); + u16 arg = pinconf_to_config_argument(config); switch (param) { case PIN_CONFIG_BIAS_DISABLE: + return rockchip_set_pull(bank, pin - bank->pin_base, param); + break; case PIN_CONFIG_BIAS_PULL_UP: case PIN_CONFIG_BIAS_PULL_DOWN: case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: + if (!rockchip_pinconf_pull_valid(info->ctrl, param)) + return -ENOTSUPP; + + if (!arg) + return -EINVAL; + return rockchip_set_pull(bank, pin - bank->pin_base, param); break; default: @@ -593,19 +621,24 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin, struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); struct rockchip_pin_bank *bank = pin_to_bank(info, pin); enum pin_config_param param = pinconf_to_config_param(*config); - unsigned int pull; switch (param) { case PIN_CONFIG_BIAS_DISABLE: + if (rockchip_get_pull(bank, pin - bank->pin_base) != param) + return -EINVAL; + + *config = 0; + break; case PIN_CONFIG_BIAS_PULL_UP: case PIN_CONFIG_BIAS_PULL_DOWN: case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: - pull = rockchip_get_pull(bank, pin - bank->pin_base); + if (!rockchip_pinconf_pull_valid(info->ctrl, param)) + return -ENOTSUPP; - if (pull != param) + if (rockchip_get_pull(bank, pin - bank->pin_base) != param) return -EINVAL; - *config = 0; + *config = 1; break; default: return -ENOTSUPP; |