• Home
  • Raw
  • Download

Lines Matching +full:function +full:- +full:group

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2011-2012 ST-Ericsson SA
6 * Written on behalf of Linaro for ST-Ericsson
23 #include <linux/radix-tree.h>
37 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_check_ops()
43 !ops->get_functions_count || in pinmux_check_ops()
44 !ops->get_function_name || in pinmux_check_ops()
45 !ops->get_function_groups || in pinmux_check_ops()
46 !ops->set_mux) { in pinmux_check_ops()
47 dev_err(pctldev->dev, "pinmux ops lacks necessary functions\n"); in pinmux_check_ops()
48 return -EINVAL; in pinmux_check_ops()
51 nfuncs = ops->get_functions_count(pctldev); in pinmux_check_ops()
53 const char *fname = ops->get_function_name(pctldev, in pinmux_check_ops()
56 dev_err(pctldev->dev, "pinmux ops has no name for function%u\n", in pinmux_check_ops()
58 return -EINVAL; in pinmux_check_ops()
68 if (!map->data.mux.function) { in pinmux_validate_map()
69 pr_err("failed to register map %s (%d): no function given\n", in pinmux_validate_map()
70 map->name, i); in pinmux_validate_map()
71 return -EINVAL; in pinmux_validate_map()
78 * pinmux_can_be_used_for_gpio() - check if a specific pin
79 * is either muxed to a different function or used as gpio.
90 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_can_be_used_for_gpio()
96 if (ops->strict && desc->mux_usecount) in pinmux_can_be_used_for_gpio()
99 return !(ops->strict && !!desc->gpio_owner); in pinmux_can_be_used_for_gpio()
103 * pin_request() - request a single pin to be muxed in, typically for GPIO
107 * name that controls its mux function, or the requested GPIO name
116 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pin_request()
117 int status = -EINVAL; in pin_request()
121 dev_err(pctldev->dev, in pin_request()
127 dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n", in pin_request()
128 pin, desc->name, owner); in pin_request()
130 if ((!gpio_range || ops->strict) && in pin_request()
131 desc->mux_usecount && strcmp(desc->mux_owner, owner)) { in pin_request()
132 dev_err(pctldev->dev, in pin_request()
134 desc->name, desc->mux_owner, owner); in pin_request()
138 if ((gpio_range || ops->strict) && desc->gpio_owner) { in pin_request()
139 dev_err(pctldev->dev, in pin_request()
141 desc->name, desc->gpio_owner, owner); in pin_request()
146 desc->gpio_owner = owner; in pin_request()
148 desc->mux_usecount++; in pin_request()
149 if (desc->mux_usecount > 1) in pin_request()
152 desc->mux_owner = owner; in pin_request()
156 if (!try_module_get(pctldev->owner)) { in pin_request()
157 dev_err(pctldev->dev, in pin_request()
160 status = -EINVAL; in pin_request()
165 * If there is no kind of request function for the pin we just assume in pin_request()
168 if (gpio_range && ops->gpio_request_enable) in pin_request()
170 status = ops->gpio_request_enable(pctldev, gpio_range, pin); in pin_request()
171 else if (ops->request) in pin_request()
172 status = ops->request(pctldev, pin); in pin_request()
177 dev_err(pctldev->dev, "request() failed for pin %d\n", pin); in pin_request()
178 module_put(pctldev->owner); in pin_request()
184 desc->gpio_owner = NULL; in pin_request()
186 desc->mux_usecount--; in pin_request()
187 if (!desc->mux_usecount) in pin_request()
188 desc->mux_owner = NULL; in pin_request()
193 dev_err(pctldev->dev, "pin-%d (%s) status %d\n", in pin_request()
200 * pin_free() - release a single muxed in pin so something else can be muxed
206 * This function returns a pointer to the previous owner. This is used
213 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pin_free()
219 dev_err(pctldev->dev, in pin_free()
228 if (WARN_ON(!desc->mux_usecount)) in pin_free()
230 desc->mux_usecount--; in pin_free()
231 if (desc->mux_usecount) in pin_free()
236 * If there is no kind of request function for the pin we just assume in pin_free()
239 if (gpio_range && ops->gpio_disable_free) in pin_free()
240 ops->gpio_disable_free(pctldev, gpio_range, pin); in pin_free()
241 else if (ops->free) in pin_free()
242 ops->free(pctldev, pin); in pin_free()
245 owner = desc->gpio_owner; in pin_free()
246 desc->gpio_owner = NULL; in pin_free()
248 owner = desc->mux_owner; in pin_free()
249 desc->mux_owner = NULL; in pin_free()
250 desc->mux_setting = NULL; in pin_free()
253 module_put(pctldev->owner); in pin_free()
259 * pinmux_request_gpio() - request pinmuxing for a GPIO pin
273 owner = kasprintf(GFP_KERNEL, "%s:%d", range->name, gpio); in pinmux_request_gpio()
275 return -ENOMEM; in pinmux_request_gpio()
285 * pinmux_free_gpio() - release a pin from GPIO muxing
287 * @pin: the affected currently GPIO-muxed in pin
300 * pinmux_gpio_direction() - set the direction of a single muxed-in GPIO pin
313 ops = pctldev->desc->pmxops; in pinmux_gpio_direction()
315 if (ops->gpio_set_direction) in pinmux_gpio_direction()
316 ret = ops->gpio_set_direction(pctldev, range, pin, input); in pinmux_gpio_direction()
324 const char *function) in pinmux_func_name_to_selector() argument
326 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_func_name_to_selector()
327 unsigned nfuncs = ops->get_functions_count(pctldev); in pinmux_func_name_to_selector()
330 /* See if this pctldev has this function */ in pinmux_func_name_to_selector()
332 const char *fname = ops->get_function_name(pctldev, selector); in pinmux_func_name_to_selector()
334 if (!strcmp(function, fname)) in pinmux_func_name_to_selector()
340 return -EINVAL; in pinmux_func_name_to_selector()
346 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_map_to_setting()
347 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_map_to_setting()
351 const char *group; in pinmux_map_to_setting() local
354 dev_err(pctldev->dev, "does not support mux function\n"); in pinmux_map_to_setting()
355 return -EINVAL; in pinmux_map_to_setting()
358 ret = pinmux_func_name_to_selector(pctldev, map->data.mux.function); in pinmux_map_to_setting()
360 dev_err(pctldev->dev, "invalid function %s in map table\n", in pinmux_map_to_setting()
361 map->data.mux.function); in pinmux_map_to_setting()
364 setting->data.mux.func = ret; in pinmux_map_to_setting()
366 ret = pmxops->get_function_groups(pctldev, setting->data.mux.func, in pinmux_map_to_setting()
369 dev_err(pctldev->dev, "can't query groups for function %s\n", in pinmux_map_to_setting()
370 map->data.mux.function); in pinmux_map_to_setting()
374 dev_err(pctldev->dev, in pinmux_map_to_setting()
375 "function %s can't be selected on any group\n", in pinmux_map_to_setting()
376 map->data.mux.function); in pinmux_map_to_setting()
377 return -EINVAL; in pinmux_map_to_setting()
379 if (map->data.mux.group) { in pinmux_map_to_setting()
380 group = map->data.mux.group; in pinmux_map_to_setting()
381 ret = match_string(groups, num_groups, group); in pinmux_map_to_setting()
383 dev_err(pctldev->dev, in pinmux_map_to_setting()
384 "invalid group \"%s\" for function \"%s\"\n", in pinmux_map_to_setting()
385 group, map->data.mux.function); in pinmux_map_to_setting()
389 group = groups[0]; in pinmux_map_to_setting()
392 ret = pinctrl_get_group_selector(pctldev, group); in pinmux_map_to_setting()
394 dev_err(pctldev->dev, "invalid group %s in map table\n", in pinmux_map_to_setting()
395 map->data.mux.group); in pinmux_map_to_setting()
398 setting->data.mux.group = ret; in pinmux_map_to_setting()
405 /* This function is currently unused */ in pinmux_free_setting()
410 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_enable_setting()
411 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_enable_setting()
412 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_enable_setting()
419 if (pctlops->get_group_pins) in pinmux_enable_setting()
420 ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, in pinmux_enable_setting()
427 gname = pctlops->get_group_name(pctldev, in pinmux_enable_setting()
428 setting->data.mux.group); in pinmux_enable_setting()
429 dev_warn(pctldev->dev, in pinmux_enable_setting()
430 "could not get pins for group %s\n", in pinmux_enable_setting()
435 /* Try to allocate all pins in this group, one by one */ in pinmux_enable_setting()
437 ret = pin_request(pctldev, pins[i], setting->dev_name, NULL); in pinmux_enable_setting()
443 pname = desc ? desc->name : "non-existing"; in pinmux_enable_setting()
444 gname = pctlops->get_group_name(pctldev, in pinmux_enable_setting()
445 setting->data.mux.group); in pinmux_enable_setting()
446 dev_err(pctldev->dev, in pinmux_enable_setting()
447 "could not request pin %d (%s) from group %s " in pinmux_enable_setting()
459 dev_warn(pctldev->dev, in pinmux_enable_setting()
464 desc->mux_setting = &(setting->data.mux); in pinmux_enable_setting()
467 ret = ops->set_mux(pctldev, setting->data.mux.func, in pinmux_enable_setting()
468 setting->data.mux.group); in pinmux_enable_setting()
479 desc->mux_setting = NULL; in pinmux_enable_setting()
483 while (--i >= 0) in pinmux_enable_setting()
491 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_disable_setting()
492 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_disable_setting()
499 if (pctlops->get_group_pins) in pinmux_disable_setting()
500 ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, in pinmux_disable_setting()
506 gname = pctlops->get_group_name(pctldev, in pinmux_disable_setting()
507 setting->data.mux.group); in pinmux_disable_setting()
508 dev_warn(pctldev->dev, in pinmux_disable_setting()
509 "could not get pins for group %s\n", in pinmux_disable_setting()
518 dev_warn(pctldev->dev, in pinmux_disable_setting()
523 if (desc->mux_setting == &(setting->data.mux)) { in pinmux_disable_setting()
528 gname = pctlops->get_group_name(pctldev, in pinmux_disable_setting()
529 setting->data.mux.group); in pinmux_disable_setting()
530 dev_warn(pctldev->dev, in pinmux_disable_setting()
532 "deactivating group %s - it is already " in pinmux_disable_setting()
534 pins[i], desc->name, gname); in pinmux_disable_setting()
544 struct pinctrl_dev *pctldev = s->private; in pinmux_functions_show()
545 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_functions_show()
552 mutex_lock(&pctldev->mutex); in pinmux_functions_show()
553 nfuncs = pmxops->get_functions_count(pctldev); in pinmux_functions_show()
555 const char *func = pmxops->get_function_name(pctldev, in pinmux_functions_show()
562 ret = pmxops->get_function_groups(pctldev, func_selector, in pinmux_functions_show()
565 seq_printf(s, "function %s: COULD NOT GET GROUPS\n", in pinmux_functions_show()
571 seq_printf(s, "function %d: %s, groups = [ ", func_selector, func); in pinmux_functions_show()
579 mutex_unlock(&pctldev->mutex); in pinmux_functions_show()
586 struct pinctrl_dev *pctldev = s->private; in pinmux_pins_show()
587 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_pins_show()
588 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_pins_show()
595 if (pmxops->strict) in pinmux_pins_show()
602 mutex_lock(&pctldev->mutex); in pinmux_pins_show()
605 for (i = 0; i < pctldev->desc->npins; i++) { in pinmux_pins_show()
609 pin = pctldev->desc->pins[i].number; in pinmux_pins_show()
615 if (desc->mux_owner && in pinmux_pins_show()
616 !strcmp(desc->mux_owner, pinctrl_dev_get_name(pctldev))) in pinmux_pins_show()
619 if (pmxops->strict) { in pinmux_pins_show()
620 if (desc->mux_owner) in pinmux_pins_show()
622 pin, desc->name, desc->mux_owner, in pinmux_pins_show()
624 else if (desc->gpio_owner) in pinmux_pins_show()
626 pin, desc->name, desc->gpio_owner); in pinmux_pins_show()
629 pin, desc->name); in pinmux_pins_show()
631 /* For non-strict controllers */ in pinmux_pins_show()
632 seq_printf(s, "pin %d (%s): %s %s%s", pin, desc->name, in pinmux_pins_show()
633 desc->mux_owner ? desc->mux_owner in pinmux_pins_show()
635 desc->gpio_owner ? desc->gpio_owner in pinmux_pins_show()
640 /* If mux: print function+group claiming the pin */ in pinmux_pins_show()
641 if (desc->mux_setting) in pinmux_pins_show()
642 seq_printf(s, " function %s group %s\n", in pinmux_pins_show()
643 pmxops->get_function_name(pctldev, in pinmux_pins_show()
644 desc->mux_setting->func), in pinmux_pins_show()
645 pctlops->get_group_name(pctldev, in pinmux_pins_show()
646 desc->mux_setting->group)); in pinmux_pins_show()
651 mutex_unlock(&pctldev->mutex); in pinmux_pins_show()
658 seq_printf(s, "group %s\nfunction %s\n", in pinmux_show_map()
659 map->data.mux.group ? map->data.mux.group : "(default)", in pinmux_show_map()
660 map->data.mux.function); in pinmux_show_map()
666 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_show_setting()
667 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_show_setting()
668 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_show_setting()
670 seq_printf(s, "group: %s (%u) function: %s (%u)\n", in pinmux_show_setting()
671 pctlops->get_group_name(pctldev, setting->data.mux.group), in pinmux_show_setting()
672 setting->data.mux.group, in pinmux_show_setting()
673 pmxops->get_function_name(pctldev, setting->data.mux.func), in pinmux_show_setting()
674 setting->data.mux.func); in pinmux_show_setting()
683 struct seq_file *sfile = file->private_data; in pinmux_select()
684 struct pinctrl_dev *pctldev = sfile->private; in pinmux_select()
685 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_select()
698 ret = -EINVAL; in pinmux_select()
705 ret = -EINVAL; in pinmux_select()
711 /* drop extra spaces between function and group names */ in pinmux_select()
714 ret = -EINVAL; in pinmux_select()
720 dev_err(pctldev->dev, "invalid function %s in map table\n", fname); in pinmux_select()
725 ret = pmxops->get_function_groups(pctldev, fsel, &groups, &num_groups); in pinmux_select()
727 dev_err(pctldev->dev, "no groups for function %d (%s)", fsel, fname); in pinmux_select()
733 dev_err(pctldev->dev, "invalid group %s", gname); in pinmux_select()
742 ret = pmxops->set_mux(pctldev, fsel, gsel); in pinmux_select()
744 dev_err(pctldev->dev, "set_mux() failed: %d", ret); in pinmux_select()
757 return single_open(file, NULL, inode->i_private); in pinmux_select_open()
771 debugfs_create_file("pinmux-functions", 0444, in pinmux_init_device_debugfs()
773 debugfs_create_file("pinmux-pins", 0444, in pinmux_init_device_debugfs()
775 debugfs_create_file("pinmux-select", 0200, in pinmux_init_device_debugfs()
784 * pinmux_generic_get_function_count() - returns number of functions
789 return pctldev->num_functions; in pinmux_generic_get_function_count()
794 * pinmux_generic_get_function_name() - returns the function name
796 * @selector: function number
802 struct function_desc *function; in pinmux_generic_get_function_name() local
804 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_get_function_name()
806 if (!function) in pinmux_generic_get_function_name()
809 return function->name; in pinmux_generic_get_function_name()
814 * pinmux_generic_get_function_groups() - gets the function groups
816 * @selector: function number
825 struct function_desc *function; in pinmux_generic_get_function_groups() local
827 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_get_function_groups()
829 if (!function) { in pinmux_generic_get_function_groups()
830 dev_err(pctldev->dev, "%s could not find function%i\n", in pinmux_generic_get_function_groups()
832 return -EINVAL; in pinmux_generic_get_function_groups()
834 *groups = function->group_names; in pinmux_generic_get_function_groups()
835 *num_groups = function->num_group_names; in pinmux_generic_get_function_groups()
842 * pinmux_generic_get_function() - returns a function based on the number
844 * @selector: function number
849 struct function_desc *function; in pinmux_generic_get_function() local
851 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_get_function()
853 if (!function) in pinmux_generic_get_function()
856 return function; in pinmux_generic_get_function()
861 * pinmux_generic_add_function() - adds a function group
863 * @name: name of the function
874 struct function_desc *function; in pinmux_generic_add_function() local
878 return -EINVAL; in pinmux_generic_add_function()
884 selector = pctldev->num_functions; in pinmux_generic_add_function()
886 function = devm_kzalloc(pctldev->dev, sizeof(*function), GFP_KERNEL); in pinmux_generic_add_function()
887 if (!function) in pinmux_generic_add_function()
888 return -ENOMEM; in pinmux_generic_add_function()
890 function->name = name; in pinmux_generic_add_function()
891 function->group_names = groups; in pinmux_generic_add_function()
892 function->num_group_names = num_groups; in pinmux_generic_add_function()
893 function->data = data; in pinmux_generic_add_function()
895 error = radix_tree_insert(&pctldev->pin_function_tree, selector, function); in pinmux_generic_add_function()
899 pctldev->num_functions++; in pinmux_generic_add_function()
906 * pinmux_generic_remove_function() - removes a numbered function
908 * @selector: function number
915 struct function_desc *function; in pinmux_generic_remove_function() local
917 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_remove_function()
919 if (!function) in pinmux_generic_remove_function()
920 return -ENOENT; in pinmux_generic_remove_function()
922 radix_tree_delete(&pctldev->pin_function_tree, selector); in pinmux_generic_remove_function()
923 devm_kfree(pctldev->dev, function); in pinmux_generic_remove_function()
925 pctldev->num_functions--; in pinmux_generic_remove_function()
932 * pinmux_generic_free_functions() - removes all functions
944 radix_tree_for_each_slot(slot, &pctldev->pin_function_tree, &iter, 0) in pinmux_generic_free_functions()
945 radix_tree_delete(&pctldev->pin_function_tree, iter.index); in pinmux_generic_free_functions()
947 pctldev->num_functions = 0; in pinmux_generic_free_functions()