10eccc9cbSMaxime Ripard /* 20eccc9cbSMaxime Ripard * Allwinner A80 SoCs special pins pinctrl driver. 30eccc9cbSMaxime Ripard * 40eccc9cbSMaxime Ripard * Copyright (C) 2014 Maxime Ripard 50eccc9cbSMaxime Ripard * Maxime Ripard <maxime.ripard@free-electrons.com> 60eccc9cbSMaxime Ripard * 70eccc9cbSMaxime Ripard * This file is licensed under the terms of the GNU General Public 80eccc9cbSMaxime Ripard * License version 2. This program is licensed "as is" without any 90eccc9cbSMaxime Ripard * warranty of any kind, whether express or implied. 100eccc9cbSMaxime Ripard */ 110eccc9cbSMaxime Ripard 125ab260aaSPaul Gortmaker #include <linux/init.h> 130eccc9cbSMaxime Ripard #include <linux/platform_device.h> 140eccc9cbSMaxime Ripard #include <linux/of.h> 150eccc9cbSMaxime Ripard #include <linux/pinctrl/pinctrl.h> 160eccc9cbSMaxime Ripard 170eccc9cbSMaxime Ripard #include "pinctrl-sunxi.h" 180eccc9cbSMaxime Ripard 190eccc9cbSMaxime Ripard static const struct sunxi_desc_pin sun9i_a80_r_pins[] = { 200eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 0), 210eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 220eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 230eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_uart"), /* TX */ 240eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)), /* PL_EINT0 */ 250eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 1), 260eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 270eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 280eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_uart"), /* RX */ 290eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)), /* PL_EINT1 */ 300eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 2), 310eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 320eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 330eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_jtag"), /* TMS */ 340eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)), /* PL_EINT2 */ 350eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 3), 360eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 370eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 380eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_jtag"), /* TCK */ 390eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)), /* PL_EINT3 */ 400eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 4), 410eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 420eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 430eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_jtag"), /* TDO */ 440eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)), /* PL_EINT4 */ 450eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 5), 460eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 470eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 480eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_jtag"), /* TDI */ 490eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)), /* PL_EINT5 */ 500eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 6), 510eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 520eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 530eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_cir_rx"), 540eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)), /* PL_EINT6 */ 550eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 7), 560eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 570eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 580eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "1wire"), 590eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)), /* PL_EINT7 */ 600eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 8), 610eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 620eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 630eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x2, "s_ps2"), /* SCK1 */ 640eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)), /* PL_EINT8 */ 650eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 9), 660eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 670eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 680eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x2, "s_ps2"), /* SDA1 */ 690eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)), /* PL_EINT9 */ 700eccc9cbSMaxime Ripard 710eccc9cbSMaxime Ripard /* Hole */ 720eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 0), 730eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 740eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 750eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 0)), /* PM_EINT0 */ 760eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 1), 770eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 780eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 790eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 1)), /* PM_EINT1 */ 800eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 2), 810eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 820eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 830eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 2)), /* PM_EINT2 */ 840eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 3), 850eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 860eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 870eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 3)), /* PM_EINT3 */ 880eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 4), 890eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 900eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 910eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_i2s1"), /* LRCKR */ 920eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 4)), /* PM_EINT4 */ 930eccc9cbSMaxime Ripard 940eccc9cbSMaxime Ripard /* Hole */ 950eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 8), 960eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 970eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 980eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_i2c1"), /* SCK */ 990eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 8)), /* PM_EINT8 */ 1000eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 9), 1010eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 1020eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 1030eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_i2c1"), /* SDA */ 1040eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 9)), /* PM_EINT9 */ 1050eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 10), 1060eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 1070eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 1080eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x2, "s_i2s0"), /* MCLK */ 1090eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_i2s1")), /* MCLK */ 1100eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 11), 1110eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 1120eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 1130eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x2, "s_i2s0"), /* BCLK */ 1140eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_i2s1")), /* BCLK */ 1150eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 12), 1160eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 1170eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 1180eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x2, "s_i2s0"), /* LRCK */ 1190eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_i2s1")), /* LRCK */ 1200eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 13), 1210eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 1220eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 1230eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x2, "s_i2s0"), /* DIN */ 1240eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_i2s1")), /* DIN */ 1250eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 14), 1260eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 1270eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 1280eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x2, "s_i2s0"), /* DOUT */ 1290eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_i2s1")), /* DOUT */ 1300eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 15), 1310eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 1320eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 1330eccc9cbSMaxime Ripard SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 15)), /* PM_EINT15 */ 1340eccc9cbSMaxime Ripard 1350eccc9cbSMaxime Ripard /* Hole */ 1360eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(N, 0), 1370eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 1380eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 1390eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x2, "s_i2c0"), /* SCK */ 1400eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_rsb")), /* SCK */ 1410eccc9cbSMaxime Ripard SUNXI_PIN(SUNXI_PINCTRL_PIN(N, 1), 1420eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x0, "gpio_in"), 1430eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x1, "gpio_out"), 1440eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x2, "s_i2c0"), /* SDA */ 1450eccc9cbSMaxime Ripard SUNXI_FUNCTION(0x3, "s_rsb")), /* SDA */ 1460eccc9cbSMaxime Ripard }; 1470eccc9cbSMaxime Ripard 1480eccc9cbSMaxime Ripard static const struct sunxi_pinctrl_desc sun9i_a80_r_pinctrl_data = { 1490eccc9cbSMaxime Ripard .pins = sun9i_a80_r_pins, 1500eccc9cbSMaxime Ripard .npins = ARRAY_SIZE(sun9i_a80_r_pins), 1510eccc9cbSMaxime Ripard .pin_base = PL_BASE, 1520eccc9cbSMaxime Ripard .irq_banks = 2, 153cd70387fSMaxime Ripard .disable_strict_mode = true, 154*f7275345SOndrej Jirman .io_bias_cfg_variant = BIAS_VOLTAGE_GRP_CONFIG, 1550eccc9cbSMaxime Ripard }; 1560eccc9cbSMaxime Ripard 1570eccc9cbSMaxime Ripard static int sun9i_a80_r_pinctrl_probe(struct platform_device *pdev) 1580eccc9cbSMaxime Ripard { 1590eccc9cbSMaxime Ripard return sunxi_pinctrl_init(pdev, 1600eccc9cbSMaxime Ripard &sun9i_a80_r_pinctrl_data); 1610eccc9cbSMaxime Ripard } 1620eccc9cbSMaxime Ripard 1630eccc9cbSMaxime Ripard static const struct of_device_id sun9i_a80_r_pinctrl_match[] = { 1640eccc9cbSMaxime Ripard { .compatible = "allwinner,sun9i-a80-r-pinctrl", }, 1650eccc9cbSMaxime Ripard {} 1660eccc9cbSMaxime Ripard }; 1670eccc9cbSMaxime Ripard 1680eccc9cbSMaxime Ripard static struct platform_driver sun9i_a80_r_pinctrl_driver = { 1690eccc9cbSMaxime Ripard .probe = sun9i_a80_r_pinctrl_probe, 1700eccc9cbSMaxime Ripard .driver = { 1710eccc9cbSMaxime Ripard .name = "sun9i-a80-r-pinctrl", 1720eccc9cbSMaxime Ripard .of_match_table = sun9i_a80_r_pinctrl_match, 1730eccc9cbSMaxime Ripard }, 1740eccc9cbSMaxime Ripard }; 1755ab260aaSPaul Gortmaker builtin_platform_driver(sun9i_a80_r_pinctrl_driver); 176