pinctrl: mvebu: count unnamed controls and allocate name buffer
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>
This commit is contained in:
Родитель
38dbfb59d1
Коммит
8d898fd596
|
@ -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++;
|
||||
|
|
Загрузка…
Ссылка в новой задаче