sh-pfc: Return an error if a pin doesn't support the requested direction
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Wed, 13 Mar 2013 17:18:30 +0000 (18:18 +0100)
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Fri, 15 Mar 2013 12:33:54 +0000 (13:33 +0100)
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 <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/sh-pfc/pinctrl.c

index 52179bbcf6b4ba4b0a42569596f65505b1a94111..aef268bc17ba0bfdce32a5255df1c46b6a5e5ec3 100644 (file)
@@ -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);