pinctrl: fix error path in pinconf_map_to_setting()
authorLinus Walleij <linus.walleij@linaro.org>
Mon, 12 Mar 2012 20:38:29 +0000 (21:38 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 12 Mar 2012 21:48:43 +0000 (22:48 +0100)
The code was using the union member
setting->data.configs.group_or_pin to store a potential
error code, but since that member is unsigned the
< 0 comparison was not true, letting errors pass through,
ending up as mapped to pin "-22". Fix this up and print
the error.

Acked-by: Stephen Warren <swarren@wwwdotorg.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinconf.c

index 84869f2..b40ac1b 100644 (file)
@@ -282,21 +282,28 @@ int pinconf_map_to_setting(struct pinctrl_map const *map,
                          struct pinctrl_setting *setting)
 {
        struct pinctrl_dev *pctldev = setting->pctldev;
+       int pin;
 
        switch (setting->type) {
        case PIN_MAP_TYPE_CONFIGS_PIN:
-               setting->data.configs.group_or_pin =
-                       pin_get_from_name(pctldev,
-                                         map->data.configs.group_or_pin);
-               if (setting->data.configs.group_or_pin < 0)
-                       return setting->data.configs.group_or_pin;
+               pin = pin_get_from_name(pctldev,
+                                       map->data.configs.group_or_pin);
+               if (pin < 0) {
+                       dev_err(pctldev->dev, "could not map pin config for \"%s\"",
+                               map->data.configs.group_or_pin);
+                       return pin;
+               }
+               setting->data.configs.group_or_pin = pin;
                break;
        case PIN_MAP_TYPE_CONFIGS_GROUP:
-               setting->data.configs.group_or_pin =
-                       pinctrl_get_group_selector(pctldev,
-                                       map->data.configs.group_or_pin);
-               if (setting->data.configs.group_or_pin < 0)
-                       return setting->data.configs.group_or_pin;
+               pin = pinctrl_get_group_selector(pctldev,
+                                        map->data.configs.group_or_pin);
+               if (pin < 0) {
+                       dev_err(pctldev->dev, "could not map group config for \"%s\"",
+                               map->data.configs.group_or_pin);
+                       return pin;
+               }
+               setting->data.configs.group_or_pin = pin;
                break;
        default:
                return -EINVAL;