Lines Matching +full:zynqmp +full:- +full:firmware

1 // SPDX-License-Identifier: GPL-2.0
3 * ZynqMP pin controller
11 #include <dt-bindings/pinctrl/pinctrl-zynqmp.h>
20 #include <linux/firmware/xlnx-zynqmp.h>
22 #include <linux/pinctrl/pinconf-generic.h>
28 #include "pinctrl-utils.h"
55 * struct zynqmp_pmux_function - a pinmux function
70 * struct zynqmp_pinctrl - driver data
90 * struct zynqmp_pctrl_group - Pin control group info
108 return pctrl->ngroups + zynqmp_desc.npins; in zynqmp_pctrl_get_groups_count()
116 if (selector < pctrl->ngroups) in zynqmp_pctrl_get_group_name()
117 return pctrl->groups[selector].name; in zynqmp_pctrl_get_group_name()
119 return zynqmp_desc.pins[selector - pctrl->ngroups].name; in zynqmp_pctrl_get_group_name()
129 if (selector < pctrl->ngroups) { in zynqmp_pctrl_get_group_pins()
130 *pins = pctrl->groups[selector].pins; in zynqmp_pctrl_get_group_pins()
131 *npins = pctrl->groups[selector].npins; in zynqmp_pctrl_get_group_pins()
133 *pins = &zynqmp_desc.pins[selector - pctrl->ngroups].number; in zynqmp_pctrl_get_group_pins()
155 dev_err(pctldev->dev, "request failed for pin %u\n", pin); in zynqmp_pinmux_request_pin()
166 return pctrl->nfuncs; in zynqmp_pmux_get_functions_count()
174 return pctrl->funcs[selector].name; in zynqmp_pmux_get_function_name()
178 * zynqmp_pmux_get_function_groups() - Get groups for the function
195 *groups = pctrl->funcs[selector].groups; in zynqmp_pmux_get_function_groups()
196 *num_groups = pctrl->funcs[selector].ngroups; in zynqmp_pmux_get_function_groups()
202 * zynqmp_pinmux_set_mux() - Set requested function for the group
207 * Loop through all pins of the group and call firmware API
224 dev_err(pctldev->dev, "set mux failed for pin %u\n", in zynqmp_pinmux_set_mux()
240 dev_err(pctldev->dev, "free pin failed for pin %u\n", in zynqmp_pinmux_release_pin()
258 * zynqmp_pinconf_cfg_get() - get config value for the pin
284 return -EINVAL; in zynqmp_pinconf_cfg_get()
292 return -EINVAL; in zynqmp_pinconf_cfg_get()
300 return -EINVAL; in zynqmp_pinconf_cfg_get()
330 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_get()
333 return -EINVAL; in zynqmp_pinconf_cfg_get()
337 ret = -ENOTSUPP; in zynqmp_pinconf_cfg_get()
351 * zynqmp_pinconf_cfg_set() - Set requested config for the pin
357 * Loop through all configurations and call firmware API
413 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
416 return -EINVAL; in zynqmp_pinconf_cfg_set()
427 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
451 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
454 ret = -ENOTSUPP; in zynqmp_pinconf_cfg_set()
461 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
470 * zynqmp_pinconf_group_set() - Set requested config for the group
553 * zynqmp_pinctrl_prepare_func_groups() - prepare function and groups data
559 * Query firmware to get group IDs for each function. Firmware returns
564 * Based on the group ID received from the firmware, function stores name of
585 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
587 for (index = 0; index < func->ngroups; index += NUM_GROUPS_PER_RESP) { in zynqmp_pinctrl_prepare_func_groups()
601 func->name, in zynqmp_pinctrl_prepare_func_groups()
604 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
610 __set_bit((u8)groups[resp[i]].pins[pin] - 1, used_pins); in zynqmp_pinctrl_prepare_func_groups()
616 fgroups = devm_kcalloc(dev, size_add(func->ngroups, npins), in zynqmp_pinctrl_prepare_func_groups()
619 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
621 for (i = 0; i < func->ngroups; i++) { in zynqmp_pinctrl_prepare_func_groups()
623 func->name, i); in zynqmp_pinctrl_prepare_func_groups()
625 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
632 func->groups = fgroups; in zynqmp_pinctrl_prepare_func_groups()
633 func->ngroups += npins; in zynqmp_pinctrl_prepare_func_groups()
694 group->pins[group->npins++] = pin; in zynqmp_pinctrl_group_add_pin()
698 * zynqmp_pinctrl_create_pin_groups() - assign pins to respective groups
703 * Query firmware to get groups available for the given pin.
704 * Based on the firmware response(group IDs for the pin), add
740 * zynqmp_pinctrl_prepare_group_pins() - prepare each group's pin data
766 * zynqmp_pinctrl_prepare_function_info() - prepare function info
770 * Query firmware for functions, groups and pin information and
789 ret = zynqmp_pinctrl_get_num_functions(&pctrl->nfuncs); in zynqmp_pinctrl_prepare_function_info()
793 funcs = devm_kcalloc(dev, pctrl->nfuncs, sizeof(*funcs), GFP_KERNEL); in zynqmp_pinctrl_prepare_function_info()
795 return -ENOMEM; in zynqmp_pinctrl_prepare_function_info()
797 for (i = 0; i < pctrl->nfuncs; i++) { in zynqmp_pinctrl_prepare_function_info()
804 pctrl->ngroups += funcs[i].ngroups; in zynqmp_pinctrl_prepare_function_info()
807 groups = devm_kcalloc(dev, pctrl->ngroups, sizeof(*groups), GFP_KERNEL); in zynqmp_pinctrl_prepare_function_info()
809 return -ENOMEM; in zynqmp_pinctrl_prepare_function_info()
811 ret = zynqmp_pinctrl_prepare_group_pins(dev, groups, pctrl->ngroups); in zynqmp_pinctrl_prepare_function_info()
815 for (i = 0; i < pctrl->nfuncs; i++) { in zynqmp_pinctrl_prepare_function_info()
822 pctrl->funcs = funcs; in zynqmp_pinctrl_prepare_function_info()
823 pctrl->groups = groups; in zynqmp_pinctrl_prepare_function_info()
846 * zynqmp_pinctrl_prepare_pin_desc() - prepare pin description info
851 * Query number of pins information from firmware and prepare pin
871 return -ENOMEM; in zynqmp_pinctrl_prepare_pin_desc()
875 pin->number = i; in zynqmp_pinctrl_prepare_pin_desc()
876 pin->name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", in zynqmp_pinctrl_prepare_pin_desc()
878 if (!pin->name) in zynqmp_pinctrl_prepare_pin_desc()
879 return -ENOMEM; in zynqmp_pinctrl_prepare_pin_desc()
923 return -ENOMEM; in versal_pinctrl_prepare_pin_desc()
931 pin->number = attr; in versal_pinctrl_prepare_pin_desc()
934 pin->name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", in versal_pinctrl_prepare_pin_desc()
938 pin->name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", in versal_pinctrl_prepare_pin_desc()
939 VERSAL_PMC_PIN_PREFIX, i - lpd_mio_pins); in versal_pinctrl_prepare_pin_desc()
942 if (!pin->name) in versal_pinctrl_prepare_pin_desc()
943 return -ENOMEM; in versal_pinctrl_prepare_pin_desc()
956 pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); in zynqmp_pinctrl_probe()
958 return -ENOMEM; in zynqmp_pinctrl_probe()
965 ret = zynqmp_pinctrl_prepare_pin_desc(&pdev->dev, &zynqmp_desc.pins, in zynqmp_pinctrl_probe()
968 ret = versal_pinctrl_prepare_pin_desc(&pdev->dev, &zynqmp_desc.pins, in zynqmp_pinctrl_probe()
973 dev_err(&pdev->dev, "pin desc prepare fail with %d\n", ret); in zynqmp_pinctrl_probe()
977 ret = zynqmp_pinctrl_prepare_function_info(&pdev->dev, pctrl); in zynqmp_pinctrl_probe()
979 dev_err(&pdev->dev, "function info prepare fail with %d\n", ret); in zynqmp_pinctrl_probe()
983 pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &zynqmp_desc, pctrl); in zynqmp_pinctrl_probe()
984 if (IS_ERR(pctrl->pctrl)) in zynqmp_pinctrl_probe()
985 return PTR_ERR(pctrl->pctrl); in zynqmp_pinctrl_probe()
993 { .compatible = "xlnx,zynqmp-pinctrl" },
994 { .compatible = "xlnx,versal-pinctrl" },
1001 .name = "zynqmp-pinctrl",
1009 MODULE_DESCRIPTION("ZynqMP Pin Controller Driver");