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>
This commit is contained in:
parent
0f9bc4bcdf
commit
44b6d93043
|
@ -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,20 +621,25 @@ 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:
|
||||
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 (pull != param)
|
||||
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:
|
||||
if (!rockchip_pinconf_pull_valid(info->ctrl, param))
|
||||
return -ENOTSUPP;
|
||||
|
||||
if (rockchip_get_pull(bank, pin - bank->pin_base) != param)
|
||||
return -EINVAL;
|
||||
|
||||
*config = 1;
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUPP;
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue