From: Laurent Pinchart Date: Wed, 13 Mar 2013 17:18:30 +0000 (+0100) Subject: sh-pfc: Return an error if a pin doesn't support the requested direction X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=6dc9b4550a74cad7daed0be192030983dad44755;p=GitHub%2Fexynos8895%2Fandroid_kernel_samsung_universal8895.git sh-pfc: Return an error if a pin doesn't support the requested direction When setting a pin direction verify that the requested direction is supported, and return an error if it isn't. This requires pin configuration information to be supplied by SoC data. The check is a no-op if the information is not supplied. Signed-off-by: Laurent Pinchart Acked-by: Linus Walleij --- diff --git a/drivers/pinctrl/sh-pfc/pinctrl.c b/drivers/pinctrl/sh-pfc/pinctrl.c index 52179bbcf6b4..aef268bc17ba 100644 --- a/drivers/pinctrl/sh-pfc/pinctrl.c +++ b/drivers/pinctrl/sh-pfc/pinctrl.c @@ -218,8 +218,18 @@ static int sh_pfc_gpio_set_direction(struct pinctrl_dev *pctldev, const struct sh_pfc_pin *pin = &pfc->info->pins[idx]; struct sh_pfc_pin_config *cfg = &pmx->configs[idx]; unsigned long flags; + unsigned int dir; int ret; + /* Check if the requested direction is supported by the pin. Not all SoC + * provide pin config data, so perform the check conditionally. + */ + if (pin->configs) { + dir = input ? SH_PFC_PIN_CFG_INPUT : SH_PFC_PIN_CFG_OUTPUT; + if (!(pin->configs & dir)) + return -EINVAL; + } + spin_lock_irqsave(&pfc->lock, flags); ret = sh_pfc_config_mux(pfc, pin->enum_id, new_type);