summaryrefslogtreecommitdiff
path: root/drivers/pinctrl/freescale/pinctrl-imx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pinctrl/freescale/pinctrl-imx.c')
-rw-r--r--drivers/pinctrl/freescale/pinctrl-imx.c45
1 files changed, 20 insertions, 25 deletions
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c
index 18de31328540..731c58ad43ee 100644
--- a/drivers/pinctrl/freescale/pinctrl-imx.c
+++ b/drivers/pinctrl/freescale/pinctrl-imx.c
@@ -245,7 +245,7 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
{
struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
const struct imx_pinctrl_soc_info *info = ipctl->info;
- struct function_desc *func;
+ const struct function_desc *func;
struct group_desc *grp;
struct imx_pin *pin;
unsigned int npins;
@@ -266,7 +266,7 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
npins = grp->grp.npins;
dev_dbg(ipctl->dev, "enable function %s group %s\n",
- func->func.name, grp->grp.name);
+ func->func->name, grp->grp.name);
for (i = 0; i < npins; i++) {
/*
@@ -580,33 +580,38 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
u32 index)
{
struct pinctrl_dev *pctl = ipctl->pctl;
- struct function_desc *func;
+ struct pinfunction *func;
struct group_desc *grp;
const char **group_names;
+ int ret;
u32 i;
dev_dbg(pctl->dev, "parse function(%d): %pOFn\n", index, np);
- func = pinmux_generic_get_function(pctl, index);
+ func = devm_kzalloc(ipctl->dev, sizeof(*func), GFP_KERNEL);
if (!func)
- return -EINVAL;
+ return -ENOMEM;
/* Initialise function */
- func->func.name = np->name;
- func->func.ngroups = of_get_child_count(np);
- if (func->func.ngroups == 0) {
+ func->name = np->name;
+ func->ngroups = of_get_child_count(np);
+ if (func->ngroups == 0) {
dev_info(ipctl->dev, "no groups defined in %pOF\n", np);
return -EINVAL;
}
- group_names = devm_kcalloc(ipctl->dev, func->func.ngroups,
- sizeof(*func->func.groups), GFP_KERNEL);
+ group_names = devm_kcalloc(ipctl->dev, func->ngroups,
+ sizeof(*func->groups), GFP_KERNEL);
if (!group_names)
return -ENOMEM;
i = 0;
for_each_child_of_node_scoped(np, child)
group_names[i++] = child->name;
- func->func.groups = group_names;
+ func->groups = group_names;
+
+ ret = pinmux_generic_add_pinfunction(pctl, func, NULL);
+ if (ret < 0)
+ return ret;
i = 0;
for_each_child_of_node_scoped(np, child) {
@@ -615,6 +620,10 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
return -ENOMEM;
mutex_lock(&ipctl->mutex);
+ /*
+ * FIXME: This should use pinctrl_generic_add_group() and not
+ * access the private radix tree directly.
+ */
radix_tree_insert(&pctl->pin_group_tree,
ipctl->group_index++, grp);
mutex_unlock(&ipctl->mutex);
@@ -669,20 +678,6 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev,
}
}
- for (i = 0; i < nfuncs; i++) {
- struct function_desc *function;
-
- function = devm_kzalloc(&pdev->dev, sizeof(*function),
- GFP_KERNEL);
- if (!function)
- return -ENOMEM;
-
- mutex_lock(&ipctl->mutex);
- radix_tree_insert(&pctl->pin_function_tree, i, function);
- mutex_unlock(&ipctl->mutex);
- }
- pctl->num_functions = nfuncs;
-
ipctl->group_index = 0;
if (flat_funcs) {
pctl->num_groups = of_get_child_count(np);