1 /*
2  * Allwinner A80 SoCs special pins pinctrl driver.
3  *
4  * Copyright (C) 2014 Maxime Ripard
5  * Maxime Ripard <maxime.ripard@free-electrons.com>
6  *
7  * This file is licensed under the terms of the GNU General Public
8  * License version 2.  This program is licensed "as is" without any
9  * warranty of any kind, whether express or implied.
10  */
11 
12 #include <linux/init.h>
13 #include <linux/platform_device.h>
14 #include <linux/of.h>
15 #include <linux/pinctrl/pinctrl.h>
16 
17 #include "pinctrl-sunxi.h"
18 
19 static const struct sunxi_desc_pin sun9i_a80_r_pins[] = {
20 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 0),
21 		  SUNXI_FUNCTION(0x0, "gpio_in"),
22 		  SUNXI_FUNCTION(0x1, "gpio_out"),
23 		  SUNXI_FUNCTION(0x3, "s_uart"),	/* TX */
24 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)),	/* PL_EINT0 */
25 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 1),
26 		  SUNXI_FUNCTION(0x0, "gpio_in"),
27 		  SUNXI_FUNCTION(0x1, "gpio_out"),
28 		  SUNXI_FUNCTION(0x3, "s_uart"),	/* RX */
29 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)),	/* PL_EINT1 */
30 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 2),
31 		  SUNXI_FUNCTION(0x0, "gpio_in"),
32 		  SUNXI_FUNCTION(0x1, "gpio_out"),
33 		  SUNXI_FUNCTION(0x3, "s_jtag"),	/* TMS */
34 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)),	/* PL_EINT2 */
35 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 3),
36 		  SUNXI_FUNCTION(0x0, "gpio_in"),
37 		  SUNXI_FUNCTION(0x1, "gpio_out"),
38 		  SUNXI_FUNCTION(0x3, "s_jtag"),	/* TCK */
39 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)),	/* PL_EINT3 */
40 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 4),
41 		  SUNXI_FUNCTION(0x0, "gpio_in"),
42 		  SUNXI_FUNCTION(0x1, "gpio_out"),
43 		  SUNXI_FUNCTION(0x3, "s_jtag"),	/* TDO */
44 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)),	/* PL_EINT4 */
45 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 5),
46 		  SUNXI_FUNCTION(0x0, "gpio_in"),
47 		  SUNXI_FUNCTION(0x1, "gpio_out"),
48 		  SUNXI_FUNCTION(0x3, "s_jtag"),	/* TDI */
49 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)),	/* PL_EINT5 */
50 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 6),
51 		  SUNXI_FUNCTION(0x0, "gpio_in"),
52 		  SUNXI_FUNCTION(0x1, "gpio_out"),
53 		  SUNXI_FUNCTION(0x3, "s_cir_rx"),
54 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)),	/* PL_EINT6 */
55 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 7),
56 		  SUNXI_FUNCTION(0x0, "gpio_in"),
57 		  SUNXI_FUNCTION(0x1, "gpio_out"),
58 		  SUNXI_FUNCTION(0x3, "1wire"),
59 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)),	/* PL_EINT7 */
60 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 8),
61 		  SUNXI_FUNCTION(0x0, "gpio_in"),
62 		  SUNXI_FUNCTION(0x1, "gpio_out"),
63 		  SUNXI_FUNCTION(0x2, "s_ps2"),		/* SCK1 */
64 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)),	/* PL_EINT8 */
65 	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 9),
66 		  SUNXI_FUNCTION(0x0, "gpio_in"),
67 		  SUNXI_FUNCTION(0x1, "gpio_out"),
68 		  SUNXI_FUNCTION(0x2, "s_ps2"),		/* SDA1 */
69 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)),	/* PL_EINT9 */
70 
71 	/* Hole */
72 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 0),
73 		  SUNXI_FUNCTION(0x0, "gpio_in"),
74 		  SUNXI_FUNCTION(0x1, "gpio_out"),
75 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 0)),	/* PM_EINT0 */
76 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 1),
77 		  SUNXI_FUNCTION(0x0, "gpio_in"),
78 		  SUNXI_FUNCTION(0x1, "gpio_out"),
79 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 1)),	/* PM_EINT1 */
80 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 2),
81 		  SUNXI_FUNCTION(0x0, "gpio_in"),
82 		  SUNXI_FUNCTION(0x1, "gpio_out"),
83 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 2)),	/* PM_EINT2 */
84 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 3),
85 		  SUNXI_FUNCTION(0x0, "gpio_in"),
86 		  SUNXI_FUNCTION(0x1, "gpio_out"),
87 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 3)),	/* PM_EINT3 */
88 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 4),
89 		  SUNXI_FUNCTION(0x0, "gpio_in"),
90 		  SUNXI_FUNCTION(0x1, "gpio_out"),
91 		  SUNXI_FUNCTION(0x3, "s_i2s1"),	/* LRCKR */
92 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 4)),	/* PM_EINT4 */
93 
94 	/* Hole */
95 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 8),
96 		  SUNXI_FUNCTION(0x0, "gpio_in"),
97 		  SUNXI_FUNCTION(0x1, "gpio_out"),
98 		  SUNXI_FUNCTION(0x3, "s_i2c1"),	/* SCK */
99 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 8)),	/* PM_EINT8 */
100 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 9),
101 		  SUNXI_FUNCTION(0x0, "gpio_in"),
102 		  SUNXI_FUNCTION(0x1, "gpio_out"),
103 		  SUNXI_FUNCTION(0x3, "s_i2c1"),	/* SDA */
104 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 9)),	/* PM_EINT9 */
105 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 10),
106 		  SUNXI_FUNCTION(0x0, "gpio_in"),
107 		  SUNXI_FUNCTION(0x1, "gpio_out"),
108 		  SUNXI_FUNCTION(0x2, "s_i2s0"),	/* MCLK */
109 		  SUNXI_FUNCTION(0x3, "s_i2s1")),	/* MCLK */
110 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 11),
111 		  SUNXI_FUNCTION(0x0, "gpio_in"),
112 		  SUNXI_FUNCTION(0x1, "gpio_out"),
113 		  SUNXI_FUNCTION(0x2, "s_i2s0"),	/* BCLK */
114 		  SUNXI_FUNCTION(0x3, "s_i2s1")),	/* BCLK */
115 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 12),
116 		  SUNXI_FUNCTION(0x0, "gpio_in"),
117 		  SUNXI_FUNCTION(0x1, "gpio_out"),
118 		  SUNXI_FUNCTION(0x2, "s_i2s0"),	/* LRCK */
119 		  SUNXI_FUNCTION(0x3, "s_i2s1")),	/* LRCK */
120 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 13),
121 		  SUNXI_FUNCTION(0x0, "gpio_in"),
122 		  SUNXI_FUNCTION(0x1, "gpio_out"),
123 		  SUNXI_FUNCTION(0x2, "s_i2s0"),	/* DIN */
124 		  SUNXI_FUNCTION(0x3, "s_i2s1")),	/* DIN */
125 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 14),
126 		  SUNXI_FUNCTION(0x0, "gpio_in"),
127 		  SUNXI_FUNCTION(0x1, "gpio_out"),
128 		  SUNXI_FUNCTION(0x2, "s_i2s0"),	/* DOUT */
129 		  SUNXI_FUNCTION(0x3, "s_i2s1")),	/* DOUT */
130 	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 15),
131 		  SUNXI_FUNCTION(0x0, "gpio_in"),
132 		  SUNXI_FUNCTION(0x1, "gpio_out"),
133 		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 15)),	/* PM_EINT15 */
134 
135 	/* Hole */
136 	SUNXI_PIN(SUNXI_PINCTRL_PIN(N, 0),
137 		  SUNXI_FUNCTION(0x0, "gpio_in"),
138 		  SUNXI_FUNCTION(0x1, "gpio_out"),
139 		  SUNXI_FUNCTION(0x2, "s_i2c0"),	/* SCK */
140 		  SUNXI_FUNCTION(0x3, "s_rsb")),	/* SCK */
141 	SUNXI_PIN(SUNXI_PINCTRL_PIN(N, 1),
142 		  SUNXI_FUNCTION(0x0, "gpio_in"),
143 		  SUNXI_FUNCTION(0x1, "gpio_out"),
144 		  SUNXI_FUNCTION(0x2, "s_i2c0"),	/* SDA */
145 		  SUNXI_FUNCTION(0x3, "s_rsb")),	/* SDA */
146 };
147 
148 static const struct sunxi_pinctrl_desc sun9i_a80_r_pinctrl_data = {
149 	.pins = sun9i_a80_r_pins,
150 	.npins = ARRAY_SIZE(sun9i_a80_r_pins),
151 	.pin_base = PL_BASE,
152 	.irq_banks = 2,
153 	.disable_strict_mode = true,
154 	.io_bias_cfg_variant = BIAS_VOLTAGE_GRP_CONFIG,
155 };
156 
157 static int sun9i_a80_r_pinctrl_probe(struct platform_device *pdev)
158 {
159 	return sunxi_pinctrl_init(pdev,
160 				  &sun9i_a80_r_pinctrl_data);
161 }
162 
163 static const struct of_device_id sun9i_a80_r_pinctrl_match[] = {
164 	{ .compatible = "allwinner,sun9i-a80-r-pinctrl", },
165 	{}
166 };
167 
168 static struct platform_driver sun9i_a80_r_pinctrl_driver = {
169 	.probe	= sun9i_a80_r_pinctrl_probe,
170 	.driver	= {
171 		.name		= "sun9i-a80-r-pinctrl",
172 		.owner		= THIS_MODULE,
173 		.of_match_table	= sun9i_a80_r_pinctrl_match,
174 	},
175 };
176 builtin_platform_driver(sun9i_a80_r_pinctrl_driver);
177