• Home
  • Raw
  • Download

Lines Matching +full:non +full:- +full:muxed

4  * Copyright (C) 2011-2012 ST-Ericsson SA
5 * Written on behalf of Linaro for ST-Ericsson
21 #include <linux/radix-tree.h>
34 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_check_ops()
40 !ops->get_functions_count || in pinmux_check_ops()
41 !ops->get_function_name || in pinmux_check_ops()
42 !ops->get_function_groups || in pinmux_check_ops()
43 !ops->set_mux) { in pinmux_check_ops()
44 dev_err(pctldev->dev, "pinmux ops lacks necessary functions\n"); in pinmux_check_ops()
45 return -EINVAL; in pinmux_check_ops()
48 nfuncs = ops->get_functions_count(pctldev); in pinmux_check_ops()
50 const char *fname = ops->get_function_name(pctldev, in pinmux_check_ops()
53 dev_err(pctldev->dev, "pinmux ops has no name for function%u\n", in pinmux_check_ops()
55 return -EINVAL; in pinmux_check_ops()
65 if (!map->data.mux.function) { in pinmux_validate_map()
67 map->name, i); in pinmux_validate_map()
68 return -EINVAL; in pinmux_validate_map()
75 * pin_request() - request a single pin to be muxed in, typically for GPIO
87 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pin_request()
88 int status = -EINVAL; in pin_request()
92 dev_err(pctldev->dev, in pin_request()
98 dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n", in pin_request()
99 pin, desc->name, owner); in pin_request()
101 if ((!gpio_range || ops->strict) && in pin_request()
102 desc->mux_usecount && strcmp(desc->mux_owner, owner)) { in pin_request()
103 dev_err(pctldev->dev, in pin_request()
105 desc->name, desc->mux_owner, owner); in pin_request()
109 if ((gpio_range || ops->strict) && desc->gpio_owner) { in pin_request()
110 dev_err(pctldev->dev, in pin_request()
112 desc->name, desc->gpio_owner, owner); in pin_request()
117 desc->gpio_owner = owner; in pin_request()
119 desc->mux_usecount++; in pin_request()
120 if (desc->mux_usecount > 1) in pin_request()
123 desc->mux_owner = owner; in pin_request()
127 if (!try_module_get(pctldev->owner)) { in pin_request()
128 dev_err(pctldev->dev, in pin_request()
131 status = -EINVAL; in pin_request()
139 if (gpio_range && ops->gpio_request_enable) in pin_request()
141 status = ops->gpio_request_enable(pctldev, gpio_range, pin); in pin_request()
142 else if (ops->request) in pin_request()
143 status = ops->request(pctldev, pin); in pin_request()
148 dev_err(pctldev->dev, "request() failed for pin %d\n", pin); in pin_request()
149 module_put(pctldev->owner); in pin_request()
155 desc->gpio_owner = NULL; in pin_request()
157 desc->mux_usecount--; in pin_request()
158 if (!desc->mux_usecount) in pin_request()
159 desc->mux_owner = NULL; in pin_request()
164 dev_err(pctldev->dev, "pin-%d (%s) status %d\n", in pin_request()
171 * pin_free() - release a single muxed in pin so something else can be muxed
184 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pin_free()
190 dev_err(pctldev->dev, in pin_free()
199 if (WARN_ON(!desc->mux_usecount)) in pin_free()
201 desc->mux_usecount--; in pin_free()
202 if (desc->mux_usecount) in pin_free()
210 if (gpio_range && ops->gpio_disable_free) in pin_free()
211 ops->gpio_disable_free(pctldev, gpio_range, pin); in pin_free()
212 else if (ops->free) in pin_free()
213 ops->free(pctldev, pin); in pin_free()
216 owner = desc->gpio_owner; in pin_free()
217 desc->gpio_owner = NULL; in pin_free()
219 owner = desc->mux_owner; in pin_free()
220 desc->mux_owner = NULL; in pin_free()
221 desc->mux_setting = NULL; in pin_free()
224 module_put(pctldev->owner); in pin_free()
230 * pinmux_request_gpio() - request pinmuxing for a GPIO pin
243 owner = kasprintf(GFP_KERNEL, "%s:%d", range->name, gpio); in pinmux_request_gpio()
245 return -ENOMEM; in pinmux_request_gpio()
255 * pinmux_free_gpio() - release a pin from GPIO muxing
257 * @pin: the affected currently GPIO-muxed in pin
270 * pinmux_gpio_direction() - set the direction of a single muxed-in GPIO pin
283 ops = pctldev->desc->pmxops; in pinmux_gpio_direction()
285 if (ops->gpio_set_direction) in pinmux_gpio_direction()
286 ret = ops->gpio_set_direction(pctldev, range, pin, input); in pinmux_gpio_direction()
296 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_func_name_to_selector()
297 unsigned nfuncs = ops->get_functions_count(pctldev); in pinmux_func_name_to_selector()
302 const char *fname = ops->get_function_name(pctldev, selector); in pinmux_func_name_to_selector()
310 return -EINVAL; in pinmux_func_name_to_selector()
316 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_map_to_setting()
317 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_map_to_setting()
324 dev_err(pctldev->dev, "does not support mux function\n"); in pinmux_map_to_setting()
325 return -EINVAL; in pinmux_map_to_setting()
328 ret = pinmux_func_name_to_selector(pctldev, map->data.mux.function); in pinmux_map_to_setting()
330 dev_err(pctldev->dev, "invalid function %s in map table\n", in pinmux_map_to_setting()
331 map->data.mux.function); in pinmux_map_to_setting()
334 setting->data.mux.func = ret; in pinmux_map_to_setting()
336 ret = pmxops->get_function_groups(pctldev, setting->data.mux.func, in pinmux_map_to_setting()
339 dev_err(pctldev->dev, "can't query groups for function %s\n", in pinmux_map_to_setting()
340 map->data.mux.function); in pinmux_map_to_setting()
344 dev_err(pctldev->dev, in pinmux_map_to_setting()
346 map->data.mux.function); in pinmux_map_to_setting()
347 return -EINVAL; in pinmux_map_to_setting()
349 if (map->data.mux.group) { in pinmux_map_to_setting()
350 group = map->data.mux.group; in pinmux_map_to_setting()
353 dev_err(pctldev->dev, in pinmux_map_to_setting()
355 group, map->data.mux.function); in pinmux_map_to_setting()
364 dev_err(pctldev->dev, "invalid group %s in map table\n", in pinmux_map_to_setting()
365 map->data.mux.group); in pinmux_map_to_setting()
368 setting->data.mux.group = ret; in pinmux_map_to_setting()
380 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_enable_setting()
381 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_enable_setting()
382 const struct pinmux_ops *ops = pctldev->desc->pmxops; in pinmux_enable_setting()
389 if (pctlops->get_group_pins) in pinmux_enable_setting()
390 ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, in pinmux_enable_setting()
397 gname = pctlops->get_group_name(pctldev, in pinmux_enable_setting()
398 setting->data.mux.group); in pinmux_enable_setting()
399 dev_warn(pctldev->dev, in pinmux_enable_setting()
407 ret = pin_request(pctldev, pins[i], setting->dev_name, NULL); in pinmux_enable_setting()
413 pname = desc ? desc->name : "non-existing"; in pinmux_enable_setting()
414 gname = pctlops->get_group_name(pctldev, in pinmux_enable_setting()
415 setting->data.mux.group); in pinmux_enable_setting()
416 dev_err(pctldev->dev, in pinmux_enable_setting()
429 dev_warn(pctldev->dev, in pinmux_enable_setting()
434 desc->mux_setting = &(setting->data.mux); in pinmux_enable_setting()
437 ret = ops->set_mux(pctldev, setting->data.mux.func, in pinmux_enable_setting()
438 setting->data.mux.group); in pinmux_enable_setting()
449 desc->mux_setting = NULL; in pinmux_enable_setting()
453 while (--i >= 0) in pinmux_enable_setting()
461 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_disable_setting()
462 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_disable_setting()
469 if (pctlops->get_group_pins) in pinmux_disable_setting()
470 ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, in pinmux_disable_setting()
476 gname = pctlops->get_group_name(pctldev, in pinmux_disable_setting()
477 setting->data.mux.group); in pinmux_disable_setting()
478 dev_warn(pctldev->dev, in pinmux_disable_setting()
488 dev_warn(pctldev->dev, in pinmux_disable_setting()
493 if (desc->mux_setting == &(setting->data.mux)) { in pinmux_disable_setting()
498 gname = pctlops->get_group_name(pctldev, in pinmux_disable_setting()
499 setting->data.mux.group); in pinmux_disable_setting()
500 dev_warn(pctldev->dev, in pinmux_disable_setting()
502 "deactivating group %s - it is already " in pinmux_disable_setting()
504 pins[i], desc->name, gname); in pinmux_disable_setting()
514 struct pinctrl_dev *pctldev = s->private; in pinmux_functions_show()
515 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_functions_show()
522 mutex_lock(&pctldev->mutex); in pinmux_functions_show()
523 nfuncs = pmxops->get_functions_count(pctldev); in pinmux_functions_show()
525 const char *func = pmxops->get_function_name(pctldev, in pinmux_functions_show()
532 ret = pmxops->get_function_groups(pctldev, func_selector, in pinmux_functions_show()
549 mutex_unlock(&pctldev->mutex); in pinmux_functions_show()
556 struct pinctrl_dev *pctldev = s->private; in pinmux_pins_show()
557 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_pins_show()
558 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_pins_show()
565 if (pmxops->strict) in pinmux_pins_show()
572 mutex_lock(&pctldev->mutex); in pinmux_pins_show()
575 for (i = 0; i < pctldev->desc->npins; i++) { in pinmux_pins_show()
579 pin = pctldev->desc->pins[i].number; in pinmux_pins_show()
585 if (desc->mux_owner && in pinmux_pins_show()
586 !strcmp(desc->mux_owner, pinctrl_dev_get_name(pctldev))) in pinmux_pins_show()
589 if (pmxops->strict) { in pinmux_pins_show()
590 if (desc->mux_owner) in pinmux_pins_show()
592 pin, desc->name, desc->mux_owner, in pinmux_pins_show()
594 else if (desc->gpio_owner) in pinmux_pins_show()
596 pin, desc->name, desc->gpio_owner); in pinmux_pins_show()
599 pin, desc->name); in pinmux_pins_show()
601 /* For non-strict controllers */ in pinmux_pins_show()
602 seq_printf(s, "pin %d (%s): %s %s%s", pin, desc->name, in pinmux_pins_show()
603 desc->mux_owner ? desc->mux_owner in pinmux_pins_show()
605 desc->gpio_owner ? desc->gpio_owner in pinmux_pins_show()
611 if (desc->mux_setting) in pinmux_pins_show()
613 pmxops->get_function_name(pctldev, in pinmux_pins_show()
614 desc->mux_setting->func), in pinmux_pins_show()
615 pctlops->get_group_name(pctldev, in pinmux_pins_show()
616 desc->mux_setting->group)); in pinmux_pins_show()
621 mutex_unlock(&pctldev->mutex); in pinmux_pins_show()
629 map->data.mux.group ? map->data.mux.group : "(default)", in pinmux_show_map()
630 map->data.mux.function); in pinmux_show_map()
636 struct pinctrl_dev *pctldev = setting->pctldev; in pinmux_show_setting()
637 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; in pinmux_show_setting()
638 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; in pinmux_show_setting()
641 pctlops->get_group_name(pctldev, setting->data.mux.group), in pinmux_show_setting()
642 setting->data.mux.group, in pinmux_show_setting()
643 pmxops->get_function_name(pctldev, setting->data.mux.func), in pinmux_show_setting()
644 setting->data.mux.func); in pinmux_show_setting()
649 return single_open(file, pinmux_functions_show, inode->i_private); in pinmux_functions_open()
654 return single_open(file, pinmux_pins_show, inode->i_private); in pinmux_pins_open()
674 debugfs_create_file("pinmux-functions", S_IFREG | S_IRUGO, in pinmux_init_device_debugfs()
676 debugfs_create_file("pinmux-pins", S_IFREG | S_IRUGO, in pinmux_init_device_debugfs()
685 * pinmux_generic_get_function_count() - returns number of functions
690 return pctldev->num_functions; in pinmux_generic_get_function_count()
695 * pinmux_generic_get_function_name() - returns the function name
705 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_get_function_name()
710 return function->name; in pinmux_generic_get_function_name()
715 * pinmux_generic_get_function_groups() - gets the function groups
728 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_get_function_groups()
731 dev_err(pctldev->dev, "%s could not find function%i\n", in pinmux_generic_get_function_groups()
733 return -EINVAL; in pinmux_generic_get_function_groups()
735 *groups = function->group_names; in pinmux_generic_get_function_groups()
736 *num_groups = function->num_group_names; in pinmux_generic_get_function_groups()
743 * pinmux_generic_get_function() - returns a function based on the number
752 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_get_function()
762 * pinmux_generic_add_function() - adds a function group
779 return -EINVAL; in pinmux_generic_add_function()
785 selector = pctldev->num_functions; in pinmux_generic_add_function()
787 function = devm_kzalloc(pctldev->dev, sizeof(*function), GFP_KERNEL); in pinmux_generic_add_function()
789 return -ENOMEM; in pinmux_generic_add_function()
791 function->name = name; in pinmux_generic_add_function()
792 function->group_names = groups; in pinmux_generic_add_function()
793 function->num_group_names = num_groups; in pinmux_generic_add_function()
794 function->data = data; in pinmux_generic_add_function()
796 radix_tree_insert(&pctldev->pin_function_tree, selector, function); in pinmux_generic_add_function()
798 pctldev->num_functions++; in pinmux_generic_add_function()
805 * pinmux_generic_remove_function() - removes a numbered function
816 function = radix_tree_lookup(&pctldev->pin_function_tree, in pinmux_generic_remove_function()
819 return -ENOENT; in pinmux_generic_remove_function()
821 radix_tree_delete(&pctldev->pin_function_tree, selector); in pinmux_generic_remove_function()
822 devm_kfree(pctldev->dev, function); in pinmux_generic_remove_function()
824 pctldev->num_functions--; in pinmux_generic_remove_function()
831 * pinmux_generic_free_functions() - removes all functions
843 radix_tree_for_each_slot(slot, &pctldev->pin_function_tree, &iter, 0) in pinmux_generic_free_functions()
844 radix_tree_delete(&pctldev->pin_function_tree, iter.index); in pinmux_generic_free_functions()
846 pctldev->num_functions = 0; in pinmux_generic_free_functions()