pinctrl: imx: don't access the pin function radix tree directly
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 2 Sep 2025 11:59:16 +0000 (13:59 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 8 Sep 2025 12:22:08 +0000 (14:22 +0200)
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>
drivers/pinctrl/freescale/pinctrl-imx.c

index 18de313..c5b17c5 100644 (file)
@@ -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);