selector++;
        }
 
-       dev_err(pctldev->dev, "function '%s' not supported\n", function);
        return -EINVAL;
 }
 
                                void *data)
 {
        struct function_desc *function;
+       int selector;
+
+       if (!name)
+               return -EINVAL;
+
+       selector = pinmux_func_name_to_selector(pctldev, name);
+       if (selector >= 0)
+               return selector;
+
+       selector = pctldev->num_functions;
 
        function = devm_kzalloc(pctldev->dev, sizeof(*function), GFP_KERNEL);
        if (!function)
        function->num_group_names = num_groups;
        function->data = data;
 
-       radix_tree_insert(&pctldev->pin_function_tree, pctldev->num_functions,
-                         function);
+       radix_tree_insert(&pctldev->pin_function_tree, selector, function);
 
        pctldev->num_functions++;
 
-       return 0;
+       return selector;
 }
 EXPORT_SYMBOL_GPL(pinmux_generic_add_function);