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.
12 #include "pinctrl-moore.h"
25 {"mediatek,pull-up-adv", MTK_PIN_CONFIG_PU_ADV, 1},
26 {"mediatek,pull-down-adv", MTK_PIN_CONFIG_PD_ADV, 1},
33 PCONFDUMP(MTK_PIN_CONFIG_PU_ADV, "pu-adv", NULL, true),
34 PCONFDUMP(MTK_PIN_CONFIG_PD_ADV, "pd-adv", NULL, true),
48 return -EINVAL; in mtk_pinmux_set_mux()
52 return -EINVAL; in mtk_pinmux_set_mux()
54 dev_dbg(pctldev->dev, "enable function %s group %s\n", in mtk_pinmux_set_mux()
55 func->name, grp->name); in mtk_pinmux_set_mux()
57 for (i = 0; i < grp->num_pins; i++) { in mtk_pinmux_set_mux()
59 int *pin_modes = grp->data; in mtk_pinmux_set_mux()
60 int pin = grp->pins[i]; in mtk_pinmux_set_mux()
62 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinmux_set_mux()
63 if (!desc->name) in mtk_pinmux_set_mux()
64 return -ENOTSUPP; in mtk_pinmux_set_mux()
80 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinmux_gpio_request_enable()
81 if (!desc->name) in mtk_pinmux_gpio_request_enable()
82 return -ENOTSUPP; in mtk_pinmux_gpio_request_enable()
85 hw->soc->gpio_m); in mtk_pinmux_gpio_request_enable()
95 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinmux_gpio_set_direction()
96 if (!desc->name) in mtk_pinmux_gpio_set_direction()
97 return -ENOTSUPP; in mtk_pinmux_gpio_set_direction()
111 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinconf_get()
112 if (!desc->name) in mtk_pinconf_get()
113 return -ENOTSUPP; in mtk_pinconf_get()
117 if (hw->soc->bias_disable_get) { in mtk_pinconf_get()
118 err = hw->soc->bias_disable_get(hw, desc, &ret); in mtk_pinconf_get()
122 return -ENOTSUPP; in mtk_pinconf_get()
126 if (hw->soc->bias_get) { in mtk_pinconf_get()
127 err = hw->soc->bias_get(hw, desc, 1, &ret); in mtk_pinconf_get()
131 return -ENOTSUPP; in mtk_pinconf_get()
135 if (hw->soc->bias_get) { in mtk_pinconf_get()
136 err = hw->soc->bias_get(hw, desc, 0, &ret); in mtk_pinconf_get()
140 return -ENOTSUPP; in mtk_pinconf_get()
149 return -EINVAL; in mtk_pinconf_get()
158 /* HW takes input mode as zero; output mode as non-zero */ in mtk_pinconf_get()
161 return -EINVAL; in mtk_pinconf_get()
174 return -EINVAL; in mtk_pinconf_get()
178 if (hw->soc->drive_get) { in mtk_pinconf_get()
179 err = hw->soc->drive_get(hw, desc, &ret); in mtk_pinconf_get()
183 err = -ENOTSUPP; in mtk_pinconf_get()
200 if (hw->soc->adv_pull_get) { in mtk_pinconf_get()
204 err = hw->soc->adv_pull_get(hw, desc, pullup, &ret); in mtk_pinconf_get()
208 return -ENOTSUPP; in mtk_pinconf_get()
212 return -ENOTSUPP; in mtk_pinconf_get()
228 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin]; in mtk_pinconf_set()
229 if (!desc->name) in mtk_pinconf_set()
230 return -ENOTSUPP; in mtk_pinconf_set()
238 if (hw->soc->bias_disable_set) { in mtk_pinconf_set()
239 err = hw->soc->bias_disable_set(hw, desc); in mtk_pinconf_set()
243 return -ENOTSUPP; in mtk_pinconf_set()
247 if (hw->soc->bias_set) { in mtk_pinconf_set()
248 err = hw->soc->bias_set(hw, desc, 1); in mtk_pinconf_set()
252 return -ENOTSUPP; in mtk_pinconf_set()
256 if (hw->soc->bias_set) { in mtk_pinconf_set()
257 err = hw->soc->bias_set(hw, desc, 0); in mtk_pinconf_set()
261 return -ENOTSUPP; in mtk_pinconf_set()
277 if (hw->soc->ies_present) { in mtk_pinconf_set()
321 if (hw->soc->drive_set) { in mtk_pinconf_set()
322 err = hw->soc->drive_set(hw, desc, arg); in mtk_pinconf_set()
326 err = -ENOTSUPP; in mtk_pinconf_set()
340 if (hw->soc->adv_pull_set) { in mtk_pinconf_set()
344 err = hw->soc->adv_pull_set(hw, desc, pullup, in mtk_pinconf_set()
349 return -ENOTSUPP; in mtk_pinconf_set()
353 err = -ENOTSUPP; in mtk_pinconf_set()
373 return -ENOTSUPP; in mtk_pinconf_group_get()
377 return -ENOTSUPP; in mtk_pinconf_group_get()
447 desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio]; in mtk_gpio_get()
448 if (!desc->name) in mtk_gpio_get()
449 return -ENOTSUPP; in mtk_gpio_get()
463 desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio]; in mtk_gpio_set()
464 if (!desc->name) { in mtk_gpio_set()
465 dev_err(hw->dev, "Failed to set gpio %d\n", gpio); in mtk_gpio_set()
474 return pinctrl_gpio_direction_input(chip->base + gpio); in mtk_gpio_direction_input()
482 return pinctrl_gpio_direction_output(chip->base + gpio); in mtk_gpio_direction_output()
490 if (!hw->eint) in mtk_gpio_to_irq()
491 return -ENOTSUPP; in mtk_gpio_to_irq()
493 desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset]; in mtk_gpio_to_irq()
495 if (desc->eint.eint_n == (u16)EINT_NA) in mtk_gpio_to_irq()
496 return -ENOTSUPP; in mtk_gpio_to_irq()
498 return mtk_eint_find_irq(hw->eint, desc->eint.eint_n); in mtk_gpio_to_irq()
508 desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset]; in mtk_gpio_set_config()
509 if (!desc->name) in mtk_gpio_set_config()
510 return -ENOTSUPP; in mtk_gpio_set_config()
512 if (!hw->eint || in mtk_gpio_set_config()
514 desc->eint.eint_n == (u16)EINT_NA) in mtk_gpio_set_config()
515 return -ENOTSUPP; in mtk_gpio_set_config()
519 return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, debounce); in mtk_gpio_set_config()
524 struct gpio_chip *chip = &hw->chip; in mtk_build_gpiochip()
527 chip->label = PINCTRL_PINCTRL_DEV; in mtk_build_gpiochip()
528 chip->parent = hw->dev; in mtk_build_gpiochip()
529 chip->request = gpiochip_generic_request; in mtk_build_gpiochip()
530 chip->free = gpiochip_generic_free; in mtk_build_gpiochip()
531 chip->direction_input = mtk_gpio_direction_input; in mtk_build_gpiochip()
532 chip->direction_output = mtk_gpio_direction_output; in mtk_build_gpiochip()
533 chip->get = mtk_gpio_get; in mtk_build_gpiochip()
534 chip->set = mtk_gpio_set; in mtk_build_gpiochip()
535 chip->to_irq = mtk_gpio_to_irq; in mtk_build_gpiochip()
536 chip->set_config = mtk_gpio_set_config; in mtk_build_gpiochip()
537 chip->base = -1; in mtk_build_gpiochip()
538 chip->ngpio = hw->soc->npins; in mtk_build_gpiochip()
539 chip->of_gpio_n_cells = 2; in mtk_build_gpiochip()
546 * "gpio-ranges" property. Otherwise, called directly from a in mtk_build_gpiochip()
547 * DeviceTree-supported pinctrl driver is DEPRECATED. in mtk_build_gpiochip()
550 * bind pinctrl and gpio drivers via the "gpio-ranges" property. in mtk_build_gpiochip()
552 if (!of_find_property(hw->dev->of_node, "gpio-ranges", NULL)) { in mtk_build_gpiochip()
553 ret = gpiochip_add_pin_range(chip, dev_name(hw->dev), 0, 0, in mtk_build_gpiochip()
554 chip->ngpio); in mtk_build_gpiochip()
568 for (i = 0; i < hw->soc->ngrps; i++) { in mtk_build_groups()
569 const struct group_desc *group = hw->soc->grps + i; in mtk_build_groups()
571 err = pinctrl_generic_add_group(hw->pctrl, group->name, in mtk_build_groups()
572 group->pins, group->num_pins, in mtk_build_groups()
573 group->data); in mtk_build_groups()
575 dev_err(hw->dev, "Failed to register group %s\n", in mtk_build_groups()
576 group->name); in mtk_build_groups()
588 for (i = 0; i < hw->soc->nfuncs ; i++) { in mtk_build_functions()
589 const struct function_desc *func = hw->soc->funcs + i; in mtk_build_functions()
591 err = pinmux_generic_add_function(hw->pctrl, func->name, in mtk_build_functions()
592 func->group_names, in mtk_build_functions()
593 func->num_group_names, in mtk_build_functions()
594 func->data); in mtk_build_functions()
596 dev_err(hw->dev, "Failed to register function %s\n", in mtk_build_functions()
597 func->name); in mtk_build_functions()
608 struct device *dev = &pdev->dev; in mtk_moore_pinctrl_probe()
613 hw = devm_kzalloc(&pdev->dev, sizeof(*hw), GFP_KERNEL); in mtk_moore_pinctrl_probe()
615 return -ENOMEM; in mtk_moore_pinctrl_probe()
617 hw->soc = soc; in mtk_moore_pinctrl_probe()
618 hw->dev = &pdev->dev; in mtk_moore_pinctrl_probe()
620 if (!hw->soc->nbase_names) in mtk_moore_pinctrl_probe()
621 return dev_err_probe(dev, -EINVAL, in mtk_moore_pinctrl_probe()
624 hw->base = devm_kmalloc_array(&pdev->dev, hw->soc->nbase_names, in mtk_moore_pinctrl_probe()
625 sizeof(*hw->base), GFP_KERNEL); in mtk_moore_pinctrl_probe()
626 if (!hw->base) in mtk_moore_pinctrl_probe()
627 return -ENOMEM; in mtk_moore_pinctrl_probe()
629 for (i = 0; i < hw->soc->nbase_names; i++) { in mtk_moore_pinctrl_probe()
630 hw->base[i] = devm_platform_ioremap_resource_byname(pdev, in mtk_moore_pinctrl_probe()
631 hw->soc->base_names[i]); in mtk_moore_pinctrl_probe()
632 if (IS_ERR(hw->base[i])) in mtk_moore_pinctrl_probe()
633 return PTR_ERR(hw->base[i]); in mtk_moore_pinctrl_probe()
636 hw->nbase = hw->soc->nbase_names; in mtk_moore_pinctrl_probe()
638 spin_lock_init(&hw->lock); in mtk_moore_pinctrl_probe()
641 pins = devm_kmalloc_array(&pdev->dev, hw->soc->npins, sizeof(*pins), in mtk_moore_pinctrl_probe()
644 return -ENOMEM; in mtk_moore_pinctrl_probe()
646 for (i = 0; i < hw->soc->npins; i++) { in mtk_moore_pinctrl_probe()
647 pins[i].number = hw->soc->pins[i].number; in mtk_moore_pinctrl_probe()
648 pins[i].name = hw->soc->pins[i].name; in mtk_moore_pinctrl_probe()
653 mtk_desc.npins = hw->soc->npins; in mtk_moore_pinctrl_probe()
660 err = devm_pinctrl_register_and_init(&pdev->dev, &mtk_desc, hw, in mtk_moore_pinctrl_probe()
661 &hw->pctrl); in mtk_moore_pinctrl_probe()
678 err = pinctrl_enable(hw->pctrl); in mtk_moore_pinctrl_probe()
684 dev_warn(&pdev->dev, in mtk_moore_pinctrl_probe()