Lines Matching +full:pin +full:- +full:function

1 // SPDX-License-Identifier: GPL-2.0
3 * ZynqMP pin controller
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
63 * @pctrl: Pin control device
64 * @groups: Pin groups
66 * @funcs: Pin mux functions
70 * information regarding pin control functions, groups and
82 * struct zynqmp_pctrl_group - Pin control group info
84 * @pins: Group pin numbers
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()
132 unsigned int pin) in zynqmp_pinmux_request_pin() argument
136 ret = zynqmp_pm_pinctrl_request(pin); in zynqmp_pinmux_request_pin()
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
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.
191 * to set requested function for all pins in the group.
196 unsigned int function, 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() local
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()
209 pin); in zynqmp_pinmux_set_mux()
218 unsigned int pin) in zynqmp_pinmux_release_pin() argument
222 ret = zynqmp_pm_pinctrl_release(pin); in zynqmp_pinmux_release_pin()
224 dev_err(pctldev->dev, "free pin failed for pin %u\n", in zynqmp_pinmux_release_pin()
225 pin); in zynqmp_pinmux_release_pin()
242 * zynqmp_pinconf_cfg_get() - get config value for the pin
243 * @pctldev: Pin control device pointer.
244 * @pin: Pin number.
248 * given pin.
253 unsigned int pin, in zynqmp_pinconf_cfg_get() argument
262 ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg); in zynqmp_pinconf_cfg_get()
266 ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg); in zynqmp_pinconf_cfg_get()
268 return -EINVAL; in zynqmp_pinconf_cfg_get()
274 ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg); in zynqmp_pinconf_cfg_get()
276 return -EINVAL; in zynqmp_pinconf_cfg_get()
282 ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg); in zynqmp_pinconf_cfg_get()
284 return -EINVAL; in zynqmp_pinconf_cfg_get()
290 ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg); in zynqmp_pinconf_cfg_get()
294 ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg); in zynqmp_pinconf_cfg_get()
298 ret = zynqmp_pm_pinctrl_get_config(pin, param, &arg); in zynqmp_pinconf_cfg_get()
314 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_get()
315 "Invalid drive strength for pin %d\n", in zynqmp_pinconf_cfg_get()
316 pin); 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
337 * @pin: Pin number.
342 * to set requested configurations for the pin.
347 unsigned int pin, unsigned long *configs, in zynqmp_pinconf_cfg_set() argument
360 ret = zynqmp_pm_pinctrl_set_config(pin, param, arg); in zynqmp_pinconf_cfg_set()
365 ret = zynqmp_pm_pinctrl_set_config(pin, param, arg); in zynqmp_pinconf_cfg_set()
370 ret = zynqmp_pm_pinctrl_set_config(pin, param, arg); in zynqmp_pinconf_cfg_set()
375 ret = zynqmp_pm_pinctrl_set_config(pin, param, arg); in zynqmp_pinconf_cfg_set()
379 ret = zynqmp_pm_pinctrl_set_config(pin, param, arg); in zynqmp_pinconf_cfg_set()
397 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
398 "Invalid drive strength for pin %d\n", in zynqmp_pinconf_cfg_set()
399 pin); in zynqmp_pinconf_cfg_set()
400 return -EINVAL; in zynqmp_pinconf_cfg_set()
404 ret = zynqmp_pm_pinctrl_set_config(pin, param, value); in zynqmp_pinconf_cfg_set()
408 ret = zynqmp_pm_pinctrl_get_config(pin, param, &value); in zynqmp_pinconf_cfg_set()
411 dev_warn(pctldev->dev, in zynqmp_pinconf_cfg_set()
412 "Invalid IO Standard requested for pin %d\n", in zynqmp_pinconf_cfg_set()
413 pin); in zynqmp_pinconf_cfg_set()
419 ret = zynqmp_pm_pinctrl_set_config(pin, param, arg); in zynqmp_pinconf_cfg_set()
432 ret = zynqmp_pm_pinctrl_set_config(pin, param, arg); 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()
446 "failed to set: pin %u param %u value %u\n", in zynqmp_pinconf_cfg_set()
447 pin, param, arg); in zynqmp_pinconf_cfg_set()
454 * zynqmp_pinconf_group_set() - Set requested config for the group
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
547 * Based on the group ID received from the firmware, function stores name of
551 * Once done for each function, each function would have its group 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()
635 static int zynqmp_pinctrl_get_pin_groups(u32 pin, u32 index, u16 *groups) in zynqmp_pinctrl_get_pin_groups() argument
642 qdata.arg1 = pin; in zynqmp_pinctrl_get_pin_groups()
655 unsigned int pin) 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
664 * @pin: Pin number.
666 * Query firmware to get groups available for the given pin.
667 * Based on the firmware response(group IDs for the pin), add
668 * pin number to the respective group's pin array.
671 * of pins and pin numbers data.
677 unsigned int pin) in zynqmp_pinctrl_create_pin_groups() argument
683 ret = zynqmp_pinctrl_get_pin_groups(pin, index, resp); in zynqmp_pinctrl_create_pin_groups()
694 zynqmp_pinctrl_group_add_pin(&groups[resp[i]], pin); in zynqmp_pinctrl_create_pin_groups()
703 * zynqmp_pinctrl_prepare_group_pins() - prepare each group's pin data
708 * Prepare pin number and number of pins data for each pins.
716 unsigned int pin; in zynqmp_pinctrl_prepare_group_pins() local
719 for (pin = 0; pin < zynqmp_desc.npins; pin++) { in zynqmp_pinctrl_prepare_group_pins()
720 ret = zynqmp_pinctrl_create_pin_groups(dev, groups, pin); in zynqmp_pinctrl_prepare_group_pins()
729 * zynqmp_pinctrl_prepare_function_info() - prepare function info
731 * @pctrl: Pin control driver data.
733 * Query firmware for functions, groups and pin information and
734 * prepare pin control driver data.
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
811 * @zynqmp_pins: Pin information.
814 * Query number of pins information from firmware and prepare pin
815 * description containing pin number and pin name.
824 struct pinctrl_pin_desc *pins, *pin; in zynqmp_pinctrl_prepare_pin_desc() local
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()
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",
898 MODULE_DESCRIPTION("ZynqMP Pin Controller Driver");