pinctrl: conjure names for unnamed pins
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 14 Dec 2011 19:33:37 +0000 (20:33 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 3 Jan 2012 08:10:06 +0000 (09:10 +0100)
If pins with blank names are registered, we assign them names on-the-fly
on the form "PINn" where n is the pin number for that pin on the specific
controller.

Acked-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/core.c
drivers/pinctrl/core.h

index 160fb5a..9e32ea3 100644 (file)
@@ -158,6 +158,8 @@ static void pinctrl_free_pindescs(struct pinctrl_dev *pctldev,
                if (pindesc != NULL) {
                        radix_tree_delete(&pctldev->pin_desc_tree,
                                          pins[i].number);
+                       if (pindesc->dynamic_name)
+                               kfree(pindesc->name);
                }
                kfree(pindesc);
        }
@@ -186,13 +188,20 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
        pindesc->pctldev = pctldev;
 
        /* Copy basic pin info */
-       pindesc->name = name;
+       if (pindesc->name) {
+               pindesc->name = name;
+       } else {
+               pindesc->name = kasprintf(GFP_KERNEL, "PIN%u", number);
+               if (pindesc->name == NULL)
+                       return -ENOMEM;
+               pindesc->dynamic_name = true;
+       }
 
        spin_lock(&pctldev->pin_desc_tree_lock);
        radix_tree_insert(&pctldev->pin_desc_tree, number, pindesc);
        spin_unlock(&pctldev->pin_desc_tree_lock);
        pr_debug("registered pin %d (%s) on %s\n",
-                number, name ? name : "(unnamed)", pctldev->desc->name);
+                number, pindesc->name, pctldev->desc->name);
        return 0;
 }
 
index 5375582..177a331 100644 (file)
@@ -52,6 +52,7 @@ struct pinctrl_dev {
  * @pctldev: corresponding pin control device
  * @name: a name for the pin, e.g. the name of the pin/pad/finger on a
  *     datasheet or such
+ * @dynamic_name: if the name of this pin was dynamically allocated
  * @lock: a lock to protect the descriptor structure
  * @mux_requested: whether the pin is already requested by pinmux or not
  * @mux_function: a named muxing function for the pin that will be passed to
@@ -60,6 +61,7 @@ struct pinctrl_dev {
 struct pin_desc {
        struct pinctrl_dev *pctldev;
        const char *name;
+       bool dynamic_name;
        spinlock_t lock;
        /* These fields only added when supporting pinmux drivers */
 #ifdef CONFIG_PINMUX