Lines Matching +full:pins +full:- +full:are +full:- +full:numbered
1 // SPDX-License-Identifier: GPL-2.0-only
17 #include <linux/pinctrl/pinconf-generic.h>
28 #include <dt-bindings/pinctrl/mt65xx.h>
32 #include "../pinctrl-utils.h"
33 #include "mtk-eint.h"
34 #include "pinctrl-mtk-common.h"
47 * There are two base address for pull related configuration
48 * in mt8135, and different GPIO pins use different base address.
55 if (pin >= pctl->devdata->type1_start && pin < pctl->devdata->type1_end) in mtk_get_regmap()
56 return pctl->regmap2; in mtk_get_regmap()
57 return pctl->regmap1; in mtk_get_regmap()
63 return ((pin >> pctl->devdata->mode_shf) & pctl->devdata->port_mask) in mtk_get_port()
64 << pctl->devdata->port_shf; in mtk_get_port()
75 reg_addr = mtk_get_port(pctl, offset) + pctl->devdata->dir_offset; in mtk_pmx_gpio_set_direction()
76 bit = BIT(offset & pctl->devdata->mode_mask); in mtk_pmx_gpio_set_direction()
78 if (pctl->devdata->spec_dir_set) in mtk_pmx_gpio_set_direction()
79 pctl->devdata->spec_dir_set(®_addr, offset); in mtk_pmx_gpio_set_direction()
97 reg_addr = mtk_get_port(pctl, offset) + pctl->devdata->dout_offset; in mtk_gpio_set()
98 bit = BIT(offset & pctl->devdata->mode_mask); in mtk_gpio_set()
115 * Due to some soc are not support ies/smt config, add this special in mtk_pconf_set_ies_smt()
118 if (!pctl->devdata->spec_ies_smt_set && in mtk_pconf_set_ies_smt()
119 pctl->devdata->ies_offset == MTK_PINCTRL_NOT_SUPPORT && in mtk_pconf_set_ies_smt()
121 return -EINVAL; in mtk_pconf_set_ies_smt()
123 if (!pctl->devdata->spec_ies_smt_set && in mtk_pconf_set_ies_smt()
124 pctl->devdata->smt_offset == MTK_PINCTRL_NOT_SUPPORT && in mtk_pconf_set_ies_smt()
126 return -EINVAL; in mtk_pconf_set_ies_smt()
129 * Due to some pins are irregular, their input enable and smt in mtk_pconf_set_ies_smt()
130 * control register are discontinuous, so we need this special handle. in mtk_pconf_set_ies_smt()
132 if (pctl->devdata->spec_ies_smt_set) { in mtk_pconf_set_ies_smt()
133 return pctl->devdata->spec_ies_smt_set(mtk_get_regmap(pctl, pin), in mtk_pconf_set_ies_smt()
134 pin, pctl->devdata->port_align, value, arg); in mtk_pconf_set_ies_smt()
138 offset = pctl->devdata->ies_offset; in mtk_pconf_set_ies_smt()
140 offset = pctl->devdata->smt_offset; in mtk_pconf_set_ies_smt()
142 bit = BIT(offset & pctl->devdata->mode_mask); in mtk_pconf_set_ies_smt()
167 return -EINVAL; in mtk_pconf_spec_set_ies_smt_range()
183 for (i = 0; i < pctl->devdata->n_pin_drv_grps; i++) { in mtk_find_pin_drv_grp_by_pin()
185 pctl->devdata->pin_drv_grp + i; in mtk_find_pin_drv_grp_by_pin()
186 if (pin == pin_drv->pin) in mtk_find_pin_drv_grp_by_pin()
201 if (pin >= pctl->devdata->npins) in mtk_pconf_set_driving()
202 return -EINVAL; in mtk_pconf_set_driving()
205 if (!pin_drv || pin_drv->grp > pctl->devdata->n_grp_cls) in mtk_pconf_set_driving()
206 return -EINVAL; in mtk_pconf_set_driving()
208 drv_grp = pctl->devdata->grp_desc + pin_drv->grp; in mtk_pconf_set_driving()
209 if (driving >= drv_grp->min_drv && driving <= drv_grp->max_drv in mtk_pconf_set_driving()
210 && !(driving % drv_grp->step)) { in mtk_pconf_set_driving()
211 val = driving / drv_grp->step - 1; in mtk_pconf_set_driving()
212 bits = drv_grp->high_bit - drv_grp->low_bit + 1; in mtk_pconf_set_driving()
213 mask = BIT(bits) - 1; in mtk_pconf_set_driving()
214 shift = pin_drv->bit + drv_grp->low_bit; in mtk_pconf_set_driving()
218 pin_drv->offset, mask, val); in mtk_pconf_set_driving()
221 return -EINVAL; in mtk_pconf_set_driving()
243 return -EINVAL; in mtk_pctrl_spec_pull_set_samereg()
246 reg_set = spec_pupd_pin->offset + align; in mtk_pctrl_spec_pull_set_samereg()
247 reg_rst = spec_pupd_pin->offset + (align << 1); in mtk_pctrl_spec_pull_set_samereg()
254 bit_pupd = BIT(spec_pupd_pin->pupd_bit); in mtk_pctrl_spec_pull_set_samereg()
257 bit_r0 = BIT(spec_pupd_pin->r0_bit); in mtk_pctrl_spec_pull_set_samereg()
258 bit_r1 = BIT(spec_pupd_pin->r1_bit); in mtk_pctrl_spec_pull_set_samereg()
278 return -EINVAL; in mtk_pctrl_spec_pull_set_samereg()
291 /* Some pins' pull setting are very different, in mtk_pconf_set_pull_select()
295 if (pctl->devdata->spec_pull_set) { in mtk_pconf_set_pull_select()
296 /* For special pins, bias-disable is set by R1R0, in mtk_pconf_set_pull_select()
300 ret = pctl->devdata->spec_pull_set(mtk_get_regmap(pctl, pin), in mtk_pconf_set_pull_select()
301 pin, pctl->devdata->port_align, isup, r1r0); in mtk_pconf_set_pull_select()
308 dev_err(pctl->dev, "invalid pull-up argument %d on pin %d .\n", in mtk_pconf_set_pull_select()
310 return -EINVAL; in mtk_pconf_set_pull_select()
313 bit = BIT(pin & pctl->devdata->mode_mask); in mtk_pconf_set_pull_select()
316 pctl->devdata->pullen_offset, pctl); in mtk_pconf_set_pull_select()
319 pctl->devdata->pullen_offset, pctl); in mtk_pconf_set_pull_select()
323 pctl->devdata->pullsel_offset, pctl); in mtk_pconf_set_pull_select()
326 pctl->devdata->pullsel_offset, pctl); in mtk_pconf_set_pull_select()
355 mtk_gpio_set(pctl->chip, pin, arg); in mtk_pconf_parse_conf()
366 ret = -EINVAL; in mtk_pconf_parse_conf()
378 *config = pctl->groups[group].config; in mtk_pconf_group_get()
387 struct mtk_pinctrl_group *g = &pctl->groups[group]; in mtk_pconf_group_set()
391 ret = mtk_pconf_parse_conf(pctldev, g->pin, in mtk_pconf_group_set()
397 g->config = configs[i]; in mtk_pconf_group_set()
413 for (i = 0; i < pctl->ngroups; i++) { in mtk_pctrl_find_group_by_pin()
414 struct mtk_pinctrl_group *grp = pctl->groups + i; in mtk_pctrl_find_group_by_pin()
416 if (grp->pin == pin) in mtk_pctrl_find_group_by_pin()
426 const struct mtk_desc_pin *pin = pctl->devdata->pins + pin_num; in mtk_pctrl_find_function_by_pin()
427 const struct mtk_desc_function *func = pin->functions; in mtk_pctrl_find_function_by_pin()
429 while (func && func->name) { in mtk_pctrl_find_function_by_pin()
430 if (func->muxval == fnum) in mtk_pctrl_find_function_by_pin()
443 for (i = 0; i < pctl->devdata->npins; i++) { in mtk_pctrl_is_function_valid()
444 const struct mtk_desc_pin *pin = pctl->devdata->pins + i; in mtk_pctrl_is_function_valid()
446 if (pin->pin.number == pin_num) { in mtk_pctrl_is_function_valid()
448 pin->functions; in mtk_pctrl_is_function_valid()
450 while (func && func->name) { in mtk_pctrl_is_function_valid()
451 if (func->muxval == fnum) in mtk_pctrl_is_function_valid()
471 return -ENOSPC; in mtk_pctrl_dt_node_to_map_func()
474 (*map)[*num_maps].data.mux.group = grp->name; in mtk_pctrl_dt_node_to_map_func()
478 dev_err(pctl->dev, "invalid function %d on pin %d .\n", in mtk_pctrl_dt_node_to_map_func()
480 return -EINVAL; in mtk_pctrl_dt_node_to_map_func()
495 struct property *pins; in mtk_pctrl_dt_subnode_to_map() local
506 pins = of_find_property(node, "pinmux", NULL); in mtk_pctrl_dt_subnode_to_map()
507 if (!pins) { in mtk_pctrl_dt_subnode_to_map()
508 dev_err(pctl->dev, "missing pins property in node %pOFn .\n", in mtk_pctrl_dt_subnode_to_map()
510 return -EINVAL; in mtk_pctrl_dt_subnode_to_map()
521 num_pins = pins->length / sizeof(u32); in mtk_pctrl_dt_subnode_to_map()
530 err = -EINVAL; in mtk_pctrl_dt_subnode_to_map()
550 if (pin >= pctl->devdata->npins || in mtk_pctrl_dt_subnode_to_map()
552 dev_err(pctl->dev, "invalid pins value.\n"); in mtk_pctrl_dt_subnode_to_map()
553 err = -EINVAL; in mtk_pctrl_dt_subnode_to_map()
559 dev_err(pctl->dev, "unable to match pin %d to group\n", in mtk_pctrl_dt_subnode_to_map()
561 err = -EINVAL; in mtk_pctrl_dt_subnode_to_map()
572 reserved_maps, num_maps, grp->name, in mtk_pctrl_dt_subnode_to_map()
616 return pctl->ngroups; in mtk_pctrl_get_groups_count()
624 return pctl->groups[group].name; in mtk_pctrl_get_group_name()
629 const unsigned **pins, in mtk_pctrl_get_group_pins() argument
634 *pins = (unsigned *)&pctl->groups[group].pin; in mtk_pctrl_get_group_pins()
666 *groups = pctl->grp_names; in mtk_pmx_get_func_groups()
667 *num_groups = pctl->ngroups; in mtk_pmx_get_func_groups()
678 unsigned int mask = (1L << GPIO_MODE_BITS) - 1; in mtk_pmx_set_mode()
681 if (pctl->devdata->spec_pinmux_set) in mtk_pmx_set_mode()
682 pctl->devdata->spec_pinmux_set(mtk_get_regmap(pctl, pin), in mtk_pmx_set_mode()
685 reg_addr = ((pin / pctl->devdata->mode_per_reg) << pctl->devdata->port_shf) in mtk_pmx_set_mode()
686 + pctl->devdata->pinmux_offset; in mtk_pmx_set_mode()
689 bit = pin % pctl->devdata->mode_per_reg; in mtk_pmx_set_mode()
702 for (i = 0; i < pctl->devdata->npins; i++) { in mtk_find_pin_by_eint_num()
703 pin = pctl->devdata->pins + i; in mtk_find_pin_by_eint_num()
704 if (pin->eint.eintnum == eint_num) in mtk_find_pin_by_eint_num()
718 struct mtk_pinctrl_group *g = pctl->groups + group; in mtk_pmx_set_mux()
720 ret = mtk_pctrl_is_function_valid(pctl, g->pin, function); in mtk_pmx_set_mux()
722 dev_err(pctl->dev, "invalid function %d on group %d .\n", in mtk_pmx_set_mux()
724 return -EINVAL; in mtk_pmx_set_mux()
727 desc = mtk_pctrl_find_function_by_pin(pctl, g->pin, function); in mtk_pmx_set_mux()
729 return -EINVAL; in mtk_pmx_set_mux()
730 mtk_pmx_set_mode(pctldev, g->pin, desc->muxval); in mtk_pmx_set_mux()
737 const struct mtk_desc_pin *pin = pctl->devdata->pins + offset; in mtk_pmx_find_gpio_mode()
738 const struct mtk_desc_function *func = pin->functions; in mtk_pmx_find_gpio_mode()
740 while (func && func->name) { in mtk_pmx_find_gpio_mode()
741 if (!strncmp(func->name, GPIO_MODE_PREFIX, in mtk_pmx_find_gpio_mode()
742 sizeof(GPIO_MODE_PREFIX)-1)) in mtk_pmx_find_gpio_mode()
743 return func->muxval; in mtk_pmx_find_gpio_mode()
746 return -EINVAL; in mtk_pmx_find_gpio_mode()
759 dev_err(pctl->dev, "invalid gpio pin %d.\n", offset); in mtk_pmx_gpio_request_enable()
760 return -EINVAL; in mtk_pmx_gpio_request_enable()
781 return pinctrl_gpio_direction_input(chip->base + offset); in mtk_gpio_direction_input()
788 return pinctrl_gpio_direction_output(chip->base + offset); in mtk_gpio_direction_output()
799 reg_addr = mtk_get_port(pctl, offset) + pctl->devdata->dir_offset; in mtk_gpio_get_direction()
800 bit = BIT(offset & pctl->devdata->mode_mask); in mtk_gpio_get_direction()
802 if (pctl->devdata->spec_dir_set) in mtk_gpio_get_direction()
803 pctl->devdata->spec_dir_set(®_addr, offset); in mtk_gpio_get_direction()
805 regmap_read(pctl->regmap1, reg_addr, &read_val); in mtk_gpio_get_direction()
820 pctl->devdata->din_offset; in mtk_gpio_get()
822 bit = BIT(offset & pctl->devdata->mode_mask); in mtk_gpio_get()
823 regmap_read(pctl->regmap1, reg_addr, &read_val); in mtk_gpio_get()
833 pin = pctl->devdata->pins + offset; in mtk_gpio_to_irq()
834 if (pin->eint.eintnum == NO_EINT_SUPPORT) in mtk_gpio_to_irq()
835 return -EINVAL; in mtk_gpio_to_irq()
837 eint_n = pin->eint.eintnum; in mtk_gpio_to_irq()
839 return mtk_eint_find_irq(pctl->eint, eint_n); in mtk_gpio_to_irq()
851 return -ENOTSUPP; in mtk_gpio_set_config()
853 pin = pctl->devdata->pins + offset; in mtk_gpio_set_config()
854 if (pin->eint.eintnum == NO_EINT_SUPPORT) in mtk_gpio_set_config()
855 return -EINVAL; in mtk_gpio_set_config()
858 eint_n = pin->eint.eintnum; in mtk_gpio_set_config()
860 return mtk_eint_set_debounce(pctl->eint, eint_n, debounce); in mtk_gpio_set_config()
881 return mtk_eint_do_suspend(pctl->eint); in mtk_eint_suspend()
888 return mtk_eint_do_resume(pctl->eint); in mtk_eint_resume()
901 pctl->ngroups = pctl->devdata->npins; in mtk_pctrl_build_state()
904 pctl->groups = devm_kcalloc(&pdev->dev, pctl->ngroups, in mtk_pctrl_build_state()
905 sizeof(*pctl->groups), GFP_KERNEL); in mtk_pctrl_build_state()
906 if (!pctl->groups) in mtk_pctrl_build_state()
907 return -ENOMEM; in mtk_pctrl_build_state()
910 pctl->grp_names = devm_kcalloc(&pdev->dev, pctl->ngroups, in mtk_pctrl_build_state()
911 sizeof(*pctl->grp_names), GFP_KERNEL); in mtk_pctrl_build_state()
912 if (!pctl->grp_names) in mtk_pctrl_build_state()
913 return -ENOMEM; in mtk_pctrl_build_state()
915 for (i = 0; i < pctl->devdata->npins; i++) { in mtk_pctrl_build_state()
916 const struct mtk_desc_pin *pin = pctl->devdata->pins + i; in mtk_pctrl_build_state()
917 struct mtk_pinctrl_group *group = pctl->groups + i; in mtk_pctrl_build_state()
919 group->name = pin->pin.name; in mtk_pctrl_build_state()
920 group->pin = pin->pin.number; in mtk_pctrl_build_state()
922 pctl->grp_names[i] = pin->pin.name; in mtk_pctrl_build_state()
937 return -EINVAL; in mtk_xt_get_gpio_n()
939 *gpio_chip = pctl->chip; in mtk_xt_get_gpio_n()
940 *gpio_n = pin->pin.number; in mtk_xt_get_gpio_n()
952 return -EINVAL; in mtk_xt_get_gpio_state()
954 return mtk_gpio_get(pctl->chip, pin->pin.number); in mtk_xt_get_gpio_state()
964 return -EINVAL; in mtk_xt_set_gpio_as_eint()
967 mtk_pmx_set_mode(pctl->pctl_dev, pin->pin.number, pin->eint.eintmux); in mtk_xt_set_gpio_as_eint()
969 mtk_pmx_gpio_set_direction(pctl->pctl_dev, NULL, pin->pin.number, in mtk_xt_set_gpio_as_eint()
971 /* set input-enable */ in mtk_xt_set_gpio_as_eint()
972 mtk_pconf_set_ies_smt(pctl, pin->pin.number, 1, in mtk_xt_set_gpio_as_eint()
986 struct device_node *np = pdev->dev.of_node; in mtk_eint_init()
988 if (!of_property_read_bool(np, "interrupt-controller")) in mtk_eint_init()
989 return -ENODEV; in mtk_eint_init()
991 pctl->eint = devm_kzalloc(pctl->dev, sizeof(*pctl->eint), GFP_KERNEL); in mtk_eint_init()
992 if (!pctl->eint) in mtk_eint_init()
993 return -ENOMEM; in mtk_eint_init()
995 pctl->eint->base = devm_platform_ioremap_resource(pdev, 0); in mtk_eint_init()
996 if (IS_ERR(pctl->eint->base)) in mtk_eint_init()
997 return PTR_ERR(pctl->eint->base); in mtk_eint_init()
999 pctl->eint->irq = irq_of_parse_and_map(np, 0); in mtk_eint_init()
1000 if (!pctl->eint->irq) in mtk_eint_init()
1001 return -EINVAL; in mtk_eint_init()
1003 pctl->eint->dev = &pdev->dev; in mtk_eint_init()
1005 * If pctl->eint->regs == NULL, it would fall back into using a generic in mtk_eint_init()
1008 pctl->eint->regs = pctl->devdata->eint_regs; in mtk_eint_init()
1009 pctl->eint->hw = &pctl->devdata->eint_hw; in mtk_eint_init()
1010 pctl->eint->pctl = pctl; in mtk_eint_init()
1011 pctl->eint->gpio_xlate = &mtk_eint_xt; in mtk_eint_init()
1013 return mtk_eint_do_init(pctl->eint); in mtk_eint_init()
1020 struct pinctrl_pin_desc *pins; in mtk_pctrl_init() local
1022 struct device_node *np = pdev->dev.of_node, *node; in mtk_pctrl_init()
1026 pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL); in mtk_pctrl_init()
1028 return -ENOMEM; in mtk_pctrl_init()
1032 prop = of_find_property(np, "pins-are-numbered", NULL); in mtk_pctrl_init()
1034 dev_err(&pdev->dev, "only support pins-are-numbered format\n"); in mtk_pctrl_init()
1035 return -EINVAL; in mtk_pctrl_init()
1038 node = of_parse_phandle(np, "mediatek,pctl-regmap", 0); in mtk_pctrl_init()
1040 pctl->regmap1 = syscon_node_to_regmap(node); in mtk_pctrl_init()
1041 if (IS_ERR(pctl->regmap1)) in mtk_pctrl_init()
1042 return PTR_ERR(pctl->regmap1); in mtk_pctrl_init()
1044 pctl->regmap1 = regmap; in mtk_pctrl_init()
1046 dev_err(&pdev->dev, "Pinctrl node has not register regmap.\n"); in mtk_pctrl_init()
1047 return -EINVAL; in mtk_pctrl_init()
1051 node = of_parse_phandle(np, "mediatek,pctl-regmap", 1); in mtk_pctrl_init()
1053 pctl->regmap2 = syscon_node_to_regmap(node); in mtk_pctrl_init()
1054 if (IS_ERR(pctl->regmap2)) in mtk_pctrl_init()
1055 return PTR_ERR(pctl->regmap2); in mtk_pctrl_init()
1058 pctl->devdata = data; in mtk_pctrl_init()
1061 dev_err(&pdev->dev, "build state failed: %d\n", ret); in mtk_pctrl_init()
1062 return -EINVAL; in mtk_pctrl_init()
1065 pins = devm_kcalloc(&pdev->dev, pctl->devdata->npins, sizeof(*pins), in mtk_pctrl_init()
1067 if (!pins) in mtk_pctrl_init()
1068 return -ENOMEM; in mtk_pctrl_init()
1070 for (i = 0; i < pctl->devdata->npins; i++) in mtk_pctrl_init()
1071 pins[i] = pctl->devdata->pins[i].pin; in mtk_pctrl_init()
1073 pctl->pctl_desc.name = dev_name(&pdev->dev); in mtk_pctrl_init()
1074 pctl->pctl_desc.owner = THIS_MODULE; in mtk_pctrl_init()
1075 pctl->pctl_desc.pins = pins; in mtk_pctrl_init()
1076 pctl->pctl_desc.npins = pctl->devdata->npins; in mtk_pctrl_init()
1077 pctl->pctl_desc.confops = &mtk_pconf_ops; in mtk_pctrl_init()
1078 pctl->pctl_desc.pctlops = &mtk_pctrl_ops; in mtk_pctrl_init()
1079 pctl->pctl_desc.pmxops = &mtk_pmx_ops; in mtk_pctrl_init()
1080 pctl->dev = &pdev->dev; in mtk_pctrl_init()
1082 pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, &pctl->pctl_desc, in mtk_pctrl_init()
1084 if (IS_ERR(pctl->pctl_dev)) { in mtk_pctrl_init()
1085 dev_err(&pdev->dev, "couldn't register pinctrl driver\n"); in mtk_pctrl_init()
1086 return PTR_ERR(pctl->pctl_dev); in mtk_pctrl_init()
1089 pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL); in mtk_pctrl_init()
1090 if (!pctl->chip) in mtk_pctrl_init()
1091 return -ENOMEM; in mtk_pctrl_init()
1093 *pctl->chip = mtk_gpio_chip; in mtk_pctrl_init()
1094 pctl->chip->ngpio = pctl->devdata->npins; in mtk_pctrl_init()
1095 pctl->chip->label = dev_name(&pdev->dev); in mtk_pctrl_init()
1096 pctl->chip->parent = &pdev->dev; in mtk_pctrl_init()
1097 pctl->chip->base = -1; in mtk_pctrl_init()
1099 ret = gpiochip_add_data(pctl->chip, pctl); in mtk_pctrl_init()
1101 return -EINVAL; in mtk_pctrl_init()
1104 ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev), in mtk_pctrl_init()
1105 0, 0, pctl->devdata->npins); in mtk_pctrl_init()
1107 ret = -EINVAL; in mtk_pctrl_init()
1118 gpiochip_remove(pctl->chip); in mtk_pctrl_init()