Lines Matching refs:pctl

52 static struct regmap *mtk_get_regmap(struct mtk_pinctrl *pctl,  in mtk_get_regmap()  argument
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()
60 static unsigned int mtk_get_port(struct mtk_pinctrl *pctl, unsigned long pin) in mtk_get_port() argument
63 return ((pin >> pctl->devdata->mode_shf) & pctl->devdata->port_mask) in mtk_get_port()
64 << pctl->devdata->port_shf; in mtk_get_port()
73 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pmx_gpio_set_direction() local
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(&reg_addr, offset); in mtk_pmx_gpio_set_direction()
83 reg_addr = CLR_ADDR(reg_addr, pctl); in mtk_pmx_gpio_set_direction()
85 reg_addr = SET_ADDR(reg_addr, pctl); in mtk_pmx_gpio_set_direction()
87 regmap_write(mtk_get_regmap(pctl, offset), reg_addr, bit); in mtk_pmx_gpio_set_direction()
95 struct mtk_pinctrl *pctl = gpiochip_get_data(chip); in mtk_gpio_set() local
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()
101 reg_addr = SET_ADDR(reg_addr, pctl); in mtk_gpio_set()
103 reg_addr = CLR_ADDR(reg_addr, pctl); in mtk_gpio_set()
105 regmap_write(mtk_get_regmap(pctl, offset), reg_addr, bit); in mtk_gpio_set()
108 static int mtk_pconf_set_ies_smt(struct mtk_pinctrl *pctl, unsigned pin, in mtk_pconf_set_ies_smt() argument
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()
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()
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 pctl->devdata, pin, 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()
145 reg_addr = SET_ADDR(mtk_get_port(pctl, pin) + offset, pctl); in mtk_pconf_set_ies_smt()
147 reg_addr = CLR_ADDR(mtk_get_port(pctl, pin) + offset, pctl); in mtk_pconf_set_ies_smt()
149 regmap_write(mtk_get_regmap(pctl, pin), reg_addr, bit); in mtk_pconf_set_ies_smt()
197 struct mtk_pinctrl *pctl, unsigned long pin) { in mtk_find_pin_drv_grp_by_pin() argument
200 for (i = 0; i < pctl->devdata->n_pin_drv_grps; i++) { in mtk_find_pin_drv_grp_by_pin()
202 pctl->devdata->pin_drv_grp + i; in mtk_find_pin_drv_grp_by_pin()
210 static int mtk_pconf_set_driving(struct mtk_pinctrl *pctl, in mtk_pconf_set_driving() argument
218 if (pin >= pctl->devdata->npins) in mtk_pconf_set_driving()
221 pin_drv = mtk_find_pin_drv_grp_by_pin(pctl, pin); in mtk_pconf_set_driving()
222 if (!pin_drv || pin_drv->grp > pctl->devdata->n_grp_cls) in mtk_pconf_set_driving()
225 drv_grp = pctl->devdata->grp_desc + pin_drv->grp; in mtk_pconf_set_driving()
234 return regmap_update_bits(mtk_get_regmap(pctl, pin), in mtk_pconf_set_driving()
303 static int mtk_pconf_set_pull_select(struct mtk_pinctrl *pctl, in mtk_pconf_set_pull_select() argument
314 if (pctl->devdata->spec_pull_set) { in mtk_pconf_set_pull_select()
319 ret = pctl->devdata->spec_pull_set(mtk_get_regmap(pctl, pin), in mtk_pconf_set_pull_select()
320 pctl->devdata, pin, isup, in mtk_pconf_set_pull_select()
328 dev_err(pctl->dev, "invalid pull-up argument %d on pin %d .\n", in mtk_pconf_set_pull_select()
333 if (pctl->devdata->mt8365_set_clr_mode) { in mtk_pconf_set_pull_select()
334 bit = pin & pctl->devdata->mode_mask; in mtk_pconf_set_pull_select()
335 reg_pullen = mtk_get_port(pctl, pin) + in mtk_pconf_set_pull_select()
336 pctl->devdata->pullen_offset; in mtk_pconf_set_pull_select()
337 reg_pullsel = mtk_get_port(pctl, pin) + in mtk_pconf_set_pull_select()
338 pctl->devdata->pullsel_offset; in mtk_pconf_set_pull_select()
339 ret = pctl->devdata->mt8365_set_clr_mode(mtk_get_regmap(pctl, pin), in mtk_pconf_set_pull_select()
348 bit = BIT(pin & pctl->devdata->mode_mask); in mtk_pconf_set_pull_select()
350 reg_pullen = SET_ADDR(mtk_get_port(pctl, pin) + in mtk_pconf_set_pull_select()
351 pctl->devdata->pullen_offset, pctl); in mtk_pconf_set_pull_select()
353 reg_pullen = CLR_ADDR(mtk_get_port(pctl, pin) + in mtk_pconf_set_pull_select()
354 pctl->devdata->pullen_offset, pctl); in mtk_pconf_set_pull_select()
357 reg_pullsel = SET_ADDR(mtk_get_port(pctl, pin) + in mtk_pconf_set_pull_select()
358 pctl->devdata->pullsel_offset, pctl); in mtk_pconf_set_pull_select()
360 reg_pullsel = CLR_ADDR(mtk_get_port(pctl, pin) + in mtk_pconf_set_pull_select()
361 pctl->devdata->pullsel_offset, pctl); in mtk_pconf_set_pull_select()
363 regmap_write(mtk_get_regmap(pctl, pin), reg_pullen, bit); in mtk_pconf_set_pull_select()
364 regmap_write(mtk_get_regmap(pctl, pin), reg_pullsel, bit); in mtk_pconf_set_pull_select()
373 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pconf_parse_conf() local
377 ret = mtk_pconf_set_pull_select(pctl, pin, false, false, arg); in mtk_pconf_parse_conf()
380 ret = mtk_pconf_set_pull_select(pctl, pin, true, true, arg); in mtk_pconf_parse_conf()
383 ret = mtk_pconf_set_pull_select(pctl, pin, true, false, arg); in mtk_pconf_parse_conf()
387 ret = mtk_pconf_set_ies_smt(pctl, pin, arg, param); in mtk_pconf_parse_conf()
390 mtk_gpio_set(pctl->chip, pin, arg); in mtk_pconf_parse_conf()
395 ret = mtk_pconf_set_ies_smt(pctl, pin, arg, param); in mtk_pconf_parse_conf()
398 ret = mtk_pconf_set_driving(pctl, pin, arg); in mtk_pconf_parse_conf()
411 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pconf_group_get() local
413 *config = pctl->groups[group].config; in mtk_pconf_group_get()
421 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pconf_group_set() local
422 struct mtk_pinctrl_group *g = &pctl->groups[group]; in mtk_pconf_group_set()
444 mtk_pctrl_find_group_by_pin(struct mtk_pinctrl *pctl, u32 pin) in mtk_pctrl_find_group_by_pin() argument
448 for (i = 0; i < pctl->ngroups; i++) { in mtk_pctrl_find_group_by_pin()
449 struct mtk_pinctrl_group *grp = pctl->groups + i; in mtk_pctrl_find_group_by_pin()
459 struct mtk_pinctrl *pctl, u32 pin_num, u32 fnum) in mtk_pctrl_find_function_by_pin() argument
461 const struct mtk_desc_pin *pin = pctl->devdata->pins + pin_num; in mtk_pctrl_find_function_by_pin()
473 static bool mtk_pctrl_is_function_valid(struct mtk_pinctrl *pctl, in mtk_pctrl_is_function_valid() argument
478 for (i = 0; i < pctl->devdata->npins; i++) { in mtk_pctrl_is_function_valid()
479 const struct mtk_desc_pin *pin = pctl->devdata->pins + i; in mtk_pctrl_is_function_valid()
498 static int mtk_pctrl_dt_node_to_map_func(struct mtk_pinctrl *pctl, in mtk_pctrl_dt_node_to_map_func() argument
511 ret = mtk_pctrl_is_function_valid(pctl, pin, fnum); in mtk_pctrl_dt_node_to_map_func()
513 dev_err(pctl->dev, "invalid function %d on pin %d .\n", in mtk_pctrl_dt_node_to_map_func()
539 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pctrl_dt_subnode_to_map() local
543 dev_err(pctl->dev, "missing pins property in node %pOFn .\n", in mtk_pctrl_dt_subnode_to_map()
585 if (pin >= pctl->devdata->npins || in mtk_pctrl_dt_subnode_to_map()
587 dev_err(pctl->dev, "invalid pins value.\n"); in mtk_pctrl_dt_subnode_to_map()
592 grp = mtk_pctrl_find_group_by_pin(pctl, pin); in mtk_pctrl_dt_subnode_to_map()
594 dev_err(pctl->dev, "unable to match pin %d to group\n", in mtk_pctrl_dt_subnode_to_map()
600 err = mtk_pctrl_dt_node_to_map_func(pctl, pin, func, grp, map, in mtk_pctrl_dt_subnode_to_map()
649 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pctrl_get_groups_count() local
651 return pctl->ngroups; in mtk_pctrl_get_groups_count()
657 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pctrl_get_group_name() local
659 return pctl->groups[group].name; in mtk_pctrl_get_group_name()
667 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pctrl_get_group_pins() local
669 *pins = (unsigned *)&pctl->groups[group].pin; in mtk_pctrl_get_group_pins()
699 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pmx_get_func_groups() local
701 *groups = pctl->grp_names; in mtk_pmx_get_func_groups()
702 *num_groups = pctl->ngroups; in mtk_pmx_get_func_groups()
714 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pmx_set_mode() local
716 if (pctl->devdata->spec_pinmux_set) in mtk_pmx_set_mode()
717 pctl->devdata->spec_pinmux_set(mtk_get_regmap(pctl, pin), in mtk_pmx_set_mode()
720 reg_addr = ((pin / pctl->devdata->mode_per_reg) << pctl->devdata->port_shf) in mtk_pmx_set_mode()
721 + pctl->devdata->pinmux_offset; in mtk_pmx_set_mode()
724 bit = pin % pctl->devdata->mode_per_reg; in mtk_pmx_set_mode()
727 return regmap_update_bits(mtk_get_regmap(pctl, pin), in mtk_pmx_set_mode()
732 mtk_find_pin_by_eint_num(struct mtk_pinctrl *pctl, unsigned int eint_num) in mtk_find_pin_by_eint_num() argument
737 for (i = 0; i < pctl->devdata->npins; i++) { in mtk_find_pin_by_eint_num()
738 pin = pctl->devdata->pins + i; in mtk_find_pin_by_eint_num()
752 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pmx_set_mux() local
753 struct mtk_pinctrl_group *g = pctl->groups + group; in mtk_pmx_set_mux()
755 ret = mtk_pctrl_is_function_valid(pctl, g->pin, function); in mtk_pmx_set_mux()
757 dev_err(pctl->dev, "invalid function %d on group %d .\n", in mtk_pmx_set_mux()
762 desc = mtk_pctrl_find_function_by_pin(pctl, g->pin, function); in mtk_pmx_set_mux()
769 static int mtk_pmx_find_gpio_mode(struct mtk_pinctrl *pctl, in mtk_pmx_find_gpio_mode() argument
772 const struct mtk_desc_pin *pin = pctl->devdata->pins + offset; in mtk_pmx_find_gpio_mode()
789 struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); in mtk_pmx_gpio_request_enable() local
791 muxval = mtk_pmx_find_gpio_mode(pctl, offset); in mtk_pmx_gpio_request_enable()
794 dev_err(pctl->dev, "invalid gpio pin %d.\n", offset); in mtk_pmx_gpio_request_enable()
799 mtk_pconf_set_ies_smt(pctl, offset, 1, PIN_CONFIG_INPUT_ENABLE); in mtk_pmx_gpio_request_enable()
832 struct mtk_pinctrl *pctl = gpiochip_get_data(chip); in mtk_gpio_get_direction() local
834 reg_addr = mtk_get_port(pctl, offset) + pctl->devdata->dir_offset; in mtk_gpio_get_direction()
835 bit = BIT(offset & pctl->devdata->mode_mask); in mtk_gpio_get_direction()
837 if (pctl->devdata->spec_dir_set) in mtk_gpio_get_direction()
838 pctl->devdata->spec_dir_set(&reg_addr, offset); in mtk_gpio_get_direction()
840 regmap_read(pctl->regmap1, reg_addr, &read_val); in mtk_gpio_get_direction()
852 struct mtk_pinctrl *pctl = gpiochip_get_data(chip); in mtk_gpio_get() local
854 reg_addr = mtk_get_port(pctl, offset) + in mtk_gpio_get()
855 pctl->devdata->din_offset; in mtk_gpio_get()
857 bit = BIT(offset & pctl->devdata->mode_mask); in mtk_gpio_get()
858 regmap_read(pctl->regmap1, reg_addr, &read_val); in mtk_gpio_get()
864 struct mtk_pinctrl *pctl = gpiochip_get_data(chip); in mtk_gpio_to_irq() local
868 pin = pctl->devdata->pins + offset; in mtk_gpio_to_irq()
874 return mtk_eint_find_irq(pctl->eint, eint_n); in mtk_gpio_to_irq()
880 struct mtk_pinctrl *pctl = gpiochip_get_data(chip); in mtk_gpio_set_config() local
888 pin = pctl->devdata->pins + offset; in mtk_gpio_set_config()
895 return mtk_eint_set_debounce(pctl->eint, eint_n, debounce); in mtk_gpio_set_config()
913 struct mtk_pinctrl *pctl = dev_get_drvdata(device); in mtk_eint_suspend() local
915 return mtk_eint_do_suspend(pctl->eint); in mtk_eint_suspend()
920 struct mtk_pinctrl *pctl = dev_get_drvdata(device); in mtk_eint_resume() local
922 return mtk_eint_do_resume(pctl->eint); in mtk_eint_resume()
932 struct mtk_pinctrl *pctl = platform_get_drvdata(pdev); in mtk_pctrl_build_state() local
935 pctl->ngroups = pctl->devdata->npins; in mtk_pctrl_build_state()
938 pctl->groups = devm_kcalloc(&pdev->dev, pctl->ngroups, in mtk_pctrl_build_state()
939 sizeof(*pctl->groups), GFP_KERNEL); in mtk_pctrl_build_state()
940 if (!pctl->groups) in mtk_pctrl_build_state()
944 pctl->grp_names = devm_kcalloc(&pdev->dev, pctl->ngroups, in mtk_pctrl_build_state()
945 sizeof(*pctl->grp_names), GFP_KERNEL); in mtk_pctrl_build_state()
946 if (!pctl->grp_names) in mtk_pctrl_build_state()
949 for (i = 0; i < pctl->devdata->npins; i++) { in mtk_pctrl_build_state()
950 const struct mtk_desc_pin *pin = pctl->devdata->pins + i; in mtk_pctrl_build_state()
951 struct mtk_pinctrl_group *group = pctl->groups + i; in mtk_pctrl_build_state()
956 pctl->grp_names[i] = pin->pin.name; in mtk_pctrl_build_state()
966 struct mtk_pinctrl *pctl = (struct mtk_pinctrl *)data; in mtk_xt_get_gpio_n() local
969 pin = mtk_find_pin_by_eint_num(pctl, eint_n); in mtk_xt_get_gpio_n()
973 *gpio_chip = pctl->chip; in mtk_xt_get_gpio_n()
981 struct mtk_pinctrl *pctl = (struct mtk_pinctrl *)data; in mtk_xt_get_gpio_state() local
984 pin = mtk_find_pin_by_eint_num(pctl, eint_n); in mtk_xt_get_gpio_state()
988 return mtk_gpio_get(pctl->chip, pin->pin.number); in mtk_xt_get_gpio_state()
993 struct mtk_pinctrl *pctl = (struct mtk_pinctrl *)data; in mtk_xt_set_gpio_as_eint() local
996 pin = mtk_find_pin_by_eint_num(pctl, eint_n); in mtk_xt_set_gpio_as_eint()
1001 mtk_pmx_set_mode(pctl->pctl_dev, pin->pin.number, pin->eint.eintmux); in mtk_xt_set_gpio_as_eint()
1003 mtk_pmx_gpio_set_direction(pctl->pctl_dev, NULL, pin->pin.number, in mtk_xt_set_gpio_as_eint()
1006 mtk_pconf_set_ies_smt(pctl, pin->pin.number, 1, in mtk_xt_set_gpio_as_eint()
1018 static int mtk_eint_init(struct mtk_pinctrl *pctl, struct platform_device *pdev) in mtk_eint_init() argument
1025 pctl->eint = devm_kzalloc(pctl->dev, sizeof(*pctl->eint), GFP_KERNEL); in mtk_eint_init()
1026 if (!pctl->eint) in mtk_eint_init()
1029 pctl->eint->base = devm_platform_ioremap_resource(pdev, 0); in mtk_eint_init()
1030 if (IS_ERR(pctl->eint->base)) in mtk_eint_init()
1031 return PTR_ERR(pctl->eint->base); in mtk_eint_init()
1033 pctl->eint->irq = irq_of_parse_and_map(np, 0); in mtk_eint_init()
1034 if (!pctl->eint->irq) in mtk_eint_init()
1037 pctl->eint->dev = &pdev->dev; in mtk_eint_init()
1042 pctl->eint->regs = pctl->devdata->eint_regs; in mtk_eint_init()
1043 pctl->eint->hw = &pctl->devdata->eint_hw; in mtk_eint_init()
1044 pctl->eint->pctl = pctl; in mtk_eint_init()
1045 pctl->eint->gpio_xlate = &mtk_eint_xt; in mtk_eint_init()
1047 return mtk_eint_do_init(pctl->eint); in mtk_eint_init()
1057 struct mtk_pinctrl *pctl; in mtk_pctrl_init() local
1061 pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL); in mtk_pctrl_init()
1062 if (!pctl) in mtk_pctrl_init()
1065 platform_set_drvdata(pdev, pctl); in mtk_pctrl_init()
1069 pctl->regmap1 = syscon_node_to_regmap(node); in mtk_pctrl_init()
1071 if (IS_ERR(pctl->regmap1)) in mtk_pctrl_init()
1072 return PTR_ERR(pctl->regmap1); in mtk_pctrl_init()
1074 pctl->regmap1 = regmap; in mtk_pctrl_init()
1082 pctl->regmap2 = syscon_node_to_regmap(node); in mtk_pctrl_init()
1084 if (IS_ERR(pctl->regmap2)) in mtk_pctrl_init()
1085 return PTR_ERR(pctl->regmap2); in mtk_pctrl_init()
1088 pctl->devdata = data; in mtk_pctrl_init()
1093 pins = devm_kcalloc(&pdev->dev, pctl->devdata->npins, sizeof(*pins), in mtk_pctrl_init()
1098 for (i = 0; i < pctl->devdata->npins; i++) in mtk_pctrl_init()
1099 pins[i] = pctl->devdata->pins[i].pin; in mtk_pctrl_init()
1101 pctl->pctl_desc.name = dev_name(&pdev->dev); in mtk_pctrl_init()
1102 pctl->pctl_desc.owner = THIS_MODULE; in mtk_pctrl_init()
1103 pctl->pctl_desc.pins = pins; in mtk_pctrl_init()
1104 pctl->pctl_desc.npins = pctl->devdata->npins; in mtk_pctrl_init()
1105 pctl->pctl_desc.confops = &mtk_pconf_ops; in mtk_pctrl_init()
1106 pctl->pctl_desc.pctlops = &mtk_pctrl_ops; in mtk_pctrl_init()
1107 pctl->pctl_desc.pmxops = &mtk_pmx_ops; in mtk_pctrl_init()
1108 pctl->dev = &pdev->dev; in mtk_pctrl_init()
1110 pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, &pctl->pctl_desc, in mtk_pctrl_init()
1111 pctl); in mtk_pctrl_init()
1112 if (IS_ERR(pctl->pctl_dev)) in mtk_pctrl_init()
1113 return dev_err_probe(dev, PTR_ERR(pctl->pctl_dev), in mtk_pctrl_init()
1116 pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL); in mtk_pctrl_init()
1117 if (!pctl->chip) in mtk_pctrl_init()
1120 *pctl->chip = mtk_gpio_chip; in mtk_pctrl_init()
1121 pctl->chip->ngpio = pctl->devdata->npins; in mtk_pctrl_init()
1122 pctl->chip->label = dev_name(&pdev->dev); in mtk_pctrl_init()
1123 pctl->chip->parent = &pdev->dev; in mtk_pctrl_init()
1124 pctl->chip->base = -1; in mtk_pctrl_init()
1126 ret = gpiochip_add_data(pctl->chip, pctl); in mtk_pctrl_init()
1131 ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev), in mtk_pctrl_init()
1132 0, 0, pctl->devdata->npins); in mtk_pctrl_init()
1138 ret = mtk_eint_init(pctl, pdev); in mtk_pctrl_init()
1145 gpiochip_remove(pctl->chip); in mtk_pctrl_init()