1ba5554dcSIcenowy Zheng // SPDX-License-Identifier: GPL-2.0 2ba5554dcSIcenowy Zheng /* 3ba5554dcSIcenowy Zheng * Allwinner H6 R_PIO pin controller driver 4ba5554dcSIcenowy Zheng * 5ba5554dcSIcenowy Zheng * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io> 6ba5554dcSIcenowy Zheng * 7ba5554dcSIcenowy Zheng * Based on pinctrl-sun6i-a31-r.c, which is: 8ba5554dcSIcenowy Zheng * Copyright (C) 2014 Boris Brezillon 9ba5554dcSIcenowy Zheng * Boris Brezillon <boris.brezillon@free-electrons.com> 10ba5554dcSIcenowy Zheng * Copyright (C) 2014 Maxime Ripard 11ba5554dcSIcenowy Zheng * Maxime Ripard <maxime.ripard@free-electrons.com> 12ba5554dcSIcenowy Zheng */ 13ba5554dcSIcenowy Zheng 14ba5554dcSIcenowy Zheng #include <linux/init.h> 15ba5554dcSIcenowy Zheng #include <linux/platform_device.h> 16ba5554dcSIcenowy Zheng #include <linux/of.h> 17ba5554dcSIcenowy Zheng #include <linux/of_device.h> 18ba5554dcSIcenowy Zheng #include <linux/pinctrl/pinctrl.h> 19ba5554dcSIcenowy Zheng #include <linux/reset.h> 20ba5554dcSIcenowy Zheng 21ba5554dcSIcenowy Zheng #include "pinctrl-sunxi.h" 22ba5554dcSIcenowy Zheng 23ba5554dcSIcenowy Zheng static const struct sunxi_desc_pin sun50i_h6_r_pins[] = { 24ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 0), 25ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 26ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 27*b071a124SSamuel Holland SUNXI_FUNCTION(0x2, "s_rsb"), /* SCK */ 28ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x3, "s_i2c"), /* SCK */ 29ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)), /* PL_EINT0 */ 30ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 1), 31ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 32ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 33*b071a124SSamuel Holland SUNXI_FUNCTION(0x2, "s_rsb"), /* SDA */ 34ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x3, "s_i2c"), /* SDA */ 35ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)), /* PL_EINT1 */ 36ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 2), 37ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 38ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 39ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x2, "s_uart"), /* TX */ 40ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)), /* PL_EINT2 */ 41ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 3), 42ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 43ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 44ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x2, "s_uart"), /* RX */ 45ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)), /* PL_EINT3 */ 46ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 4), 47ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 48ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 49ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x2, "s_jtag"), /* MS */ 50ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)), /* PL_EINT4 */ 51ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 5), 52ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 53ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 54ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x2, "s_jtag"), /* CK */ 55ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)), /* PL_EINT5 */ 56ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 6), 57ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 58ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 59ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x2, "s_jtag"), /* DO */ 60ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)), /* PL_EINT6 */ 61ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 7), 62ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 63ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 64ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x2, "s_jtag"), /* DI */ 65ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)), /* PL_EINT7 */ 66ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 8), 67ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 68ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 69ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x2, "s_pwm"), 70ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)), /* PL_EINT8 */ 71ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 9), 72ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 73ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 74ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x2, "s_cir_rx"), 75ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)), /* PL_EINT9 */ 76ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 10), 77ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 78ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 79ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x2, "s_w1"), 80ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 10)), /* PL_EINT10 */ 81ba5554dcSIcenowy Zheng /* Hole */ 82ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 0), 83ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 84ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 85ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 0)), /* PM_EINT0 */ 86ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 1), 87ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 88ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 89ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 1)), /* PM_EINT1 */ 90ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 2), 91ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 92ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 93ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 2), /* PM_EINT2 */ 94ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x3, "1wire")), 95ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 3), 96ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 97ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 98ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 3)), /* PM_EINT3 */ 99ba5554dcSIcenowy Zheng SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 4), 100ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x0, "gpio_in"), 101ba5554dcSIcenowy Zheng SUNXI_FUNCTION(0x1, "gpio_out"), 102ba5554dcSIcenowy Zheng SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 4)), /* PM_EINT4 */ 103ba5554dcSIcenowy Zheng }; 104ba5554dcSIcenowy Zheng 105ba5554dcSIcenowy Zheng static const struct sunxi_pinctrl_desc sun50i_h6_r_pinctrl_data = { 106ba5554dcSIcenowy Zheng .pins = sun50i_h6_r_pins, 107ba5554dcSIcenowy Zheng .npins = ARRAY_SIZE(sun50i_h6_r_pins), 108ba5554dcSIcenowy Zheng .pin_base = PL_BASE, 109ba5554dcSIcenowy Zheng .irq_banks = 2, 110ba5554dcSIcenowy Zheng }; 111ba5554dcSIcenowy Zheng 112ba5554dcSIcenowy Zheng static int sun50i_h6_r_pinctrl_probe(struct platform_device *pdev) 113ba5554dcSIcenowy Zheng { 114ba5554dcSIcenowy Zheng return sunxi_pinctrl_init(pdev, 115ba5554dcSIcenowy Zheng &sun50i_h6_r_pinctrl_data); 116ba5554dcSIcenowy Zheng } 117ba5554dcSIcenowy Zheng 118ba5554dcSIcenowy Zheng static const struct of_device_id sun50i_h6_r_pinctrl_match[] = { 119ba5554dcSIcenowy Zheng { .compatible = "allwinner,sun50i-h6-r-pinctrl", }, 120ba5554dcSIcenowy Zheng {} 121ba5554dcSIcenowy Zheng }; 122ba5554dcSIcenowy Zheng 123ba5554dcSIcenowy Zheng static struct platform_driver sun50i_h6_r_pinctrl_driver = { 124ba5554dcSIcenowy Zheng .probe = sun50i_h6_r_pinctrl_probe, 125ba5554dcSIcenowy Zheng .driver = { 126ba5554dcSIcenowy Zheng .name = "sun50i-h6-r-pinctrl", 127ba5554dcSIcenowy Zheng .of_match_table = sun50i_h6_r_pinctrl_match, 128ba5554dcSIcenowy Zheng }, 129ba5554dcSIcenowy Zheng }; 130ba5554dcSIcenowy Zheng builtin_platform_driver(sun50i_h6_r_pinctrl_driver); 131