Lines Matching +full:data +full:- +full:pins

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
62 * struct zynqmp_pinctrl - driver data
69 * This struct is stored as driver data and used to retrieve
71 * group pins.
82 * struct zynqmp_pctrl_group - Pin control group info
84 * @pins: Group pin numbers
85 * @npins: Number of pins in the group
89 unsigned int pins[MAX_GROUP_PIN]; member
99 return pctrl->ngroups; in zynqmp_pctrl_get_groups_count()
107 return pctrl->groups[selector].name; in zynqmp_pctrl_get_group_name()
112 const unsigned int **pins, in zynqmp_pctrl_get_group_pins() argument
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
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
190 * Loop through all pins of the group and call firmware API
191 * to set requested function for all pins in the group.
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()
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
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
539 * @func: Function data.
540 * @groups: Groups data.
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()
657 group->pins[group->npins++] = pin; in zynqmp_pinctrl_group_add_pin()
661 * zynqmp_pinctrl_create_pin_groups() - assign pins to respective groups
663 * @groups: Groups data.
670 * Once all pins are queries, each group would have its number
671 * of pins and pin numbers data.
703 * zynqmp_pinctrl_prepare_group_pins() - prepare each group's pin data
705 * @groups: Groups data.
708 * Prepare pin number and number of pins data for each pins.
729 * zynqmp_pinctrl_prepare_function_info() - prepare function info
731 * @pctrl: Pin control driver data.
734 * prepare pin control driver data.
739 * functions and groups data, query and store required information
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
812 * @npins: Number of pins.
814 * Query number of pins information from firmware and prepare pin
824 struct pinctrl_pin_desc *pins, *pin; in zynqmp_pinctrl_prepare_pin_desc() local
832 pins = devm_kzalloc(dev, sizeof(*pins) * *npins, GFP_KERNEL); in zynqmp_pinctrl_prepare_pin_desc()
833 if (!pins) in zynqmp_pinctrl_prepare_pin_desc()
834 return -ENOMEM; in zynqmp_pinctrl_prepare_pin_desc()
837 pin = &pins[i]; 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()
845 *zynqmp_pins = pins; 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()
860 &zynqmp_desc.pins, 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",