9ae44e0e244aa0993857ae731dfb754b3111ff5d
[platform/kernel/u-boot.git] / board / gateworks / gw_ventana / common.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2013 Gateworks Corporation
4  *
5  * Author: Tim Harvey <tharvey@gateworks.com>
6  */
7
8 #include <common.h>
9 #include <log.h>
10 #include <asm/arch/clock.h>
11 #include <asm/arch/mx6-pins.h>
12 #include <asm/arch/sys_proto.h>
13 #include <asm/gpio.h>
14 #include <asm/mach-imx/mxc_i2c.h>
15 #include <env.h>
16 #include <fsl_esdhc_imx.h>
17 #include <hwconfig.h>
18 #include <linux/delay.h>
19 #include <power/pmic.h>
20 #include <power/ltc3676_pmic.h>
21 #include <power/pfuze100_pmic.h>
22
23 #include "common.h"
24
25 /* UART2: Serial Console */
26 static iomux_v3_cfg_t const uart2_pads[] = {
27         IOMUX_PADS(PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
28         IOMUX_PADS(PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
29 };
30
31 void setup_iomux_uart(void)
32 {
33         SETUP_IOMUX_PADS(uart2_pads);
34 }
35
36 /* MMC */
37 static iomux_v3_cfg_t const gw5904_emmc_pads[] = {
38         IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
39         IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
40         IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
41         IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
42         IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
43         IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
44         IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
45         IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
46         IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
47         IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
48         IOMUX_PADS(PAD_SD3_RST__SD3_RESET  | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
49 };
50 /* 4-bit microSD on SD2 */
51 static iomux_v3_cfg_t const gw5904_mmc_pads[] = {
52         IOMUX_PADS(PAD_SD2_CLK__SD2_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
53         IOMUX_PADS(PAD_SD2_CMD__SD2_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
54         IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
55         IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
56         IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
57         IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
58         /* CD */
59         IOMUX_PADS(PAD_NANDF_CS0__GPIO6_IO11 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
60 };
61 /* 8-bit eMMC on SD2/NAND */
62 static iomux_v3_cfg_t const gw560x_emmc_sd2_pads[] = {
63         IOMUX_PADS(PAD_SD2_CLK__SD2_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
64         IOMUX_PADS(PAD_SD2_CMD__SD2_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
65         IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
66         IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
67         IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
68         IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
69         IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
70         IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
71         IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
72         IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
73 };
74
75 static iomux_v3_cfg_t const usdhc3_pads[] = {
76         IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
77         IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
78         IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
79         IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
80         IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
81         IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
82         IOMUX_PADS(PAD_SD3_DAT5__GPIO7_IO00  | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
83 };
84
85 /*
86  * I2C pad configs:
87  * I2C1: GSC
88  * I2C2: PMIC,PCIe Switch,Clock,Mezz
89  * I2C3: Multimedia/Expansion
90  */
91 static struct i2c_pads_info mx6q_i2c_pad_info[] = {
92         {
93                 .scl = {
94                         .i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
95                         .gpio_mode = MX6Q_PAD_EIM_D21__GPIO3_IO21 | PC,
96                         .gp = IMX_GPIO_NR(3, 21)
97                 },
98                 .sda = {
99                         .i2c_mode = MX6Q_PAD_EIM_D28__I2C1_SDA | PC,
100                         .gpio_mode = MX6Q_PAD_EIM_D28__GPIO3_IO28 | PC,
101                         .gp = IMX_GPIO_NR(3, 28)
102                 }
103         }, {
104                 .scl = {
105                         .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
106                         .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | PC,
107                         .gp = IMX_GPIO_NR(4, 12)
108                 },
109                 .sda = {
110                         .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
111                         .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
112                         .gp = IMX_GPIO_NR(4, 13)
113                 }
114         }, {
115                 .scl = {
116                         .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
117                         .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
118                         .gp = IMX_GPIO_NR(1, 3)
119                 },
120                 .sda = {
121                         .i2c_mode = MX6Q_PAD_GPIO_6__I2C3_SDA | PC,
122                         .gpio_mode = MX6Q_PAD_GPIO_6__GPIO1_IO06 | PC,
123                         .gp = IMX_GPIO_NR(1, 6)
124                 }
125         }
126 };
127
128 static struct i2c_pads_info mx6dl_i2c_pad_info[] = {
129         {
130                 .scl = {
131                         .i2c_mode = MX6DL_PAD_EIM_D21__I2C1_SCL | PC,
132                         .gpio_mode = MX6DL_PAD_EIM_D21__GPIO3_IO21 | PC,
133                         .gp = IMX_GPIO_NR(3, 21)
134                 },
135                 .sda = {
136                         .i2c_mode = MX6DL_PAD_EIM_D28__I2C1_SDA | PC,
137                         .gpio_mode = MX6DL_PAD_EIM_D28__GPIO3_IO28 | PC,
138                         .gp = IMX_GPIO_NR(3, 28)
139                 }
140         }, {
141                 .scl = {
142                         .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | PC,
143                         .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | PC,
144                         .gp = IMX_GPIO_NR(4, 12)
145                 },
146                 .sda = {
147                         .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
148                         .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
149                         .gp = IMX_GPIO_NR(4, 13)
150                 }
151         }, {
152                 .scl = {
153                         .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
154                         .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
155                         .gp = IMX_GPIO_NR(1, 3)
156                 },
157                 .sda = {
158                         .i2c_mode = MX6DL_PAD_GPIO_6__I2C3_SDA | PC,
159                         .gpio_mode = MX6DL_PAD_GPIO_6__GPIO1_IO06 | PC,
160                         .gp = IMX_GPIO_NR(1, 6)
161                 }
162         }
163 };
164
165 void setup_ventana_i2c(int i2c)
166 {
167         struct i2c_pads_info *p;
168
169         if (is_cpu_type(MXC_CPU_MX6Q))
170                 p = &mx6q_i2c_pad_info[i2c];
171         else
172                 p = &mx6dl_i2c_pad_info[i2c];
173
174         setup_i2c(i2c, CONFIG_SYS_I2C_SPEED, 0x7f, p);
175 }
176
177 /*
178  * Baseboard specific GPIO
179  */
180 static iomux_v3_cfg_t const gw51xx_gpio_pads[] = {
181         /* IOEXP_PWREN# */
182         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
183         /* IOEXP_IRQ# */
184         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
185         /* GPS_SHDN */
186         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
187         /* VID_PWR */
188         IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
189         /* PCIESKT_WDIS# */
190         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
191 };
192
193 static iomux_v3_cfg_t const gw52xx_gpio_pads[] = {
194         /* SD3_VSELECT */
195         IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
196         /* RS232_EN# */
197         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
198         /* MSATA_EN */
199         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
200         /* IOEXP_PWREN# */
201         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
202         /* IOEXP_IRQ# */
203         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
204         /* CAN_STBY */
205         IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
206         /* GPS_SHDN */
207         IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
208         /* USBOTG_SEL */
209         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
210         /* VID_PWR */
211         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
212         /* RS485_EN */
213         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
214         /* PCIESKT_WDIS# */
215         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
216 };
217
218 static iomux_v3_cfg_t const gw53xx_gpio_pads[] = {
219         /* SD3_VSELECT */
220         IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
221         /* RS232_EN# */
222         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
223         /* MSATA_EN */
224         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
225         /* CAN_STBY */
226         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
227         /* IOEXP_PWREN# */
228         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
229         /* IOEXP_IRQ# */
230         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
231         /* DIOI2C_DIS# */
232         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
233         /* GPS_SHDN */
234         IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
235         /* VID_EN */
236         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
237         /* RS485_EN */
238         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
239         /* PCIESKT_WDIS# */
240         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
241 };
242
243 static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
244         /* SD3_VSELECT */
245         IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
246         /* RS232_EN# */
247         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
248         /* MSATA_EN */
249         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
250         /* CAN_STBY */
251         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
252         /* MIPI_DIO */
253         IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | DIO_PAD_CFG),
254         /* RS485_EN */
255         IOMUX_PADS(PAD_EIM_D24__GPIO3_IO24 | DIO_PAD_CFG),
256         /* IOEXP_PWREN# */
257         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
258         /* IOEXP_IRQ# */
259         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
260         /* DIOI2C_DIS# */
261         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
262         /* VID_EN */
263         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
264         /* RS485_EN */
265         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
266         /* PCIESKT_WDIS# */
267         IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
268 };
269
270 static iomux_v3_cfg_t const gw551x_gpio_pads[] = {
271         /* CAN_STBY */
272         IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
273         /* PCIESKT_WDIS# */
274         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
275 };
276
277 static iomux_v3_cfg_t const gw552x_gpio_pads[] = {
278         /* MSATA_EN */
279         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
280         /* USBOTG_SEL */
281         IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
282         /* MX6_DIO[4:9] */
283         IOMUX_PADS(PAD_CSI0_PIXCLK__GPIO5_IO18 | DIO_PAD_CFG),
284         IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
285         IOMUX_PADS(PAD_CSI0_VSYNC__GPIO5_IO21 | DIO_PAD_CFG),
286         IOMUX_PADS(PAD_CSI0_DAT4__GPIO5_IO22 | DIO_PAD_CFG),
287         IOMUX_PADS(PAD_CSI0_DAT5__GPIO5_IO23 | DIO_PAD_CFG),
288         IOMUX_PADS(PAD_CSI0_DAT7__GPIO5_IO25 | DIO_PAD_CFG),
289         /* PCIEGBE1_OFF# */
290         IOMUX_PADS(PAD_GPIO_1__GPIO1_IO01 | DIO_PAD_CFG),
291         /* PCIEGBE2_OFF# */
292         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
293         /* PCIESKT_WDIS# */
294         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
295 };
296
297 static iomux_v3_cfg_t const gw553x_gpio_pads[] = {
298         /* SD3_VSELECT */
299         IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
300         /* VID_PWR */
301         IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
302         /* PCIESKT_WDIS# */
303         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
304 };
305
306 static iomux_v3_cfg_t const gw560x_gpio_pads[] = {
307         /* RS232_EN# */
308         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
309         /* CAN_STBY */
310         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
311         /* IOEXP_PWREN# */
312         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
313         /* IOEXP_IRQ# */
314         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
315         /* DIOI2C_DIS# */
316         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
317         /* VID_EN */
318         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
319         /* RS485_EN */
320         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
321         /* PCIESKT_WDIS# */
322         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
323         /* 12V0_PWR_EN */
324         IOMUX_PADS(PAD_DISP0_DAT5__GPIO4_IO26 | DIO_PAD_CFG),
325 };
326
327 static iomux_v3_cfg_t const gw5901_gpio_pads[] = {
328         /* ETH1_EN */
329         IOMUX_PADS(PAD_GPIO_1__GPIO1_IO01 | DIO_PAD_CFG),
330         /* CAN_STBY */
331         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
332         /* PMIC reset */
333         IOMUX_PADS(PAD_DISP0_DAT8__WDOG1_B | DIO_PAD_CFG),
334         /* COM_CFGA/B/C/D */
335         IOMUX_PADS(PAD_DISP0_DAT20__GPIO5_IO14 | DIO_PAD_CFG),
336         IOMUX_PADS(PAD_DISP0_DAT21__GPIO5_IO15 | DIO_PAD_CFG),
337         IOMUX_PADS(PAD_DISP0_DAT22__GPIO5_IO16 | DIO_PAD_CFG),
338         IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
339         /* ETI_IRQ# */
340         IOMUX_PADS(PAD_GPIO_5__GPIO1_IO05 | DIO_PAD_CFG),
341         /* DIO_IRQ# */
342         IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
343         /* FIBER_SIGDET */
344         IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
345 };
346
347 static iomux_v3_cfg_t const gw5902_gpio_pads[] = {
348         /* CAN1_STBY */
349         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
350         /* CAN2_STBY */
351         IOMUX_PADS(PAD_SD3_CLK__GPIO7_IO03 | DIO_PAD_CFG),
352         /* UART1_EN# */
353         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
354         /* 5V_UVLO */
355         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
356         /* ETI_IRQ# */
357         IOMUX_PADS(PAD_GPIO_5__GPIO1_IO05 | DIO_PAD_CFG),
358         /* DIO_IRQ# */
359         IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
360 };
361
362 static iomux_v3_cfg_t const gw5903_gpio_pads[] = {
363         /* BKLT_12VEN */
364         IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
365         /* EMMY_PDN# */
366         IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02 | DIO_PAD_CFG),
367         /* EMMY_CFG1# */
368         IOMUX_PADS(PAD_NANDF_D3__GPIO2_IO03 | DIO_PAD_CFG),
369         /* EMMY_CFG1# */
370         IOMUX_PADS(PAD_NANDF_D4__GPIO2_IO04 | DIO_PAD_CFG),
371         /* USBH1_PEN (EHCI) */
372         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
373         /* USBDPC_PEN */
374         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
375         /* TOUCH_RST */
376         IOMUX_PADS(PAD_KEY_COL1__GPIO4_IO08 | DIO_PAD_CFG),
377         /* AUDIO_RST# */
378         IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
379         /* UART1_TEN# */
380         IOMUX_PADS(PAD_CSI0_DAT12__GPIO5_IO30 | DIO_PAD_CFG),
381         /* LVDS_BKLEN # */
382         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
383         /* RGMII_PDWN# */
384         IOMUX_PADS(PAD_ENET_CRS_DV__GPIO1_IO25 | DIO_PAD_CFG),
385         /* TOUCH_IRQ# */
386         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
387         /* TOUCH_RST# */
388         IOMUX_PADS(PAD_KEY_COL1__GPIO4_IO08 | DIO_PAD_CFG),
389 };
390
391 static iomux_v3_cfg_t const gw5904_gpio_pads[] = {
392         /* IOEXP_PWREN# */
393         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
394         /* IOEXP_IRQ# */
395         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
396         /* DIOI2C_DIS# */
397         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
398         /* UART_RS485 */
399         IOMUX_PADS(PAD_DISP0_DAT2__GPIO4_IO23 | DIO_PAD_CFG),
400         /* UART_HALF */
401         IOMUX_PADS(PAD_DISP0_DAT3__GPIO4_IO24 | DIO_PAD_CFG),
402         /* SKT1_WDIS# */
403         IOMUX_PADS(PAD_DISP0_DAT17__GPIO5_IO11 | DIO_PAD_CFG),
404         /* SKT1_RST# */
405         IOMUX_PADS(PAD_DISP0_DAT18__GPIO5_IO12 | DIO_PAD_CFG),
406         /* SKT2_WDIS# */
407         IOMUX_PADS(PAD_DISP0_DAT19__GPIO5_IO13 | DIO_PAD_CFG),
408         /* SKT2_RST# */
409         IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
410         /* M2_OFF# */
411         IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15 | DIO_PAD_CFG),
412         /* M2_WDIS# */
413         IOMUX_PADS(PAD_SD2_DAT1__GPIO1_IO14 | DIO_PAD_CFG),
414         /* M2_RST# */
415         IOMUX_PADS(PAD_SD2_DAT2__GPIO1_IO13 | DIO_PAD_CFG),
416         /* RS232_EN# */
417         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
418 };
419
420 static iomux_v3_cfg_t const gw5905_gpio_pads[] = {
421         /* EMMY_PDN# */
422         IOMUX_PADS(PAD_NANDF_D3__GPIO2_IO03 | DIO_PAD_CFG),
423         /* MIPI_RST */
424         IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15 | DIO_PAD_CFG),
425         /* MIPI_PWDN */
426         IOMUX_PADS(PAD_SD2_DAT1__GPIO1_IO14 | DIO_PAD_CFG),
427         /* USBEHCI_SEL */
428         IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
429         /* LVDS_BKLEN # */
430         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
431         /* PCIESKT_WDIS# */
432         IOMUX_PADS(PAD_GPIO_18__GPIO7_IO13 | DIO_PAD_CFG),
433         /* SPK_SHDN# */
434         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
435         /* DECT_RST# */
436         IOMUX_PADS(PAD_DISP0_DAT20__GPIO5_IO14 | DIO_PAD_CFG),
437         /* USBH1_PEN (EHCI) */
438         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
439         /* LVDS_PWM */
440         IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
441         /* CODEC_RST */
442         IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
443         /* GYRO_CONTROL/DATA_EN */
444         IOMUX_PADS(PAD_CSI0_DAT8__GPIO5_IO26 | DIO_PAD_CFG),
445         /* TOUCH_RST */
446         IOMUX_PADS(PAD_KEY_COL1__GPIO4_IO08 | DIO_PAD_CFG),
447         /* TOUCH_IRQ */
448         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
449 };
450
451 /* Digital I/O */
452 struct dio_cfg gw51xx_dio[] = {
453         {
454                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
455                 IMX_GPIO_NR(1, 16),
456                 { 0, 0 },
457                 0
458         },
459         {
460                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
461                 IMX_GPIO_NR(1, 19),
462                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
463                 2
464         },
465         {
466                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
467                 IMX_GPIO_NR(1, 17),
468                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
469                 3
470         },
471         {
472                 { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
473                 IMX_GPIO_NR(1, 18),
474                 { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
475                 4
476         },
477 };
478
479 struct dio_cfg gw52xx_dio[] = {
480         {
481                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
482                 IMX_GPIO_NR(1, 16),
483                 { 0, 0 },
484                 0
485         },
486         {
487                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
488                 IMX_GPIO_NR(1, 19),
489                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
490                 2
491         },
492         {
493                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
494                 IMX_GPIO_NR(1, 17),
495                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
496                 3
497         },
498         {
499                 { IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
500                 IMX_GPIO_NR(1, 20),
501                 { 0, 0 },
502                 0
503         },
504 };
505
506 struct dio_cfg gw53xx_dio[] = {
507         {
508                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
509                 IMX_GPIO_NR(1, 16),
510                 { 0, 0 },
511                 0
512         },
513         {
514                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
515                 IMX_GPIO_NR(1, 19),
516                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
517                 2
518         },
519         {
520                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
521                 IMX_GPIO_NR(1, 17),
522                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
523                 3
524         },
525         {
526                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
527                 IMX_GPIO_NR(1, 20),
528                 { 0, 0 },
529                 0
530         },
531 };
532
533 struct dio_cfg gw54xx_dio[] = {
534         {
535                 { IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09) },
536                 IMX_GPIO_NR(1, 9),
537                 { IOMUX_PADS(PAD_GPIO_9__PWM1_OUT) },
538                 1
539         },
540         {
541                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
542                 IMX_GPIO_NR(1, 19),
543                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
544                 2
545         },
546         {
547                 { IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09) },
548                 IMX_GPIO_NR(2, 9),
549                 { IOMUX_PADS(PAD_SD4_DAT1__PWM3_OUT) },
550                 3
551         },
552         {
553                 { IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10) },
554                 IMX_GPIO_NR(2, 10),
555                 { IOMUX_PADS(PAD_SD4_DAT2__PWM4_OUT) },
556                 4
557         },
558 };
559
560 struct dio_cfg gw551x_dio[] = {
561         {
562                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
563                 IMX_GPIO_NR(1, 19),
564                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
565                 2
566         },
567         {
568                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
569                 IMX_GPIO_NR(1, 17),
570                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
571                 3
572         },
573 };
574
575 struct dio_cfg gw552x_dio[] = {
576         {
577                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
578                 IMX_GPIO_NR(1, 16),
579                 { 0, 0 },
580                 0
581         },
582         {
583                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
584                 IMX_GPIO_NR(1, 19),
585                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
586                 2
587         },
588         {
589                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
590                 IMX_GPIO_NR(1, 17),
591                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
592                 3
593         },
594         {
595                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
596                 IMX_GPIO_NR(1, 20),
597                 { 0, 0 },
598                 0
599         },
600         {
601                 {IOMUX_PADS(PAD_CSI0_PIXCLK__GPIO5_IO18) },
602                 IMX_GPIO_NR(5, 18),
603                 { 0, 0 },
604                 0
605         },
606         {
607                 {IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20) },
608                 IMX_GPIO_NR(5, 20),
609                 { 0, 0 },
610                 0
611         },
612         {
613                 {IOMUX_PADS(PAD_CSI0_VSYNC__GPIO5_IO21) },
614                 IMX_GPIO_NR(5, 21),
615                 { 0, 0 },
616                 0
617         },
618         {
619                 {IOMUX_PADS(PAD_CSI0_DAT4__GPIO5_IO22) },
620                 IMX_GPIO_NR(5, 22),
621                 { 0, 0 },
622                 0
623         },
624         {
625                 {IOMUX_PADS(PAD_CSI0_DAT5__GPIO5_IO23) },
626                 IMX_GPIO_NR(5, 23),
627                 { 0, 0 },
628                 0
629         },
630         {
631                 {IOMUX_PADS(PAD_CSI0_DAT7__GPIO5_IO25) },
632                 IMX_GPIO_NR(5, 25),
633                 { 0, 0 },
634                 0
635         },
636 };
637
638 struct dio_cfg gw553x_dio[] = {
639         {
640                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
641                 IMX_GPIO_NR(1, 16),
642                 { 0, 0 },
643                 0
644         },
645         {
646                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
647                 IMX_GPIO_NR(1, 19),
648                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
649                 2
650         },
651         {
652                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
653                 IMX_GPIO_NR(1, 17),
654                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
655                 3
656         },
657         {
658                 { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
659                 IMX_GPIO_NR(1, 18),
660                 { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
661                 4
662         },
663 };
664
665 struct dio_cfg gw560x_dio[] = {
666         {
667                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
668                 IMX_GPIO_NR(1, 16),
669                 { 0, 0 },
670                 0
671         },
672         {
673                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
674                 IMX_GPIO_NR(1, 19),
675                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
676                 2
677         },
678         {
679                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
680                 IMX_GPIO_NR(1, 17),
681                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
682                 3
683         },
684         {
685                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
686                 IMX_GPIO_NR(1, 20),
687                 { 0, 0 },
688                 0
689         },
690 };
691
692 struct dio_cfg gw5901_dio[] = {
693         {
694                 { IOMUX_PADS(PAD_DISP0_DAT20__GPIO5_IO14) },
695                 IMX_GPIO_NR(5, 14),
696                 { 0, 0 },
697                 0
698         },
699         {
700                 { IOMUX_PADS(PAD_DISP0_DAT21__GPIO5_IO15) },
701                 IMX_GPIO_NR(5, 15),
702                 { 0, 0 },
703                 0
704         },
705         {
706                 { IOMUX_PADS(PAD_DISP0_DAT22__GPIO5_IO16) },
707                 IMX_GPIO_NR(5, 16),
708                 { 0, 0 },
709                 0
710         },
711         {
712                 { IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17) },
713                 IMX_GPIO_NR(5, 17),
714                 { 0, 0 },
715                 0
716         },
717 };
718
719 struct dio_cfg gw5902_dio[] = {
720         {
721                 { IOMUX_PADS(PAD_DISP0_DAT20__GPIO5_IO14) },
722                 IMX_GPIO_NR(5, 14),
723                 { 0, 0 },
724                 0
725         },
726         {
727                 { IOMUX_PADS(PAD_DISP0_DAT21__GPIO5_IO15) },
728                 IMX_GPIO_NR(5, 15),
729                 { 0, 0 },
730                 0
731         },
732         {
733                 { IOMUX_PADS(PAD_DISP0_DAT22__GPIO5_IO16) },
734                 IMX_GPIO_NR(5, 16),
735                 { 0, 0 },
736                 0
737         },
738         {
739                 { IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17) },
740                 IMX_GPIO_NR(5, 17),
741                 { 0, 0 },
742                 0
743         },
744 };
745
746 struct dio_cfg gw5903_dio[] = {
747 };
748
749 struct dio_cfg gw5904_dio[] = {
750         {
751                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
752                 IMX_GPIO_NR(1, 16),
753                 { 0, 0 },
754                 0
755         },
756         {
757                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
758                 IMX_GPIO_NR(1, 19),
759                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
760                 2
761         },
762         {
763                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
764                 IMX_GPIO_NR(1, 17),
765                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
766                 3
767         },
768         {
769                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
770                 IMX_GPIO_NR(1, 20),
771                 { 0, 0 },
772                 0
773         },
774         {
775                 {IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00) },
776                 IMX_GPIO_NR(2, 0),
777                 { 0, 0 },
778                 0
779         },
780         {
781                 {IOMUX_PADS(PAD_NANDF_D1__GPIO2_IO01) },
782                 IMX_GPIO_NR(2, 1),
783                 { 0, 0 },
784                 0
785         },
786         {
787                 {IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02) },
788                 IMX_GPIO_NR(2, 2),
789                 { 0, 0 },
790                 0
791         },
792         {
793                 {IOMUX_PADS(PAD_NANDF_D3__GPIO2_IO03) },
794                 IMX_GPIO_NR(2, 3),
795                 { 0, 0 },
796                 0
797         },
798         {
799                 {IOMUX_PADS(PAD_NANDF_D4__GPIO2_IO04) },
800                 IMX_GPIO_NR(2, 4),
801                 { 0, 0 },
802                 0
803         },
804         {
805                 {IOMUX_PADS(PAD_NANDF_D5__GPIO2_IO05) },
806                 IMX_GPIO_NR(2, 5),
807                 { 0, 0 },
808                 0
809         },
810         {
811                 {IOMUX_PADS(PAD_NANDF_D6__GPIO2_IO06) },
812                 IMX_GPIO_NR(2, 6),
813                 { 0, 0 },
814                 0
815         },
816         {
817                 {IOMUX_PADS(PAD_NANDF_D7__GPIO2_IO07) },
818                 IMX_GPIO_NR(2, 7),
819                 { 0, 0 },
820                 0
821         },
822 };
823
824 struct dio_cfg gw5906_dio[] = {
825         {
826                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
827                 IMX_GPIO_NR(1, 16),
828                 { 0, 0 },
829                 0
830         },
831         {
832                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
833                 IMX_GPIO_NR(1, 19),
834                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
835                 2
836         },
837         {
838                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
839                 IMX_GPIO_NR(1, 17),
840                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
841                 3
842         },
843         {
844                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
845                 IMX_GPIO_NR(1, 20),
846                 { 0, 0 },
847                 0
848         },
849 };
850
851 /*
852  * Board Specific GPIO
853  */
854 struct ventana gpio_cfg[GW_UNKNOWN] = {
855         /* GW5400proto */
856         {
857                 .gpio_pads = gw54xx_gpio_pads,
858                 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
859                 .dio_cfg = gw54xx_dio,
860                 .dio_num = ARRAY_SIZE(gw54xx_dio),
861                 .mezz_pwren = IMX_GPIO_NR(4, 7),
862                 .mezz_irq = IMX_GPIO_NR(4, 9),
863                 .rs485en = IMX_GPIO_NR(3, 24),
864                 .dioi2c_en = IMX_GPIO_NR(4,  5),
865                 .pcie_sson = IMX_GPIO_NR(1, 20),
866                 .mmc_cd = IMX_GPIO_NR(7, 0),
867         },
868
869         /* GW51xx */
870         {
871                 .gpio_pads = gw51xx_gpio_pads,
872                 .num_pads = ARRAY_SIZE(gw51xx_gpio_pads)/2,
873                 .dio_cfg = gw51xx_dio,
874                 .dio_num = ARRAY_SIZE(gw51xx_dio),
875                 .mezz_pwren = IMX_GPIO_NR(2, 19),
876                 .mezz_irq = IMX_GPIO_NR(2, 18),
877                 .gps_shdn = IMX_GPIO_NR(1, 2),
878                 .vidin_en = IMX_GPIO_NR(5, 20),
879                 .wdis = IMX_GPIO_NR(7, 12),
880         },
881
882         /* GW52xx */
883         {
884                 .gpio_pads = gw52xx_gpio_pads,
885                 .num_pads = ARRAY_SIZE(gw52xx_gpio_pads)/2,
886                 .dio_cfg = gw52xx_dio,
887                 .dio_num = ARRAY_SIZE(gw52xx_dio),
888                 .mezz_pwren = IMX_GPIO_NR(2, 19),
889                 .mezz_irq = IMX_GPIO_NR(2, 18),
890                 .gps_shdn = IMX_GPIO_NR(1, 27),
891                 .vidin_en = IMX_GPIO_NR(3, 31),
892                 .usb_sel = IMX_GPIO_NR(1, 2),
893                 .wdis = IMX_GPIO_NR(7, 12),
894                 .msata_en = GP_MSATA_SEL,
895                 .rs232_en = GP_RS232_EN,
896                 .vsel_pin = IMX_GPIO_NR(6, 14),
897                 .mmc_cd = IMX_GPIO_NR(7, 0),
898         },
899
900         /* GW53xx */
901         {
902                 .gpio_pads = gw53xx_gpio_pads,
903                 .num_pads = ARRAY_SIZE(gw53xx_gpio_pads)/2,
904                 .dio_cfg = gw53xx_dio,
905                 .dio_num = ARRAY_SIZE(gw53xx_dio),
906                 .mezz_pwren = IMX_GPIO_NR(2, 19),
907                 .mezz_irq = IMX_GPIO_NR(2, 18),
908                 .gps_shdn = IMX_GPIO_NR(1, 27),
909                 .vidin_en = IMX_GPIO_NR(3, 31),
910                 .wdis = IMX_GPIO_NR(7, 12),
911                 .msata_en = GP_MSATA_SEL,
912                 .rs232_en = GP_RS232_EN,
913                 .vsel_pin = IMX_GPIO_NR(6, 14),
914                 .mmc_cd = IMX_GPIO_NR(7, 0),
915         },
916
917         /* GW54xx */
918         {
919                 .gpio_pads = gw54xx_gpio_pads,
920                 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
921                 .dio_cfg = gw54xx_dio,
922                 .dio_num = ARRAY_SIZE(gw54xx_dio),
923                 .mezz_pwren = IMX_GPIO_NR(2, 19),
924                 .mezz_irq = IMX_GPIO_NR(2, 18),
925                 .rs485en = IMX_GPIO_NR(7, 1),
926                 .vidin_en = IMX_GPIO_NR(3, 31),
927                 .dioi2c_en = IMX_GPIO_NR(4,  5),
928                 .pcie_sson = IMX_GPIO_NR(1, 20),
929                 .wdis = IMX_GPIO_NR(5, 17),
930                 .msata_en = GP_MSATA_SEL,
931                 .rs232_en = GP_RS232_EN,
932                 .vsel_pin = IMX_GPIO_NR(6, 14),
933                 .mmc_cd = IMX_GPIO_NR(7, 0),
934         },
935
936         /* GW551x */
937         {
938                 .gpio_pads = gw551x_gpio_pads,
939                 .num_pads = ARRAY_SIZE(gw551x_gpio_pads)/2,
940                 .dio_cfg = gw551x_dio,
941                 .dio_num = ARRAY_SIZE(gw551x_dio),
942                 .wdis = IMX_GPIO_NR(7, 12),
943         },
944
945         /* GW552x */
946         {
947                 .gpio_pads = gw552x_gpio_pads,
948                 .num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2,
949                 .dio_cfg = gw552x_dio,
950                 .dio_num = ARRAY_SIZE(gw552x_dio),
951                 .usb_sel = IMX_GPIO_NR(1, 7),
952                 .wdis = IMX_GPIO_NR(7, 12),
953                 .msata_en = GP_MSATA_SEL,
954         },
955
956         /* GW553x */
957         {
958                 .gpio_pads = gw553x_gpio_pads,
959                 .num_pads = ARRAY_SIZE(gw553x_gpio_pads)/2,
960                 .dio_cfg = gw553x_dio,
961                 .dio_num = ARRAY_SIZE(gw553x_dio),
962                 .vidin_en = IMX_GPIO_NR(5, 20),
963                 .wdis = IMX_GPIO_NR(7, 12),
964                 .vsel_pin = IMX_GPIO_NR(6, 14),
965                 .mmc_cd = IMX_GPIO_NR(7, 0),
966         },
967
968         /* GW560x */
969         {
970                 .gpio_pads = gw560x_gpio_pads,
971                 .num_pads = ARRAY_SIZE(gw560x_gpio_pads)/2,
972                 .dio_cfg = gw560x_dio,
973                 .dio_num = ARRAY_SIZE(gw560x_dio),
974                 .mezz_pwren = IMX_GPIO_NR(2, 19),
975                 .mezz_irq = IMX_GPIO_NR(2, 18),
976                 .rs232_en = GP_RS232_EN,
977                 .vidin_en = IMX_GPIO_NR(3, 31),
978                 .wdis = IMX_GPIO_NR(7, 12),
979                 .mmc_cd = IMX_GPIO_NR(7, 0),
980         },
981
982         /* GW5901 */
983         {
984                 .gpio_pads = gw5901_gpio_pads,
985                 .num_pads = ARRAY_SIZE(gw5901_gpio_pads)/2,
986                 .dio_cfg = gw5901_dio,
987         },
988
989         /* GW5902 */
990         {
991                 .gpio_pads = gw5902_gpio_pads,
992                 .num_pads = ARRAY_SIZE(gw5902_gpio_pads)/2,
993                 .dio_cfg = gw5902_dio,
994                 .rs232_en = GP_RS232_EN,
995         },
996
997         /* GW5903 */
998         {
999                 .gpio_pads = gw5903_gpio_pads,
1000                 .num_pads = ARRAY_SIZE(gw5903_gpio_pads)/2,
1001                 .dio_cfg = gw5903_dio,
1002                 .dio_num = ARRAY_SIZE(gw5903_dio),
1003                 .mmc_cd = IMX_GPIO_NR(6, 11),
1004         },
1005
1006         /* GW5904 */
1007         {
1008                 .gpio_pads = gw5904_gpio_pads,
1009                 .num_pads = ARRAY_SIZE(gw5904_gpio_pads)/2,
1010                 .dio_cfg = gw5904_dio,
1011                 .dio_num = ARRAY_SIZE(gw5904_dio),
1012                 .mezz_pwren = IMX_GPIO_NR(2, 19),
1013                 .mezz_irq = IMX_GPIO_NR(2, 18),
1014         },
1015
1016         /* GW5905 */
1017         {
1018                 .gpio_pads = gw5905_gpio_pads,
1019                 .num_pads = ARRAY_SIZE(gw5905_gpio_pads)/2,
1020                 .wdis = IMX_GPIO_NR(7, 13),
1021         },
1022
1023         /* GW5906 */
1024         {
1025                 .gpio_pads = gw552x_gpio_pads,
1026                 .num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2,
1027                 .dio_cfg = gw5906_dio,
1028                 .dio_num = ARRAY_SIZE(gw5906_dio),
1029                 .usb_sel = IMX_GPIO_NR(1, 7),
1030                 .wdis = IMX_GPIO_NR(7, 12),
1031                 .msata_en = GP_MSATA_SEL,
1032         },
1033
1034         /* GW5907 */
1035         {
1036                 .gpio_pads = gw51xx_gpio_pads,
1037                 .num_pads = ARRAY_SIZE(gw51xx_gpio_pads)/2,
1038                 .dio_cfg = gw51xx_dio,
1039                 .dio_num = ARRAY_SIZE(gw51xx_dio),
1040                 .wdis = IMX_GPIO_NR(7, 12),
1041         },
1042
1043         /* GW5908 */
1044         {
1045                 .gpio_pads = gw53xx_gpio_pads,
1046                 .num_pads = ARRAY_SIZE(gw53xx_gpio_pads)/2,
1047                 .dio_cfg = gw53xx_dio,
1048                 .dio_num = ARRAY_SIZE(gw53xx_dio),
1049                 .mezz_pwren = IMX_GPIO_NR(2, 19),
1050                 .mezz_irq = IMX_GPIO_NR(2, 18),
1051                 .gps_shdn = IMX_GPIO_NR(1, 27),
1052                 .vidin_en = IMX_GPIO_NR(3, 31),
1053                 .wdis = IMX_GPIO_NR(7, 12),
1054                 .msata_en = GP_MSATA_SEL,
1055                 .rs232_en = GP_RS232_EN,
1056         },
1057
1058         /* GW5909 */
1059         {
1060                 .gpio_pads = gw5904_gpio_pads,
1061                 .num_pads = ARRAY_SIZE(gw5904_gpio_pads)/2,
1062                 .dio_cfg = gw5904_dio,
1063                 .dio_num = ARRAY_SIZE(gw5904_dio),
1064                 .mezz_pwren = IMX_GPIO_NR(2, 19),
1065                 .mezz_irq = IMX_GPIO_NR(2, 18),
1066         },
1067 };
1068
1069 #define SETUP_GPIO_OUTPUT(gpio, name, level) \
1070         gpio_request(gpio, name); \
1071         gpio_direction_output(gpio, level);
1072 #define SETUP_GPIO_INPUT(gpio, name) \
1073         gpio_request(gpio, name); \
1074         gpio_direction_input(gpio);
1075 void setup_iomux_gpio(int board, struct ventana_board_info *info)
1076 {
1077         if (board >= GW_UNKNOWN)
1078                 return;
1079
1080         /* board specific iomux */
1081         imx_iomux_v3_setup_multiple_pads(gpio_cfg[board].gpio_pads,
1082                                          gpio_cfg[board].num_pads);
1083
1084         /* RS232_EN# */
1085         if (gpio_cfg[board].rs232_en) {
1086                 gpio_request(gpio_cfg[board].rs232_en, "rs232_en#");
1087                 gpio_direction_output(gpio_cfg[board].rs232_en, 0);
1088         }
1089
1090         /* MSATA Enable - default to PCI */
1091         if (gpio_cfg[board].msata_en) {
1092                 gpio_request(gpio_cfg[board].msata_en, "msata_en");
1093                 gpio_direction_output(gpio_cfg[board].msata_en, 0);
1094         }
1095
1096         /* Expansion Mezzanine IO */
1097         if (gpio_cfg[board].mezz_pwren) {
1098                 gpio_request(gpio_cfg[board].mezz_pwren, "mezz_pwr");
1099                 gpio_direction_output(gpio_cfg[board].mezz_pwren, 0);
1100         }
1101         if (gpio_cfg[board].mezz_irq) {
1102                 gpio_request(gpio_cfg[board].mezz_irq, "mezz_irq#");
1103                 gpio_direction_input(gpio_cfg[board].mezz_irq);
1104         }
1105
1106         /* RS485 Transmit Enable */
1107         if (gpio_cfg[board].rs485en) {
1108                 gpio_request(gpio_cfg[board].rs485en, "rs485_en");
1109                 gpio_direction_output(gpio_cfg[board].rs485en, 0);
1110         }
1111
1112         /* GPS_SHDN */
1113         if (gpio_cfg[board].gps_shdn) {
1114                 gpio_request(gpio_cfg[board].gps_shdn, "gps_shdn");
1115                 gpio_direction_output(gpio_cfg[board].gps_shdn, 1);
1116         }
1117
1118         /* Analog video codec power enable */
1119         if (gpio_cfg[board].vidin_en) {
1120                 gpio_request(gpio_cfg[board].vidin_en, "anavidin_en");
1121                 gpio_direction_output(gpio_cfg[board].vidin_en, 1);
1122         }
1123
1124         /* DIOI2C_DIS# */
1125         if (gpio_cfg[board].dioi2c_en) {
1126                 gpio_request(gpio_cfg[board].dioi2c_en, "dioi2c_dis#");
1127                 gpio_direction_output(gpio_cfg[board].dioi2c_en, 0);
1128         }
1129
1130         /* PCICK_SSON: disable spread-spectrum clock */
1131         if (gpio_cfg[board].pcie_sson) {
1132                 gpio_request(gpio_cfg[board].pcie_sson, "pci_sson");
1133                 gpio_direction_output(gpio_cfg[board].pcie_sson, 0);
1134         }
1135
1136         /* USBOTG mux routing */
1137         if (gpio_cfg[board].usb_sel) {
1138                 gpio_request(gpio_cfg[board].usb_sel, "usb_pcisel");
1139                 gpio_direction_output(gpio_cfg[board].usb_sel, 0);
1140         }
1141
1142         /* PCISKT_WDIS# (Wireless disable GPIO to miniPCIe sockets) */
1143         if (gpio_cfg[board].wdis) {
1144                 gpio_request(gpio_cfg[board].wdis, "wlan_dis");
1145                 gpio_direction_output(gpio_cfg[board].wdis, 1);
1146         }
1147
1148         /* sense vselect pin to see if we support uhs-i */
1149         if (gpio_cfg[board].vsel_pin) {
1150                 gpio_request(gpio_cfg[board].vsel_pin, "sd3_vselect");
1151                 gpio_direction_input(gpio_cfg[board].vsel_pin);
1152                 gpio_cfg[board].usd_vsel = !gpio_get_value(gpio_cfg[board].vsel_pin);
1153         }
1154
1155         /* microSD CD */
1156         if (gpio_cfg[board].mmc_cd) {
1157                 gpio_request(gpio_cfg[board].mmc_cd, "sd_cd");
1158                 gpio_direction_input(gpio_cfg[board].mmc_cd);
1159         }
1160
1161         /* Anything else board specific */
1162         switch(board) {
1163         case GW560x:
1164                 gpio_request(IMX_GPIO_NR(4, 26), "12p0_en");
1165                 gpio_direction_output(IMX_GPIO_NR(4, 26), 1);
1166                 break;
1167         case GW5901:
1168                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 2), "can_stby", 0);
1169                 break;
1170         case GW5902:
1171                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 2), "can1_stby", 0);
1172                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(7, 3), "can2_stby", 0);
1173                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(7, 12), "5P0V_EN", 1);
1174                 break;
1175         case GW5903:
1176                 gpio_request(IMX_GPIO_NR(3, 31) , "usbh1-ehci_pwr");
1177                 gpio_direction_output(IMX_GPIO_NR(3, 31), 1);
1178                 gpio_request(IMX_GPIO_NR(4, 15) , "usbh2-otg_pwr");
1179                 gpio_direction_output(IMX_GPIO_NR(4, 15), 1);
1180                 gpio_request(IMX_GPIO_NR(4, 7) , "usbdpc_pwr");
1181                 gpio_direction_output(IMX_GPIO_NR(4, 15), 1);
1182                 gpio_request(IMX_GPIO_NR(1, 25) , "rgmii_en");
1183                 gpio_direction_output(IMX_GPIO_NR(1, 25), 1);
1184                 gpio_request(IMX_GPIO_NR(4, 6) , "touch_irq#");
1185                 gpio_direction_input(IMX_GPIO_NR(4, 6));
1186                 gpio_request(IMX_GPIO_NR(4, 8) , "touch_rst");
1187                 gpio_direction_output(IMX_GPIO_NR(4, 8), 1);
1188                 gpio_request(IMX_GPIO_NR(1, 7) , "bklt_12ven");
1189                 gpio_direction_output(IMX_GPIO_NR(1, 7), 1);
1190                 break;
1191         case GW5909:
1192         case GW5904:
1193                 gpio_request(IMX_GPIO_NR(4, 23), "rs485_en");
1194                 gpio_direction_output(IMX_GPIO_NR(4, 23), 0);
1195                 gpio_request(IMX_GPIO_NR(5, 11), "skt1_wdis#");
1196                 gpio_direction_output(IMX_GPIO_NR(5, 11), 1);
1197                 gpio_request(IMX_GPIO_NR(5, 12), "skt1_rst#");
1198                 gpio_direction_output(IMX_GPIO_NR(5, 12), 1);
1199                 gpio_request(IMX_GPIO_NR(5, 13), "skt2_wdis#");
1200                 gpio_direction_output(IMX_GPIO_NR(5, 13), 1);
1201                 gpio_request(IMX_GPIO_NR(1, 15), "m2_off#");
1202                 gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
1203                 gpio_request(IMX_GPIO_NR(1, 14), "m2_wdis#");
1204                 gpio_direction_output(IMX_GPIO_NR(1, 14), 1);
1205                 gpio_request(IMX_GPIO_NR(1, 13), "m2_rst#");
1206                 gpio_direction_output(IMX_GPIO_NR(1, 13), 1);
1207                 break;
1208         case GW5905:
1209                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 7), "usb_pcisel", 0);
1210                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 9), "lvds_cabc", 1);
1211                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 14), "mipi_pdwn", 1);
1212                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 15), "mipi_rst#", 0);
1213                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(2, 3), "emmy_pdwn#", 1);
1214                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(4, 5), "spk_shdn#", 0);
1215                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(4, 8), "touch_rst", 0);
1216                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(4, 6), "touch_irq", 0);
1217                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 5), "flash_en1", 0);
1218                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 6), "flash_en2", 0);
1219                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 14), "dect_rst#", 1);
1220                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 17), "codec_rst#", 0);
1221                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 26), "imu_den", 1);
1222                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(7, 12), "lvds_cabc", 0);
1223                 mdelay(100);
1224                 /*
1225                  * gauruntee touch controller comes out of reset with INT
1226                  * low for address
1227                  */
1228                 SETUP_GPIO_OUTPUT(IMX_GPIO_NR(4, 8), "touch_rst", 1);
1229                 break;
1230         }
1231 }
1232
1233 /* setup GPIO pinmux and default configuration per baseboard and env */
1234 void setup_board_gpio(int board, struct ventana_board_info *info)
1235 {
1236         const char *s;
1237         char arg[10];
1238         size_t len;
1239         int i;
1240         int quiet = simple_strtol(env_get("quiet"), NULL, 10);
1241
1242         if (board >= GW_UNKNOWN)
1243                 return;
1244
1245         /* RS232_EN# */
1246         if (gpio_cfg[board].rs232_en) {
1247                 gpio_direction_output(gpio_cfg[board].rs232_en,
1248                                       (hwconfig("rs232")) ? 0 : 1);
1249         }
1250
1251         /* MSATA Enable */
1252         if (gpio_cfg[board].msata_en && is_cpu_type(MXC_CPU_MX6Q)) {
1253                 gpio_direction_output(GP_MSATA_SEL,
1254                                       (hwconfig("msata")) ? 1 : 0);
1255         }
1256
1257         /* USBOTG Select (PCISKT or FrontPanel) */
1258         if (gpio_cfg[board].usb_sel) {
1259                 gpio_direction_output(gpio_cfg[board].usb_sel,
1260                                       (hwconfig("usb_pcisel")) ? 1 : 0);
1261         }
1262
1263         /*
1264          * Configure DIO pinmux/padctl registers
1265          * see IMX6DQRM/IMX6SDLRM IOMUXC_SW_PAD_CTL_PAD_* register definitions
1266          */
1267         for (i = 0; i < gpio_cfg[board].dio_num; i++) {
1268                 struct dio_cfg *cfg = &gpio_cfg[board].dio_cfg[i];
1269                 iomux_v3_cfg_t ctrl = DIO_PAD_CFG;
1270                 unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1;
1271
1272                 if (!cfg->gpio_padmux[0] && !cfg->gpio_padmux[1])
1273                         continue;
1274                 sprintf(arg, "dio%d", i);
1275                 if (!hwconfig(arg))
1276                         continue;
1277                 s = hwconfig_subarg(arg, "padctrl", &len);
1278                 if (s) {
1279                         ctrl = MUX_PAD_CTRL(hextoul(s, NULL)
1280                                             & 0x1ffff) | MUX_MODE_SION;
1281                 }
1282                 if (hwconfig_subarg_cmp(arg, "mode", "gpio")) {
1283                         if (!quiet) {
1284                                 printf("DIO%d:  GPIO%d_IO%02d (gpio-%d)\n", i,
1285                                        (cfg->gpio_param/32)+1,
1286                                        cfg->gpio_param%32,
1287                                        cfg->gpio_param);
1288                         }
1289                         imx_iomux_v3_setup_pad(cfg->gpio_padmux[cputype] |
1290                                                ctrl);
1291                         gpio_requestf(cfg->gpio_param, "dio%d", i);
1292                         gpio_direction_input(cfg->gpio_param);
1293                 } else if (hwconfig_subarg_cmp(arg, "mode", "pwm") &&
1294                            cfg->pwm_padmux) {
1295                         if (!cfg->pwm_param) {
1296                                 printf("DIO%d:  Error: pwm config invalid\n",
1297                                         i);
1298                                 continue;
1299                         }
1300                         if (!quiet)
1301                                 printf("DIO%d:  pwm%d\n", i, cfg->pwm_param);
1302                         imx_iomux_v3_setup_pad(cfg->pwm_padmux[cputype] |
1303                                                MUX_PAD_CTRL(ctrl));
1304                 }
1305         }
1306
1307         if (!quiet) {
1308                 if (gpio_cfg[board].msata_en && is_cpu_type(MXC_CPU_MX6Q)) {
1309                         printf("MSATA: %s\n", (hwconfig("msata") ?
1310                                "enabled" : "disabled"));
1311                 }
1312                 if (gpio_cfg[board].rs232_en) {
1313                         printf("RS232: %s\n", (hwconfig("rs232")) ?
1314                                "enabled" : "disabled");
1315                 }
1316         }
1317 }
1318
1319 /* setup board specific PMIC */
1320 void setup_pmic(void)
1321 {
1322         struct pmic *p;
1323         struct ventana_board_info ventana_info;
1324         int board = read_eeprom(CONFIG_I2C_GSC, &ventana_info);
1325         const int i2c_pmic = 1;
1326         u32 reg;
1327         char rev;
1328         int i;
1329
1330         /* determine board revision */
1331         rev = 'A';
1332         for (i = sizeof(ventana_info.model) - 1; i > 0; i--) {
1333                 if (ventana_info.model[i] >= 'A') {
1334                         rev = ventana_info.model[i];
1335                         break;
1336                 }
1337         }
1338
1339         i2c_set_bus_num(i2c_pmic);
1340
1341         /* configure PFUZE100 PMIC */
1342         if (!i2c_probe(CONFIG_POWER_PFUZE100_I2C_ADDR)) {
1343                 debug("probed PFUZE100@0x%x\n", CONFIG_POWER_PFUZE100_I2C_ADDR);
1344                 power_pfuze100_init(i2c_pmic);
1345                 p = pmic_get("PFUZE100");
1346                 if (p && !pmic_probe(p)) {
1347                         pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
1348                         printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
1349
1350                         /* Set VGEN1 to 1.5V and enable */
1351                         pmic_reg_read(p, PFUZE100_VGEN1VOL, &reg);
1352                         reg &= ~(LDO_VOL_MASK);
1353                         reg |= (LDOA_1_50V | LDO_EN);
1354                         pmic_reg_write(p, PFUZE100_VGEN1VOL, reg);
1355
1356                         /* Set SWBST to 5.0V and enable */
1357                         pmic_reg_read(p, PFUZE100_SWBSTCON1, &reg);
1358                         reg &= ~(SWBST_MODE_MASK | SWBST_VOL_MASK);
1359                         reg |= (SWBST_5_00V | (SWBST_MODE_AUTO << SWBST_MODE_SHIFT));
1360                         pmic_reg_write(p, PFUZE100_SWBSTCON1, reg);
1361
1362                         if (board == GW54xx && (rev == 'G')) {
1363                                 /* Disable VGEN5 */
1364                                 pmic_reg_write(p, PFUZE100_VGEN5VOL, 0);
1365
1366                                 /* Set VGEN6 to 2.5V and enable */
1367                                 pmic_reg_read(p, PFUZE100_VGEN6VOL, &reg);
1368                                 reg &= ~(LDO_VOL_MASK);
1369                                 reg |= (LDOB_2_50V | LDO_EN);
1370                                 pmic_reg_write(p, PFUZE100_VGEN6VOL, reg);
1371                         }
1372                 }
1373
1374                 /* put all switchers in continuous mode */
1375                 pmic_reg_read(p, PFUZE100_SW1ABMODE, &reg);
1376                 reg &= ~(SW_MODE_MASK);
1377                 reg |= PWM_PWM;
1378                 pmic_reg_write(p, PFUZE100_SW1ABMODE, reg);
1379
1380                 pmic_reg_read(p, PFUZE100_SW2MODE, &reg);
1381                 reg &= ~(SW_MODE_MASK);
1382                 reg |= PWM_PWM;
1383                 pmic_reg_write(p, PFUZE100_SW2MODE, reg);
1384
1385                 pmic_reg_read(p, PFUZE100_SW3AMODE, &reg);
1386                 reg &= ~(SW_MODE_MASK);
1387                 reg |= PWM_PWM;
1388                 pmic_reg_write(p, PFUZE100_SW3AMODE, reg);
1389
1390                 pmic_reg_read(p, PFUZE100_SW3BMODE, &reg);
1391                 reg &= ~(SW_MODE_MASK);
1392                 reg |= PWM_PWM;
1393                 pmic_reg_write(p, PFUZE100_SW3BMODE, reg);
1394
1395                 pmic_reg_read(p, PFUZE100_SW4MODE, &reg);
1396                 reg &= ~(SW_MODE_MASK);
1397                 reg |= PWM_PWM;
1398                 pmic_reg_write(p, PFUZE100_SW4MODE, reg);
1399         }
1400
1401         /* configure LTC3676 PMIC */
1402         else if (!i2c_probe(CONFIG_POWER_LTC3676_I2C_ADDR)) {
1403                 debug("probed LTC3676@0x%x\n", CONFIG_POWER_LTC3676_I2C_ADDR);
1404                 power_ltc3676_init(i2c_pmic);
1405                 p = pmic_get("LTC3676_PMIC");
1406                 if (!p || pmic_probe(p))
1407                         return;
1408                 puts("PMIC:  LTC3676\n");
1409                 /*
1410                  * set board-specific scalar for max CPU frequency
1411                  * per CPU based on the LDO enabled Operating Ranges
1412                  * defined in the respective IMX6DQ and IMX6SDL
1413                  * datasheets. The voltage resulting from the R1/R2
1414                  * feedback inputs on Ventana is 1308mV. Note that this
1415                  * is a bit shy of the Vmin of 1350mV in the datasheet
1416                  * for LDO enabled mode but is as high as we can go.
1417                  */
1418                 switch (board) {
1419                 case GW560x:
1420                         /* mask PGOOD during SW3 transition */
1421                         pmic_reg_write(p, LTC3676_DVB3B,
1422                                        0x1f | LTC3676_PGOOD_MASK);
1423                         /* set SW3 (VDD_ARM) */
1424                         pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
1425                         break;
1426                 case GW5903:
1427                         /* mask PGOOD during SW3 transition */
1428                         pmic_reg_write(p, LTC3676_DVB3B,
1429                                        0x1f | LTC3676_PGOOD_MASK);
1430                         /* set SW3 (VDD_ARM) */
1431                         pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
1432
1433                         /* mask PGOOD during SW4 transition */
1434                         pmic_reg_write(p, LTC3676_DVB4B,
1435                                        0x1f | LTC3676_PGOOD_MASK);
1436                         /* set SW4 (VDD_SOC) */
1437                         pmic_reg_write(p, LTC3676_DVB4A, 0x1f);
1438                         break;
1439                 case GW5905:
1440                         /* mask PGOOD during SW1 transition */
1441                         pmic_reg_write(p, LTC3676_DVB1B,
1442                                        0x1f | LTC3676_PGOOD_MASK);
1443                         /* set SW1 (VDD_ARM) */
1444                         pmic_reg_write(p, LTC3676_DVB1A, 0x1f);
1445
1446                         /* mask PGOOD during SW3 transition */
1447                         pmic_reg_write(p, LTC3676_DVB3B,
1448                                        0x1f | LTC3676_PGOOD_MASK);
1449                         /* set SW3 (VDD_SOC) */
1450                         pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
1451                         break;
1452                 default:
1453                         /* mask PGOOD during SW1 transition */
1454                         pmic_reg_write(p, LTC3676_DVB1B,
1455                                        0x1f | LTC3676_PGOOD_MASK);
1456                         /* set SW1 (VDD_SOC) */
1457                         pmic_reg_write(p, LTC3676_DVB1A, 0x1f);
1458
1459                         /* mask PGOOD during SW3 transition */
1460                         pmic_reg_write(p, LTC3676_DVB3B,
1461                                        0x1f | LTC3676_PGOOD_MASK);
1462                         /* set SW3 (VDD_ARM) */
1463                         pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
1464                 }
1465
1466                 /* put all switchers in continuous mode */
1467                 pmic_reg_write(p, LTC3676_BUCK1, 0xc0);
1468                 pmic_reg_write(p, LTC3676_BUCK2, 0xc0);
1469                 pmic_reg_write(p, LTC3676_BUCK3, 0xc0);
1470                 pmic_reg_write(p, LTC3676_BUCK4, 0xc0);
1471         }
1472 }
1473
1474 #include <fdt_support.h>
1475 #define WDOG1_ADDR      0x20bc000
1476 #define WDOG2_ADDR      0x20c0000
1477 #define GPIO3_ADDR      0x20a4000
1478 #define USDHC3_ADDR     0x2198000
1479
1480 static void ft_board_wdog_fixup(void *blob, phys_addr_t addr)
1481 {
1482         int off = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-wdt", addr);
1483
1484         if (off) {
1485                 fdt_delprop(blob, off, "ext-reset-output");
1486                 fdt_delprop(blob, off, "fsl,ext-reset-output");
1487         }
1488 }
1489
1490 void ft_early_fixup(void *blob, int board_type)
1491 {
1492         struct ventana_board_info *info = &ventana_info;
1493         char rev = 0;
1494         int i;
1495
1496         /* determine board revision */
1497         for (i = sizeof(ventana_info.model) - 1; i > 0; i--) {
1498                 if (ventana_info.model[i] >= 'A') {
1499                         rev = ventana_info.model[i];
1500                         break;
1501                 }
1502         }
1503
1504         /*
1505          * Board model specific fixups
1506          */
1507         switch (board_type) {
1508         case GW51xx:
1509                 /*
1510                  * disable wdog node for GW51xx-A/B to work around
1511                  * errata causing wdog timer to be unreliable.
1512                  */
1513                 if (rev >= 'A' && rev < 'C') {
1514                         i = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-wdt",
1515                                                           WDOG1_ADDR);
1516                         if (i)
1517                                 fdt_status_disabled(blob, i);
1518                 }
1519
1520                 /* GW51xx-E adds WDOG1_B external reset */
1521                 if (rev < 'E')
1522                         ft_board_wdog_fixup(blob, WDOG1_ADDR);
1523                 break;
1524
1525         case GW52xx:
1526                 /* GW522x Uses GPIO3_IO23 instead of GPIO1_IO29 */
1527                 if (info->model[4] == '2') {
1528                         u32 handle = 0;
1529                         u32 *range = NULL;
1530
1531                         i = fdt_node_offset_by_compatible(blob, -1,
1532                                                           "fsl,imx6q-pcie");
1533                         if (i)
1534                                 range = (u32 *)fdt_getprop(blob, i,
1535                                                            "reset-gpio", NULL);
1536
1537                         if (range) {
1538                                 i = fdt_node_offset_by_compat_reg(blob,
1539                                         "fsl,imx6q-gpio", GPIO3_ADDR);
1540                                 if (i)
1541                                         handle = fdt_get_phandle(blob, i);
1542                                 if (handle) {
1543                                         range[0] = cpu_to_fdt32(handle);
1544                                         range[1] = cpu_to_fdt32(23);
1545                                 }
1546                         }
1547
1548                         /* these have broken usd_vsel */
1549                         if (strstr((const char *)info->model, "SP318-B") ||
1550                             strstr((const char *)info->model, "SP331-B"))
1551                                 gpio_cfg[board_type].usd_vsel = 0;
1552
1553                         /* GW522x-B adds WDOG1_B external reset */
1554                         if (rev < 'B')
1555                                 ft_board_wdog_fixup(blob, WDOG1_ADDR);
1556                 }
1557
1558                 /* GW520x-E adds WDOG1_B external reset */
1559                 else if (info->model[4] == '0' && rev < 'E')
1560                         ft_board_wdog_fixup(blob, WDOG1_ADDR);
1561                 break;
1562
1563         case GW53xx:
1564                 /* GW53xx-E adds WDOG1_B external reset */
1565                 if (rev < 'E')
1566                         ft_board_wdog_fixup(blob, WDOG1_ADDR);
1567                 break;
1568
1569         case GW54xx:
1570                 /*
1571                  * disable serial2 node for GW54xx for compatibility with older
1572                  * 3.10.x kernel that improperly had this node enabled in the DT
1573                  */
1574                 fdt_set_status_by_alias(blob, "serial2", FDT_STATUS_DISABLED,
1575                                         0);
1576
1577                 /* GW54xx-E adds WDOG2_B external reset */
1578                 if (rev < 'E')
1579                         ft_board_wdog_fixup(blob, WDOG2_ADDR);
1580                 break;
1581
1582         case GW551x:
1583                 /* GW551x-C adds WDOG1_B external reset */
1584                 if (rev < 'C')
1585                         ft_board_wdog_fixup(blob, WDOG1_ADDR);
1586                 break;
1587         case GW5901:
1588         case GW5902:
1589                 /* GW5901/GW5901 revB adds WDOG1_B as an external reset */
1590                 if (rev < 'B')
1591                         ft_board_wdog_fixup(blob, WDOG1_ADDR);
1592                 break;
1593         }
1594
1595         /* remove no-1-8-v if UHS-I support is present */
1596         if (gpio_cfg[board_type].usd_vsel) {
1597                 debug("Enabling UHS-I support\n");
1598                 i = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-usdhc",
1599                                                   USDHC3_ADDR);
1600                 if (i)
1601                         fdt_delprop(blob, i, "no-1-8-v");
1602         }
1603 }
1604
1605 #ifdef CONFIG_FSL_ESDHC_IMX
1606 static struct fsl_esdhc_cfg usdhc_cfg[2];
1607
1608 int board_mmc_init(struct bd_info *bis)
1609 {
1610         struct ventana_board_info ventana_info;
1611         int board_type = read_eeprom(CONFIG_I2C_GSC, &ventana_info);
1612         int ret;
1613
1614         switch (board_type) {
1615         case GW52xx:
1616         case GW53xx:
1617         case GW54xx:
1618         case GW553x:
1619                 /* usdhc3: 4bit microSD */
1620                 SETUP_IOMUX_PADS(usdhc3_pads);
1621                 usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
1622                 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
1623                 usdhc_cfg[0].max_bus_width = 4;
1624                 return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
1625         case GW560x:
1626                 /* usdhc2: 8-bit eMMC */
1627                 SETUP_IOMUX_PADS(gw560x_emmc_sd2_pads);
1628                 usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
1629                 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
1630                 usdhc_cfg[0].max_bus_width = 8;
1631                 ret = fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
1632                 if (ret)
1633                         return ret;
1634                 /* usdhc3: 4-bit microSD */
1635                 SETUP_IOMUX_PADS(usdhc3_pads);
1636                 usdhc_cfg[1].esdhc_base = USDHC3_BASE_ADDR;
1637                 usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
1638                 usdhc_cfg[1].max_bus_width = 4;
1639                 return fsl_esdhc_initialize(bis, &usdhc_cfg[1]);
1640         case GW5903:
1641                 /* usdhc3: 8-bit eMMC */
1642                 SETUP_IOMUX_PADS(gw5904_emmc_pads);
1643                 usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
1644                 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
1645                 usdhc_cfg[0].max_bus_width = 8;
1646                 ret = fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
1647                 if (ret)
1648                         return ret;
1649                 /* usdhc2: 4-bit microSD */
1650                 SETUP_IOMUX_PADS(gw5904_mmc_pads);
1651                 usdhc_cfg[1].esdhc_base = USDHC2_BASE_ADDR;
1652                 usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
1653                 usdhc_cfg[1].max_bus_width = 4;
1654                 return fsl_esdhc_initialize(bis, &usdhc_cfg[1]);
1655         case GW5904:
1656         case GW5905:
1657         case GW5909:
1658                 /* usdhc3: 8bit eMMC */
1659                 SETUP_IOMUX_PADS(gw5904_emmc_pads);
1660                 usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
1661                 usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
1662                 usdhc_cfg[0].max_bus_width = 8;
1663                 return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
1664         default:
1665                 /* doesn't have MMC */
1666                 printf("None");
1667                 return -1;
1668         }
1669 }
1670
1671 int board_mmc_getcd(struct mmc *mmc)
1672 {
1673         struct ventana_board_info ventana_info;
1674         struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
1675         int board = read_eeprom(CONFIG_I2C_GSC, &ventana_info);
1676         int gpio = gpio_cfg[board].mmc_cd;
1677
1678         /* Card Detect */
1679         switch (board) {
1680         case GW560x:
1681                 /* emmc is always present */
1682                 if (cfg->esdhc_base == USDHC2_BASE_ADDR)
1683                         return 1;
1684                 break;
1685         case GW5903:
1686         case GW5904:
1687         case GW5905:
1688         case GW5909:
1689                 /* emmc is always present */
1690                 if (cfg->esdhc_base == USDHC3_BASE_ADDR)
1691                         return 1;
1692                 break;
1693         }
1694
1695         if (gpio) {
1696                 debug("%s: gpio%d=%d\n", __func__, gpio, gpio_get_value(gpio));
1697                 return !gpio_get_value(gpio);
1698         }
1699
1700         return -1;
1701 }
1702
1703 #endif /* CONFIG_FSL_ESDHC_IMX */