Lines Matching +full:function +full:- +full:group
1 // SPDX-License-Identifier: GPL-2.0
11 #include <dt-bindings/pinctrl/pinctrl-zynqmp.h>
18 #include <linux/firmware/xlnx-zynqmp.h>
20 #include <linux/pinctrl/pinconf-generic.h>
26 #include "pinctrl-utils.h"
47 * struct zynqmp_pmux_function - a pinmux function
48 * @name: Name of the pin mux function
49 * @groups: List of pin groups for this function
51 * @node: Firmware node matching with the function
53 * This structure holds information about pin control function
54 * and function group names supporting that function.
63 * struct zynqmp_pinctrl - driver data
72 * group pins.
83 * struct zynqmp_pctrl_group - Pin control group info
84 * @name: Group name
85 * @pins: Group pin numbers
86 * @npins: Number of pins in the group
100 return pctrl->ngroups; in zynqmp_pctrl_get_groups_count()
108 return pctrl->groups[selector].name; in zynqmp_pctrl_get_group_name()
118 *pins = pctrl->groups[selector].pins; in zynqmp_pctrl_get_group_pins()
119 *npins = pctrl->groups[selector].npins; in zynqmp_pctrl_get_group_pins()
139 dev_err(pctldev->dev, "request failed for pin %u\n", pin); in zynqmp_pinmux_request_pin()
150 return pctrl->nfuncs; in zynqmp_pmux_get_functions_count()
158 return pctrl->funcs[selector].name; in zynqmp_pmux_get_function_name()
162 * zynqmp_pmux_get_function_groups() - Get groups for the function
164 * @selector: Function ID
165 * @groups: Group names.
166 * @num_groups: Number of function groups.
168 * Get function's group count and group names.
179 *groups = pctrl->funcs[selector].groups; in zynqmp_pmux_get_function_groups()
180 *num_groups = pctrl->funcs[selector].ngroups; in zynqmp_pmux_get_function_groups()
186 * zynqmp_pinmux_set_mux() - Set requested function for the group
188 * @function: Function ID.
189 * @group: Group ID.
191 * Loop through all pins of the group and call firmware API
192 * to set requested function for all pins in the group.
197 unsigned int function, in zynqmp_pinmux_set_mux() argument
198 unsigned int group) in zynqmp_pinmux_set_mux() argument
201 const struct zynqmp_pctrl_group *pgrp = &pctrl->groups[group]; in zynqmp_pinmux_set_mux()
204 for (i = 0; i < pgrp->npins; i++) { in zynqmp_pinmux_set_mux()
205 unsigned int pin = pgrp->pins[i]; in zynqmp_pinmux_set_mux()
207 ret = zynqmp_pm_pinctrl_set_function(pin, function); in zynqmp_pinmux_set_mux()
209 dev_err(pctldev->dev, "set mux failed for pin %u\n", in zynqmp_pinmux_set_mux()
225 dev_err(pctldev->dev, "free pin failed for pin %u\n", in zynqmp_pinmux_release_pin()
243 * zynqmp_pinconf_cfg_get() - get config value for the pin
269 return -EINVAL; in zynqmp_pinconf_cfg_get()
277 return -EINVAL; in zynqmp_pinconf_cfg_get()
285 return -EINVAL; in zynqmp_pinconf_cfg_get()
315 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_get()
318 return -EINVAL; in zynqmp_pinconf_cfg_get()
322 ret = -ENOTSUPP; in zynqmp_pinconf_cfg_get()
336 * zynqmp_pinconf_cfg_set() - Set requested config for the pin
398 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
401 return -EINVAL; in zynqmp_pinconf_cfg_set()
412 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
436 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
439 ret = -ENOTSUPP; in zynqmp_pinconf_cfg_set()
446 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
455 * zynqmp_pinconf_group_set() - Set requested config for the group
457 * @selector: Group ID.
461 * Call function to set configs for each pin in the group.
472 const struct zynqmp_pctrl_group *pgrp = &pctrl->groups[selector]; in zynqmp_pinconf_group_set()
474 for (i = 0; i < pgrp->npins; i++) { in zynqmp_pinconf_group_set()
475 ret = zynqmp_pinconf_cfg_set(pctldev, pgrp->pins[i], configs, in zynqmp_pinconf_group_set()
537 * zynqmp_pinctrl_prepare_func_groups() - prepare function and groups data
539 * @fid: Function ID.
540 * @func: Function data.
543 * Query firmware to get group IDs for each function. Firmware returns
544 * group IDs. Based on the group index for the function, group names in
545 * the function are stored. For example, the first group in "eth0" function
546 * is named as "eth0_0" and the second group as "eth0_1" and so on.
548 * Based on the group ID received from the firmware, function stores name of
549 * the group for that group ID. For example, if "eth0" first group ID
552 * Once done for each function, each function would have its group names
553 * and each group would also have their names.
565 fgroups = devm_kzalloc(dev, sizeof(*fgroups) * func->ngroups, GFP_KERNEL); in zynqmp_pinctrl_prepare_func_groups()
567 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
569 for (index = 0; index < func->ngroups; index += NUM_GROUPS_PER_RESP) { in zynqmp_pinctrl_prepare_func_groups()
583 func->name, in zynqmp_pinctrl_prepare_func_groups()
586 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
590 func->name, in zynqmp_pinctrl_prepare_func_groups()
593 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
597 func->groups = fgroups; in zynqmp_pinctrl_prepare_func_groups()
611 * Name of the function is maximum 16 bytes and cannot in zynqmp_pinctrl_get_function_name()
655 static void zynqmp_pinctrl_group_add_pin(struct zynqmp_pctrl_group *group, in zynqmp_pinctrl_group_add_pin() argument
658 group->pins[group->npins++] = pin; in zynqmp_pinctrl_group_add_pin()
662 * zynqmp_pinctrl_create_pin_groups() - assign pins to respective groups
668 * Based on the firmware response(group IDs for the pin), add
669 * pin number to the respective group's pin array.
671 * Once all pins are queries, each group would have its number
704 * zynqmp_pinctrl_prepare_group_pins() - prepare each group's pin data
730 * zynqmp_pinctrl_prepare_function_info() - prepare function info
737 * Query number of functions and number of function groups (number
738 * of groups in the given function) to allocate required memory buffers
741 * (number of groups and group names for each function, number of
742 * pins and pin numbers for each group).
753 ret = zynqmp_pinctrl_get_num_functions(&pctrl->nfuncs); in zynqmp_pinctrl_prepare_function_info()
757 funcs = devm_kzalloc(dev, sizeof(*funcs) * pctrl->nfuncs, GFP_KERNEL); in zynqmp_pinctrl_prepare_function_info()
759 return -ENOMEM; in zynqmp_pinctrl_prepare_function_info()
761 for (i = 0; i < pctrl->nfuncs; i++) { in zynqmp_pinctrl_prepare_function_info()
768 pctrl->ngroups += funcs[i].ngroups; in zynqmp_pinctrl_prepare_function_info()
771 groups = devm_kzalloc(dev, sizeof(*groups) * pctrl->ngroups, GFP_KERNEL); in zynqmp_pinctrl_prepare_function_info()
773 return -ENOMEM; in zynqmp_pinctrl_prepare_function_info()
775 for (i = 0; i < pctrl->nfuncs; i++) { in zynqmp_pinctrl_prepare_function_info()
782 ret = zynqmp_pinctrl_prepare_group_pins(dev, groups, pctrl->ngroups); in zynqmp_pinctrl_prepare_function_info()
786 pctrl->funcs = funcs; in zynqmp_pinctrl_prepare_function_info()
787 pctrl->groups = groups; in zynqmp_pinctrl_prepare_function_info()
810 * zynqmp_pinctrl_prepare_pin_desc() - prepare pin description info
835 return -ENOMEM; in zynqmp_pinctrl_prepare_pin_desc()
839 pin->number = i; in zynqmp_pinctrl_prepare_pin_desc()
840 pin->name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", in zynqmp_pinctrl_prepare_pin_desc()
842 if (!pin->name) in zynqmp_pinctrl_prepare_pin_desc()
843 return -ENOMEM; in zynqmp_pinctrl_prepare_pin_desc()
856 pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); in zynqmp_pinctrl_probe()
858 return -ENOMEM; in zynqmp_pinctrl_probe()
860 ret = zynqmp_pinctrl_prepare_pin_desc(&pdev->dev, in zynqmp_pinctrl_probe()
864 dev_err(&pdev->dev, "pin desc prepare fail with %d\n", ret); in zynqmp_pinctrl_probe()
868 ret = zynqmp_pinctrl_prepare_function_info(&pdev->dev, pctrl); in zynqmp_pinctrl_probe()
870 dev_err(&pdev->dev, "function info prepare fail with %d\n", ret); in zynqmp_pinctrl_probe()
874 pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &zynqmp_desc, pctrl); in zynqmp_pinctrl_probe()
875 if (IS_ERR(pctrl->pctrl)) in zynqmp_pinctrl_probe()
876 return PTR_ERR(pctrl->pctrl); in zynqmp_pinctrl_probe()
884 { .compatible = "xlnx,zynqmp-pinctrl" },
891 .name = "zynqmp-pinctrl",