Lines Matching +full:zynqmp +full:- +full:pinctrl
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>
23 #include <linux/pinctrl/pinconf.h>
24 #include <linux/pinctrl/pinctrl.h>
25 #include <linux/pinctrl/pinmux.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
109 return pctrl->ngroups + zynqmp_desc.npins; in zynqmp_pctrl_get_groups_count()
117 if (selector < pctrl->ngroups) in zynqmp_pctrl_get_group_name()
118 return pctrl->groups[selector].name; in zynqmp_pctrl_get_group_name()
120 return zynqmp_desc.pins[selector - pctrl->ngroups].name; in zynqmp_pctrl_get_group_name()
130 if (selector < pctrl->ngroups) { in zynqmp_pctrl_get_group_pins()
131 *pins = pctrl->groups[selector].pins; in zynqmp_pctrl_get_group_pins()
132 *npins = pctrl->groups[selector].npins; in zynqmp_pctrl_get_group_pins()
134 *pins = &zynqmp_desc.pins[selector - pctrl->ngroups].number; in zynqmp_pctrl_get_group_pins()
156 dev_err(pctldev->dev, "request failed for pin %u\n", pin); in zynqmp_pinmux_request_pin()
167 return pctrl->nfuncs; in zynqmp_pmux_get_functions_count()
175 return pctrl->funcs[selector].name; in zynqmp_pmux_get_function_name()
179 * zynqmp_pmux_get_function_groups() - Get groups for the function
196 *groups = pctrl->funcs[selector].groups; in zynqmp_pmux_get_function_groups()
197 *num_groups = pctrl->funcs[selector].ngroups; in zynqmp_pmux_get_function_groups()
203 * zynqmp_pinmux_set_mux() - Set requested function for the group
225 dev_err(pctldev->dev, "set mux failed for pin %u\n", in zynqmp_pinmux_set_mux()
241 dev_err(pctldev->dev, "free pin failed for pin %u\n", in zynqmp_pinmux_release_pin()
259 * zynqmp_pinconf_cfg_get() - get config value for the pin
285 return -EINVAL; in zynqmp_pinconf_cfg_get()
293 return -EINVAL; in zynqmp_pinconf_cfg_get()
301 return -EINVAL; in zynqmp_pinconf_cfg_get()
331 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_get()
334 return -EINVAL; in zynqmp_pinconf_cfg_get()
338 ret = -ENOTSUPP; in zynqmp_pinconf_cfg_get()
352 * zynqmp_pinconf_cfg_set() - Set requested config for the pin
414 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
417 return -EINVAL; in zynqmp_pinconf_cfg_set()
428 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
452 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
455 ret = -ENOTSUPP; in zynqmp_pinconf_cfg_set()
462 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
471 * zynqmp_pinconf_group_set() - Set requested config for the group
554 * zynqmp_pinctrl_prepare_func_groups() - prepare function and groups data
586 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
588 for (index = 0; index < func->ngroups; index += NUM_GROUPS_PER_RESP) { in zynqmp_pinctrl_prepare_func_groups()
602 func->name, in zynqmp_pinctrl_prepare_func_groups()
605 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
611 __set_bit((u8)groups[resp[i]].pins[pin] - 1, used_pins); in zynqmp_pinctrl_prepare_func_groups()
617 fgroups = devm_kcalloc(dev, size_add(func->ngroups, npins), in zynqmp_pinctrl_prepare_func_groups()
620 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
622 for (i = 0; i < func->ngroups; i++) { in zynqmp_pinctrl_prepare_func_groups()
624 func->name, i); in zynqmp_pinctrl_prepare_func_groups()
626 return -ENOMEM; in zynqmp_pinctrl_prepare_func_groups()
633 func->groups = fgroups; in zynqmp_pinctrl_prepare_func_groups()
634 func->ngroups += npins; in zynqmp_pinctrl_prepare_func_groups()
695 group->pins[group->npins++] = pin; in zynqmp_pinctrl_group_add_pin()
699 * zynqmp_pinctrl_create_pin_groups() - assign pins to respective groups
741 * zynqmp_pinctrl_prepare_group_pins() - prepare each group's pin data
767 * zynqmp_pinctrl_prepare_function_info() - prepare function info
790 ret = zynqmp_pinctrl_get_num_functions(&pctrl->nfuncs); in zynqmp_pinctrl_prepare_function_info()
794 funcs = devm_kcalloc(dev, pctrl->nfuncs, sizeof(*funcs), GFP_KERNEL); in zynqmp_pinctrl_prepare_function_info()
796 return -ENOMEM; in zynqmp_pinctrl_prepare_function_info()
798 for (i = 0; i < pctrl->nfuncs; i++) { in zynqmp_pinctrl_prepare_function_info()
805 pctrl->ngroups += funcs[i].ngroups; in zynqmp_pinctrl_prepare_function_info()
808 groups = devm_kcalloc(dev, pctrl->ngroups, sizeof(*groups), GFP_KERNEL); in zynqmp_pinctrl_prepare_function_info()
810 return -ENOMEM; in zynqmp_pinctrl_prepare_function_info()
812 ret = zynqmp_pinctrl_prepare_group_pins(dev, groups, pctrl->ngroups); in zynqmp_pinctrl_prepare_function_info()
816 for (i = 0; i < pctrl->nfuncs; i++) { in zynqmp_pinctrl_prepare_function_info()
823 pctrl->funcs = funcs; in zynqmp_pinctrl_prepare_function_info()
824 pctrl->groups = groups; in zynqmp_pinctrl_prepare_function_info()
847 * zynqmp_pinctrl_prepare_pin_desc() - prepare pin description info
872 return -ENOMEM; in zynqmp_pinctrl_prepare_pin_desc()
876 pin->number = i; in zynqmp_pinctrl_prepare_pin_desc()
877 pin->name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", in zynqmp_pinctrl_prepare_pin_desc()
879 if (!pin->name) in zynqmp_pinctrl_prepare_pin_desc()
880 return -ENOMEM; in zynqmp_pinctrl_prepare_pin_desc()
924 return -ENOMEM; in versal_pinctrl_prepare_pin_desc()
932 pin->number = attr; in versal_pinctrl_prepare_pin_desc()
935 pin->name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", in versal_pinctrl_prepare_pin_desc()
939 pin->name = devm_kasprintf(dev, GFP_KERNEL, "%s%d", in versal_pinctrl_prepare_pin_desc()
940 VERSAL_PMC_PIN_PREFIX, i - lpd_mio_pins); in versal_pinctrl_prepare_pin_desc()
943 if (!pin->name) in versal_pinctrl_prepare_pin_desc()
944 return -ENOMEM; in versal_pinctrl_prepare_pin_desc()
957 pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); in zynqmp_pinctrl_probe()
959 return -ENOMEM; in zynqmp_pinctrl_probe()
966 ret = zynqmp_pinctrl_prepare_pin_desc(&pdev->dev, &zynqmp_desc.pins, in zynqmp_pinctrl_probe()
969 ret = versal_pinctrl_prepare_pin_desc(&pdev->dev, &zynqmp_desc.pins, in zynqmp_pinctrl_probe()
974 dev_err(&pdev->dev, "pin desc prepare fail with %d\n", ret); in zynqmp_pinctrl_probe()
978 ret = zynqmp_pinctrl_prepare_function_info(&pdev->dev, pctrl); in zynqmp_pinctrl_probe()
980 dev_err(&pdev->dev, "function info prepare fail with %d\n", ret); in zynqmp_pinctrl_probe()
984 pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &zynqmp_desc, pctrl); in zynqmp_pinctrl_probe()
985 if (IS_ERR(pctrl->pctrl)) in zynqmp_pinctrl_probe()
986 return PTR_ERR(pctrl->pctrl); in zynqmp_pinctrl_probe()
994 { .compatible = "xlnx,zynqmp-pinctrl" },
995 { .compatible = "xlnx,versal-pinctrl" },
1002 .name = "zynqmp-pinctrl",
1010 MODULE_DESCRIPTION("ZynqMP Pin Controller Driver");