提交 3b7ac941 编写于 作者: S Shawn Guo 提交者: Linus Walleij

pinctrl: mxs: create group for pin config node

The initial mxs pinctrl support, commit 17723111 (pinctrl: add
pinctrl-mxs support) skipped creating group from device tree pin config
node.  Add it to get pin config node work for client device.
Signed-off-by: NShawn Guo <shawn.guo@linaro.org>
Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
上级 c7eea50b
...@@ -70,13 +70,18 @@ static int mxs_dt_node_to_map(struct pinctrl_dev *pctldev, ...@@ -70,13 +70,18 @@ static int mxs_dt_node_to_map(struct pinctrl_dev *pctldev,
struct pinctrl_map **map, unsigned *num_maps) struct pinctrl_map **map, unsigned *num_maps)
{ {
struct pinctrl_map *new_map; struct pinctrl_map *new_map;
char *group; char *group = NULL;
unsigned new_num; unsigned new_num = 1;
unsigned long config = 0; unsigned long config = 0;
unsigned long *pconfig; unsigned long *pconfig;
int length = strlen(np->name) + SUFFIX_LEN; int length = strlen(np->name) + SUFFIX_LEN;
u32 val; bool purecfg = false;
int ret; u32 val, reg;
int ret, i = 0;
/* Check for pin config node which has no 'reg' property */
if (of_property_read_u32(np, "reg", &reg))
purecfg = true;
ret = of_property_read_u32(np, "fsl,drive-strength", &val); ret = of_property_read_u32(np, "fsl,drive-strength", &val);
if (!ret) if (!ret)
...@@ -88,21 +93,26 @@ static int mxs_dt_node_to_map(struct pinctrl_dev *pctldev, ...@@ -88,21 +93,26 @@ static int mxs_dt_node_to_map(struct pinctrl_dev *pctldev,
if (!ret) if (!ret)
config |= val << PULL_SHIFT | PULL_PRESENT; config |= val << PULL_SHIFT | PULL_PRESENT;
new_num = config ? 2 : 1; /* Check for group node which has both mux and config settings */
if (!purecfg && config)
new_num = 2;
new_map = kzalloc(sizeof(*new_map) * new_num, GFP_KERNEL); new_map = kzalloc(sizeof(*new_map) * new_num, GFP_KERNEL);
if (!new_map) if (!new_map)
return -ENOMEM; return -ENOMEM;
new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; if (!purecfg) {
new_map[0].data.mux.function = np->name; new_map[i].type = PIN_MAP_TYPE_MUX_GROUP;
new_map[i].data.mux.function = np->name;
/* Compose group name */ /* Compose group name */
group = kzalloc(length, GFP_KERNEL); group = kzalloc(length, GFP_KERNEL);
if (!group) if (!group)
return -ENOMEM; return -ENOMEM;
of_property_read_u32(np, "reg", &val); snprintf(group, length, "%s.%d", np->name, reg);
snprintf(group, length, "%s.%d", np->name, val); new_map[i].data.mux.group = group;
new_map[0].data.mux.group = group; i++;
}
if (config) { if (config) {
pconfig = kmemdup(&config, sizeof(config), GFP_KERNEL); pconfig = kmemdup(&config, sizeof(config), GFP_KERNEL);
...@@ -111,10 +121,11 @@ static int mxs_dt_node_to_map(struct pinctrl_dev *pctldev, ...@@ -111,10 +121,11 @@ static int mxs_dt_node_to_map(struct pinctrl_dev *pctldev,
goto free; goto free;
} }
new_map[1].type = PIN_MAP_TYPE_CONFIGS_GROUP; new_map[i].type = PIN_MAP_TYPE_CONFIGS_GROUP;
new_map[1].data.configs.group_or_pin = group; new_map[i].data.configs.group_or_pin = purecfg ? np->name :
new_map[1].data.configs.configs = pconfig; group;
new_map[1].data.configs.num_configs = 1; new_map[i].data.configs.configs = pconfig;
new_map[i].data.configs.num_configs = 1;
} }
*map = new_map; *map = new_map;
...@@ -342,7 +353,9 @@ static int __devinit mxs_pinctrl_parse_group(struct platform_device *pdev, ...@@ -342,7 +353,9 @@ static int __devinit mxs_pinctrl_parse_group(struct platform_device *pdev,
group = devm_kzalloc(&pdev->dev, length, GFP_KERNEL); group = devm_kzalloc(&pdev->dev, length, GFP_KERNEL);
if (!group) if (!group)
return -ENOMEM; return -ENOMEM;
of_property_read_u32(np, "reg", &val); if (of_property_read_u32(np, "reg", &val))
snprintf(group, length, "%s", np->name);
else
snprintf(group, length, "%s.%d", np->name, val); snprintf(group, length, "%s.%d", np->name, val);
g->name = group; g->name = group;
...@@ -367,6 +380,7 @@ static int __devinit mxs_pinctrl_parse_group(struct platform_device *pdev, ...@@ -367,6 +380,7 @@ static int __devinit mxs_pinctrl_parse_group(struct platform_device *pdev,
g->pins[i] = MUXID_TO_PINID(g->pins[i]); g->pins[i] = MUXID_TO_PINID(g->pins[i]);
} }
if (out_name)
*out_name = g->name; *out_name = g->name;
return 0; return 0;
...@@ -393,6 +407,7 @@ static int __devinit mxs_pinctrl_probe_dt(struct platform_device *pdev, ...@@ -393,6 +407,7 @@ static int __devinit mxs_pinctrl_probe_dt(struct platform_device *pdev,
/* Count total functions and groups */ /* Count total functions and groups */
fn = fnull; fn = fnull;
for_each_child_of_node(np, child) { for_each_child_of_node(np, child) {
soc->ngroups++;
/* Skip pure pinconf node */ /* Skip pure pinconf node */
if (of_property_read_u32(child, "reg", &val)) if (of_property_read_u32(child, "reg", &val))
continue; continue;
...@@ -400,7 +415,6 @@ static int __devinit mxs_pinctrl_probe_dt(struct platform_device *pdev, ...@@ -400,7 +415,6 @@ static int __devinit mxs_pinctrl_probe_dt(struct platform_device *pdev,
fn = child->name; fn = child->name;
soc->nfunctions++; soc->nfunctions++;
} }
soc->ngroups++;
} }
soc->functions = devm_kzalloc(&pdev->dev, soc->nfunctions * soc->functions = devm_kzalloc(&pdev->dev, soc->nfunctions *
...@@ -430,8 +444,14 @@ static int __devinit mxs_pinctrl_probe_dt(struct platform_device *pdev, ...@@ -430,8 +444,14 @@ static int __devinit mxs_pinctrl_probe_dt(struct platform_device *pdev,
idxf = 0; idxf = 0;
fn = fnull; fn = fnull;
for_each_child_of_node(np, child) { for_each_child_of_node(np, child) {
if (of_property_read_u32(child, "reg", &val)) if (of_property_read_u32(child, "reg", &val)) {
ret = mxs_pinctrl_parse_group(pdev, child,
idxg++, NULL);
if (ret)
return ret;
continue; continue;
}
if (strcmp(fn, child->name)) { if (strcmp(fn, child->name)) {
f = &soc->functions[idxf++]; f = &soc->functions[idxf++];
f->groups = devm_kzalloc(&pdev->dev, f->ngroups * f->groups = devm_kzalloc(&pdev->dev, f->ngroups *
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册