Commit ea22f777 authored by Bartosz Golaszewski's avatar Bartosz Golaszewski Committed by Linus Walleij
Browse files

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: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent bd6f4a91
Loading
Loading
Loading
Loading
+18 −23
Original line number Diff line number Diff line
@@ -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);