Lines Matching +full:pin +full:- +full:function
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Core driver for the pin muxing portions of the pin control subsystem
5 * Copyright (C) 2011-2012 ST-Ericsson SA
6 * Written on behalf of Linaro for ST-Ericsson
20 #include <linux/radix-tree.h>
33 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_check_ops()
39 !ops->get_functions_count || in pinmux_check_ops()
40 !ops->get_function_name || in pinmux_check_ops()
41 !ops->get_function_groups || in pinmux_check_ops()
42 !ops->set_mux) { in pinmux_check_ops()
43 dev_err(pctldev->dev, "pinmux ops lacks necessary functions\n"); in pinmux_check_ops()
44 return -EINVAL; in pinmux_check_ops()
47 nfuncs = ops->get_functions_count(pctldev); in pinmux_check_ops()
49 const char *fname = ops->get_function_name(pctldev, in pinmux_check_ops()
52 dev_err(pctldev->dev, "pinmux ops has no name for function%u\n", in pinmux_check_ops()
54 return -EINVAL; in pinmux_check_ops()
64 if (!map->data.mux.function) { in pinmux_validate_map()
65 pr_err("failed to register map %s (%d): no function given\n", in pinmux_validate_map()
66 map->name, i); in pinmux_validate_map()
67 return -EINVAL; in pinmux_validate_map()
74 * pinmux_can_be_used_for_gpio() - check if a specific pin
75 * is either muxed to a different function or used as gpio.
77 * @pctldev: the associated pin controller device
78 * @pin: the pin number in the global pin space
83 bool pinmux_can_be_used_for_gpio(struct pinctrl_dev *pctldev, unsigned pin) in pinmux_can_be_used_for_gpio() argument
85 struct pin_desc *desc = pin_desc_get(pctldev, pin); in pinmux_can_be_used_for_gpio()
86 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_can_be_used_for_gpio()
88 /* Can't inspect pin, assume it can be used */ in pinmux_can_be_used_for_gpio()
92 if (ops->strict && desc->mux_usecount) in pinmux_can_be_used_for_gpio()
95 return !(ops->strict && !!desc->gpio_owner); in pinmux_can_be_used_for_gpio()
99 * pin_request() - request a single pin to be muxed in, typically for GPIO
100 * @pctldev: the associated pin controller device
101 * @pin: the pin number in the global pin space
102 * @owner: a representation of the owner of this pin; typically the device
103 * name that controls its mux function, or the requested GPIO name
104 * @gpio_range: the range matching the GPIO pin if this is a request for a
105 * single GPIO pin
108 int pin, const char *owner, in pin_request()
112 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pin_request()
113 int status = -EINVAL; in pin_request()
115 desc = pin_desc_get(pctldev, pin); in pin_request()
117 dev_err(pctldev->dev, in pin_request()
118 "pin %d is not registered so it cannot be requested\n", in pin_request()
119 pin); in pin_request()
123 dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n", in pin_request()
124 pin, desc->name, owner); in pin_request()
126 if ((!gpio_range || ops->strict) && in pin_request()
127 desc->mux_usecount && strcmp(desc->mux_owner, owner)) { in pin_request()
128 dev_err(pctldev->dev, in pin_request()
129 "pin %s already requested by %s; cannot claim for %s\n", in pin_request()
130 desc->name, desc->mux_owner, owner); in pin_request()
134 if ((gpio_range || ops->strict) && desc->gpio_owner) { in pin_request()
135 dev_err(pctldev->dev, in pin_request()
136 "pin %s already requested by %s; cannot claim for %s\n", in pin_request()
137 desc->name, desc->gpio_owner, owner); in pin_request()
142 desc->gpio_owner = owner; in pin_request()
144 desc->mux_usecount++; in pin_request()
145 if (desc->mux_usecount > 1) in pin_request()
148 desc->mux_owner = owner; in pin_request()
151 /* Let each pin increase references to this module */ in pin_request()
152 if (!try_module_get(pctldev->owner)) { in pin_request()
153 dev_err(pctldev->dev, in pin_request()
154 "could not increase module refcount for pin %d\n", in pin_request()
155 pin); in pin_request()
156 status = -EINVAL; in pin_request()
161 * If there is no kind of request function for the pin we just assume in pin_request()
164 if (gpio_range && ops->gpio_request_enable) in pin_request()
165 /* This requests and enables a single GPIO pin */ in pin_request()
166 status = ops->gpio_request_enable(pctldev, gpio_range, pin); in pin_request()
167 else if (ops->request) in pin_request()
168 status = ops->request(pctldev, pin); in pin_request()
173 dev_err(pctldev->dev, "request() failed for pin %d\n", pin); in pin_request()
174 module_put(pctldev->owner); in pin_request()
180 desc->gpio_owner = NULL; in pin_request()
182 desc->mux_usecount--; in pin_request()
183 if (!desc->mux_usecount) in pin_request()
184 desc->mux_owner = NULL; in pin_request()
189 dev_err(pctldev->dev, "pin-%d (%s) status %d\n", in pin_request()
190 pin, owner, status); in pin_request()
196 * pin_free() - release a single muxed in pin so something else can be muxed
197 * @pctldev: pin controller device handling this pin
198 * @pin: the pin to free
199 * @gpio_range: the range matching the GPIO pin if this is a request for a
200 * single GPIO pin
202 * This function returns a pointer to the previous owner. This is used
204 * once the pin is free. This is done for GPIO request functions.
206 static const char *pin_free(struct pinctrl_dev *pctldev, int pin, in pin_free() argument
209 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pin_free()
213 desc = pin_desc_get(pctldev, pin); in pin_free()
215 dev_err(pctldev->dev, in pin_free()
216 "pin is not registered so it cannot be freed\n"); in pin_free()
222 * A pin should not be freed more times than allocated. in pin_free()
224 if (WARN_ON(!desc->mux_usecount)) in pin_free()
226 desc->mux_usecount--; in pin_free()
227 if (desc->mux_usecount) in pin_free()
232 * If there is no kind of request function for the pin we just assume in pin_free()
235 if (gpio_range && ops->gpio_disable_free) in pin_free()
236 ops->gpio_disable_free(pctldev, gpio_range, pin); in pin_free()
237 else if (ops->free) in pin_free()
238 ops->free(pctldev, pin); in pin_free()
241 owner = desc->gpio_owner; in pin_free()
242 desc->gpio_owner = NULL; in pin_free()
244 owner = desc->mux_owner; in pin_free()
245 desc->mux_owner = NULL; in pin_free()
246 desc->mux_setting = NULL; in pin_free()
249 module_put(pctldev->owner); in pin_free()
255 * pinmux_request_gpio() - request pinmuxing for a GPIO pin
256 * @pctldev: pin controller device affected
257 * @pin: the pin to mux in for GPIO
263 unsigned pin, unsigned gpio) in pinmux_request_gpio() argument
268 /* Conjure some name stating what chip and pin this is taken by */ in pinmux_request_gpio()
269 owner = kasprintf(GFP_KERNEL, "%s:%d", range->name, gpio); in pinmux_request_gpio()
271 return -ENOMEM; in pinmux_request_gpio()
273 ret = pin_request(pctldev, pin, owner, range); in pinmux_request_gpio()
281 * pinmux_free_gpio() - release a pin from GPIO muxing
282 * @pctldev: the pin controller device for the pin
283 * @pin: the affected currently GPIO-muxed in pin
286 void pinmux_free_gpio(struct pinctrl_dev *pctldev, unsigned pin, in pinmux_free_gpio() argument
291 owner = pin_free(pctldev, pin, range); in pinmux_free_gpio()
296 * pinmux_gpio_direction() - set the direction of a single muxed-in GPIO pin
297 * @pctldev: the pin controller handling this pin
299 * @pin: the affected GPIO pin in this controller
300 * @input: true if we set the pin as input, false for output
304 unsigned pin, bool input) in pinmux_gpio_direction() argument
309 ops = pctldev->desc->pmxops; in pinmux_gpio_direction()
311 if (ops->gpio_set_direction) in pinmux_gpio_direction()
312 ret = ops->gpio_set_direction(pctldev, range, pin, input); in pinmux_gpio_direction()
320 const char *function) in pinmux_func_name_to_selector() argument
322 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_func_name_to_selector()
323 unsigned nfuncs = ops->get_functions_count(pctldev); in pinmux_func_name_to_selector()
326 /* See if this pctldev has this function */ in pinmux_func_name_to_selector()
328 const char *fname = ops->get_function_name(pctldev, selector); in pinmux_func_name_to_selector()
330 if (!strcmp(function, fname)) in pinmux_func_name_to_selector()
336 return -EINVAL; in pinmux_func_name_to_selector()
342 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_map_to_setting()
343 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_map_to_setting()
350 dev_err(pctldev->dev, "does not support mux function\n"); in pinmux_map_to_setting()
351 return -EINVAL; in pinmux_map_to_setting()
354 ret = pinmux_func_name_to_selector(pctldev, map->data.mux.function); in pinmux_map_to_setting()
356 dev_err(pctldev->dev, "invalid function %s in map table\n", in pinmux_map_to_setting()
357 map->data.mux.function); in pinmux_map_to_setting()
360 setting->data.mux.func = ret; in pinmux_map_to_setting()
362 ret = pmxops->get_function_groups(pctldev, setting->data.mux.func, in pinmux_map_to_setting()
365 dev_err(pctldev->dev, "can't query groups for function %s\n", in pinmux_map_to_setting()
366 map->data.mux.function); in pinmux_map_to_setting()
370 dev_err(pctldev->dev, in pinmux_map_to_setting()
371 "function %s can't be selected on any group\n", in pinmux_map_to_setting()
372 map->data.mux.function); in pinmux_map_to_setting()
373 return -EINVAL; in pinmux_map_to_setting()
375 if (map->data.mux.group) { in pinmux_map_to_setting()
376 group = map->data.mux.group; in pinmux_map_to_setting()
379 dev_err(pctldev->dev, in pinmux_map_to_setting()
380 "invalid group \"%s\" for function \"%s\"\n", in pinmux_map_to_setting()
381 group, map->data.mux.function); in pinmux_map_to_setting()
390 dev_err(pctldev->dev, "invalid group %s in map table\n", in pinmux_map_to_setting()
391 map->data.mux.group); in pinmux_map_to_setting()
394 setting->data.mux.group = ret; in pinmux_map_to_setting()
401 /* This function is currently unused */ in pinmux_free_setting()
406 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_enable_setting()
407 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_enable_setting()
408 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_enable_setting()
415 if (pctlops->get_group_pins) in pinmux_enable_setting()
416 ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, in pinmux_enable_setting()
423 gname = pctlops->get_group_name(pctldev, in pinmux_enable_setting()
424 setting->data.mux.group); in pinmux_enable_setting()
425 dev_warn(pctldev->dev, in pinmux_enable_setting()
433 ret = pin_request(pctldev, pins[i], setting->dev_name, NULL); in pinmux_enable_setting()
439 pname = desc ? desc->name : "non-existing"; in pinmux_enable_setting()
440 gname = pctlops->get_group_name(pctldev, in pinmux_enable_setting()
441 setting->data.mux.group); in pinmux_enable_setting()
442 dev_err(pctldev->dev, in pinmux_enable_setting()
443 "could not request pin %d (%s) from group %s " in pinmux_enable_setting()
455 dev_warn(pctldev->dev, in pinmux_enable_setting()
456 "could not get pin desc for pin %d\n", in pinmux_enable_setting()
460 desc->mux_setting = &(setting->data.mux); in pinmux_enable_setting()
463 ret = ops->set_mux(pctldev, setting->data.mux.func, in pinmux_enable_setting()
464 setting->data.mux.group); in pinmux_enable_setting()
475 desc->mux_setting = NULL; in pinmux_enable_setting()
479 while (--i >= 0) in pinmux_enable_setting()
487 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_disable_setting()
488 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_disable_setting()
495 if (pctlops->get_group_pins) in pinmux_disable_setting()
496 ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, in pinmux_disable_setting()
502 gname = pctlops->get_group_name(pctldev, in pinmux_disable_setting()
503 setting->data.mux.group); in pinmux_disable_setting()
504 dev_warn(pctldev->dev, in pinmux_disable_setting()
514 dev_warn(pctldev->dev, in pinmux_disable_setting()
515 "could not get pin desc for pin %d\n", in pinmux_disable_setting()
519 if (desc->mux_setting == &(setting->data.mux)) { in pinmux_disable_setting()
524 gname = pctlops->get_group_name(pctldev, in pinmux_disable_setting()
525 setting->data.mux.group); in pinmux_disable_setting()
526 dev_warn(pctldev->dev, in pinmux_disable_setting()
527 "not freeing pin %d (%s) as part of " in pinmux_disable_setting()
528 "deactivating group %s - it is already " in pinmux_disable_setting()
530 pins[i], desc->name, gname); in pinmux_disable_setting()
540 struct pinctrl_dev *pctldev = s->private; in pinmux_functions_show()
541 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_functions_show()
548 mutex_lock(&pctldev->mutex); in pinmux_functions_show()
549 nfuncs = pmxops->get_functions_count(pctldev); in pinmux_functions_show()
551 const char *func = pmxops->get_function_name(pctldev, in pinmux_functions_show()
558 ret = pmxops->get_function_groups(pctldev, func_selector, in pinmux_functions_show()
561 seq_printf(s, "function %s: COULD NOT GET GROUPS\n", in pinmux_functions_show()
567 seq_printf(s, "function: %s, groups = [ ", func); in pinmux_functions_show()
575 mutex_unlock(&pctldev->mutex); in pinmux_functions_show()
582 struct pinctrl_dev *pctldev = s->private; in pinmux_pins_show()
583 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_pins_show()
584 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_pins_show()
585 unsigned i, pin; in pinmux_pins_show() local
590 seq_puts(s, "Pinmux settings per pin\n"); in pinmux_pins_show()
591 if (pmxops->strict) in pinmux_pins_show()
593 "Format: pin (name): mux_owner|gpio_owner (strict) hog?\n"); in pinmux_pins_show()
596 "Format: pin (name): mux_owner gpio_owner hog?\n"); in pinmux_pins_show()
598 mutex_lock(&pctldev->mutex); in pinmux_pins_show()
600 /* The pin number can be retrived from the pin controller descriptor */ in pinmux_pins_show()
601 for (i = 0; i < pctldev->desc->npins; i++) { in pinmux_pins_show()
605 pin = pctldev->desc->pins[i].number; in pinmux_pins_show()
606 desc = pin_desc_get(pctldev, pin); in pinmux_pins_show()
607 /* Skip if we cannot search the pin */ in pinmux_pins_show()
611 if (desc->mux_owner && in pinmux_pins_show()
612 !strcmp(desc->mux_owner, pinctrl_dev_get_name(pctldev))) in pinmux_pins_show()
615 if (pmxops->strict) { in pinmux_pins_show()
616 if (desc->mux_owner) in pinmux_pins_show()
617 seq_printf(s, "pin %d (%s): device %s%s", in pinmux_pins_show()
618 pin, desc->name, desc->mux_owner, in pinmux_pins_show()
620 else if (desc->gpio_owner) in pinmux_pins_show()
621 seq_printf(s, "pin %d (%s): GPIO %s", in pinmux_pins_show()
622 pin, desc->name, desc->gpio_owner); in pinmux_pins_show()
624 seq_printf(s, "pin %d (%s): UNCLAIMED", in pinmux_pins_show()
625 pin, desc->name); in pinmux_pins_show()
627 /* For non-strict controllers */ in pinmux_pins_show()
628 seq_printf(s, "pin %d (%s): %s %s%s", pin, desc->name, in pinmux_pins_show()
629 desc->mux_owner ? desc->mux_owner in pinmux_pins_show()
631 desc->gpio_owner ? desc->gpio_owner in pinmux_pins_show()
636 /* If mux: print function+group claiming the pin */ in pinmux_pins_show()
637 if (desc->mux_setting) in pinmux_pins_show()
638 seq_printf(s, " function %s group %s\n", in pinmux_pins_show()
639 pmxops->get_function_name(pctldev, in pinmux_pins_show()
640 desc->mux_setting->func), in pinmux_pins_show()
641 pctlops->get_group_name(pctldev, in pinmux_pins_show()
642 desc->mux_setting->group)); in pinmux_pins_show()
647 mutex_unlock(&pctldev->mutex); in pinmux_pins_show()
655 map->data.mux.group ? map->data.mux.group : "(default)", in pinmux_show_map()
656 map->data.mux.function); in pinmux_show_map()
662 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_show_setting()
663 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_show_setting()
664 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_show_setting()
666 seq_printf(s, "group: %s (%u) function: %s (%u)\n", in pinmux_show_setting()
667 pctlops->get_group_name(pctldev, setting->data.mux.group), in pinmux_show_setting()
668 setting->data.mux.group, in pinmux_show_setting()
669 pmxops->get_function_name(pctldev, setting->data.mux.func), in pinmux_show_setting()
670 setting->data.mux.func); in pinmux_show_setting()
679 debugfs_create_file("pinmux-functions", S_IFREG | S_IRUGO, in pinmux_init_device_debugfs()
681 debugfs_create_file("pinmux-pins", S_IFREG | S_IRUGO, in pinmux_init_device_debugfs()
690 * pinmux_generic_get_function_count() - returns number of functions
691 * @pctldev: pin controller device
695 return pctldev->num_functions; in pinmux_generic_get_function_count()
700 * pinmux_generic_get_function_name() - returns the function name
701 * @pctldev: pin controller device
702 * @selector: function number
708 struct function_desc *function; in pinmux_generic_get_function_name() local
710 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_get_function_name()
712 if (!function) in pinmux_generic_get_function_name()
715 return function->name; in pinmux_generic_get_function_name()
720 * pinmux_generic_get_function_groups() - gets the function groups
721 * @pctldev: pin controller device
722 * @selector: function number
723 * @groups: array of pin groups
724 * @num_groups: number of pin groups
731 struct function_desc *function; in pinmux_generic_get_function_groups() local
733 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_get_function_groups()
735 if (!function) { in pinmux_generic_get_function_groups()
736 dev_err(pctldev->dev, "%s could not find function%i\n", in pinmux_generic_get_function_groups()
738 return -EINVAL; in pinmux_generic_get_function_groups()
740 *groups = function->group_names; in pinmux_generic_get_function_groups()
741 *num_groups = function->num_group_names; in pinmux_generic_get_function_groups()
748 * pinmux_generic_get_function() - returns a function based on the number
749 * @pctldev: pin controller device
750 * @selector: function number
755 struct function_desc *function; in pinmux_generic_get_function() local
757 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_get_function()
759 if (!function) in pinmux_generic_get_function()
762 return function; in pinmux_generic_get_function()
767 * pinmux_generic_add_function() - adds a function group
768 * @pctldev: pin controller device
769 * @name: name of the function
770 * @groups: array of pin groups
771 * @num_groups: number of pin groups
772 * @data: pin controller driver specific data
780 struct function_desc *function; in pinmux_generic_add_function() local
784 return -EINVAL; in pinmux_generic_add_function()
790 selector = pctldev->num_functions; in pinmux_generic_add_function()
792 function = devm_kzalloc(pctldev->dev, sizeof(*function), GFP_KERNEL); in pinmux_generic_add_function()
793 if (!function) in pinmux_generic_add_function()
794 return -ENOMEM; in pinmux_generic_add_function()
796 function->name = name; in pinmux_generic_add_function()
797 function->group_names = groups; in pinmux_generic_add_function()
798 function->num_group_names = num_groups; in pinmux_generic_add_function()
799 function->data = data; in pinmux_generic_add_function()
801 radix_tree_insert(&pctldev->pin_function_tree, selector, function); in pinmux_generic_add_function()
803 pctldev->num_functions++; in pinmux_generic_add_function()
810 * pinmux_generic_remove_function() - removes a numbered function
811 * @pctldev: pin controller device
812 * @selector: function number
819 struct function_desc *function; in pinmux_generic_remove_function() local
821 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_remove_function()
823 if (!function) in pinmux_generic_remove_function()
824 return -ENOENT; in pinmux_generic_remove_function()
826 radix_tree_delete(&pctldev->pin_function_tree, selector); in pinmux_generic_remove_function()
827 devm_kfree(pctldev->dev, function); in pinmux_generic_remove_function()
829 pctldev->num_functions--; in pinmux_generic_remove_function()
836 * pinmux_generic_free_functions() - removes all functions
837 * @pctldev: pin controller device
848 radix_tree_for_each_slot(slot, &pctldev->pin_function_tree, &iter, 0) in pinmux_generic_free_functions()
849 radix_tree_delete(&pctldev->pin_function_tree, iter.index); in pinmux_generic_free_functions()
851 pctldev->num_functions = 0; in pinmux_generic_free_functions()