xref: /linux/drivers/pinctrl/sunxi/pinctrl-sun9i-a80-r.c (revision 36ec807b627b4c0a0a382f0ae48eac7187d14b2b)
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