]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/pinctrl/core.c
Merge tag 'writeback-proportions' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / drivers / pinctrl / core.c
index 0cc053af70bd361e806a94993f64bb4077e69b88..fb7f3bebdc69dadec1451773c596c9b901821265 100644 (file)
@@ -332,19 +332,16 @@ void pinctrl_add_gpio_range(struct pinctrl_dev *pctldev,
 }
 EXPORT_SYMBOL_GPL(pinctrl_add_gpio_range);
 
-/**
- * pinctrl_remove_gpio_range() - remove a range of GPIOs fro a pin controller
- * @pctldev: pin controller device to remove the range from
- * @range: the GPIO range to remove
- */
-void pinctrl_remove_gpio_range(struct pinctrl_dev *pctldev,
-                              struct pinctrl_gpio_range *range)
+void pinctrl_add_gpio_ranges(struct pinctrl_dev *pctldev,
+                            struct pinctrl_gpio_range *ranges,
+                            unsigned nranges)
 {
-       mutex_lock(&pinctrl_mutex);
-       list_del(&range->node);
-       mutex_unlock(&pinctrl_mutex);
+       int i;
+
+       for (i = 0; i < nranges; i++)
+               pinctrl_add_gpio_range(pctldev, &ranges[i]);
 }
-EXPORT_SYMBOL_GPL(pinctrl_remove_gpio_range);
+EXPORT_SYMBOL_GPL(pinctrl_add_gpio_ranges);
 
 /**
  * pinctrl_get_group_selector() - returns the group selector for a group
@@ -1395,9 +1392,9 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
        struct pinctrl_dev *pctldev;
        int ret;
 
-       if (pctldesc == NULL)
+       if (!pctldesc)
                return NULL;
-       if (pctldesc->name == NULL)
+       if (!pctldesc->name)
                return NULL;
 
        pctldev = kzalloc(sizeof(*pctldev), GFP_KERNEL);
@@ -1415,23 +1412,20 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
        pctldev->dev = dev;
 
        /* check core ops for sanity */
-       ret = pinctrl_check_ops(pctldev);
-       if (ret) {
+       if (pinctrl_check_ops(pctldev)) {
                dev_err(dev, "pinctrl ops lacks necessary functions\n");
                goto out_err;
        }
 
        /* If we're implementing pinmuxing, check the ops for sanity */
        if (pctldesc->pmxops) {
-               ret = pinmux_check_ops(pctldev);
-               if (ret)
+               if (pinmux_check_ops(pctldev))
                        goto out_err;
        }
 
        /* If we're implementing pinconfig, check the ops for sanity */
        if (pctldesc->confops) {
-               ret = pinconf_check_ops(pctldev);
-               if (ret)
+               if (pinconf_check_ops(pctldev))
                        goto out_err;
        }
 
@@ -1457,11 +1451,9 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
                if (IS_ERR(s)) {
                        dev_dbg(dev, "failed to lookup the default state\n");
                } else {
-                       ret = pinctrl_select_state_locked(pctldev->p, s);
-                       if (ret) {
+                       if (pinctrl_select_state_locked(pctldev->p, s))
                                dev_err(dev,
                                        "failed to select default state\n");
-                       }
                }
        }
 
@@ -1485,6 +1477,7 @@ EXPORT_SYMBOL_GPL(pinctrl_register);
  */
 void pinctrl_unregister(struct pinctrl_dev *pctldev)
 {
+       struct pinctrl_gpio_range *range, *n;
        if (pctldev == NULL)
                return;
 
@@ -1500,6 +1493,10 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev)
        /* Destroy descriptor tree */
        pinctrl_free_pindescs(pctldev, pctldev->desc->pins,
                              pctldev->desc->npins);
+       /* remove gpio ranges map */
+       list_for_each_entry_safe(range, n, &pctldev->gpio_ranges, node)
+               list_del(&range->node);
+
        kfree(pctldev);
 
        mutex_unlock(&pinctrl_mutex);