• Home
  • Raw
  • Download

Lines Matching +full:pull +full:- +full:up +full:- +full:adv

1 // SPDX-License-Identifier: GPL-2.0
3 * MediaTek Pinctrl Paris Driver, which implement the vendor per-pin
14 #include <dt-bindings/pinctrl/mt65xx.h>
15 #include "pinctrl-paris.h"
29 {"mediatek,pull-up-adv", MTK_PIN_CONFIG_PU_ADV, 1},
30 {"mediatek,pull-down-adv", MTK_PIN_CONFIG_PD_ADV, 1},
31 {"mediatek,drive-strength-adv", MTK_PIN_CONFIG_DRV_ADV, 2},
38 PCONFDUMP(MTK_PIN_CONFIG_PU_ADV, "pu-adv", NULL, true),
39 PCONFDUMP(MTK_PIN_CONFIG_PD_ADV, "pd-adv", NULL, true),
40 PCONFDUMP(MTK_PIN_CONFIG_DRV_ADV, "drive-strength-adv", NULL, true),
58 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinmux_gpio_request_enable()
61 hw->soc->gpio_m); in mtk_pinmux_gpio_request_enable()
71 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinmux_gpio_set_direction()
85 if (pin >= hw->soc->npins) { in mtk_pinconf_get()
86 err = -EINVAL; in mtk_pinconf_get()
89 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinconf_get()
95 if (hw->soc->bias_get_combo) { in mtk_pinconf_get()
96 err = hw->soc->bias_get_combo(hw, desc, &pullup, &ret); in mtk_pinconf_get()
103 /* When desire to get pull-up value, return in mtk_pinconf_get()
104 * error if current setting is pull-down in mtk_pinconf_get()
107 err = -EINVAL; in mtk_pinconf_get()
109 /* When desire to get pull-down value, return in mtk_pinconf_get()
110 * error if current setting is pull-up in mtk_pinconf_get()
113 err = -EINVAL; in mtk_pinconf_get()
116 err = -ENOTSUPP; in mtk_pinconf_get()
128 * ------------- ----------------- ---------------------- in mtk_pinconf_get()
146 err = -EINVAL; in mtk_pinconf_get()
154 if (hw->soc->drive_get) in mtk_pinconf_get()
155 err = hw->soc->drive_get(hw, desc, &ret); in mtk_pinconf_get()
157 err = -ENOTSUPP; in mtk_pinconf_get()
167 if (hw->soc->adv_pull_get) { in mtk_pinconf_get()
169 err = hw->soc->adv_pull_get(hw, desc, pullup, &ret); in mtk_pinconf_get()
171 err = -ENOTSUPP; in mtk_pinconf_get()
174 if (hw->soc->adv_drive_get) in mtk_pinconf_get()
175 err = hw->soc->adv_drive_get(hw, desc, &ret); in mtk_pinconf_get()
177 err = -ENOTSUPP; in mtk_pinconf_get()
180 err = -ENOTSUPP; in mtk_pinconf_get()
199 if (pin >= hw->soc->npins) { in mtk_pinconf_set()
200 err = -EINVAL; in mtk_pinconf_set()
203 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinconf_set()
207 if (hw->soc->bias_set_combo) in mtk_pinconf_set()
208 err = hw->soc->bias_set_combo(hw, desc, 0, MTK_DISABLE); in mtk_pinconf_set()
210 err = -ENOTSUPP; in mtk_pinconf_set()
213 if (hw->soc->bias_set_combo) in mtk_pinconf_set()
214 err = hw->soc->bias_set_combo(hw, desc, 1, arg); in mtk_pinconf_set()
216 err = -ENOTSUPP; in mtk_pinconf_set()
219 if (hw->soc->bias_set_combo) in mtk_pinconf_set()
220 err = hw->soc->bias_set_combo(hw, desc, 0, arg); in mtk_pinconf_set()
222 err = -ENOTSUPP; in mtk_pinconf_set()
230 if (err != -ENOTSUPP) in mtk_pinconf_set()
237 /* regard all non-zero value as enable */ in mtk_pinconf_set()
246 /* regard all non-zero value as enable */ in mtk_pinconf_set()
270 if (hw->soc->drive_set) in mtk_pinconf_set()
271 err = hw->soc->drive_set(hw, desc, arg); in mtk_pinconf_set()
273 err = -ENOTSUPP; in mtk_pinconf_set()
283 if (hw->soc->adv_pull_set) { in mtk_pinconf_set()
287 err = hw->soc->adv_pull_set(hw, desc, pullup, in mtk_pinconf_set()
290 err = -ENOTSUPP; in mtk_pinconf_set()
293 if (hw->soc->adv_drive_set) in mtk_pinconf_set()
294 err = hw->soc->adv_drive_set(hw, desc, arg); in mtk_pinconf_set()
296 err = -ENOTSUPP; in mtk_pinconf_set()
299 err = -ENOTSUPP; in mtk_pinconf_set()
311 for (i = 0; i < hw->soc->ngrps; i++) { in mtk_pctrl_find_group_by_pin()
312 struct mtk_pinctrl_group *grp = hw->groups + i; in mtk_pctrl_find_group_by_pin()
314 if (grp->pin == pin) in mtk_pctrl_find_group_by_pin()
324 const struct mtk_pin_desc *pin = hw->soc->pins + pin_num; in mtk_pctrl_find_function_by_pin()
325 const struct mtk_func_desc *func = pin->funcs; in mtk_pctrl_find_function_by_pin()
327 while (func && func->name) { in mtk_pctrl_find_function_by_pin()
328 if (func->muxval == fnum) in mtk_pctrl_find_function_by_pin()
341 for (i = 0; i < hw->soc->npins; i++) { in mtk_pctrl_is_function_valid()
342 const struct mtk_pin_desc *pin = hw->soc->pins + i; in mtk_pctrl_is_function_valid()
344 if (pin->number == pin_num) { in mtk_pctrl_is_function_valid()
345 const struct mtk_func_desc *func = pin->funcs; in mtk_pctrl_is_function_valid()
347 while (func && func->name) { in mtk_pctrl_is_function_valid()
348 if (func->muxval == fnum) in mtk_pctrl_is_function_valid()
370 return -ENOSPC; in mtk_pctrl_dt_node_to_map_func()
373 (*map)[*num_maps].data.mux.group = grp->name; in mtk_pctrl_dt_node_to_map_func()
377 dev_err(pctl->dev, "invalid function %d on pin %d .\n", in mtk_pctrl_dt_node_to_map_func()
379 return -EINVAL; in mtk_pctrl_dt_node_to_map_func()
406 dev_err(hw->dev, "missing pins property in node %pOFn .\n", in mtk_pctrl_dt_subnode_to_map()
408 return -EINVAL; in mtk_pctrl_dt_subnode_to_map()
419 num_pins = pins->length / sizeof(u32); in mtk_pctrl_dt_subnode_to_map()
428 err = -EINVAL; in mtk_pctrl_dt_subnode_to_map()
447 if (pin >= hw->soc->npins || in mtk_pctrl_dt_subnode_to_map()
449 dev_err(hw->dev, "invalid pins value.\n"); in mtk_pctrl_dt_subnode_to_map()
450 err = -EINVAL; in mtk_pctrl_dt_subnode_to_map()
456 dev_err(hw->dev, "unable to match pin %d to group\n", in mtk_pctrl_dt_subnode_to_map()
458 err = -EINVAL; in mtk_pctrl_dt_subnode_to_map()
471 grp->name, in mtk_pctrl_dt_subnode_to_map()
518 return hw->soc->ngrps; in mtk_pctrl_get_groups_count()
526 return hw->groups[group].name; in mtk_pctrl_get_group_name()
535 *pins = (unsigned *)&hw->groups[group].pin; in mtk_pctrl_get_group_pins()
546 if (gpio >= hw->soc->npins) in mtk_hw_get_value_wrap()
547 return -EINVAL; in mtk_hw_get_value_wrap()
549 desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio]; in mtk_hw_get_value_wrap()
582 int pinmux, pullup, pullen, len = 0, r1 = -1, r0 = -1; in mtk_pctrl_show_one_pin()
585 if (gpio >= hw->soc->npins) in mtk_pctrl_show_one_pin()
586 return -EINVAL; in mtk_pctrl_show_one_pin()
588 desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio]; in mtk_pctrl_show_one_pin()
590 if (pinmux >= hw->soc->nfuncs) in mtk_pctrl_show_one_pin()
591 pinmux -= hw->soc->nfuncs; in mtk_pctrl_show_one_pin()
613 len += scnprintf(buf + len, bufLen - len, in mtk_pctrl_show_one_pin()
626 if (r1 != -1) { in mtk_pctrl_show_one_pin()
627 len += scnprintf(buf + len, bufLen - len, " (%1d %1d)\n", in mtk_pctrl_show_one_pin()
630 len += scnprintf(buf + len, bufLen - len, "\n"); in mtk_pctrl_show_one_pin()
676 *groups = hw->grp_names; in mtk_pmx_get_func_groups()
677 *num_groups = hw->soc->ngrps; in mtk_pmx_get_func_groups()
687 struct mtk_pinctrl_group *grp = hw->groups + group; in mtk_pmx_set_mux()
692 ret = mtk_pctrl_is_function_valid(hw, grp->pin, function); in mtk_pmx_set_mux()
694 dev_err(hw->dev, "invalid function %d on group %d .\n", in mtk_pmx_set_mux()
696 return -EINVAL; in mtk_pmx_set_mux()
699 desc_func = mtk_pctrl_find_function_by_pin(hw, grp->pin, function); in mtk_pmx_set_mux()
701 return -EINVAL; in mtk_pmx_set_mux()
703 desc = (const struct mtk_pin_desc *)&hw->soc->pins[grp->pin]; in mtk_pmx_set_mux()
704 mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE, desc_func->muxval); in mtk_pmx_set_mux()
723 *config = hw->groups[group].config; in mtk_pconf_group_get()
732 struct mtk_pinctrl_group *grp = &hw->groups[group]; in mtk_pconf_group_set()
736 ret = mtk_pinconf_set(pctldev, grp->pin, in mtk_pconf_group_set()
742 grp->config = configs[i]; in mtk_pconf_group_set()
769 if (gpio >= hw->soc->npins) in mtk_gpio_get_direction()
770 return -EINVAL; in mtk_gpio_get_direction()
779 desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio]; in mtk_gpio_get_direction()
797 if (gpio >= hw->soc->npins) in mtk_gpio_get()
798 return -EINVAL; in mtk_gpio_get()
800 desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio]; in mtk_gpio_get()
814 if (gpio >= hw->soc->npins) in mtk_gpio_set()
817 desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio]; in mtk_gpio_set()
826 if (gpio >= hw->soc->npins) in mtk_gpio_direction_input()
827 return -EINVAL; in mtk_gpio_direction_input()
829 return pinctrl_gpio_direction_input(chip->base + gpio); in mtk_gpio_direction_input()
837 if (gpio >= hw->soc->npins) in mtk_gpio_direction_output()
838 return -EINVAL; in mtk_gpio_direction_output()
842 return pinctrl_gpio_direction_output(chip->base + gpio); in mtk_gpio_direction_output()
850 if (!hw->eint) in mtk_gpio_to_irq()
851 return -ENOTSUPP; in mtk_gpio_to_irq()
853 desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset]; in mtk_gpio_to_irq()
855 if (desc->eint.eint_n == EINT_NA) in mtk_gpio_to_irq()
856 return -ENOTSUPP; in mtk_gpio_to_irq()
858 return mtk_eint_find_irq(hw->eint, desc->eint.eint_n); in mtk_gpio_to_irq()
868 desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset]; in mtk_gpio_set_config()
870 if (!hw->eint || in mtk_gpio_set_config()
872 desc->eint.eint_n == EINT_NA) in mtk_gpio_set_config()
873 return -ENOTSUPP; in mtk_gpio_set_config()
877 return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, debounce); in mtk_gpio_set_config()
882 struct gpio_chip *chip = &hw->chip; in mtk_build_gpiochip()
885 chip->label = PINCTRL_PINCTRL_DEV; in mtk_build_gpiochip()
886 chip->parent = hw->dev; in mtk_build_gpiochip()
887 chip->request = gpiochip_generic_request; in mtk_build_gpiochip()
888 chip->free = gpiochip_generic_free; in mtk_build_gpiochip()
889 chip->get_direction = mtk_gpio_get_direction; in mtk_build_gpiochip()
890 chip->direction_input = mtk_gpio_direction_input; in mtk_build_gpiochip()
891 chip->direction_output = mtk_gpio_direction_output; in mtk_build_gpiochip()
892 chip->get = mtk_gpio_get; in mtk_build_gpiochip()
893 chip->set = mtk_gpio_set; in mtk_build_gpiochip()
894 chip->to_irq = mtk_gpio_to_irq, in mtk_build_gpiochip()
895 chip->set_config = mtk_gpio_set_config, in mtk_build_gpiochip()
896 chip->base = -1; in mtk_build_gpiochip()
897 chip->ngpio = hw->soc->npins; in mtk_build_gpiochip()
898 chip->of_node = np; in mtk_build_gpiochip()
899 chip->of_gpio_n_cells = 2; in mtk_build_gpiochip()
914 hw->groups = devm_kmalloc_array(&pdev->dev, hw->soc->ngrps, in mtk_pctrl_build_state()
915 sizeof(*hw->groups), GFP_KERNEL); in mtk_pctrl_build_state()
916 if (!hw->groups) in mtk_pctrl_build_state()
917 return -ENOMEM; in mtk_pctrl_build_state()
920 hw->grp_names = devm_kmalloc_array(&pdev->dev, hw->soc->ngrps, in mtk_pctrl_build_state()
921 sizeof(*hw->grp_names), GFP_KERNEL); in mtk_pctrl_build_state()
922 if (!hw->grp_names) in mtk_pctrl_build_state()
923 return -ENOMEM; in mtk_pctrl_build_state()
925 for (i = 0; i < hw->soc->npins; i++) { in mtk_pctrl_build_state()
926 const struct mtk_pin_desc *pin = hw->soc->pins + i; in mtk_pctrl_build_state()
927 struct mtk_pinctrl_group *group = hw->groups + i; in mtk_pctrl_build_state()
929 group->name = pin->name; in mtk_pctrl_build_state()
930 group->pin = pin->number; in mtk_pctrl_build_state()
932 hw->grp_names[i] = pin->name; in mtk_pctrl_build_state()
945 hw = devm_kzalloc(&pdev->dev, sizeof(*hw), GFP_KERNEL); in mtk_paris_pinctrl_probe()
947 return -ENOMEM; in mtk_paris_pinctrl_probe()
950 hw->soc = soc; in mtk_paris_pinctrl_probe()
951 hw->dev = &pdev->dev; in mtk_paris_pinctrl_probe()
953 if (!hw->soc->nbase_names) { in mtk_paris_pinctrl_probe()
954 dev_err(&pdev->dev, in mtk_paris_pinctrl_probe()
956 return -EINVAL; in mtk_paris_pinctrl_probe()
959 hw->base = devm_kmalloc_array(&pdev->dev, hw->soc->nbase_names, in mtk_paris_pinctrl_probe()
960 sizeof(*hw->base), GFP_KERNEL); in mtk_paris_pinctrl_probe()
961 if (!hw->base) in mtk_paris_pinctrl_probe()
962 return -ENOMEM; in mtk_paris_pinctrl_probe()
964 for (i = 0; i < hw->soc->nbase_names; i++) { in mtk_paris_pinctrl_probe()
965 hw->base[i] = devm_platform_ioremap_resource_byname(pdev, in mtk_paris_pinctrl_probe()
966 hw->soc->base_names[i]); in mtk_paris_pinctrl_probe()
967 if (IS_ERR(hw->base[i])) in mtk_paris_pinctrl_probe()
968 return PTR_ERR(hw->base[i]); in mtk_paris_pinctrl_probe()
971 hw->nbase = hw->soc->nbase_names; in mtk_paris_pinctrl_probe()
975 dev_err(&pdev->dev, "build state failed: %d\n", err); in mtk_paris_pinctrl_probe()
976 return -EINVAL; in mtk_paris_pinctrl_probe()
980 pins = devm_kmalloc_array(&pdev->dev, hw->soc->npins, sizeof(*pins), in mtk_paris_pinctrl_probe()
983 return -ENOMEM; in mtk_paris_pinctrl_probe()
985 for (i = 0; i < hw->soc->npins; i++) { in mtk_paris_pinctrl_probe()
986 pins[i].number = hw->soc->pins[i].number; in mtk_paris_pinctrl_probe()
987 pins[i].name = hw->soc->pins[i].name; in mtk_paris_pinctrl_probe()
992 mtk_desc.npins = hw->soc->npins; in mtk_paris_pinctrl_probe()
999 err = devm_pinctrl_register_and_init(&pdev->dev, &mtk_desc, hw, in mtk_paris_pinctrl_probe()
1000 &hw->pctrl); in mtk_paris_pinctrl_probe()
1004 err = pinctrl_enable(hw->pctrl); in mtk_paris_pinctrl_probe()
1010 dev_warn(&pdev->dev, in mtk_paris_pinctrl_probe()
1014 err = mtk_build_gpiochip(hw, pdev->dev.of_node); in mtk_paris_pinctrl_probe()
1016 dev_err(&pdev->dev, "Failed to add gpio_chip\n"); in mtk_paris_pinctrl_probe()
1030 return mtk_eint_do_suspend(pctl->eint); in mtk_paris_pinctrl_suspend()
1037 return mtk_eint_do_resume(pctl->eint); in mtk_paris_pinctrl_resume()