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
52 * This structure holds information about pin control function
53 * and function group names supporting that function.
62 * struct zynqmp_pinctrl - driver data
71 * group pins.
82 * struct zynqmp_pctrl_group - Pin control group info
83 * @name: Group name
84 * @pins: Group pin numbers
85 * @npins: Number of pins in the group
99 return pctrl->ngroups; in zynqmp_pctrl_get_groups_count()
107 return pctrl->groups[selector].name; in zynqmp_pctrl_get_group_name()
117 *pins = pctrl->groups[selector].pins; in zynqmp_pctrl_get_group_pins()
118 *npins = pctrl->groups[selector].npins; in zynqmp_pctrl_get_group_pins()
138 dev_err(pctldev->dev, "request failed for pin %u\n", pin); in zynqmp_pinmux_request_pin()
149 return pctrl->nfuncs; in zynqmp_pmux_get_functions_count()
157 return pctrl->funcs[selector].name; in zynqmp_pmux_get_function_name()
161 * zynqmp_pmux_get_function_groups() - Get groups for the function
163 * @selector: Function ID
164 * @groups: Group names.
165 * @num_groups: Number of function groups.
167 * Get function's group count and group names.
178 *groups = pctrl->funcs[selector].groups; in zynqmp_pmux_get_function_groups()
179 *num_groups = pctrl->funcs[selector].ngroups; in zynqmp_pmux_get_function_groups()
185 * zynqmp_pinmux_set_mux() - Set requested function for the group
187 * @function: Function ID.
188 * @group: Group ID.
190 * Loop through all pins of the group and call firmware API
191 * to set requested function for all pins in the group.
196 unsigned int function, in zynqmp_pinmux_set_mux() argument
197 unsigned int group) in zynqmp_pinmux_set_mux() argument
200 const struct zynqmp_pctrl_group *pgrp = &pctrl->groups[group]; in zynqmp_pinmux_set_mux()
203 for (i = 0; i < pgrp->npins; i++) { in zynqmp_pinmux_set_mux()
204 unsigned int pin = pgrp->pins[i]; in zynqmp_pinmux_set_mux()
206 ret = zynqmp_pm_pinctrl_set_function(pin, function); in zynqmp_pinmux_set_mux()
208 dev_err(pctldev->dev, "set mux failed for pin %u\n", in zynqmp_pinmux_set_mux()
224 dev_err(pctldev->dev, "free pin failed for pin %u\n", in zynqmp_pinmux_release_pin()
242 * zynqmp_pinconf_cfg_get() - get config value for the pin
268 return -EINVAL; in zynqmp_pinconf_cfg_get()
276 return -EINVAL; in zynqmp_pinconf_cfg_get()
284 return -EINVAL; in zynqmp_pinconf_cfg_get()
314 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_get()
317 return -EINVAL; in zynqmp_pinconf_cfg_get()
321 ret = -ENOTSUPP; in zynqmp_pinconf_cfg_get()
335 * zynqmp_pinconf_cfg_set() - Set requested config for the pin
397 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
400 return -EINVAL; in zynqmp_pinconf_cfg_set()
411 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
435 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
438 ret = -ENOTSUPP; in zynqmp_pinconf_cfg_set()
445 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
454 * zynqmp_pinconf_group_set() - Set requested config for the group
456 * @selector: Group ID.
460 * Call function to set configs for each pin in the group.
471 const struct zynqmp_pctrl_group *pgrp = &pctrl->groups[selector]; in zynqmp_pinconf_group_set()
473 for (i = 0; i < pgrp->npins; i++) { in zynqmp_pinconf_group_set()
474 ret = zynqmp_pinconf_cfg_set(pctldev, pgrp->pins[i], configs, in zynqmp_pinconf_group_set()
536 * zynqmp_pinctrl_prepare_func_groups() - prepare function and groups data
538 * @fid: Function ID.
539 * @func: Function data.
542 * Query firmware to get group IDs for each function. Firmware returns
543 * group IDs. Based on the group index for the function, group names in
544 * the function are stored. For example, the first group in "eth0" function
545 * is named as "eth0_0" and the second group as "eth0_1" and so on.
547 * Based on the group ID received from the firmware, function stores name of
548 * the group for that group ID. For example, if "eth0" first group ID
551 * Once done for each function, each function would have its group names
552 * and each group would also have their names.
564 fgroups = devm_kzalloc(dev, sizeof(*fgroups) * func->ngroups, GFP_KERNEL); in zynqmp_pinctrl_prepare_func_groups()
566 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
568 for (index = 0; index < func->ngroups; index += NUM_GROUPS_PER_RESP) { in zynqmp_pinctrl_prepare_func_groups()
582 func->name, in zynqmp_pinctrl_prepare_func_groups()
585 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
589 func->name, in zynqmp_pinctrl_prepare_func_groups()
592 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
596 func->groups = fgroups; in zynqmp_pinctrl_prepare_func_groups()
610 * Name of the function is maximum 16 bytes and cannot in zynqmp_pinctrl_get_function_name()
654 static void zynqmp_pinctrl_group_add_pin(struct zynqmp_pctrl_group *group, in zynqmp_pinctrl_group_add_pin() argument
657 group->pins[group->npins++] = pin; in zynqmp_pinctrl_group_add_pin()
661 * zynqmp_pinctrl_create_pin_groups() - assign pins to respective groups
667 * Based on the firmware response(group IDs for the pin), add
668 * pin number to the respective group's pin array.
670 * Once all pins are queries, each group would have its number
703 * zynqmp_pinctrl_prepare_group_pins() - prepare each group's pin data
729 * zynqmp_pinctrl_prepare_function_info() - prepare function info
736 * Query number of functions and number of function groups (number
737 * of groups in the given function) to allocate required memory buffers
740 * (number of groups and group names for each function, number of
741 * pins and pin numbers for each group).
752 ret = zynqmp_pinctrl_get_num_functions(&pctrl->nfuncs); in zynqmp_pinctrl_prepare_function_info()
756 funcs = devm_kzalloc(dev, sizeof(*funcs) * pctrl->nfuncs, GFP_KERNEL); in zynqmp_pinctrl_prepare_function_info()
758 return -ENOMEM; in zynqmp_pinctrl_prepare_function_info()
760 for (i = 0; i < pctrl->nfuncs; i++) { in zynqmp_pinctrl_prepare_function_info()
767 pctrl->ngroups += funcs[i].ngroups; in zynqmp_pinctrl_prepare_function_info()
770 groups = devm_kzalloc(dev, sizeof(*groups) * pctrl->ngroups, GFP_KERNEL); in zynqmp_pinctrl_prepare_function_info()
772 return -ENOMEM; in zynqmp_pinctrl_prepare_function_info()
774 for (i = 0; i < pctrl->nfuncs; i++) { in zynqmp_pinctrl_prepare_function_info()
781 ret = zynqmp_pinctrl_prepare_group_pins(dev, groups, pctrl->ngroups); in zynqmp_pinctrl_prepare_function_info()
785 pctrl->funcs = funcs; in zynqmp_pinctrl_prepare_function_info()
786 pctrl->groups = groups; in zynqmp_pinctrl_prepare_function_info()
809 * zynqmp_pinctrl_prepare_pin_desc() - prepare pin description info
834 return -ENOMEM; in zynqmp_pinctrl_prepare_pin_desc()
838 pin->number = i; in zynqmp_pinctrl_prepare_pin_desc()
839 pin->name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", in zynqmp_pinctrl_prepare_pin_desc()
841 if (!pin->name) in zynqmp_pinctrl_prepare_pin_desc()
842 return -ENOMEM; in zynqmp_pinctrl_prepare_pin_desc()
855 pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); in zynqmp_pinctrl_probe()
857 return -ENOMEM; in zynqmp_pinctrl_probe()
859 ret = zynqmp_pinctrl_prepare_pin_desc(&pdev->dev, in zynqmp_pinctrl_probe()
863 dev_err(&pdev->dev, "pin desc prepare fail with %d\n", ret); in zynqmp_pinctrl_probe()
867 ret = zynqmp_pinctrl_prepare_function_info(&pdev->dev, pctrl); in zynqmp_pinctrl_probe()
869 dev_err(&pdev->dev, "function info prepare fail with %d\n", ret); in zynqmp_pinctrl_probe()
873 pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &zynqmp_desc, pctrl); in zynqmp_pinctrl_probe()
874 if (IS_ERR(pctrl->pctrl)) in zynqmp_pinctrl_probe()
875 return PTR_ERR(pctrl->pctrl); in zynqmp_pinctrl_probe()
883 { .compatible = "xlnx,zynqmp-pinctrl" },
890 .name = "zynqmp-pinctrl",