mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 07:33:19 +02:00
pinctrl: imx: don't access the pin function radix tree directly
The radix tree containing pin function descriptors should not be accessed directly by drivers. There are dedicated functions for it. I suppose this driver does it so that the memory containing the function description is not duplicated but we're going to address that shortly so convert it to using generic pinctrl APIs. Tested-by: Neil Armstrong <neil.armstrong@linaro.org> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
bd6f4a9140
commit
ea22f777fc
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user