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
1 changed files with 40 additions and 7 deletions
|
@ -563,6 +563,25 @@ static const struct pinmux_ops rockchip_pmx_ops = {
|
||||||
* Pinconf_ops handling
|
* 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 */
|
/* set the pin config settings for a specified pin */
|
||||||
static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
|
static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
|
||||||
unsigned long config)
|
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_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
|
||||||
struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
|
struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
|
||||||
enum pin_config_param param = pinconf_to_config_param(config);
|
enum pin_config_param param = pinconf_to_config_param(config);
|
||||||
|
u16 arg = pinconf_to_config_argument(config);
|
||||||
|
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case PIN_CONFIG_BIAS_DISABLE:
|
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_UP:
|
||||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||||
case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
|
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);
|
return rockchip_set_pull(bank, pin - bank->pin_base, param);
|
||||||
break;
|
break;
|
||||||
default:
|
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_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
|
||||||
struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
|
struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
|
||||||
enum pin_config_param param = pinconf_to_config_param(*config);
|
enum pin_config_param param = pinconf_to_config_param(*config);
|
||||||
unsigned int pull;
|
|
||||||
|
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case PIN_CONFIG_BIAS_DISABLE:
|
case PIN_CONFIG_BIAS_DISABLE:
|
||||||
case PIN_CONFIG_BIAS_PULL_UP:
|
if (rockchip_get_pull(bank, pin - bank->pin_base) != param)
|
||||||
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)
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
*config = 0;
|
*config = 0;
|
||||||
break;
|
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:
|
default:
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Reference in a new issue