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

1 // SPDX-License-Identifier: GPL-2.0
3 * MediaTek Pinctrl Moore Driver, which implement the generic dt-binding
4 * pinctrl-bindings.txt for MediaTek SoC.
6 * Copyright (C) 2017-2018 MediaTek Inc.
11 #include <dt-bindings/pinctrl/mt65xx.h>
16 #include "pinctrl-moore.h"
29 {"mediatek,pull-up-adv", MTK_PIN_CONFIG_PU_ADV, 1},
30 {"mediatek,pull-down-adv", MTK_PIN_CONFIG_PD_ADV, 1},
37 PCONFDUMP(MTK_PIN_CONFIG_PU_ADV, "pu-adv", NULL, true),
38 PCONFDUMP(MTK_PIN_CONFIG_PD_ADV, "pd-adv", NULL, true),
52 return -EINVAL; in mtk_pinmux_set_mux()
56 return -EINVAL; in mtk_pinmux_set_mux()
58 dev_dbg(pctldev->dev, "enable function %s group %s\n", in mtk_pinmux_set_mux()
59 func->name, grp->name); in mtk_pinmux_set_mux()
61 for (i = 0; i < grp->num_pins; i++) { in mtk_pinmux_set_mux()
63 int *pin_modes = grp->data; in mtk_pinmux_set_mux()
64 int pin = grp->pins[i]; in mtk_pinmux_set_mux()
66 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinmux_set_mux()
67 if (!desc->name) in mtk_pinmux_set_mux()
68 return -ENOTSUPP; in mtk_pinmux_set_mux()
84 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinmux_gpio_request_enable()
85 if (!desc->name) in mtk_pinmux_gpio_request_enable()
86 return -ENOTSUPP; in mtk_pinmux_gpio_request_enable()
89 hw->soc->gpio_m); in mtk_pinmux_gpio_request_enable()
99 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinmux_gpio_set_direction()
100 if (!desc->name) in mtk_pinmux_gpio_set_direction()
101 return -ENOTSUPP; in mtk_pinmux_gpio_set_direction()
115 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinconf_get()
116 if (!desc->name) in mtk_pinconf_get()
117 return -ENOTSUPP; in mtk_pinconf_get()
121 if (hw->soc->bias_get_combo) { in mtk_pinconf_get()
122 err = hw->soc->bias_get_combo(hw, desc, &pullup, &ret); in mtk_pinconf_get()
126 return -EINVAL; in mtk_pinconf_get()
127 } else if (hw->soc->bias_disable_get) { in mtk_pinconf_get()
128 err = hw->soc->bias_disable_get(hw, desc, &ret); in mtk_pinconf_get()
132 return -ENOTSUPP; in mtk_pinconf_get()
136 if (hw->soc->bias_get_combo) { in mtk_pinconf_get()
137 err = hw->soc->bias_get_combo(hw, desc, &pullup, &ret); in mtk_pinconf_get()
141 return -EINVAL; in mtk_pinconf_get()
143 return -EINVAL; in mtk_pinconf_get()
144 } else if (hw->soc->bias_get) { in mtk_pinconf_get()
145 err = hw->soc->bias_get(hw, desc, 1, &ret); in mtk_pinconf_get()
149 return -ENOTSUPP; in mtk_pinconf_get()
153 if (hw->soc->bias_get_combo) { in mtk_pinconf_get()
154 err = hw->soc->bias_get_combo(hw, desc, &pullup, &ret); in mtk_pinconf_get()
158 return -EINVAL; in mtk_pinconf_get()
160 return -EINVAL; in mtk_pinconf_get()
161 } else if (hw->soc->bias_get) { in mtk_pinconf_get()
162 err = hw->soc->bias_get(hw, desc, 0, &ret); in mtk_pinconf_get()
166 return -ENOTSUPP; in mtk_pinconf_get()
175 return -EINVAL; in mtk_pinconf_get()
184 /* HW takes input mode as zero; output mode as non-zero */ in mtk_pinconf_get()
187 return -EINVAL; in mtk_pinconf_get()
200 return -EINVAL; in mtk_pinconf_get()
204 if (hw->soc->drive_get) { in mtk_pinconf_get()
205 err = hw->soc->drive_get(hw, desc, &ret); in mtk_pinconf_get()
209 err = -ENOTSUPP; in mtk_pinconf_get()
226 if (hw->soc->adv_pull_get) { in mtk_pinconf_get()
230 err = hw->soc->adv_pull_get(hw, desc, pullup, &ret); in mtk_pinconf_get()
234 return -ENOTSUPP; in mtk_pinconf_get()
238 return -ENOTSUPP; in mtk_pinconf_get()
254 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinconf_set()
255 if (!desc->name) in mtk_pinconf_set()
256 return -ENOTSUPP; in mtk_pinconf_set()
264 if (hw->soc->bias_set_combo) { in mtk_pinconf_set()
265 err = hw->soc->bias_set_combo(hw, desc, 0, MTK_DISABLE); in mtk_pinconf_set()
268 } else if (hw->soc->bias_disable_set) { in mtk_pinconf_set()
269 err = hw->soc->bias_disable_set(hw, desc); in mtk_pinconf_set()
273 return -ENOTSUPP; in mtk_pinconf_set()
277 if (hw->soc->bias_set_combo) { in mtk_pinconf_set()
278 err = hw->soc->bias_set_combo(hw, desc, 1, arg); in mtk_pinconf_set()
281 } else if (hw->soc->bias_set) { in mtk_pinconf_set()
282 err = hw->soc->bias_set(hw, desc, 1); in mtk_pinconf_set()
286 return -ENOTSUPP; in mtk_pinconf_set()
290 if (hw->soc->bias_set_combo) { in mtk_pinconf_set()
291 err = hw->soc->bias_set_combo(hw, desc, 0, arg); in mtk_pinconf_set()
294 } else if (hw->soc->bias_set) { in mtk_pinconf_set()
295 err = hw->soc->bias_set(hw, desc, 0); in mtk_pinconf_set()
299 return -ENOTSUPP; in mtk_pinconf_set()
315 if (hw->soc->ies_present) { in mtk_pinconf_set()
359 if (hw->soc->drive_set) { in mtk_pinconf_set()
360 err = hw->soc->drive_set(hw, desc, arg); in mtk_pinconf_set()
364 err = -ENOTSUPP; in mtk_pinconf_set()
378 if (hw->soc->adv_pull_set) { in mtk_pinconf_set()
382 err = hw->soc->adv_pull_set(hw, desc, pullup, in mtk_pinconf_set()
387 return -ENOTSUPP; in mtk_pinconf_set()
391 err = -ENOTSUPP; in mtk_pinconf_set()
411 return -ENOTSUPP; in mtk_pinconf_group_get()
415 return -ENOTSUPP; in mtk_pinconf_group_get()
485 desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio]; in mtk_gpio_get()
486 if (!desc->name) in mtk_gpio_get()
487 return -ENOTSUPP; in mtk_gpio_get()
501 desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio]; in mtk_gpio_set()
502 if (!desc->name) { in mtk_gpio_set()
503 dev_err(hw->dev, "Failed to set gpio %d\n", gpio); in mtk_gpio_set()
512 return pinctrl_gpio_direction_input(chip->base + gpio); in mtk_gpio_direction_input()
520 return pinctrl_gpio_direction_output(chip->base + gpio); in mtk_gpio_direction_output()
528 if (!hw->eint) in mtk_gpio_to_irq()
529 return -ENOTSUPP; in mtk_gpio_to_irq()
531 desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset]; in mtk_gpio_to_irq()
533 if (desc->eint.eint_n == (u16)EINT_NA) in mtk_gpio_to_irq()
534 return -ENOTSUPP; in mtk_gpio_to_irq()
536 return mtk_eint_find_irq(hw->eint, desc->eint.eint_n); in mtk_gpio_to_irq()
546 desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset]; in mtk_gpio_set_config()
547 if (!desc->name) in mtk_gpio_set_config()
548 return -ENOTSUPP; in mtk_gpio_set_config()
550 if (!hw->eint || in mtk_gpio_set_config()
552 desc->eint.eint_n == (u16)EINT_NA) in mtk_gpio_set_config()
553 return -ENOTSUPP; in mtk_gpio_set_config()
557 return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, debounce); in mtk_gpio_set_config()
562 struct gpio_chip *chip = &hw->chip; in mtk_build_gpiochip()
565 chip->label = PINCTRL_PINCTRL_DEV; in mtk_build_gpiochip()
566 chip->parent = hw->dev; in mtk_build_gpiochip()
567 chip->request = gpiochip_generic_request; in mtk_build_gpiochip()
568 chip->free = gpiochip_generic_free; in mtk_build_gpiochip()
569 chip->direction_input = mtk_gpio_direction_input; in mtk_build_gpiochip()
570 chip->direction_output = mtk_gpio_direction_output; in mtk_build_gpiochip()
571 chip->get = mtk_gpio_get; in mtk_build_gpiochip()
572 chip->set = mtk_gpio_set; in mtk_build_gpiochip()
573 chip->to_irq = mtk_gpio_to_irq; in mtk_build_gpiochip()
574 chip->set_config = mtk_gpio_set_config; in mtk_build_gpiochip()
575 chip->base = -1; in mtk_build_gpiochip()
576 chip->ngpio = hw->soc->npins; in mtk_build_gpiochip()
583 * "gpio-ranges" property. Otherwise, called directly from a in mtk_build_gpiochip()
584 * DeviceTree-supported pinctrl driver is DEPRECATED. in mtk_build_gpiochip()
587 * bind pinctrl and gpio drivers via the "gpio-ranges" property. in mtk_build_gpiochip()
589 if (!of_property_present(hw->dev->of_node, "gpio-ranges")) { in mtk_build_gpiochip()
590 ret = gpiochip_add_pin_range(chip, dev_name(hw->dev), 0, 0, in mtk_build_gpiochip()
591 chip->ngpio); in mtk_build_gpiochip()
605 for (i = 0; i < hw->soc->ngrps; i++) { in mtk_build_groups()
606 const struct group_desc *group = hw->soc->grps + i; in mtk_build_groups()
608 err = pinctrl_generic_add_group(hw->pctrl, group->name, in mtk_build_groups()
609 group->pins, group->num_pins, in mtk_build_groups()
610 group->data); in mtk_build_groups()
612 dev_err(hw->dev, "Failed to register group %s\n", in mtk_build_groups()
613 group->name); in mtk_build_groups()
625 for (i = 0; i < hw->soc->nfuncs ; i++) { in mtk_build_functions()
626 const struct function_desc *func = hw->soc->funcs + i; in mtk_build_functions()
628 err = pinmux_generic_add_function(hw->pctrl, func->name, in mtk_build_functions()
629 func->group_names, in mtk_build_functions()
630 func->num_group_names, in mtk_build_functions()
631 func->data); in mtk_build_functions()
633 dev_err(hw->dev, "Failed to register function %s\n", in mtk_build_functions()
634 func->name); in mtk_build_functions()
645 struct device *dev = &pdev->dev; in mtk_moore_pinctrl_probe()
650 hw = devm_kzalloc(&pdev->dev, sizeof(*hw), GFP_KERNEL); in mtk_moore_pinctrl_probe()
652 return -ENOMEM; in mtk_moore_pinctrl_probe()
654 hw->soc = soc; in mtk_moore_pinctrl_probe()
655 hw->dev = &pdev->dev; in mtk_moore_pinctrl_probe()
657 if (!hw->soc->nbase_names) in mtk_moore_pinctrl_probe()
658 return dev_err_probe(dev, -EINVAL, in mtk_moore_pinctrl_probe()
661 hw->base = devm_kmalloc_array(&pdev->dev, hw->soc->nbase_names, in mtk_moore_pinctrl_probe()
662 sizeof(*hw->base), GFP_KERNEL); in mtk_moore_pinctrl_probe()
663 if (!hw->base) in mtk_moore_pinctrl_probe()
664 return -ENOMEM; in mtk_moore_pinctrl_probe()
666 for (i = 0; i < hw->soc->nbase_names; i++) { in mtk_moore_pinctrl_probe()
667 hw->base[i] = devm_platform_ioremap_resource_byname(pdev, in mtk_moore_pinctrl_probe()
668 hw->soc->base_names[i]); in mtk_moore_pinctrl_probe()
669 if (IS_ERR(hw->base[i])) in mtk_moore_pinctrl_probe()
670 return PTR_ERR(hw->base[i]); in mtk_moore_pinctrl_probe()
673 hw->nbase = hw->soc->nbase_names; in mtk_moore_pinctrl_probe()
675 spin_lock_init(&hw->lock); in mtk_moore_pinctrl_probe()
678 pins = devm_kmalloc_array(&pdev->dev, hw->soc->npins, sizeof(*pins), in mtk_moore_pinctrl_probe()
681 return -ENOMEM; in mtk_moore_pinctrl_probe()
683 for (i = 0; i < hw->soc->npins; i++) { in mtk_moore_pinctrl_probe()
684 pins[i].number = hw->soc->pins[i].number; in mtk_moore_pinctrl_probe()
685 pins[i].name = hw->soc->pins[i].name; in mtk_moore_pinctrl_probe()
690 mtk_desc.npins = hw->soc->npins; in mtk_moore_pinctrl_probe()
697 err = devm_pinctrl_register_and_init(&pdev->dev, &mtk_desc, hw, in mtk_moore_pinctrl_probe()
698 &hw->pctrl); in mtk_moore_pinctrl_probe()
715 err = pinctrl_enable(hw->pctrl); in mtk_moore_pinctrl_probe()
721 dev_warn(&pdev->dev, in mtk_moore_pinctrl_probe()