blob: f4a74f1c0bfd135fa0e39104eb5cd98507a136f7 [file] [log] [blame]
Maxime Ripard0e37f882013-01-18 22:30:34 +01001/*
2 * Allwinner A1X SoCs pinctrl driver.
3 *
4 * Copyright (C) 2012 Maxime Ripard
5 *
6 * Maxime Ripard <maxime.ripard@free-electrons.com>
7 *
8 * This file is licensed under the terms of the GNU General Public
9 * License version 2. This program is licensed "as is" without any
10 * warranty of any kind, whether express or implied.
11 */
12
13#include <linux/io.h>
Emilio López950707c2013-03-22 11:20:40 -030014#include <linux/clk.h>
Maxime Ripard08e9e612013-01-28 21:33:12 +010015#include <linux/gpio.h>
Maxime Ripard0e37f882013-01-18 22:30:34 +010016#include <linux/module.h>
17#include <linux/of.h>
18#include <linux/of_address.h>
19#include <linux/of_device.h>
20#include <linux/pinctrl/consumer.h>
21#include <linux/pinctrl/machine.h>
22#include <linux/pinctrl/pinctrl.h>
23#include <linux/pinctrl/pinconf-generic.h>
24#include <linux/pinctrl/pinmux.h>
25#include <linux/platform_device.h>
26#include <linux/slab.h>
27
28#include "core.h"
29#include "pinctrl-sunxi.h"
30
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010031static const struct sunxi_desc_pin sun4i_a10_pins[] = {
32 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA0,
33 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010034 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010035 SUNXI_FUNCTION(0x2, "emac"), /* ERXD3 */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010036 SUNXI_FUNCTION(0x3, "spi1"), /* CS0 */
37 SUNXI_FUNCTION(0x4, "uart2")), /* RTS */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010038 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA1,
39 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010040 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010041 SUNXI_FUNCTION(0x2, "emac"), /* ERXD2 */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010042 SUNXI_FUNCTION(0x3, "spi1"), /* CLK */
43 SUNXI_FUNCTION(0x4, "uart2")), /* CTS */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010044 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA2,
45 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010046 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010047 SUNXI_FUNCTION(0x2, "emac"), /* ERXD1 */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010048 SUNXI_FUNCTION(0x3, "spi1"), /* MOSI */
49 SUNXI_FUNCTION(0x4, "uart2")), /* TX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010050 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA3,
51 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010052 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010053 SUNXI_FUNCTION(0x2, "emac"), /* ERXD0 */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010054 SUNXI_FUNCTION(0x3, "spi1"), /* MISO */
55 SUNXI_FUNCTION(0x4, "uart2")), /* RX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010056 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA4,
57 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010058 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010059 SUNXI_FUNCTION(0x2, "emac"), /* ETXD3 */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010060 SUNXI_FUNCTION(0x3, "spi1")), /* CS1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010061 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA5,
62 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010063 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010064 SUNXI_FUNCTION(0x2, "emac"), /* ETXD2 */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010065 SUNXI_FUNCTION(0x3, "spi3")), /* CS0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010066 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA6,
67 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010068 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010069 SUNXI_FUNCTION(0x2, "emac"), /* ETXD1 */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010070 SUNXI_FUNCTION(0x3, "spi3")), /* CLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010071 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA7,
72 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010073 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010074 SUNXI_FUNCTION(0x2, "emac"), /* ETXD0 */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010075 SUNXI_FUNCTION(0x3, "spi3")), /* MOSI */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010076 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA8,
77 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010078 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010079 SUNXI_FUNCTION(0x2, "emac"), /* ERXCK */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010080 SUNXI_FUNCTION(0x3, "spi3")), /* MISO */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010081 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA9,
82 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010083 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010084 SUNXI_FUNCTION(0x2, "emac"), /* ERXERR */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +010085 SUNXI_FUNCTION(0x3, "spi3")), /* CS1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010086 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA10,
87 SUNXI_FUNCTION(0x0, "gpio_in"),
88 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010089 SUNXI_FUNCTION(0x2, "emac"), /* ERXDV */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010090 SUNXI_FUNCTION(0x4, "uart1")), /* TX */
91 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA11,
92 SUNXI_FUNCTION(0x0, "gpio_in"),
93 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010094 SUNXI_FUNCTION(0x2, "emac"), /* EMDC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +010095 SUNXI_FUNCTION(0x4, "uart1")), /* RX */
96 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA12,
97 SUNXI_FUNCTION(0x0, "gpio_in"),
98 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +010099 SUNXI_FUNCTION(0x2, "emac"), /* EMDIO */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100100 SUNXI_FUNCTION(0x3, "uart6"), /* TX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100101 SUNXI_FUNCTION(0x4, "uart1")), /* RTS */
102 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA13,
103 SUNXI_FUNCTION(0x0, "gpio_in"),
104 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +0100105 SUNXI_FUNCTION(0x2, "emac"), /* ETXEN */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100106 SUNXI_FUNCTION(0x3, "uart6"), /* RX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100107 SUNXI_FUNCTION(0x4, "uart1")), /* CTS */
108 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA14,
109 SUNXI_FUNCTION(0x0, "gpio_in"),
110 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +0100111 SUNXI_FUNCTION(0x2, "emac"), /* ETXCK */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100112 SUNXI_FUNCTION(0x3, "uart7"), /* TX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100113 SUNXI_FUNCTION(0x4, "uart1")), /* DTR */
114 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA15,
115 SUNXI_FUNCTION(0x0, "gpio_in"),
116 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +0100117 SUNXI_FUNCTION(0x2, "emac"), /* ECRS */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100118 SUNXI_FUNCTION(0x3, "uart7"), /* RX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100119 SUNXI_FUNCTION(0x4, "uart1")), /* DSR */
120 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA16,
121 SUNXI_FUNCTION(0x0, "gpio_in"),
122 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +0100123 SUNXI_FUNCTION(0x2, "emac"), /* ECOL */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100124 SUNXI_FUNCTION(0x3, "can"), /* TX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100125 SUNXI_FUNCTION(0x4, "uart1")), /* DCD */
126 SUNXI_PIN(SUNXI_PINCTRL_PIN_PA17,
127 SUNXI_FUNCTION(0x0, "gpio_in"),
128 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardcb51f8e2013-03-27 14:12:33 +0100129 SUNXI_FUNCTION(0x2, "emac"), /* ETXERR */
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100130 SUNXI_FUNCTION(0x3, "can"), /* RX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100131 SUNXI_FUNCTION(0x4, "uart1")), /* RING */
132 /* Hole */
133 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0,
134 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100135 SUNXI_FUNCTION(0x1, "gpio_out"),
136 SUNXI_FUNCTION(0x2, "i2c0")), /* SCK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100137 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB1,
138 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100139 SUNXI_FUNCTION(0x1, "gpio_out"),
140 SUNXI_FUNCTION(0x2, "i2c0")), /* SDA */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100141 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB2,
142 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100143 SUNXI_FUNCTION(0x1, "gpio_out"),
144 SUNXI_FUNCTION(0x2, "pwm")), /* PWM0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100145 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3,
146 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100147 SUNXI_FUNCTION(0x1, "gpio_out"),
148 SUNXI_FUNCTION(0x2, "ir0")), /* TX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100149 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB4,
150 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100151 SUNXI_FUNCTION(0x1, "gpio_out"),
152 SUNXI_FUNCTION(0x2, "ir0")), /* RX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100153 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB5,
154 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100155 SUNXI_FUNCTION(0x1, "gpio_out"),
156 SUNXI_FUNCTION(0x2, "i2s"), /* MCLK */
157 SUNXI_FUNCTION(0x3, "ac97")), /* MCLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100158 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB6,
159 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100160 SUNXI_FUNCTION(0x1, "gpio_out"),
161 SUNXI_FUNCTION(0x2, "i2s"), /* BCLK */
162 SUNXI_FUNCTION(0x3, "ac97")), /* BCLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100163 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB7,
164 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100165 SUNXI_FUNCTION(0x1, "gpio_out"),
166 SUNXI_FUNCTION(0x2, "i2s"), /* LRCK */
167 SUNXI_FUNCTION(0x3, "ac97")), /* SYNC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100168 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB8,
169 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100170 SUNXI_FUNCTION(0x1, "gpio_out"),
171 SUNXI_FUNCTION(0x2, "i2s"), /* DO0 */
172 SUNXI_FUNCTION(0x3, "ac97")), /* DO */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100173 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB9,
174 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100175 SUNXI_FUNCTION(0x1, "gpio_out"),
176 SUNXI_FUNCTION(0x2, "i2s")), /* DO1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100177 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB10,
178 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100179 SUNXI_FUNCTION(0x1, "gpio_out"),
180 SUNXI_FUNCTION(0x2, "i2s")), /* DO2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100181 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB11,
182 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100183 SUNXI_FUNCTION(0x1, "gpio_out"),
184 SUNXI_FUNCTION(0x2, "i2s")), /* DO3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100185 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB12,
186 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100187 SUNXI_FUNCTION(0x1, "gpio_out"),
188 SUNXI_FUNCTION(0x2, "i2s"), /* DI */
189 SUNXI_FUNCTION(0x3, "ac97")), /* DI */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100190 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB13,
191 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100192 SUNXI_FUNCTION(0x1, "gpio_out"),
193 SUNXI_FUNCTION(0x2, "spi2")), /* CS1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100194 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB14,
195 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100196 SUNXI_FUNCTION(0x1, "gpio_out"),
197 SUNXI_FUNCTION(0x2, "spi2"), /* CS0 */
198 SUNXI_FUNCTION(0x3, "jtag")), /* MS0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100199 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB15,
200 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100201 SUNXI_FUNCTION(0x1, "gpio_out"),
202 SUNXI_FUNCTION(0x2, "spi2"), /* CLK */
203 SUNXI_FUNCTION(0x3, "jtag")), /* CK0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100204 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB16,
205 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100206 SUNXI_FUNCTION(0x1, "gpio_out"),
207 SUNXI_FUNCTION(0x2, "spi2"), /* MOSI */
208 SUNXI_FUNCTION(0x3, "jtag")), /* DO0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100209 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB17,
210 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100211 SUNXI_FUNCTION(0x1, "gpio_out"),
212 SUNXI_FUNCTION(0x2, "spi2"), /* MISO */
213 SUNXI_FUNCTION(0x3, "jtag")), /* DI0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100214 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB18,
215 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100216 SUNXI_FUNCTION(0x1, "gpio_out"),
217 SUNXI_FUNCTION(0x2, "i2c1")), /* SCK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100218 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB19,
219 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100220 SUNXI_FUNCTION(0x1, "gpio_out"),
221 SUNXI_FUNCTION(0x2, "i2c1")), /* SDA */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100222 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB20,
223 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100224 SUNXI_FUNCTION(0x1, "gpio_out"),
225 SUNXI_FUNCTION(0x2, "i2c2")), /* SCK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100226 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB21,
227 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100228 SUNXI_FUNCTION(0x1, "gpio_out"),
229 SUNXI_FUNCTION(0x2, "i2c2")), /* SDA */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100230 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB22,
231 SUNXI_FUNCTION(0x0, "gpio_in"),
232 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100233 SUNXI_FUNCTION(0x2, "uart0"), /* TX */
234 SUNXI_FUNCTION(0x3, "ir1")), /* TX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100235 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB23,
236 SUNXI_FUNCTION(0x0, "gpio_in"),
237 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100238 SUNXI_FUNCTION(0x2, "uart0"), /* RX */
239 SUNXI_FUNCTION(0x3, "ir1")), /* RX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100240 /* Hole */
241 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC0,
242 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100243 SUNXI_FUNCTION(0x1, "gpio_out"),
244 SUNXI_FUNCTION(0x2, "nand0"), /* NWE */
245 SUNXI_FUNCTION(0x3, "spi0")), /* MOSI */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100246 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC1,
247 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100248 SUNXI_FUNCTION(0x1, "gpio_out"),
249 SUNXI_FUNCTION(0x2, "nand0"), /* NALE */
250 SUNXI_FUNCTION(0x3, "spi0")), /* MISO */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100251 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC2,
252 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100253 SUNXI_FUNCTION(0x1, "gpio_out"),
254 SUNXI_FUNCTION(0x2, "nand0"), /* NCLE */
255 SUNXI_FUNCTION(0x3, "spi0")), /* SCK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100256 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC3,
257 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100258 SUNXI_FUNCTION(0x1, "gpio_out"),
259 SUNXI_FUNCTION(0x2, "nand0")), /* NCE1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100260 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC4,
261 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100262 SUNXI_FUNCTION(0x1, "gpio_out"),
263 SUNXI_FUNCTION(0x2, "nand0")), /* NCE0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100264 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC5,
265 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100266 SUNXI_FUNCTION(0x1, "gpio_out"),
267 SUNXI_FUNCTION(0x2, "nand0")), /* NRE# */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100268 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC6,
269 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100270 SUNXI_FUNCTION(0x1, "gpio_out"),
271 SUNXI_FUNCTION(0x2, "nand0"), /* NRB0 */
272 SUNXI_FUNCTION(0x3, "mmc2")), /* CMD */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100273 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC7,
274 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100275 SUNXI_FUNCTION(0x1, "gpio_out"),
276 SUNXI_FUNCTION(0x2, "nand0"), /* NRB1 */
277 SUNXI_FUNCTION(0x3, "mmc2")), /* CLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100278 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC8,
279 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100280 SUNXI_FUNCTION(0x1, "gpio_out"),
281 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ0 */
282 SUNXI_FUNCTION(0x3, "mmc2")), /* D0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100283 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC9,
284 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100285 SUNXI_FUNCTION(0x1, "gpio_out"),
286 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ1 */
287 SUNXI_FUNCTION(0x3, "mmc2")), /* D1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100288 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC10,
289 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100290 SUNXI_FUNCTION(0x1, "gpio_out"),
291 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ2 */
292 SUNXI_FUNCTION(0x3, "mmc2")), /* D2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100293 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC11,
294 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100295 SUNXI_FUNCTION(0x1, "gpio_out"),
296 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ3 */
297 SUNXI_FUNCTION(0x3, "mmc2")), /* D3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100298 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC12,
299 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100300 SUNXI_FUNCTION(0x1, "gpio_out"),
301 SUNXI_FUNCTION(0x2, "nand0")), /* NDQ4 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100302 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC13,
303 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100304 SUNXI_FUNCTION(0x1, "gpio_out"),
305 SUNXI_FUNCTION(0x2, "nand0")), /* NDQ5 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100306 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC14,
307 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100308 SUNXI_FUNCTION(0x1, "gpio_out"),
309 SUNXI_FUNCTION(0x2, "nand0")), /* NDQ6 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100310 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC15,
311 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100312 SUNXI_FUNCTION(0x1, "gpio_out"),
313 SUNXI_FUNCTION(0x2, "nand0")), /* NDQ7 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100314 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC16,
315 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100316 SUNXI_FUNCTION(0x1, "gpio_out"),
317 SUNXI_FUNCTION(0x2, "nand0")), /* NWP */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100318 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC17,
319 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100320 SUNXI_FUNCTION(0x1, "gpio_out"),
321 SUNXI_FUNCTION(0x2, "nand0")), /* NCE2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100322 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC18,
323 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100324 SUNXI_FUNCTION(0x1, "gpio_out"),
325 SUNXI_FUNCTION(0x2, "nand0")), /* NCE3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100326 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC19,
327 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100328 SUNXI_FUNCTION(0x1, "gpio_out"),
329 SUNXI_FUNCTION(0x2, "nand0"), /* NCE4 */
330 SUNXI_FUNCTION(0x3, "spi2")), /* CS0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100331 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC20,
332 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100333 SUNXI_FUNCTION(0x1, "gpio_out"),
334 SUNXI_FUNCTION(0x2, "nand0"), /* NCE5 */
335 SUNXI_FUNCTION(0x3, "spi2")), /* CLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100336 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC21,
337 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100338 SUNXI_FUNCTION(0x1, "gpio_out"),
339 SUNXI_FUNCTION(0x2, "nand0"), /* NCE6 */
340 SUNXI_FUNCTION(0x3, "spi2")), /* MOSI */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100341 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC22,
342 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100343 SUNXI_FUNCTION(0x1, "gpio_out"),
344 SUNXI_FUNCTION(0x2, "nand0"), /* NCE7 */
345 SUNXI_FUNCTION(0x3, "spi2")), /* MISO */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100346 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC23,
347 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100348 SUNXI_FUNCTION(0x1, "gpio_out"),
349 SUNXI_FUNCTION(0x3, "spi0")), /* CS0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100350 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC24,
351 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100352 SUNXI_FUNCTION(0x1, "gpio_out"),
353 SUNXI_FUNCTION(0x2, "nand0")), /* NDQS */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100354 /* Hole */
355 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD0,
356 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100357 SUNXI_FUNCTION(0x1, "gpio_out"),
358 SUNXI_FUNCTION(0x2, "lcd0"), /* D0 */
359 SUNXI_FUNCTION(0x3, "lvds0")), /* VP0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100360 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD1,
361 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100362 SUNXI_FUNCTION(0x1, "gpio_out"),
363 SUNXI_FUNCTION(0x2, "lcd0"), /* D1 */
364 SUNXI_FUNCTION(0x3, "lvds0")), /* VN0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100365 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD2,
366 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100367 SUNXI_FUNCTION(0x1, "gpio_out"),
368 SUNXI_FUNCTION(0x2, "lcd0"), /* D2 */
369 SUNXI_FUNCTION(0x3, "lvds0")), /* VP1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100370 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD3,
371 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100372 SUNXI_FUNCTION(0x1, "gpio_out"),
373 SUNXI_FUNCTION(0x2, "lcd0"), /* D3 */
374 SUNXI_FUNCTION(0x3, "lvds0")), /* VN1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100375 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD4,
376 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100377 SUNXI_FUNCTION(0x1, "gpio_out"),
378 SUNXI_FUNCTION(0x2, "lcd0"), /* D4 */
379 SUNXI_FUNCTION(0x3, "lvds0")), /* VP2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100380 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD5,
381 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100382 SUNXI_FUNCTION(0x1, "gpio_out"),
383 SUNXI_FUNCTION(0x2, "lcd0"), /* D5 */
384 SUNXI_FUNCTION(0x3, "lvds0")), /* VN2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100385 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD6,
386 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100387 SUNXI_FUNCTION(0x1, "gpio_out"),
388 SUNXI_FUNCTION(0x2, "lcd0"), /* D6 */
389 SUNXI_FUNCTION(0x3, "lvds0")), /* VPC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100390 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD7,
391 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100392 SUNXI_FUNCTION(0x1, "gpio_out"),
393 SUNXI_FUNCTION(0x2, "lcd0"), /* D7 */
394 SUNXI_FUNCTION(0x3, "lvds0")), /* VNC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100395 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD8,
396 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100397 SUNXI_FUNCTION(0x1, "gpio_out"),
398 SUNXI_FUNCTION(0x2, "lcd0"), /* D8 */
399 SUNXI_FUNCTION(0x3, "lvds0")), /* VP3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100400 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD9,
401 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100402 SUNXI_FUNCTION(0x1, "gpio_out"),
403 SUNXI_FUNCTION(0x2, "lcd0"), /* D9 */
404 SUNXI_FUNCTION(0x3, "lvds0")), /* VM3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100405 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD10,
406 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100407 SUNXI_FUNCTION(0x1, "gpio_out"),
408 SUNXI_FUNCTION(0x2, "lcd0"), /* D10 */
409 SUNXI_FUNCTION(0x3, "lvds1")), /* VP0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100410 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD11,
411 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100412 SUNXI_FUNCTION(0x1, "gpio_out"),
413 SUNXI_FUNCTION(0x2, "lcd0"), /* D11 */
414 SUNXI_FUNCTION(0x3, "lvds1")), /* VN0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100415 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD12,
416 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100417 SUNXI_FUNCTION(0x1, "gpio_out"),
418 SUNXI_FUNCTION(0x2, "lcd0"), /* D12 */
419 SUNXI_FUNCTION(0x3, "lvds1")), /* VP1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100420 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD13,
421 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100422 SUNXI_FUNCTION(0x1, "gpio_out"),
423 SUNXI_FUNCTION(0x2, "lcd0"), /* D13 */
424 SUNXI_FUNCTION(0x3, "lvds1")), /* VN1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100425 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD14,
426 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100427 SUNXI_FUNCTION(0x1, "gpio_out"),
428 SUNXI_FUNCTION(0x2, "lcd0"), /* D14 */
429 SUNXI_FUNCTION(0x3, "lvds1")), /* VP2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100430 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD15,
431 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100432 SUNXI_FUNCTION(0x1, "gpio_out"),
433 SUNXI_FUNCTION(0x2, "lcd0"), /* D15 */
434 SUNXI_FUNCTION(0x3, "lvds1")), /* VN2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100435 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD16,
436 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100437 SUNXI_FUNCTION(0x1, "gpio_out"),
438 SUNXI_FUNCTION(0x2, "lcd0"), /* D16 */
439 SUNXI_FUNCTION(0x3, "lvds1")), /* VPC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100440 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD17,
441 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100442 SUNXI_FUNCTION(0x1, "gpio_out"),
443 SUNXI_FUNCTION(0x2, "lcd0"), /* D17 */
444 SUNXI_FUNCTION(0x3, "lvds1")), /* VNC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100445 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD18,
446 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100447 SUNXI_FUNCTION(0x1, "gpio_out"),
448 SUNXI_FUNCTION(0x2, "lcd0"), /* D18 */
449 SUNXI_FUNCTION(0x3, "lvds1")), /* VP3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100450 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD19,
451 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100452 SUNXI_FUNCTION(0x1, "gpio_out"),
453 SUNXI_FUNCTION(0x2, "lcd0"), /* D19 */
454 SUNXI_FUNCTION(0x3, "lvds1")), /* VN3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100455 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD20,
456 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100457 SUNXI_FUNCTION(0x1, "gpio_out"),
458 SUNXI_FUNCTION(0x2, "lcd0"), /* D20 */
459 SUNXI_FUNCTION(0x3, "csi1")), /* MCLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100460 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD21,
461 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100462 SUNXI_FUNCTION(0x1, "gpio_out"),
463 SUNXI_FUNCTION(0x2, "lcd0"), /* D21 */
464 SUNXI_FUNCTION(0x3, "sim")), /* VPPEN */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100465 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD22,
466 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100467 SUNXI_FUNCTION(0x1, "gpio_out"),
468 SUNXI_FUNCTION(0x2, "lcd0"), /* D22 */
469 SUNXI_FUNCTION(0x3, "sim")), /* VPPPP */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100470 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD23,
471 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100472 SUNXI_FUNCTION(0x1, "gpio_out"),
473 SUNXI_FUNCTION(0x2, "lcd0"), /* D23 */
474 SUNXI_FUNCTION(0x3, "sim")), /* DET */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100475 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD24,
476 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100477 SUNXI_FUNCTION(0x1, "gpio_out"),
478 SUNXI_FUNCTION(0x2, "lcd0"), /* CLK */
479 SUNXI_FUNCTION(0x3, "sim")), /* VCCEN */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100480 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD25,
481 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100482 SUNXI_FUNCTION(0x1, "gpio_out"),
483 SUNXI_FUNCTION(0x2, "lcd0"), /* DE */
484 SUNXI_FUNCTION(0x3, "sim")), /* RST */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100485 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD26,
486 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100487 SUNXI_FUNCTION(0x1, "gpio_out"),
488 SUNXI_FUNCTION(0x2, "lcd0"), /* HSYNC */
489 SUNXI_FUNCTION(0x3, "sim")), /* SCK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100490 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD27,
491 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100492 SUNXI_FUNCTION(0x1, "gpio_out"),
493 SUNXI_FUNCTION(0x2, "lcd0"), /* VSYNC */
494 SUNXI_FUNCTION(0x3, "sim")), /* SDA */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100495 /* Hole */
496 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE0,
497 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100498 SUNXI_FUNCTION(0x1, "gpio_out"),
499 SUNXI_FUNCTION(0x2, "ts0"), /* CLK */
500 SUNXI_FUNCTION(0x3, "csi0")), /* PCK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100501 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1,
502 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100503 SUNXI_FUNCTION(0x1, "gpio_out"),
504 SUNXI_FUNCTION(0x2, "ts0"), /* ERR */
505 SUNXI_FUNCTION(0x3, "csi0")), /* CK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100506 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2,
507 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100508 SUNXI_FUNCTION(0x1, "gpio_out"),
509 SUNXI_FUNCTION(0x2, "ts0"), /* SYNC */
510 SUNXI_FUNCTION(0x3, "csi0")), /* HSYNC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100511 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE3,
512 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100513 SUNXI_FUNCTION(0x1, "gpio_out"),
514 SUNXI_FUNCTION(0x2, "ts0"), /* DVLD */
515 SUNXI_FUNCTION(0x3, "csi0")), /* VSYNC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100516 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE4,
517 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100518 SUNXI_FUNCTION(0x1, "gpio_out"),
519 SUNXI_FUNCTION(0x2, "ts0"), /* D0 */
520 SUNXI_FUNCTION(0x3, "csi0")), /* D0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100521 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE5,
522 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100523 SUNXI_FUNCTION(0x1, "gpio_out"),
524 SUNXI_FUNCTION(0x2, "ts0"), /* D1 */
525 SUNXI_FUNCTION(0x3, "csi0"), /* D1 */
526 SUNXI_FUNCTION(0x4, "sim")), /* VPPEN */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100527 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE6,
528 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100529 SUNXI_FUNCTION(0x1, "gpio_out"),
530 SUNXI_FUNCTION(0x2, "ts0"), /* D2 */
531 SUNXI_FUNCTION(0x3, "csi0")), /* D2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100532 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE7,
533 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100534 SUNXI_FUNCTION(0x1, "gpio_out"),
535 SUNXI_FUNCTION(0x2, "ts0"), /* D3 */
536 SUNXI_FUNCTION(0x3, "csi0")), /* D3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100537 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE8,
538 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100539 SUNXI_FUNCTION(0x1, "gpio_out"),
540 SUNXI_FUNCTION(0x2, "ts0"), /* D4 */
541 SUNXI_FUNCTION(0x3, "csi0")), /* D4 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100542 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE9,
543 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100544 SUNXI_FUNCTION(0x1, "gpio_out"),
545 SUNXI_FUNCTION(0x2, "ts0"), /* D5 */
546 SUNXI_FUNCTION(0x3, "csi0")), /* D5 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100547 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE10,
548 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100549 SUNXI_FUNCTION(0x1, "gpio_out"),
550 SUNXI_FUNCTION(0x2, "ts0"), /* D6 */
551 SUNXI_FUNCTION(0x3, "csi0")), /* D6 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100552 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE11,
553 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100554 SUNXI_FUNCTION(0x1, "gpio_out"),
555 SUNXI_FUNCTION(0x2, "ts0"), /* D7 */
556 SUNXI_FUNCTION(0x3, "csi0")), /* D7 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100557 /* Hole */
558 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF0,
559 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100560 SUNXI_FUNCTION(0x1, "gpio_out"),
561 SUNXI_FUNCTION(0x2, "mmc0"), /* D1 */
562 SUNXI_FUNCTION(0x4, "jtag")), /* MSI */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100563 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF1,
564 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100565 SUNXI_FUNCTION(0x1, "gpio_out"),
566 SUNXI_FUNCTION(0x2, "mmc0"), /* D0 */
567 SUNXI_FUNCTION(0x4, "jtag")), /* DI1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100568 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF2,
569 SUNXI_FUNCTION(0x0, "gpio_in"),
570 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100571 SUNXI_FUNCTION(0x2, "mmc0"), /* CLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100572 SUNXI_FUNCTION(0x4, "uart0")), /* TX */
573 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF3,
574 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100575 SUNXI_FUNCTION(0x1, "gpio_out"),
576 SUNXI_FUNCTION(0x2, "mmc0"), /* CMD */
577 SUNXI_FUNCTION(0x4, "jtag")), /* DO1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100578 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF4,
579 SUNXI_FUNCTION(0x0, "gpio_in"),
580 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100581 SUNXI_FUNCTION(0x2, "mmc0"), /* D3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100582 SUNXI_FUNCTION(0x4, "uart0")), /* RX */
583 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF5,
584 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100585 SUNXI_FUNCTION(0x1, "gpio_out"),
586 SUNXI_FUNCTION(0x2, "mmc0"), /* D2 */
587 SUNXI_FUNCTION(0x4, "jtag")), /* CK1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100588 /* Hole */
589 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0,
590 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100591 SUNXI_FUNCTION(0x1, "gpio_out"),
592 SUNXI_FUNCTION(0x2, "ts1"), /* CLK */
593 SUNXI_FUNCTION(0x3, "csi1"), /* PCK */
594 SUNXI_FUNCTION(0x4, "mmc1")), /* CMD */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100595 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG1,
596 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100597 SUNXI_FUNCTION(0x1, "gpio_out"),
598 SUNXI_FUNCTION(0x2, "ts1"), /* ERR */
599 SUNXI_FUNCTION(0x3, "csi1"), /* CK */
600 SUNXI_FUNCTION(0x4, "mmc1")), /* CLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100601 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG2,
602 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100603 SUNXI_FUNCTION(0x1, "gpio_out"),
604 SUNXI_FUNCTION(0x2, "ts1"), /* SYNC */
605 SUNXI_FUNCTION(0x3, "csi1"), /* HSYNC */
606 SUNXI_FUNCTION(0x4, "mmc1")), /* D0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100607 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG3,
608 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100609 SUNXI_FUNCTION(0x1, "gpio_out"),
610 SUNXI_FUNCTION(0x2, "ts1"), /* DVLD */
611 SUNXI_FUNCTION(0x3, "csi1"), /* VSYNC */
612 SUNXI_FUNCTION(0x4, "mmc1")), /* D1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100613 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG4,
614 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100615 SUNXI_FUNCTION(0x1, "gpio_out"),
616 SUNXI_FUNCTION(0x2, "ts1"), /* D0 */
617 SUNXI_FUNCTION(0x3, "csi1"), /* D0 */
618 SUNXI_FUNCTION(0x4, "mmc1"), /* D2 */
619 SUNXI_FUNCTION(0x5, "csi0")), /* D8 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100620 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG5,
621 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100622 SUNXI_FUNCTION(0x1, "gpio_out"),
623 SUNXI_FUNCTION(0x2, "ts1"), /* D1 */
624 SUNXI_FUNCTION(0x3, "csi1"), /* D1 */
625 SUNXI_FUNCTION(0x4, "mmc1"), /* D3 */
626 SUNXI_FUNCTION(0x5, "csi0")), /* D9 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100627 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG6,
628 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100629 SUNXI_FUNCTION(0x1, "gpio_out"),
630 SUNXI_FUNCTION(0x2, "ts1"), /* D2 */
631 SUNXI_FUNCTION(0x3, "csi1"), /* D2 */
632 SUNXI_FUNCTION(0x4, "uart3"), /* TX */
633 SUNXI_FUNCTION(0x5, "csi0")), /* D10 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100634 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG7,
635 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100636 SUNXI_FUNCTION(0x1, "gpio_out"),
637 SUNXI_FUNCTION(0x2, "ts1"), /* D3 */
638 SUNXI_FUNCTION(0x3, "csi1"), /* D3 */
639 SUNXI_FUNCTION(0x4, "uart3"), /* RX */
640 SUNXI_FUNCTION(0x5, "csi0")), /* D11 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100641 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG8,
642 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100643 SUNXI_FUNCTION(0x1, "gpio_out"),
644 SUNXI_FUNCTION(0x2, "ts1"), /* D4 */
645 SUNXI_FUNCTION(0x3, "csi1"), /* D4 */
646 SUNXI_FUNCTION(0x4, "uart3"), /* RTS */
647 SUNXI_FUNCTION(0x5, "csi0")), /* D12 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100648 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9,
649 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100650 SUNXI_FUNCTION(0x1, "gpio_out"),
651 SUNXI_FUNCTION(0x2, "ts1"), /* D5 */
652 SUNXI_FUNCTION(0x3, "csi1"), /* D5 */
653 SUNXI_FUNCTION(0x4, "uart3"), /* CTS */
654 SUNXI_FUNCTION(0x5, "csi0")), /* D13 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100655 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10,
656 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100657 SUNXI_FUNCTION(0x1, "gpio_out"),
658 SUNXI_FUNCTION(0x2, "ts1"), /* D6 */
659 SUNXI_FUNCTION(0x3, "csi1"), /* D6 */
660 SUNXI_FUNCTION(0x4, "uart4"), /* TX */
661 SUNXI_FUNCTION(0x5, "csi0")), /* D14 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100662 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11,
663 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100664 SUNXI_FUNCTION(0x1, "gpio_out"),
665 SUNXI_FUNCTION(0x2, "ts1"), /* D7 */
666 SUNXI_FUNCTION(0x3, "csi1"), /* D7 */
667 SUNXI_FUNCTION(0x4, "uart4"), /* RX */
668 SUNXI_FUNCTION(0x5, "csi0")), /* D15 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100669 /* Hole */
670 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH0,
671 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100672 SUNXI_FUNCTION(0x1, "gpio_out"),
673 SUNXI_FUNCTION(0x2, "lcd1"), /* D0 */
674 SUNXI_FUNCTION(0x3, "pata"), /* ATAA0 */
675 SUNXI_FUNCTION(0x4, "uart3"), /* TX */
676 SUNXI_FUNCTION(0x7, "csi1")), /* D0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100677 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH1,
678 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100679 SUNXI_FUNCTION(0x1, "gpio_out"),
680 SUNXI_FUNCTION(0x2, "lcd1"), /* D1 */
681 SUNXI_FUNCTION(0x3, "pata"), /* ATAA1 */
682 SUNXI_FUNCTION(0x4, "uart3"), /* RX */
683 SUNXI_FUNCTION(0x7, "csi1")), /* D1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100684 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH2,
685 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100686 SUNXI_FUNCTION(0x1, "gpio_out"),
687 SUNXI_FUNCTION(0x2, "lcd1"), /* D2 */
688 SUNXI_FUNCTION(0x3, "pata"), /* ATAA2 */
689 SUNXI_FUNCTION(0x4, "uart3"), /* RTS */
690 SUNXI_FUNCTION(0x7, "csi1")), /* D2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100691 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH3,
692 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100693 SUNXI_FUNCTION(0x1, "gpio_out"),
694 SUNXI_FUNCTION(0x2, "lcd1"), /* D3 */
695 SUNXI_FUNCTION(0x3, "pata"), /* ATAIRQ */
696 SUNXI_FUNCTION(0x4, "uart3"), /* CTS */
697 SUNXI_FUNCTION(0x7, "csi1")), /* D3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100698 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH4,
699 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100700 SUNXI_FUNCTION(0x1, "gpio_out"),
701 SUNXI_FUNCTION(0x2, "lcd1"), /* D4 */
702 SUNXI_FUNCTION(0x3, "pata"), /* ATAD0 */
703 SUNXI_FUNCTION(0x4, "uart4"), /* TX */
704 SUNXI_FUNCTION(0x7, "csi1")), /* D4 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100705 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH5,
706 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100707 SUNXI_FUNCTION(0x1, "gpio_out"),
708 SUNXI_FUNCTION(0x2, "lcd1"), /* D5 */
709 SUNXI_FUNCTION(0x3, "pata"), /* ATAD1 */
710 SUNXI_FUNCTION(0x4, "uart4"), /* RX */
711 SUNXI_FUNCTION(0x7, "csi1")), /* D5 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100712 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH6,
713 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100714 SUNXI_FUNCTION(0x1, "gpio_out"),
715 SUNXI_FUNCTION(0x2, "lcd1"), /* D6 */
716 SUNXI_FUNCTION(0x3, "pata"), /* ATAD2 */
717 SUNXI_FUNCTION(0x4, "uart5"), /* TX */
718 SUNXI_FUNCTION(0x5, "ms"), /* BS */
719 SUNXI_FUNCTION(0x7, "csi1")), /* D6 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100720 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH7,
721 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100722 SUNXI_FUNCTION(0x1, "gpio_out"),
723 SUNXI_FUNCTION(0x2, "lcd1"), /* D7 */
724 SUNXI_FUNCTION(0x3, "pata"), /* ATAD3 */
725 SUNXI_FUNCTION(0x4, "uart5"), /* RX */
726 SUNXI_FUNCTION(0x5, "ms"), /* CLK */
727 SUNXI_FUNCTION(0x7, "csi1")), /* D7 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100728 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH8,
729 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100730 SUNXI_FUNCTION(0x1, "gpio_out"),
731 SUNXI_FUNCTION(0x2, "lcd1"), /* D8 */
732 SUNXI_FUNCTION(0x3, "pata"), /* ATAD4 */
733 SUNXI_FUNCTION(0x4, "keypad"), /* IN0 */
734 SUNXI_FUNCTION(0x5, "ms"), /* D0 */
735 SUNXI_FUNCTION(0x7, "csi1")), /* D8 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100736 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH9,
737 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100738 SUNXI_FUNCTION(0x1, "gpio_out"),
739 SUNXI_FUNCTION(0x2, "lcd1"), /* D9 */
740 SUNXI_FUNCTION(0x3, "pata"), /* ATAD5 */
741 SUNXI_FUNCTION(0x4, "keypad"), /* IN1 */
742 SUNXI_FUNCTION(0x5, "ms"), /* D1 */
743 SUNXI_FUNCTION(0x7, "csi1")), /* D9 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100744 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH10,
745 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100746 SUNXI_FUNCTION(0x1, "gpio_out"),
747 SUNXI_FUNCTION(0x2, "lcd1"), /* D10 */
748 SUNXI_FUNCTION(0x3, "pata"), /* ATAD6 */
749 SUNXI_FUNCTION(0x4, "keypad"), /* IN2 */
750 SUNXI_FUNCTION(0x5, "ms"), /* D2 */
751 SUNXI_FUNCTION(0x7, "csi1")), /* D10 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100752 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH11,
753 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100754 SUNXI_FUNCTION(0x1, "gpio_out"),
755 SUNXI_FUNCTION(0x2, "lcd1"), /* D11 */
756 SUNXI_FUNCTION(0x3, "pata"), /* ATAD7 */
757 SUNXI_FUNCTION(0x4, "keypad"), /* IN3 */
758 SUNXI_FUNCTION(0x5, "ms"), /* D3 */
759 SUNXI_FUNCTION(0x7, "csi1")), /* D11 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100760 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH12,
761 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100762 SUNXI_FUNCTION(0x1, "gpio_out"),
763 SUNXI_FUNCTION(0x2, "lcd1"), /* D12 */
764 SUNXI_FUNCTION(0x3, "pata"), /* ATAD8 */
765 SUNXI_FUNCTION(0x4, "ps2"), /* SCK1 */
766 SUNXI_FUNCTION(0x7, "csi1")), /* D12 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100767 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH13,
768 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100769 SUNXI_FUNCTION(0x1, "gpio_out"),
770 SUNXI_FUNCTION(0x2, "lcd1"), /* D13 */
771 SUNXI_FUNCTION(0x3, "pata"), /* ATAD9 */
772 SUNXI_FUNCTION(0x4, "ps2"), /* SDA1 */
773 SUNXI_FUNCTION(0x5, "sim"), /* RST */
774 SUNXI_FUNCTION(0x7, "csi1")), /* D13 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100775 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH14,
776 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100777 SUNXI_FUNCTION(0x1, "gpio_out"),
778 SUNXI_FUNCTION(0x2, "lcd1"), /* D14 */
779 SUNXI_FUNCTION(0x3, "pata"), /* ATAD10 */
780 SUNXI_FUNCTION(0x4, "keypad"), /* IN4 */
781 SUNXI_FUNCTION(0x5, "sim"), /* VPPEN */
782 SUNXI_FUNCTION(0x7, "csi1")), /* D14 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100783 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH15,
784 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100785 SUNXI_FUNCTION(0x1, "gpio_out"),
786 SUNXI_FUNCTION(0x2, "lcd1"), /* D15 */
787 SUNXI_FUNCTION(0x3, "pata"), /* ATAD11 */
788 SUNXI_FUNCTION(0x4, "keypad"), /* IN5 */
789 SUNXI_FUNCTION(0x5, "sim"), /* VPPPP */
790 SUNXI_FUNCTION(0x7, "csi1")), /* D15 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100791 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH16,
792 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100793 SUNXI_FUNCTION(0x1, "gpio_out"),
794 SUNXI_FUNCTION(0x2, "lcd1"), /* D16 */
795 SUNXI_FUNCTION(0x3, "pata"), /* ATAD12 */
796 SUNXI_FUNCTION(0x4, "keypad"), /* IN6 */
797 SUNXI_FUNCTION(0x7, "csi1")), /* D16 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100798 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH17,
799 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100800 SUNXI_FUNCTION(0x1, "gpio_out"),
801 SUNXI_FUNCTION(0x2, "lcd1"), /* D17 */
802 SUNXI_FUNCTION(0x3, "pata"), /* ATAD13 */
803 SUNXI_FUNCTION(0x4, "keypad"), /* IN7 */
804 SUNXI_FUNCTION(0x5, "sim"), /* VCCEN */
805 SUNXI_FUNCTION(0x7, "csi1")), /* D17 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100806 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH18,
807 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100808 SUNXI_FUNCTION(0x1, "gpio_out"),
809 SUNXI_FUNCTION(0x2, "lcd1"), /* D18 */
810 SUNXI_FUNCTION(0x3, "pata"), /* ATAD14 */
811 SUNXI_FUNCTION(0x4, "keypad"), /* OUT0 */
812 SUNXI_FUNCTION(0x5, "sim"), /* SCK */
813 SUNXI_FUNCTION(0x7, "csi1")), /* D18 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100814 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH19,
815 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100816 SUNXI_FUNCTION(0x1, "gpio_out"),
817 SUNXI_FUNCTION(0x2, "lcd1"), /* D19 */
818 SUNXI_FUNCTION(0x3, "pata"), /* ATAD15 */
819 SUNXI_FUNCTION(0x4, "keypad"), /* OUT1 */
820 SUNXI_FUNCTION(0x5, "sim"), /* SDA */
821 SUNXI_FUNCTION(0x7, "csi1")), /* D19 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100822 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH20,
823 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100824 SUNXI_FUNCTION(0x1, "gpio_out"),
825 SUNXI_FUNCTION(0x2, "lcd1"), /* D20 */
826 SUNXI_FUNCTION(0x3, "pata"), /* ATAOE */
827 SUNXI_FUNCTION(0x4, "can"), /* TX */
828 SUNXI_FUNCTION(0x7, "csi1")), /* D20 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100829 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH21,
830 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100831 SUNXI_FUNCTION(0x1, "gpio_out"),
832 SUNXI_FUNCTION(0x2, "lcd1"), /* D21 */
833 SUNXI_FUNCTION(0x3, "pata"), /* ATADREQ */
834 SUNXI_FUNCTION(0x4, "can"), /* RX */
835 SUNXI_FUNCTION(0x7, "csi1")), /* D21 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100836 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH22,
837 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100838 SUNXI_FUNCTION(0x1, "gpio_out"),
839 SUNXI_FUNCTION(0x2, "lcd1"), /* D22 */
840 SUNXI_FUNCTION(0x3, "pata"), /* ATADACK */
841 SUNXI_FUNCTION(0x4, "keypad"), /* OUT2 */
842 SUNXI_FUNCTION(0x5, "mmc1"), /* CMD */
843 SUNXI_FUNCTION(0x7, "csi1")), /* D22 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100844 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH23,
845 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100846 SUNXI_FUNCTION(0x1, "gpio_out"),
847 SUNXI_FUNCTION(0x2, "lcd1"), /* D23 */
848 SUNXI_FUNCTION(0x3, "pata"), /* ATACS0 */
849 SUNXI_FUNCTION(0x4, "keypad"), /* OUT3 */
850 SUNXI_FUNCTION(0x5, "mmc1"), /* CLK */
851 SUNXI_FUNCTION(0x7, "csi1")), /* D23 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100852 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH24,
853 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100854 SUNXI_FUNCTION(0x1, "gpio_out"),
855 SUNXI_FUNCTION(0x2, "lcd1"), /* CLK */
856 SUNXI_FUNCTION(0x3, "pata"), /* ATACS1 */
857 SUNXI_FUNCTION(0x4, "keypad"), /* OUT4 */
858 SUNXI_FUNCTION(0x5, "mmc1"), /* D0 */
859 SUNXI_FUNCTION(0x7, "csi1")), /* PCLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100860 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH25,
861 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100862 SUNXI_FUNCTION(0x1, "gpio_out"),
863 SUNXI_FUNCTION(0x2, "lcd1"), /* DE */
864 SUNXI_FUNCTION(0x3, "pata"), /* ATAIORDY */
865 SUNXI_FUNCTION(0x4, "keypad"), /* OUT5 */
866 SUNXI_FUNCTION(0x5, "mmc1"), /* D1 */
867 SUNXI_FUNCTION(0x7, "csi1")), /* FIELD */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100868 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH26,
869 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100870 SUNXI_FUNCTION(0x1, "gpio_out"),
871 SUNXI_FUNCTION(0x2, "lcd1"), /* HSYNC */
872 SUNXI_FUNCTION(0x3, "pata"), /* ATAIOR */
873 SUNXI_FUNCTION(0x4, "keypad"), /* OUT6 */
874 SUNXI_FUNCTION(0x5, "mmc1"), /* D2 */
875 SUNXI_FUNCTION(0x7, "csi1")), /* HSYNC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100876 SUNXI_PIN(SUNXI_PINCTRL_PIN_PH27,
877 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100878 SUNXI_FUNCTION(0x1, "gpio_out"),
879 SUNXI_FUNCTION(0x2, "lcd1"), /* VSYNC */
880 SUNXI_FUNCTION(0x3, "pata"), /* ATAIOW */
881 SUNXI_FUNCTION(0x4, "keypad"), /* OUT7 */
882 SUNXI_FUNCTION(0x5, "mmc1"), /* D3 */
883 SUNXI_FUNCTION(0x7, "csi1")), /* VSYNC */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100884 /* Hole */
885 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI0,
886 SUNXI_FUNCTION(0x0, "gpio_in"),
887 SUNXI_FUNCTION(0x1, "gpio_out")),
888 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI1,
889 SUNXI_FUNCTION(0x0, "gpio_in"),
890 SUNXI_FUNCTION(0x1, "gpio_out")),
891 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI2,
892 SUNXI_FUNCTION(0x0, "gpio_in"),
893 SUNXI_FUNCTION(0x1, "gpio_out")),
894 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI3,
895 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100896 SUNXI_FUNCTION(0x1, "gpio_out"),
897 SUNXI_FUNCTION(0x2, "pwm")), /* PWM1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100898 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI4,
899 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100900 SUNXI_FUNCTION(0x1, "gpio_out"),
901 SUNXI_FUNCTION(0x2, "mmc3")), /* CMD */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100902 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI5,
903 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100904 SUNXI_FUNCTION(0x1, "gpio_out"),
905 SUNXI_FUNCTION(0x2, "mmc3")), /* CLK */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100906 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI6,
907 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100908 SUNXI_FUNCTION(0x1, "gpio_out"),
909 SUNXI_FUNCTION(0x2, "mmc3")), /* D0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100910 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI7,
911 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100912 SUNXI_FUNCTION(0x1, "gpio_out"),
913 SUNXI_FUNCTION(0x2, "mmc3")), /* D1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100914 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI8,
915 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100916 SUNXI_FUNCTION(0x1, "gpio_out"),
917 SUNXI_FUNCTION(0x2, "mmc3")), /* D2 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100918 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI9,
919 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100920 SUNXI_FUNCTION(0x1, "gpio_out"),
921 SUNXI_FUNCTION(0x2, "mmc3")), /* D3 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100922 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI10,
923 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100924 SUNXI_FUNCTION(0x1, "gpio_out"),
925 SUNXI_FUNCTION(0x2, "spi0"), /* CS0 */
926 SUNXI_FUNCTION(0x3, "uart5")), /* TX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100927 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI11,
928 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100929 SUNXI_FUNCTION(0x1, "gpio_out"),
930 SUNXI_FUNCTION(0x2, "spi0"), /* CLK */
931 SUNXI_FUNCTION(0x3, "uart5")), /* RX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100932 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI12,
933 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100934 SUNXI_FUNCTION(0x1, "gpio_out"),
935 SUNXI_FUNCTION(0x2, "spi0"), /* MOSI */
936 SUNXI_FUNCTION(0x3, "uart6")), /* TX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100937 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI13,
938 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100939 SUNXI_FUNCTION(0x1, "gpio_out"),
940 SUNXI_FUNCTION(0x2, "spi0"), /* MISO */
941 SUNXI_FUNCTION(0x3, "uart6")), /* RX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100942 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI14,
943 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100944 SUNXI_FUNCTION(0x1, "gpio_out"),
945 SUNXI_FUNCTION(0x2, "spi0"), /* CS1 */
946 SUNXI_FUNCTION(0x3, "ps2"), /* SCK1 */
947 SUNXI_FUNCTION(0x4, "timer4")), /* TCLKIN0 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100948 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI15,
949 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100950 SUNXI_FUNCTION(0x1, "gpio_out"),
951 SUNXI_FUNCTION(0x2, "spi1"), /* CS1 */
952 SUNXI_FUNCTION(0x3, "ps2"), /* SDA1 */
953 SUNXI_FUNCTION(0x4, "timer5")), /* TCLKIN1 */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100954 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI16,
955 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100956 SUNXI_FUNCTION(0x1, "gpio_out"),
957 SUNXI_FUNCTION(0x2, "spi1"), /* CS0 */
958 SUNXI_FUNCTION(0x3, "uart2")), /* RTS */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100959 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI17,
960 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100961 SUNXI_FUNCTION(0x1, "gpio_out"),
962 SUNXI_FUNCTION(0x2, "spi1"), /* CLK */
963 SUNXI_FUNCTION(0x3, "uart2")), /* CTS */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100964 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI18,
965 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100966 SUNXI_FUNCTION(0x1, "gpio_out"),
967 SUNXI_FUNCTION(0x2, "spi1"), /* MOSI */
968 SUNXI_FUNCTION(0x3, "uart2")), /* TX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100969 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI19,
970 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100971 SUNXI_FUNCTION(0x1, "gpio_out"),
972 SUNXI_FUNCTION(0x2, "spi1"), /* MISO */
973 SUNXI_FUNCTION(0x3, "uart2")), /* RX */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100974 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI20,
975 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100976 SUNXI_FUNCTION(0x1, "gpio_out"),
977 SUNXI_FUNCTION(0x2, "ps2"), /* SCK0 */
978 SUNXI_FUNCTION(0x3, "uart7"), /* TX */
979 SUNXI_FUNCTION(0x4, "hdmi")), /* HSCL */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100980 SUNXI_PIN(SUNXI_PINCTRL_PIN_PI21,
981 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardb5f50bf2013-03-06 16:12:44 +0100982 SUNXI_FUNCTION(0x1, "gpio_out"),
983 SUNXI_FUNCTION(0x2, "ps2"), /* SDA0 */
984 SUNXI_FUNCTION(0x3, "uart7"), /* RX */
985 SUNXI_FUNCTION(0x4, "hdmi")), /* HSDA */
Maxime Ripard9f5b6b32013-01-26 15:36:53 +0100986};
987
Maxime Ripardeaa3d842013-01-18 22:30:35 +0100988static const struct sunxi_desc_pin sun5i_a13_pins[] = {
989 /* Hole */
990 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0,
991 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +0100992 SUNXI_FUNCTION(0x1, "gpio_out"),
993 SUNXI_FUNCTION(0x2, "i2c0")), /* SCK */
Maxime Ripardeaa3d842013-01-18 22:30:35 +0100994 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB1,
995 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +0100996 SUNXI_FUNCTION(0x1, "gpio_out"),
997 SUNXI_FUNCTION(0x2, "i2c0")), /* SDA */
Maxime Ripardeaa3d842013-01-18 22:30:35 +0100998 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB2,
999 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001000 SUNXI_FUNCTION(0x1, "gpio_out"),
1001 SUNXI_FUNCTION(0x2, "pwm")),
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001002 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3,
1003 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001004 SUNXI_FUNCTION(0x1, "gpio_out"),
1005 SUNXI_FUNCTION(0x2, "ir0")), /* TX */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001006 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB4,
1007 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001008 SUNXI_FUNCTION(0x1, "gpio_out"),
1009 SUNXI_FUNCTION(0x2, "ir0")), /* RX */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001010 /* Hole */
1011 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB10,
1012 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001013 SUNXI_FUNCTION(0x1, "gpio_out"),
1014 SUNXI_FUNCTION(0x2, "spi2")), /* CS1 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001015 /* Hole */
1016 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB15,
1017 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001018 SUNXI_FUNCTION(0x1, "gpio_out"),
1019 SUNXI_FUNCTION(0x2, "i2c1")), /* SCK */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001020 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB16,
1021 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001022 SUNXI_FUNCTION(0x1, "gpio_out"),
1023 SUNXI_FUNCTION(0x2, "i2c1")), /* SDA */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001024 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB17,
1025 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001026 SUNXI_FUNCTION(0x1, "gpio_out"),
1027 SUNXI_FUNCTION(0x2, "i2c2")), /* SCK */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001028 SUNXI_PIN(SUNXI_PINCTRL_PIN_PB18,
1029 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001030 SUNXI_FUNCTION(0x1, "gpio_out"),
1031 SUNXI_FUNCTION(0x2, "i2c2")), /* SDA */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001032 /* Hole */
1033 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC0,
1034 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001035 SUNXI_FUNCTION(0x1, "gpio_out"),
1036 SUNXI_FUNCTION(0x2, "nand0"), /* NWE */
1037 SUNXI_FUNCTION(0x3, "spi0")), /* MOSI */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001038 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC1,
1039 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001040 SUNXI_FUNCTION(0x1, "gpio_out"),
1041 SUNXI_FUNCTION(0x2, "nand0"), /* NALE */
1042 SUNXI_FUNCTION(0x3, "spi0")), /* MISO */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001043 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC2,
1044 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001045 SUNXI_FUNCTION(0x1, "gpio_out"),
1046 SUNXI_FUNCTION(0x2, "nand0"), /* NCLE */
1047 SUNXI_FUNCTION(0x3, "spi0")), /* CLK */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001048 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC3,
1049 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001050 SUNXI_FUNCTION(0x1, "gpio_out"),
1051 SUNXI_FUNCTION(0x2, "nand0"), /* NCE1 */
1052 SUNXI_FUNCTION(0x3, "spi0")), /* CS0 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001053 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC4,
1054 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001055 SUNXI_FUNCTION(0x1, "gpio_out"),
1056 SUNXI_FUNCTION(0x2, "nand0")), /* NCE0 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001057 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC5,
1058 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001059 SUNXI_FUNCTION(0x1, "gpio_out"),
1060 SUNXI_FUNCTION(0x2, "nand0")), /* NRE */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001061 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC6,
1062 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001063 SUNXI_FUNCTION(0x1, "gpio_out"),
1064 SUNXI_FUNCTION(0x2, "nand0"), /* NRB0 */
1065 SUNXI_FUNCTION(0x3, "mmc2")), /* CMD */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001066 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC7,
1067 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001068 SUNXI_FUNCTION(0x1, "gpio_out"),
1069 SUNXI_FUNCTION(0x2, "nand0"), /* NRB1 */
1070 SUNXI_FUNCTION(0x3, "mmc2")), /* CLK */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001071 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC8,
1072 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001073 SUNXI_FUNCTION(0x1, "gpio_out"),
1074 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ0 */
1075 SUNXI_FUNCTION(0x3, "mmc2")), /* D0 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001076 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC9,
1077 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001078 SUNXI_FUNCTION(0x1, "gpio_out"),
1079 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ1 */
1080 SUNXI_FUNCTION(0x3, "mmc2")), /* D1 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001081 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC10,
1082 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001083 SUNXI_FUNCTION(0x1, "gpio_out"),
1084 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ2 */
1085 SUNXI_FUNCTION(0x3, "mmc2")), /* D2 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001086 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC11,
1087 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001088 SUNXI_FUNCTION(0x1, "gpio_out"),
1089 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ3 */
1090 SUNXI_FUNCTION(0x3, "mmc2")), /* D3 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001091 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC12,
1092 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001093 SUNXI_FUNCTION(0x1, "gpio_out"),
1094 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ4 */
1095 SUNXI_FUNCTION(0x3, "mmc2")), /* D4 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001096 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC13,
1097 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001098 SUNXI_FUNCTION(0x1, "gpio_out"),
1099 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ5 */
1100 SUNXI_FUNCTION(0x3, "mmc2")), /* D5 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001101 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC14,
1102 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001103 SUNXI_FUNCTION(0x1, "gpio_out"),
1104 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ6 */
1105 SUNXI_FUNCTION(0x3, "mmc2")), /* D6 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001106 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC15,
1107 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001108 SUNXI_FUNCTION(0x1, "gpio_out"),
1109 SUNXI_FUNCTION(0x2, "nand0"), /* NDQ7 */
1110 SUNXI_FUNCTION(0x3, "mmc2")), /* D7 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001111 /* Hole */
1112 SUNXI_PIN(SUNXI_PINCTRL_PIN_PC19,
1113 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001114 SUNXI_FUNCTION(0x1, "gpio_out"),
1115 SUNXI_FUNCTION(0x2, "nand0"), /* NDQS */
1116 SUNXI_FUNCTION(0x4, "uart3")), /* RTS */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001117 /* Hole */
1118 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD2,
1119 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001120 SUNXI_FUNCTION(0x1, "gpio_out"),
1121 SUNXI_FUNCTION(0x2, "lcd0")), /* D2 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001122 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD3,
1123 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001124 SUNXI_FUNCTION(0x1, "gpio_out"),
1125 SUNXI_FUNCTION(0x2, "lcd0")), /* D3 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001126 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD4,
1127 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001128 SUNXI_FUNCTION(0x1, "gpio_out"),
1129 SUNXI_FUNCTION(0x2, "lcd0")), /* D4 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001130 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD5,
1131 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001132 SUNXI_FUNCTION(0x1, "gpio_out"),
1133 SUNXI_FUNCTION(0x2, "lcd0")), /* D5 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001134 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD6,
1135 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001136 SUNXI_FUNCTION(0x1, "gpio_out"),
1137 SUNXI_FUNCTION(0x2, "lcd0")), /* D6 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001138 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD7,
1139 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001140 SUNXI_FUNCTION(0x1, "gpio_out"),
1141 SUNXI_FUNCTION(0x2, "lcd0")), /* D7 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001142 /* Hole */
1143 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD10,
1144 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001145 SUNXI_FUNCTION(0x1, "gpio_out"),
1146 SUNXI_FUNCTION(0x2, "lcd0")), /* D10 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001147 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD11,
1148 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001149 SUNXI_FUNCTION(0x1, "gpio_out"),
1150 SUNXI_FUNCTION(0x2, "lcd0")), /* D11 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001151 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD12,
1152 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001153 SUNXI_FUNCTION(0x1, "gpio_out"),
1154 SUNXI_FUNCTION(0x2, "lcd0")), /* D12 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001155 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD13,
1156 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001157 SUNXI_FUNCTION(0x1, "gpio_out"),
1158 SUNXI_FUNCTION(0x2, "lcd0")), /* D13 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001159 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD14,
1160 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001161 SUNXI_FUNCTION(0x1, "gpio_out"),
1162 SUNXI_FUNCTION(0x2, "lcd0")), /* D14 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001163 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD15,
1164 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001165 SUNXI_FUNCTION(0x1, "gpio_out"),
1166 SUNXI_FUNCTION(0x2, "lcd0")), /* D15 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001167 /* Hole */
1168 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD18,
1169 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001170 SUNXI_FUNCTION(0x1, "gpio_out"),
1171 SUNXI_FUNCTION(0x2, "lcd0")), /* D18 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001172 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD19,
1173 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001174 SUNXI_FUNCTION(0x1, "gpio_out"),
1175 SUNXI_FUNCTION(0x2, "lcd0")), /* D19 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001176 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD20,
1177 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001178 SUNXI_FUNCTION(0x1, "gpio_out"),
1179 SUNXI_FUNCTION(0x2, "lcd0")), /* D20 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001180 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD21,
1181 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001182 SUNXI_FUNCTION(0x1, "gpio_out"),
1183 SUNXI_FUNCTION(0x2, "lcd0")), /* D21 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001184 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD22,
1185 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001186 SUNXI_FUNCTION(0x1, "gpio_out"),
1187 SUNXI_FUNCTION(0x2, "lcd0")), /* D22 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001188 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD23,
1189 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001190 SUNXI_FUNCTION(0x1, "gpio_out"),
1191 SUNXI_FUNCTION(0x2, "lcd0")), /* D23 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001192 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD24,
1193 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001194 SUNXI_FUNCTION(0x1, "gpio_out"),
1195 SUNXI_FUNCTION(0x2, "lcd0")), /* CLK */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001196 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD25,
1197 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001198 SUNXI_FUNCTION(0x1, "gpio_out"),
1199 SUNXI_FUNCTION(0x2, "lcd0")), /* DE */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001200 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD26,
1201 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001202 SUNXI_FUNCTION(0x1, "gpio_out"),
1203 SUNXI_FUNCTION(0x2, "lcd0")), /* HSYNC */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001204 SUNXI_PIN(SUNXI_PINCTRL_PIN_PD27,
1205 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001206 SUNXI_FUNCTION(0x1, "gpio_out"),
1207 SUNXI_FUNCTION(0x2, "lcd0")), /* VSYNC */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001208 /* Hole */
1209 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE0,
1210 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001211 SUNXI_FUNCTION(0x3, "csi0"), /* PCLK */
1212 SUNXI_FUNCTION(0x4, "spi2")), /* CS0 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001213 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1,
1214 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001215 SUNXI_FUNCTION(0x3, "csi0"), /* MCLK */
1216 SUNXI_FUNCTION(0x4, "spi2")), /* CLK */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001217 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2,
1218 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001219 SUNXI_FUNCTION(0x3, "csi0"), /* HSYNC */
1220 SUNXI_FUNCTION(0x4, "spi2")), /* MOSI */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001221 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE3,
1222 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001223 SUNXI_FUNCTION(0x1, "gpio_out"),
1224 SUNXI_FUNCTION(0x3, "csi0"), /* VSYNC */
1225 SUNXI_FUNCTION(0x4, "spi2")), /* MISO */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001226 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE4,
1227 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001228 SUNXI_FUNCTION(0x1, "gpio_out"),
1229 SUNXI_FUNCTION(0x3, "csi0"), /* D0 */
1230 SUNXI_FUNCTION(0x4, "mmc2")), /* D0 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001231 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE5,
1232 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001233 SUNXI_FUNCTION(0x1, "gpio_out"),
1234 SUNXI_FUNCTION(0x3, "csi0"), /* D1 */
1235 SUNXI_FUNCTION(0x4, "mmc2")), /* D1 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001236 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE6,
1237 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001238 SUNXI_FUNCTION(0x1, "gpio_out"),
1239 SUNXI_FUNCTION(0x3, "csi0"), /* D2 */
1240 SUNXI_FUNCTION(0x4, "mmc2")), /* D2 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001241 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE7,
1242 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001243 SUNXI_FUNCTION(0x1, "gpio_out"),
1244 SUNXI_FUNCTION(0x3, "csi0"), /* D3 */
1245 SUNXI_FUNCTION(0x4, "mmc2")), /* D3 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001246 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE8,
1247 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001248 SUNXI_FUNCTION(0x1, "gpio_out"),
1249 SUNXI_FUNCTION(0x3, "csi0"), /* D4 */
1250 SUNXI_FUNCTION(0x4, "mmc2")), /* CMD */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001251 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE9,
1252 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001253 SUNXI_FUNCTION(0x1, "gpio_out"),
1254 SUNXI_FUNCTION(0x3, "csi0"), /* D5 */
1255 SUNXI_FUNCTION(0x4, "mmc2")), /* CLK */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001256 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE10,
1257 SUNXI_FUNCTION(0x0, "gpio_in"),
1258 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001259 SUNXI_FUNCTION(0x3, "csi0"), /* D6 */
Maxime Ripardae1575f2013-01-26 15:36:52 +01001260 SUNXI_FUNCTION(0x4, "uart1")), /* TX */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001261 SUNXI_PIN(SUNXI_PINCTRL_PIN_PE11,
1262 SUNXI_FUNCTION(0x0, "gpio_in"),
1263 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001264 SUNXI_FUNCTION(0x3, "csi0"), /* D7 */
Maxime Ripardae1575f2013-01-26 15:36:52 +01001265 SUNXI_FUNCTION(0x4, "uart1")), /* RX */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001266 /* Hole */
1267 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF0,
1268 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001269 SUNXI_FUNCTION(0x1, "gpio_out"),
1270 SUNXI_FUNCTION(0x4, "mmc0")), /* D1 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001271 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF1,
1272 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001273 SUNXI_FUNCTION(0x1, "gpio_out"),
1274 SUNXI_FUNCTION(0x4, "mmc0")), /* D0 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001275 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF2,
1276 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001277 SUNXI_FUNCTION(0x1, "gpio_out"),
1278 SUNXI_FUNCTION(0x4, "mmc0")), /* CLK */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001279 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF3,
1280 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001281 SUNXI_FUNCTION(0x1, "gpio_out"),
1282 SUNXI_FUNCTION(0x4, "mmc0")), /* CMD */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001283 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF4,
1284 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001285 SUNXI_FUNCTION(0x1, "gpio_out"),
1286 SUNXI_FUNCTION(0x4, "mmc0")), /* D3 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001287 SUNXI_PIN(SUNXI_PINCTRL_PIN_PF5,
1288 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001289 SUNXI_FUNCTION(0x1, "gpio_out"),
1290 SUNXI_FUNCTION(0x4, "mmc0")), /* D2 */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001291 /* Hole */
1292 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0,
1293 SUNXI_FUNCTION(0x0, "gpio_in"),
1294 SUNXI_FUNCTION(0x1, "gpio_out")),
1295 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG1,
1296 SUNXI_FUNCTION(0x0, "gpio_in"),
1297 SUNXI_FUNCTION(0x1, "gpio_out")),
1298 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG2,
1299 SUNXI_FUNCTION(0x0, "gpio_in"),
1300 SUNXI_FUNCTION(0x1, "gpio_out")),
1301 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG3,
1302 SUNXI_FUNCTION(0x0, "gpio_in"),
1303 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001304 SUNXI_FUNCTION(0x2, "mmc1"), /* CMD */
Maxime Ripardae1575f2013-01-26 15:36:52 +01001305 SUNXI_FUNCTION(0x4, "uart1")), /* TX */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001306 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG4,
1307 SUNXI_FUNCTION(0x0, "gpio_in"),
1308 SUNXI_FUNCTION(0x1, "gpio_out"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001309 SUNXI_FUNCTION(0x2, "mmc1"), /* CLK */
Maxime Ripardae1575f2013-01-26 15:36:52 +01001310 SUNXI_FUNCTION(0x4, "uart1")), /* RX */
Maxime Ripardee341a92013-03-06 16:12:45 +01001311/* Hole */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001312 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9,
1313 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001314 SUNXI_FUNCTION(0x1, "gpio_out"),
1315 SUNXI_FUNCTION(0x2, "spi1"), /* CS0 */
1316 SUNXI_FUNCTION(0x3, "uart3")), /* TX */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001317 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10,
1318 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001319 SUNXI_FUNCTION(0x1, "gpio_out"),
1320 SUNXI_FUNCTION(0x2, "spi1"), /* CLK */
1321 SUNXI_FUNCTION(0x3, "uart3")), /* RX */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001322 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11,
1323 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001324 SUNXI_FUNCTION(0x1, "gpio_out"),
1325 SUNXI_FUNCTION(0x2, "spi1"), /* MOSI */
1326 SUNXI_FUNCTION(0x3, "uart3")), /* CTS */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001327 SUNXI_PIN(SUNXI_PINCTRL_PIN_PG12,
1328 SUNXI_FUNCTION(0x0, "gpio_in"),
Maxime Ripardee341a92013-03-06 16:12:45 +01001329 SUNXI_FUNCTION(0x1, "gpio_out"),
1330 SUNXI_FUNCTION(0x2, "spi1"), /* MISO */
1331 SUNXI_FUNCTION(0x3, "uart3")), /* RTS */
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001332};
1333
Maxime Ripard9f5b6b32013-01-26 15:36:53 +01001334static const struct sunxi_pinctrl_desc sun4i_a10_pinctrl_data = {
1335 .pins = sun4i_a10_pins,
1336 .npins = ARRAY_SIZE(sun4i_a10_pins),
1337};
1338
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001339static const struct sunxi_pinctrl_desc sun5i_a13_pinctrl_data = {
1340 .pins = sun5i_a13_pins,
1341 .npins = ARRAY_SIZE(sun5i_a13_pins),
1342};
1343
Maxime Ripard0e37f882013-01-18 22:30:34 +01001344static struct sunxi_pinctrl_group *
1345sunxi_pinctrl_find_group_by_name(struct sunxi_pinctrl *pctl, const char *group)
1346{
1347 int i;
1348
1349 for (i = 0; i < pctl->ngroups; i++) {
1350 struct sunxi_pinctrl_group *grp = pctl->groups + i;
1351
1352 if (!strcmp(grp->name, group))
1353 return grp;
1354 }
1355
1356 return NULL;
1357}
1358
1359static struct sunxi_pinctrl_function *
1360sunxi_pinctrl_find_function_by_name(struct sunxi_pinctrl *pctl,
1361 const char *name)
1362{
1363 struct sunxi_pinctrl_function *func = pctl->functions;
1364 int i;
1365
1366 for (i = 0; i < pctl->nfunctions; i++) {
1367 if (!func[i].name)
1368 break;
1369
1370 if (!strcmp(func[i].name, name))
1371 return func + i;
1372 }
1373
1374 return NULL;
1375}
1376
1377static struct sunxi_desc_function *
1378sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl,
1379 const char *pin_name,
1380 const char *func_name)
1381{
1382 int i;
1383
1384 for (i = 0; i < pctl->desc->npins; i++) {
1385 const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
1386
1387 if (!strcmp(pin->pin.name, pin_name)) {
1388 struct sunxi_desc_function *func = pin->functions;
1389
1390 while (func->name) {
1391 if (!strcmp(func->name, func_name))
1392 return func;
1393
1394 func++;
1395 }
1396 }
1397 }
1398
1399 return NULL;
1400}
1401
Maxime Ripard814d4f22013-06-08 12:05:43 +02001402static struct sunxi_desc_function *
1403sunxi_pinctrl_desc_find_function_by_pin(struct sunxi_pinctrl *pctl,
1404 const u16 pin_num,
1405 const char *func_name)
1406{
1407 int i;
1408
1409 for (i = 0; i < pctl->desc->npins; i++) {
1410 const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
1411
1412 if (pin->pin.number == pin_num) {
1413 struct sunxi_desc_function *func = pin->functions;
1414
1415 while (func->name) {
1416 if (!strcmp(func->name, func_name))
1417 return func;
1418
1419 func++;
1420 }
1421 }
1422 }
1423
1424 return NULL;
1425}
1426
Maxime Ripard0e37f882013-01-18 22:30:34 +01001427static int sunxi_pctrl_get_groups_count(struct pinctrl_dev *pctldev)
1428{
1429 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1430
1431 return pctl->ngroups;
1432}
1433
1434static const char *sunxi_pctrl_get_group_name(struct pinctrl_dev *pctldev,
1435 unsigned group)
1436{
1437 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1438
1439 return pctl->groups[group].name;
1440}
1441
1442static int sunxi_pctrl_get_group_pins(struct pinctrl_dev *pctldev,
1443 unsigned group,
1444 const unsigned **pins,
1445 unsigned *num_pins)
1446{
1447 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1448
1449 *pins = (unsigned *)&pctl->groups[group].pin;
1450 *num_pins = 1;
1451
1452 return 0;
1453}
1454
1455static int sunxi_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
1456 struct device_node *node,
1457 struct pinctrl_map **map,
1458 unsigned *num_maps)
1459{
1460 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1461 unsigned long *pinconfig;
1462 struct property *prop;
1463 const char *function;
1464 const char *group;
1465 int ret, nmaps, i = 0;
1466 u32 val;
1467
1468 *map = NULL;
1469 *num_maps = 0;
1470
1471 ret = of_property_read_string(node, "allwinner,function", &function);
1472 if (ret) {
1473 dev_err(pctl->dev,
1474 "missing allwinner,function property in node %s\n",
1475 node->name);
1476 return -EINVAL;
1477 }
1478
1479 nmaps = of_property_count_strings(node, "allwinner,pins") * 2;
1480 if (nmaps < 0) {
1481 dev_err(pctl->dev,
1482 "missing allwinner,pins property in node %s\n",
1483 node->name);
1484 return -EINVAL;
1485 }
1486
1487 *map = kmalloc(nmaps * sizeof(struct pinctrl_map), GFP_KERNEL);
1488 if (!map)
1489 return -ENOMEM;
1490
1491 of_property_for_each_string(node, "allwinner,pins", prop, group) {
1492 struct sunxi_pinctrl_group *grp =
1493 sunxi_pinctrl_find_group_by_name(pctl, group);
1494 int j = 0, configlen = 0;
1495
1496 if (!grp) {
1497 dev_err(pctl->dev, "unknown pin %s", group);
1498 continue;
1499 }
1500
1501 if (!sunxi_pinctrl_desc_find_function_by_name(pctl,
1502 grp->name,
1503 function)) {
1504 dev_err(pctl->dev, "unsupported function %s on pin %s",
1505 function, group);
1506 continue;
1507 }
1508
1509 (*map)[i].type = PIN_MAP_TYPE_MUX_GROUP;
1510 (*map)[i].data.mux.group = group;
1511 (*map)[i].data.mux.function = function;
1512
1513 i++;
1514
1515 (*map)[i].type = PIN_MAP_TYPE_CONFIGS_GROUP;
1516 (*map)[i].data.configs.group_or_pin = group;
1517
1518 if (of_find_property(node, "allwinner,drive", NULL))
1519 configlen++;
1520 if (of_find_property(node, "allwinner,pull", NULL))
1521 configlen++;
1522
1523 pinconfig = kzalloc(configlen * sizeof(*pinconfig), GFP_KERNEL);
1524
1525 if (!of_property_read_u32(node, "allwinner,drive", &val)) {
1526 u16 strength = (val + 1) * 10;
1527 pinconfig[j++] =
1528 pinconf_to_config_packed(PIN_CONFIG_DRIVE_STRENGTH,
1529 strength);
1530 }
1531
1532 if (!of_property_read_u32(node, "allwinner,pull", &val)) {
1533 enum pin_config_param pull = PIN_CONFIG_END;
1534 if (val == 1)
1535 pull = PIN_CONFIG_BIAS_PULL_UP;
1536 else if (val == 2)
1537 pull = PIN_CONFIG_BIAS_PULL_DOWN;
1538 pinconfig[j++] = pinconf_to_config_packed(pull, 0);
1539 }
1540
1541 (*map)[i].data.configs.configs = pinconfig;
1542 (*map)[i].data.configs.num_configs = configlen;
1543
1544 i++;
1545 }
1546
1547 *num_maps = nmaps;
1548
1549 return 0;
1550}
1551
1552static void sunxi_pctrl_dt_free_map(struct pinctrl_dev *pctldev,
1553 struct pinctrl_map *map,
1554 unsigned num_maps)
1555{
1556 int i;
1557
1558 for (i = 0; i < num_maps; i++) {
1559 if (map[i].type == PIN_MAP_TYPE_CONFIGS_GROUP)
1560 kfree(map[i].data.configs.configs);
1561 }
1562
1563 kfree(map);
1564}
1565
Laurent Pinchart022ab142013-02-16 10:25:07 +01001566static const struct pinctrl_ops sunxi_pctrl_ops = {
Maxime Ripard0e37f882013-01-18 22:30:34 +01001567 .dt_node_to_map = sunxi_pctrl_dt_node_to_map,
1568 .dt_free_map = sunxi_pctrl_dt_free_map,
1569 .get_groups_count = sunxi_pctrl_get_groups_count,
1570 .get_group_name = sunxi_pctrl_get_group_name,
1571 .get_group_pins = sunxi_pctrl_get_group_pins,
1572};
1573
1574static int sunxi_pconf_group_get(struct pinctrl_dev *pctldev,
1575 unsigned group,
1576 unsigned long *config)
1577{
1578 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1579
1580 *config = pctl->groups[group].config;
1581
1582 return 0;
1583}
1584
1585static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev,
1586 unsigned group,
1587 unsigned long config)
1588{
1589 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1590 struct sunxi_pinctrl_group *g = &pctl->groups[group];
1591 u32 val, mask;
1592 u16 strength;
1593 u8 dlevel;
1594
1595 switch (pinconf_to_config_param(config)) {
1596 case PIN_CONFIG_DRIVE_STRENGTH:
1597 strength = pinconf_to_config_argument(config);
1598 if (strength > 40)
1599 return -EINVAL;
1600 /*
1601 * We convert from mA to what the register expects:
1602 * 0: 10mA
1603 * 1: 20mA
1604 * 2: 30mA
1605 * 3: 40mA
1606 */
1607 dlevel = strength / 10 - 1;
1608 val = readl(pctl->membase + sunxi_dlevel_reg(g->pin));
1609 mask = DLEVEL_PINS_MASK << sunxi_dlevel_offset(g->pin);
1610 writel((val & ~mask) | dlevel << sunxi_dlevel_offset(g->pin),
1611 pctl->membase + sunxi_dlevel_reg(g->pin));
1612 break;
1613 case PIN_CONFIG_BIAS_PULL_UP:
1614 val = readl(pctl->membase + sunxi_pull_reg(g->pin));
1615 mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin);
1616 writel((val & ~mask) | 1 << sunxi_pull_offset(g->pin),
1617 pctl->membase + sunxi_pull_reg(g->pin));
1618 break;
1619 case PIN_CONFIG_BIAS_PULL_DOWN:
1620 val = readl(pctl->membase + sunxi_pull_reg(g->pin));
1621 mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin);
1622 writel((val & ~mask) | 2 << sunxi_pull_offset(g->pin),
1623 pctl->membase + sunxi_pull_reg(g->pin));
1624 break;
1625 default:
1626 break;
1627 }
1628
1629 /* cache the config value */
1630 g->config = config;
1631
1632 return 0;
1633}
1634
Laurent Pinchart022ab142013-02-16 10:25:07 +01001635static const struct pinconf_ops sunxi_pconf_ops = {
Maxime Ripard0e37f882013-01-18 22:30:34 +01001636 .pin_config_group_get = sunxi_pconf_group_get,
1637 .pin_config_group_set = sunxi_pconf_group_set,
1638};
1639
1640static int sunxi_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev)
1641{
1642 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1643
1644 return pctl->nfunctions;
1645}
1646
1647static const char *sunxi_pmx_get_func_name(struct pinctrl_dev *pctldev,
1648 unsigned function)
1649{
1650 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1651
1652 return pctl->functions[function].name;
1653}
1654
1655static int sunxi_pmx_get_func_groups(struct pinctrl_dev *pctldev,
1656 unsigned function,
1657 const char * const **groups,
1658 unsigned * const num_groups)
1659{
1660 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1661
1662 *groups = pctl->functions[function].groups;
1663 *num_groups = pctl->functions[function].ngroups;
1664
1665 return 0;
1666}
1667
1668static void sunxi_pmx_set(struct pinctrl_dev *pctldev,
1669 unsigned pin,
1670 u8 config)
1671{
1672 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1673
1674 u32 val = readl(pctl->membase + sunxi_mux_reg(pin));
1675 u32 mask = MUX_PINS_MASK << sunxi_mux_offset(pin);
1676 writel((val & ~mask) | config << sunxi_mux_offset(pin),
1677 pctl->membase + sunxi_mux_reg(pin));
1678}
1679
1680static int sunxi_pmx_enable(struct pinctrl_dev *pctldev,
1681 unsigned function,
1682 unsigned group)
1683{
1684 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1685 struct sunxi_pinctrl_group *g = pctl->groups + group;
1686 struct sunxi_pinctrl_function *func = pctl->functions + function;
1687 struct sunxi_desc_function *desc =
1688 sunxi_pinctrl_desc_find_function_by_name(pctl,
1689 g->name,
1690 func->name);
1691
1692 if (!desc)
1693 return -EINVAL;
1694
1695 sunxi_pmx_set(pctldev, g->pin, desc->muxval);
1696
1697 return 0;
1698}
1699
Maxime Ripard08e9e612013-01-28 21:33:12 +01001700static int
1701sunxi_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
1702 struct pinctrl_gpio_range *range,
1703 unsigned offset,
1704 bool input)
1705{
1706 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1707 struct sunxi_desc_function *desc;
Maxime Ripard08e9e612013-01-28 21:33:12 +01001708 const char *func;
Maxime Ripard08e9e612013-01-28 21:33:12 +01001709
1710 if (input)
1711 func = "gpio_in";
1712 else
1713 func = "gpio_out";
1714
Maxime Ripard814d4f22013-06-08 12:05:43 +02001715 desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, offset, func);
1716 if (!desc)
1717 return -EINVAL;
Maxime Ripard08e9e612013-01-28 21:33:12 +01001718
1719 sunxi_pmx_set(pctldev, offset, desc->muxval);
1720
Maxime Ripard814d4f22013-06-08 12:05:43 +02001721 return 0;
Maxime Ripard08e9e612013-01-28 21:33:12 +01001722}
1723
Laurent Pinchart022ab142013-02-16 10:25:07 +01001724static const struct pinmux_ops sunxi_pmx_ops = {
Maxime Ripard0e37f882013-01-18 22:30:34 +01001725 .get_functions_count = sunxi_pmx_get_funcs_cnt,
1726 .get_function_name = sunxi_pmx_get_func_name,
1727 .get_function_groups = sunxi_pmx_get_func_groups,
1728 .enable = sunxi_pmx_enable,
Maxime Ripard08e9e612013-01-28 21:33:12 +01001729 .gpio_set_direction = sunxi_pmx_gpio_set_direction,
Maxime Ripard0e37f882013-01-18 22:30:34 +01001730};
1731
1732static struct pinctrl_desc sunxi_pctrl_desc = {
1733 .confops = &sunxi_pconf_ops,
1734 .pctlops = &sunxi_pctrl_ops,
1735 .pmxops = &sunxi_pmx_ops,
1736};
1737
Maxime Ripard08e9e612013-01-28 21:33:12 +01001738static int sunxi_pinctrl_gpio_request(struct gpio_chip *chip, unsigned offset)
1739{
1740 return pinctrl_request_gpio(chip->base + offset);
1741}
1742
1743static void sunxi_pinctrl_gpio_free(struct gpio_chip *chip, unsigned offset)
1744{
1745 pinctrl_free_gpio(chip->base + offset);
1746}
1747
1748static int sunxi_pinctrl_gpio_direction_input(struct gpio_chip *chip,
1749 unsigned offset)
1750{
1751 return pinctrl_gpio_direction_input(chip->base + offset);
1752}
1753
1754static int sunxi_pinctrl_gpio_get(struct gpio_chip *chip, unsigned offset)
1755{
1756 struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev);
1757
1758 u32 reg = sunxi_data_reg(offset);
1759 u8 index = sunxi_data_offset(offset);
1760 u32 val = (readl(pctl->membase + reg) >> index) & DATA_PINS_MASK;
1761
1762 return val;
1763}
1764
1765static int sunxi_pinctrl_gpio_direction_output(struct gpio_chip *chip,
1766 unsigned offset, int value)
1767{
1768 return pinctrl_gpio_direction_output(chip->base + offset);
1769}
1770
1771static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip,
1772 unsigned offset, int value)
1773{
1774 struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev);
1775 u32 reg = sunxi_data_reg(offset);
1776 u8 index = sunxi_data_offset(offset);
1777
1778 writel((value & DATA_PINS_MASK) << index, pctl->membase + reg);
1779}
1780
Maxime Riparda0d72092013-02-03 12:10:11 +01001781static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc,
1782 const struct of_phandle_args *gpiospec,
1783 u32 *flags)
1784{
1785 int pin, base;
1786
1787 base = PINS_PER_BANK * gpiospec->args[0];
1788 pin = base + gpiospec->args[1];
1789
1790 if (pin > (gc->base + gc->ngpio))
1791 return -EINVAL;
1792
1793 if (flags)
1794 *flags = gpiospec->args[2];
1795
1796 return pin;
1797}
1798
Maxime Ripard08e9e612013-01-28 21:33:12 +01001799static struct gpio_chip sunxi_pinctrl_gpio_chip = {
1800 .owner = THIS_MODULE,
1801 .request = sunxi_pinctrl_gpio_request,
1802 .free = sunxi_pinctrl_gpio_free,
1803 .direction_input = sunxi_pinctrl_gpio_direction_input,
1804 .direction_output = sunxi_pinctrl_gpio_direction_output,
1805 .get = sunxi_pinctrl_gpio_get,
1806 .set = sunxi_pinctrl_gpio_set,
Maxime Riparda0d72092013-02-03 12:10:11 +01001807 .of_xlate = sunxi_pinctrl_gpio_of_xlate,
1808 .of_gpio_n_cells = 3,
Maxime Ripard08e9e612013-01-28 21:33:12 +01001809 .can_sleep = 0,
1810};
1811
Maxime Ripard0e37f882013-01-18 22:30:34 +01001812static struct of_device_id sunxi_pinctrl_match[] = {
Maxime Ripard9f5b6b32013-01-26 15:36:53 +01001813 { .compatible = "allwinner,sun4i-a10-pinctrl", .data = (void *)&sun4i_a10_pinctrl_data },
Maxime Ripardeaa3d842013-01-18 22:30:35 +01001814 { .compatible = "allwinner,sun5i-a13-pinctrl", .data = (void *)&sun5i_a13_pinctrl_data },
Maxime Ripard0e37f882013-01-18 22:30:34 +01001815 {}
1816};
1817MODULE_DEVICE_TABLE(of, sunxi_pinctrl_match);
1818
1819static int sunxi_pinctrl_add_function(struct sunxi_pinctrl *pctl,
1820 const char *name)
1821{
1822 struct sunxi_pinctrl_function *func = pctl->functions;
1823
1824 while (func->name) {
1825 /* function already there */
1826 if (strcmp(func->name, name) == 0) {
1827 func->ngroups++;
1828 return -EEXIST;
1829 }
1830 func++;
1831 }
1832
1833 func->name = name;
1834 func->ngroups = 1;
1835
1836 pctl->nfunctions++;
1837
1838 return 0;
1839}
1840
1841static int sunxi_pinctrl_build_state(struct platform_device *pdev)
1842{
1843 struct sunxi_pinctrl *pctl = platform_get_drvdata(pdev);
1844 int i;
1845
1846 pctl->ngroups = pctl->desc->npins;
1847
1848 /* Allocate groups */
1849 pctl->groups = devm_kzalloc(&pdev->dev,
1850 pctl->ngroups * sizeof(*pctl->groups),
1851 GFP_KERNEL);
1852 if (!pctl->groups)
1853 return -ENOMEM;
1854
1855 for (i = 0; i < pctl->desc->npins; i++) {
1856 const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
1857 struct sunxi_pinctrl_group *group = pctl->groups + i;
1858
1859 group->name = pin->pin.name;
1860 group->pin = pin->pin.number;
1861 }
1862
1863 /*
1864 * We suppose that we won't have any more functions than pins,
1865 * we'll reallocate that later anyway
1866 */
1867 pctl->functions = devm_kzalloc(&pdev->dev,
1868 pctl->desc->npins * sizeof(*pctl->functions),
1869 GFP_KERNEL);
1870 if (!pctl->functions)
1871 return -ENOMEM;
1872
1873 /* Count functions and their associated groups */
1874 for (i = 0; i < pctl->desc->npins; i++) {
1875 const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
1876 struct sunxi_desc_function *func = pin->functions;
1877
1878 while (func->name) {
1879 sunxi_pinctrl_add_function(pctl, func->name);
1880 func++;
1881 }
1882 }
1883
1884 pctl->functions = krealloc(pctl->functions,
1885 pctl->nfunctions * sizeof(*pctl->functions),
1886 GFP_KERNEL);
1887
1888 for (i = 0; i < pctl->desc->npins; i++) {
1889 const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
1890 struct sunxi_desc_function *func = pin->functions;
1891
1892 while (func->name) {
1893 struct sunxi_pinctrl_function *func_item;
1894 const char **func_grp;
1895
1896 func_item = sunxi_pinctrl_find_function_by_name(pctl,
1897 func->name);
1898 if (!func_item)
1899 return -EINVAL;
1900
1901 if (!func_item->groups) {
1902 func_item->groups =
1903 devm_kzalloc(&pdev->dev,
1904 func_item->ngroups * sizeof(*func_item->groups),
1905 GFP_KERNEL);
1906 if (!func_item->groups)
1907 return -ENOMEM;
1908 }
1909
1910 func_grp = func_item->groups;
1911 while (*func_grp)
1912 func_grp++;
1913
1914 *func_grp = pin->pin.name;
1915 func++;
1916 }
1917 }
1918
1919 return 0;
1920}
1921
1922static int sunxi_pinctrl_probe(struct platform_device *pdev)
1923{
1924 struct device_node *node = pdev->dev.of_node;
1925 const struct of_device_id *device;
1926 struct pinctrl_pin_desc *pins;
1927 struct sunxi_pinctrl *pctl;
Maxime Ripard08e9e612013-01-28 21:33:12 +01001928 int i, ret, last_pin;
Emilio López950707c2013-03-22 11:20:40 -03001929 struct clk *clk;
Maxime Ripard0e37f882013-01-18 22:30:34 +01001930
1931 pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL);
1932 if (!pctl)
1933 return -ENOMEM;
1934 platform_set_drvdata(pdev, pctl);
1935
1936 pctl->membase = of_iomap(node, 0);
1937 if (!pctl->membase)
1938 return -ENOMEM;
1939
1940 device = of_match_device(sunxi_pinctrl_match, &pdev->dev);
1941 if (!device)
1942 return -ENODEV;
1943
1944 pctl->desc = (struct sunxi_pinctrl_desc *)device->data;
1945
1946 ret = sunxi_pinctrl_build_state(pdev);
1947 if (ret) {
1948 dev_err(&pdev->dev, "dt probe failed: %d\n", ret);
1949 return ret;
1950 }
1951
1952 pins = devm_kzalloc(&pdev->dev,
1953 pctl->desc->npins * sizeof(*pins),
1954 GFP_KERNEL);
1955 if (!pins)
1956 return -ENOMEM;
1957
1958 for (i = 0; i < pctl->desc->npins; i++)
1959 pins[i] = pctl->desc->pins[i].pin;
1960
1961 sunxi_pctrl_desc.name = dev_name(&pdev->dev);
1962 sunxi_pctrl_desc.owner = THIS_MODULE;
1963 sunxi_pctrl_desc.pins = pins;
1964 sunxi_pctrl_desc.npins = pctl->desc->npins;
1965 pctl->dev = &pdev->dev;
1966 pctl->pctl_dev = pinctrl_register(&sunxi_pctrl_desc,
1967 &pdev->dev, pctl);
1968 if (!pctl->pctl_dev) {
1969 dev_err(&pdev->dev, "couldn't register pinctrl driver\n");
1970 return -EINVAL;
1971 }
1972
Maxime Ripard08e9e612013-01-28 21:33:12 +01001973 pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL);
1974 if (!pctl->chip) {
1975 ret = -ENOMEM;
1976 goto pinctrl_error;
1977 }
1978
1979 last_pin = pctl->desc->pins[pctl->desc->npins - 1].pin.number;
1980 pctl->chip = &sunxi_pinctrl_gpio_chip;
1981 pctl->chip->ngpio = round_up(last_pin, PINS_PER_BANK);
1982 pctl->chip->label = dev_name(&pdev->dev);
1983 pctl->chip->dev = &pdev->dev;
1984 pctl->chip->base = 0;
1985
1986 ret = gpiochip_add(pctl->chip);
1987 if (ret)
1988 goto pinctrl_error;
1989
1990 for (i = 0; i < pctl->desc->npins; i++) {
1991 const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
1992
1993 ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev),
1994 pin->pin.number,
1995 pin->pin.number, 1);
1996 if (ret)
1997 goto gpiochip_error;
1998 }
1999
Emilio López950707c2013-03-22 11:20:40 -03002000 clk = devm_clk_get(&pdev->dev, NULL);
Wei Yongjund72f88a2013-05-23 17:32:14 +08002001 if (IS_ERR(clk)) {
2002 ret = PTR_ERR(clk);
Emilio López950707c2013-03-22 11:20:40 -03002003 goto gpiochip_error;
Wei Yongjund72f88a2013-05-23 17:32:14 +08002004 }
Emilio López950707c2013-03-22 11:20:40 -03002005
2006 clk_prepare_enable(clk);
2007
Maxime Ripard08e9e612013-01-28 21:33:12 +01002008 dev_info(&pdev->dev, "initialized sunXi PIO driver\n");
Maxime Ripard0e37f882013-01-18 22:30:34 +01002009
2010 return 0;
Maxime Ripard08e9e612013-01-28 21:33:12 +01002011
2012gpiochip_error:
Axel Lin97fc4632013-05-19 13:58:37 +08002013 if (gpiochip_remove(pctl->chip))
2014 dev_err(&pdev->dev, "failed to remove gpio chip\n");
Maxime Ripard08e9e612013-01-28 21:33:12 +01002015pinctrl_error:
2016 pinctrl_unregister(pctl->pctl_dev);
2017 return ret;
Maxime Ripard0e37f882013-01-18 22:30:34 +01002018}
2019
2020static struct platform_driver sunxi_pinctrl_driver = {
2021 .probe = sunxi_pinctrl_probe,
2022 .driver = {
2023 .name = "sunxi-pinctrl",
2024 .owner = THIS_MODULE,
2025 .of_match_table = sunxi_pinctrl_match,
2026 },
2027};
2028module_platform_driver(sunxi_pinctrl_driver);
2029
2030MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com");
2031MODULE_DESCRIPTION("Allwinner A1X pinctrl driver");
2032MODULE_LICENSE("GPL");