]> git.karo-electronics.de Git - linux-beck.git/commitdiff
pinctrl: mvebu: count unnamed controls and allocate name buffer
authorSebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Thu, 30 Jan 2014 22:38:12 +0000 (23:38 +0100)
committerSebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Tue, 25 Feb 2014 17:34:34 +0000 (18:34 +0100)
pinctrl-mvebu allows SoCs to pass unnamed controls that will get an
auto-generated name of "mpp<PIN#>". Currently, we are allocating name
buffers on a per-control basis while looping over passed controls.
This counts the total number of unnamed controls and allocates a
global name buffer instead. The new buffer is then used while assigning
controls to pinctrl groups later.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Tested-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
drivers/pinctrl/mvebu/pinctrl-mvebu.c

index 0fd1ad31fbf9aa719d19dffb7f18cc61194d2984..d47650fc511972320314aefdd18d7f285b01452a 100644 (file)
@@ -598,6 +598,9 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
        void __iomem *base;
        struct pinctrl_pin_desc *pdesc;
        unsigned gid, n, k;
+       unsigned size, noname = 0;
+       char *noname_buf;
+       void *p;
        int ret;
 
        if (!soc || !soc->controls || !soc->modes) {
@@ -660,6 +663,7 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
                        sprintf(names + 8*k, "mpp%d", ctrl->pid+k);
                ctrl->name = names;
                pctl->num_groups += ctrl->npins;
+               noname += ctrl->npins;
        }
 
        pdesc = devm_kzalloc(&pdev->dev, pctl->desc.npins *
@@ -673,12 +677,17 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
                pdesc[n].number = n;
        pctl->desc.pins = pdesc;
 
-       pctl->groups = devm_kzalloc(&pdev->dev, pctl->num_groups *
-                            sizeof(struct mvebu_pinctrl_group), GFP_KERNEL);
-       if (!pctl->groups) {
-               dev_err(&pdev->dev, "failed to alloc pinctrl groups\n");
+       /*
+        * allocate groups and name buffers for unnamed groups.
+        */
+       size = pctl->num_groups * sizeof(*pctl->groups) + noname * 8;
+       p = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
+       if (!p) {
+               dev_err(&pdev->dev, "failed to alloc group data\n");
                return -ENOMEM;
        }
+       pctl->groups = p;
+       noname_buf = p + pctl->num_groups * sizeof(*pctl->groups);
 
        /* assign mpp controls to groups */
        gid = 0;
@@ -692,15 +701,20 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
 
                /* generic mvebu register control maps to a number of groups */
                if (!ctrl->mpp_get && !ctrl->mpp_set) {
+                       pctl->groups[gid].name = noname_buf;
                        pctl->groups[gid].npins = 1;
+                       sprintf(noname_buf, "mpp%d", ctrl->pid+0);
+                       noname_buf += 8;
 
                        for (k = 1; k < ctrl->npins; k++) {
                                gid++;
                                pctl->groups[gid].gid = gid;
                                pctl->groups[gid].ctrl = ctrl;
-                               pctl->groups[gid].name = &ctrl->name[8*k];
+                               pctl->groups[gid].name = noname_buf;
                                pctl->groups[gid].pins = &ctrl->pins[k];
                                pctl->groups[gid].npins = 1;
+                               sprintf(noname_buf, "mpp%d", ctrl->pid+k);
+                               noname_buf += 8;
                        }
                }
                gid++;