]> git.sur5r.net Git - u-boot/blob - board/gateworks/gw_ventana/common.c
d60989476fc14716c1ba725b0abe03135054851c
[u-boot] / board / gateworks / gw_ventana / common.c
1 /*
2  * Copyright (C) 2013 Gateworks Corporation
3  *
4  * Author: Tim Harvey <tharvey@gateworks.com>
5  *
6  * SPDX-License-Identifier: GPL-2.0+
7  */
8
9 #include <asm/arch/clock.h>
10 #include <asm/arch/mx6-pins.h>
11 #include <asm/arch/sys_proto.h>
12 #include <asm/gpio.h>
13 #include <asm/imx-common/mxc_i2c.h>
14 #include <fsl_esdhc.h>
15 #include <hwconfig.h>
16 #include <power/pmic.h>
17 #include <power/ltc3676_pmic.h>
18 #include <power/pfuze100_pmic.h>
19
20 #include "common.h"
21
22 /* UART1: Function varies per baseboard */
23 static iomux_v3_cfg_t const uart1_pads[] = {
24         IOMUX_PADS(PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
25         IOMUX_PADS(PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
26 };
27
28 /* UART2: Serial Console */
29 static iomux_v3_cfg_t const uart2_pads[] = {
30         IOMUX_PADS(PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
31         IOMUX_PADS(PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
32 };
33
34 void setup_iomux_uart(void)
35 {
36         SETUP_IOMUX_PADS(uart1_pads);
37         SETUP_IOMUX_PADS(uart2_pads);
38 }
39
40 /* MMC */
41 static iomux_v3_cfg_t const gw5904_emmc_pads[] = {
42         IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
43         IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
44         IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
45         IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
46         IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
47         IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
48         IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
49         IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
50         IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
51         IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
52         IOMUX_PADS(PAD_SD3_RST__SD3_RESET  | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
53 };
54 static iomux_v3_cfg_t const usdhc3_pads[] = {
55         IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
56         IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
57         IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
58         IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
59         IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
60         IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
61         IOMUX_PADS(PAD_SD3_DAT5__GPIO7_IO00  | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
62 };
63
64 /* I2C1: GSC */
65 static struct i2c_pads_info mx6q_i2c_pad_info0 = {
66         .scl = {
67                 .i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
68                 .gpio_mode = MX6Q_PAD_EIM_D21__GPIO3_IO21 | PC,
69                 .gp = IMX_GPIO_NR(3, 21)
70         },
71         .sda = {
72                 .i2c_mode = MX6Q_PAD_EIM_D28__I2C1_SDA | PC,
73                 .gpio_mode = MX6Q_PAD_EIM_D28__GPIO3_IO28 | PC,
74                 .gp = IMX_GPIO_NR(3, 28)
75         }
76 };
77 static struct i2c_pads_info mx6dl_i2c_pad_info0 = {
78         .scl = {
79                 .i2c_mode = MX6DL_PAD_EIM_D21__I2C1_SCL | PC,
80                 .gpio_mode = MX6DL_PAD_EIM_D21__GPIO3_IO21 | PC,
81                 .gp = IMX_GPIO_NR(3, 21)
82         },
83         .sda = {
84                 .i2c_mode = MX6DL_PAD_EIM_D28__I2C1_SDA | PC,
85                 .gpio_mode = MX6DL_PAD_EIM_D28__GPIO3_IO28 | PC,
86                 .gp = IMX_GPIO_NR(3, 28)
87         }
88 };
89
90 /* I2C2: PMIC/PCIe Switch/PCIe Clock/Mezz */
91 static struct i2c_pads_info mx6q_i2c_pad_info1 = {
92         .scl = {
93                 .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
94                 .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | PC,
95                 .gp = IMX_GPIO_NR(4, 12)
96         },
97         .sda = {
98                 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
99                 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
100                 .gp = IMX_GPIO_NR(4, 13)
101         }
102 };
103 static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
104         .scl = {
105                 .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | PC,
106                 .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | PC,
107                 .gp = IMX_GPIO_NR(4, 12)
108         },
109         .sda = {
110                 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
111                 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
112                 .gp = IMX_GPIO_NR(4, 13)
113         }
114 };
115
116 /* I2C3: Misc/Expansion */
117 static struct i2c_pads_info mx6q_i2c_pad_info2 = {
118         .scl = {
119                 .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
120                 .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
121                 .gp = IMX_GPIO_NR(1, 3)
122         },
123         .sda = {
124                 .i2c_mode = MX6Q_PAD_GPIO_6__I2C3_SDA | PC,
125                 .gpio_mode = MX6Q_PAD_GPIO_6__GPIO1_IO06 | PC,
126                 .gp = IMX_GPIO_NR(1, 6)
127         }
128 };
129 static struct i2c_pads_info mx6dl_i2c_pad_info2 = {
130         .scl = {
131                 .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
132                 .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
133                 .gp = IMX_GPIO_NR(1, 3)
134         },
135         .sda = {
136                 .i2c_mode = MX6DL_PAD_GPIO_6__I2C3_SDA | PC,
137                 .gpio_mode = MX6DL_PAD_GPIO_6__GPIO1_IO06 | PC,
138                 .gp = IMX_GPIO_NR(1, 6)
139         }
140 };
141
142 void setup_ventana_i2c(void)
143 {
144         if (is_cpu_type(MXC_CPU_MX6Q)) {
145                 setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info0);
146                 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
147                 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info2);
148         } else {
149                 setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info0);
150                 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
151                 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info2);
152         }
153 }
154
155 /*
156  * Baseboard specific GPIO
157  */
158
159 /* prototype */
160 static iomux_v3_cfg_t const gwproto_gpio_pads[] = {
161         /* RS232_EN# */
162         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
163         /* PANLEDG# */
164         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
165         /* PANLEDR# */
166         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
167         /* LOCLED# */
168         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
169         /* RS485_EN */
170         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
171         /* IOEXP_PWREN# */
172         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
173         /* IOEXP_IRQ# */
174         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
175         /* VID_EN */
176         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
177         /* DIOI2C_DIS# */
178         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
179         /* PCICK_SSON */
180         IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20 | DIO_PAD_CFG),
181         /* PCI_RST# */
182         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
183 };
184
185 static iomux_v3_cfg_t const gw51xx_gpio_pads[] = {
186         /* PANLEDG# */
187         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
188         /* PANLEDR# */
189         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
190         /* IOEXP_PWREN# */
191         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
192         /* IOEXP_IRQ# */
193         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
194
195         /* GPS_SHDN */
196         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
197         /* VID_PWR */
198         IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
199         /* PCI_RST# */
200         IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
201         /* PCIESKT_WDIS# */
202         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
203 };
204
205 static iomux_v3_cfg_t const gw52xx_gpio_pads[] = {
206         /* SD3_VSELECT */
207         IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
208         /* RS232_EN# */
209         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
210         /* MSATA_EN */
211         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
212         /* PANLEDG# */
213         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
214         /* PANLEDR# */
215         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
216         /* IOEXP_PWREN# */
217         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
218         /* IOEXP_IRQ# */
219         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
220         /* CAN_STBY */
221         IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
222         /* MX6_LOCLED# */
223         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
224         /* GPS_SHDN */
225         IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
226         /* USBOTG_SEL */
227         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
228         /* VID_PWR */
229         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
230         /* PCI_RST# */
231         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
232         /* PCI_RST# (GW522x) */
233         IOMUX_PADS(PAD_EIM_D23__GPIO3_IO23 | DIO_PAD_CFG),
234         /* RS485_EN */
235         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
236         /* PCIESKT_WDIS# */
237         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
238 };
239
240 static iomux_v3_cfg_t const gw53xx_gpio_pads[] = {
241         /* SD3_VSELECT */
242         IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
243         /* RS232_EN# */
244         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
245         /* MSATA_EN */
246         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
247         /* CAN_STBY */
248         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
249         /* USB_HUBRST# */
250         IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
251         /* PANLEDG# */
252         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
253         /* PANLEDR# */
254         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
255         /* MX6_LOCLED# */
256         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
257         /* IOEXP_PWREN# */
258         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
259         /* IOEXP_IRQ# */
260         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
261         /* DIOI2C_DIS# */
262         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
263         /* GPS_SHDN */
264         IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
265         /* VID_EN */
266         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
267         /* PCI_RST# */
268         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
269         /* RS485_EN */
270         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
271         /* PCIESKT_WDIS# */
272         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
273 };
274
275 static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
276         /* SD3_VSELECT */
277         IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
278         /* RS232_EN# */
279         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
280         /* MSATA_EN */
281         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
282         /* CAN_STBY */
283         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
284         /* PANLEDG# */
285         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
286         /* PANLEDR# */
287         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
288         /* MX6_LOCLED# */
289         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
290         /* USB_HUBRST# */
291         IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16 | DIO_PAD_CFG),
292         /* MIPI_DIO */
293         IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | DIO_PAD_CFG),
294         /* RS485_EN */
295         IOMUX_PADS(PAD_EIM_D24__GPIO3_IO24 | DIO_PAD_CFG),
296         /* IOEXP_PWREN# */
297         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
298         /* IOEXP_IRQ# */
299         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
300         /* DIOI2C_DIS# */
301         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
302         /* PCI_RST# */
303         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
304         /* VID_EN */
305         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
306         /* RS485_EN */
307         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
308         /* PCIESKT_WDIS# */
309         IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
310 };
311
312 static iomux_v3_cfg_t const gw551x_gpio_pads[] = {
313         /* CAN_STBY */
314         IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
315         /* PANLED# */
316         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
317         /* PCI_RST# */
318         IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
319         /* PCIESKT_WDIS# */
320         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
321 };
322
323 static iomux_v3_cfg_t const gw552x_gpio_pads[] = {
324         /* MSATA_EN */
325         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
326         /* USBOTG_SEL */
327         IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
328         /* USB_HUBRST# */
329         IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
330         /* PANLEDG# */
331         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
332         /* PANLEDR# */
333         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
334         /* MX6_LOCLED# */
335         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
336         /* PCI_RST# */
337         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
338         /* MX6_DIO[4:9] */
339         IOMUX_PADS(PAD_CSI0_PIXCLK__GPIO5_IO18 | DIO_PAD_CFG),
340         IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
341         IOMUX_PADS(PAD_CSI0_VSYNC__GPIO5_IO21 | DIO_PAD_CFG),
342         IOMUX_PADS(PAD_CSI0_DAT4__GPIO5_IO22 | DIO_PAD_CFG),
343         IOMUX_PADS(PAD_CSI0_DAT5__GPIO5_IO23 | DIO_PAD_CFG),
344         IOMUX_PADS(PAD_CSI0_DAT7__GPIO5_IO25 | DIO_PAD_CFG),
345         /* PCIEGBE1_OFF# */
346         IOMUX_PADS(PAD_GPIO_1__GPIO1_IO01 | DIO_PAD_CFG),
347         /* PCIEGBE2_OFF# */
348         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
349         /* PCIESKT_WDIS# */
350         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
351 };
352
353 static iomux_v3_cfg_t const gw553x_gpio_pads[] = {
354         /* SD3_VSELECT */
355         IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
356         /* PANLEDG# */
357         IOMUX_PADS(PAD_KEY_COL2__GPIO4_IO10 | DIO_PAD_CFG),
358         /* PANLEDR# */
359         IOMUX_PADS(PAD_KEY_ROW2__GPIO4_IO11 | DIO_PAD_CFG),
360         /* VID_PWR */
361         IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
362         /* PCI_RST# */
363         IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
364         /* PCIESKT_WDIS# */
365         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
366 };
367
368 static iomux_v3_cfg_t const gw5904_gpio_pads[] = {
369         /* USB_HUBRST# */
370         IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
371         /* PANLEDG# */
372         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
373         /* PANLEDR# */
374         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
375         /* MX6_LOCLED# */
376         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
377         /* IOEXP_PWREN# */
378         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
379         /* IOEXP_IRQ# */
380         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
381         /* DIOI2C_DIS# */
382         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
383         /* UART_RS485 */
384         IOMUX_PADS(PAD_DISP0_DAT2__GPIO4_IO23 | DIO_PAD_CFG),
385         /* UART_HALF */
386         IOMUX_PADS(PAD_DISP0_DAT3__GPIO4_IO24 | DIO_PAD_CFG),
387         /* SKT1_WDIS# */
388         IOMUX_PADS(PAD_DISP0_DAT17__GPIO5_IO11 | DIO_PAD_CFG),
389         /* SKT1_RST# */
390         IOMUX_PADS(PAD_DISP0_DAT18__GPIO5_IO12 | DIO_PAD_CFG),
391         /* SKT2_WDIS# */
392         IOMUX_PADS(PAD_DISP0_DAT19__GPIO5_IO13 | DIO_PAD_CFG),
393         /* SKT2_RST# */
394         IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
395         /* M2_OFF# */
396         IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15 | DIO_PAD_CFG),
397         /* M2_WDIS# */
398         IOMUX_PADS(PAD_SD2_DAT1__GPIO1_IO14 | DIO_PAD_CFG),
399         /* M2_RST# */
400         IOMUX_PADS(PAD_SD2_DAT2__GPIO1_IO13 | DIO_PAD_CFG),
401 };
402
403 /* Digital I/O */
404 struct dio_cfg gw51xx_dio[] = {
405         {
406                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
407                 IMX_GPIO_NR(1, 16),
408                 { 0, 0 },
409                 0
410         },
411         {
412                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
413                 IMX_GPIO_NR(1, 19),
414                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
415                 2
416         },
417         {
418                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
419                 IMX_GPIO_NR(1, 17),
420                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
421                 3
422         },
423         {
424                 { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
425                 IMX_GPIO_NR(1, 18),
426                 { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
427                 4
428         },
429 };
430
431 struct dio_cfg gw52xx_dio[] = {
432         {
433                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
434                 IMX_GPIO_NR(1, 16),
435                 { 0, 0 },
436                 0
437         },
438         {
439                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
440                 IMX_GPIO_NR(1, 19),
441                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
442                 2
443         },
444         {
445                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
446                 IMX_GPIO_NR(1, 17),
447                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
448                 3
449         },
450         {
451                 { IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
452                 IMX_GPIO_NR(1, 20),
453                 { 0, 0 },
454                 0
455         },
456 };
457
458 struct dio_cfg gw53xx_dio[] = {
459         {
460                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
461                 IMX_GPIO_NR(1, 16),
462                 { 0, 0 },
463                 0
464         },
465         {
466                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
467                 IMX_GPIO_NR(1, 19),
468                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
469                 2
470         },
471         {
472                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
473                 IMX_GPIO_NR(1, 17),
474                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
475                 3
476         },
477         {
478                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
479                 IMX_GPIO_NR(1, 20),
480                 { 0, 0 },
481                 0
482         },
483 };
484
485 struct dio_cfg gw54xx_dio[] = {
486         {
487                 { IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09) },
488                 IMX_GPIO_NR(1, 9),
489                 { IOMUX_PADS(PAD_GPIO_9__PWM1_OUT) },
490                 1
491         },
492         {
493                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
494                 IMX_GPIO_NR(1, 19),
495                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
496                 2
497         },
498         {
499                 { IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09) },
500                 IMX_GPIO_NR(2, 9),
501                 { IOMUX_PADS(PAD_SD4_DAT1__PWM3_OUT) },
502                 3
503         },
504         {
505                 { IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10) },
506                 IMX_GPIO_NR(2, 10),
507                 { IOMUX_PADS(PAD_SD4_DAT2__PWM4_OUT) },
508                 4
509         },
510 };
511
512 struct dio_cfg gw551x_dio[] = {
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
527 struct dio_cfg gw552x_dio[] = {
528         {
529                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
530                 IMX_GPIO_NR(1, 16),
531                 { 0, 0 },
532                 0
533         },
534         {
535                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
536                 IMX_GPIO_NR(1, 19),
537                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
538                 2
539         },
540         {
541                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
542                 IMX_GPIO_NR(1, 17),
543                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
544                 3
545         },
546         {
547                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
548                 IMX_GPIO_NR(1, 20),
549                 { 0, 0 },
550                 0
551         },
552         {
553                 {IOMUX_PADS(PAD_CSI0_PIXCLK__GPIO5_IO18) },
554                 IMX_GPIO_NR(5, 18),
555                 { 0, 0 },
556                 0
557         },
558         {
559                 {IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20) },
560                 IMX_GPIO_NR(5, 20),
561                 { 0, 0 },
562                 0
563         },
564         {
565                 {IOMUX_PADS(PAD_CSI0_VSYNC__GPIO5_IO21) },
566                 IMX_GPIO_NR(5, 21),
567                 { 0, 0 },
568                 0
569         },
570         {
571                 {IOMUX_PADS(PAD_CSI0_DAT4__GPIO5_IO22) },
572                 IMX_GPIO_NR(5, 22),
573                 { 0, 0 },
574                 0
575         },
576         {
577                 {IOMUX_PADS(PAD_CSI0_DAT5__GPIO5_IO23) },
578                 IMX_GPIO_NR(5, 23),
579                 { 0, 0 },
580                 0
581         },
582         {
583                 {IOMUX_PADS(PAD_CSI0_DAT7__GPIO5_IO25) },
584                 IMX_GPIO_NR(5, 25),
585                 { 0, 0 },
586                 0
587         },
588 };
589
590 struct dio_cfg gw553x_dio[] = {
591         {
592                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
593                 IMX_GPIO_NR(1, 16),
594                 { 0, 0 },
595                 0
596         },
597         {
598                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
599                 IMX_GPIO_NR(1, 19),
600                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
601                 2
602         },
603         {
604                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
605                 IMX_GPIO_NR(1, 17),
606                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
607                 3
608         },
609         {
610                 { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
611                 IMX_GPIO_NR(1, 18),
612                 { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
613                 4
614         },
615 };
616
617 struct dio_cfg gw5904_dio[] = {
618         {
619                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
620                 IMX_GPIO_NR(1, 16),
621                 { 0, 0 },
622                 0
623         },
624         {
625                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
626                 IMX_GPIO_NR(1, 19),
627                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
628                 2
629         },
630         {
631                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
632                 IMX_GPIO_NR(1, 17),
633                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
634                 3
635         },
636         {
637                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
638                 IMX_GPIO_NR(1, 20),
639                 { 0, 0 },
640                 0
641         },
642         {
643                 {IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00) },
644                 IMX_GPIO_NR(2, 0),
645                 { 0, 0 },
646                 0
647         },
648         {
649                 {IOMUX_PADS(PAD_NANDF_D1__GPIO2_IO01) },
650                 IMX_GPIO_NR(2, 1),
651                 { 0, 0 },
652                 0
653         },
654         {
655                 {IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02) },
656                 IMX_GPIO_NR(2, 2),
657                 { 0, 0 },
658                 0
659         },
660         {
661                 {IOMUX_PADS(PAD_NANDF_D3__GPIO2_IO03) },
662                 IMX_GPIO_NR(2, 3),
663                 { 0, 0 },
664                 0
665         },
666         {
667                 {IOMUX_PADS(PAD_NANDF_D4__GPIO2_IO04) },
668                 IMX_GPIO_NR(2, 4),
669                 { 0, 0 },
670                 0
671         },
672         {
673                 {IOMUX_PADS(PAD_NANDF_D5__GPIO2_IO05) },
674                 IMX_GPIO_NR(2, 5),
675                 { 0, 0 },
676                 0
677         },
678         {
679                 {IOMUX_PADS(PAD_NANDF_D6__GPIO2_IO06) },
680                 IMX_GPIO_NR(2, 6),
681                 { 0, 0 },
682                 0
683         },
684         {
685                 {IOMUX_PADS(PAD_NANDF_D7__GPIO2_IO07) },
686                 IMX_GPIO_NR(2, 7),
687                 { 0, 0 },
688                 0
689         },
690 };
691
692 /*
693  * Board Specific GPIO
694  */
695 struct ventana gpio_cfg[GW_UNKNOWN] = {
696         /* GW5400proto */
697         {
698                 .gpio_pads = gw54xx_gpio_pads,
699                 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
700                 .dio_cfg = gw54xx_dio,
701                 .dio_num = ARRAY_SIZE(gw54xx_dio),
702                 .leds = {
703                         IMX_GPIO_NR(4, 6),
704                         IMX_GPIO_NR(4, 10),
705                         IMX_GPIO_NR(4, 15),
706                 },
707                 .pcie_rst = IMX_GPIO_NR(1, 29),
708                 .mezz_pwren = IMX_GPIO_NR(4, 7),
709                 .mezz_irq = IMX_GPIO_NR(4, 9),
710                 .rs485en = IMX_GPIO_NR(3, 24),
711                 .dioi2c_en = IMX_GPIO_NR(4,  5),
712                 .pcie_sson = IMX_GPIO_NR(1, 20),
713                 .otgpwr_en = IMX_GPIO_NR(3, 22),
714                 .mmc_cd = IMX_GPIO_NR(7, 0),
715         },
716
717         /* GW51xx */
718         {
719                 .gpio_pads = gw51xx_gpio_pads,
720                 .num_pads = ARRAY_SIZE(gw51xx_gpio_pads)/2,
721                 .dio_cfg = gw51xx_dio,
722                 .dio_num = ARRAY_SIZE(gw51xx_dio),
723                 .leds = {
724                         IMX_GPIO_NR(4, 6),
725                         IMX_GPIO_NR(4, 10),
726                 },
727                 .pcie_rst = IMX_GPIO_NR(1, 0),
728                 .mezz_pwren = IMX_GPIO_NR(2, 19),
729                 .mezz_irq = IMX_GPIO_NR(2, 18),
730                 .gps_shdn = IMX_GPIO_NR(1, 2),
731                 .vidin_en = IMX_GPIO_NR(5, 20),
732                 .wdis = IMX_GPIO_NR(7, 12),
733                 .otgpwr_en = IMX_GPIO_NR(3, 22),
734         },
735
736         /* GW52xx */
737         {
738                 .gpio_pads = gw52xx_gpio_pads,
739                 .num_pads = ARRAY_SIZE(gw52xx_gpio_pads)/2,
740                 .dio_cfg = gw52xx_dio,
741                 .dio_num = ARRAY_SIZE(gw52xx_dio),
742                 .leds = {
743                         IMX_GPIO_NR(4, 6),
744                         IMX_GPIO_NR(4, 7),
745                         IMX_GPIO_NR(4, 15),
746                 },
747                 .pcie_rst = IMX_GPIO_NR(1, 29),
748                 .mezz_pwren = IMX_GPIO_NR(2, 19),
749                 .mezz_irq = IMX_GPIO_NR(2, 18),
750                 .gps_shdn = IMX_GPIO_NR(1, 27),
751                 .vidin_en = IMX_GPIO_NR(3, 31),
752                 .usb_sel = IMX_GPIO_NR(1, 2),
753                 .wdis = IMX_GPIO_NR(7, 12),
754                 .msata_en = GP_MSATA_SEL,
755                 .rs232_en = GP_RS232_EN,
756                 .otgpwr_en = IMX_GPIO_NR(3, 22),
757                 .vsel_pin = IMX_GPIO_NR(6, 14),
758                 .mmc_cd = IMX_GPIO_NR(7, 0),
759         },
760
761         /* GW53xx */
762         {
763                 .gpio_pads = gw53xx_gpio_pads,
764                 .num_pads = ARRAY_SIZE(gw53xx_gpio_pads)/2,
765                 .dio_cfg = gw53xx_dio,
766                 .dio_num = ARRAY_SIZE(gw53xx_dio),
767                 .leds = {
768                         IMX_GPIO_NR(4, 6),
769                         IMX_GPIO_NR(4, 7),
770                         IMX_GPIO_NR(4, 15),
771                 },
772                 .pcie_rst = IMX_GPIO_NR(1, 29),
773                 .mezz_pwren = IMX_GPIO_NR(2, 19),
774                 .mezz_irq = IMX_GPIO_NR(2, 18),
775                 .gps_shdn = IMX_GPIO_NR(1, 27),
776                 .vidin_en = IMX_GPIO_NR(3, 31),
777                 .wdis = IMX_GPIO_NR(7, 12),
778                 .msata_en = GP_MSATA_SEL,
779                 .rs232_en = GP_RS232_EN,
780                 .otgpwr_en = IMX_GPIO_NR(3, 22),
781                 .vsel_pin = IMX_GPIO_NR(6, 14),
782                 .mmc_cd = IMX_GPIO_NR(7, 0),
783         },
784
785         /* GW54xx */
786         {
787                 .gpio_pads = gw54xx_gpio_pads,
788                 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
789                 .dio_cfg = gw54xx_dio,
790                 .dio_num = ARRAY_SIZE(gw54xx_dio),
791                 .leds = {
792                         IMX_GPIO_NR(4, 6),
793                         IMX_GPIO_NR(4, 7),
794                         IMX_GPIO_NR(4, 15),
795                 },
796                 .pcie_rst = IMX_GPIO_NR(1, 29),
797                 .mezz_pwren = IMX_GPIO_NR(2, 19),
798                 .mezz_irq = IMX_GPIO_NR(2, 18),
799                 .rs485en = IMX_GPIO_NR(7, 1),
800                 .vidin_en = IMX_GPIO_NR(3, 31),
801                 .dioi2c_en = IMX_GPIO_NR(4,  5),
802                 .pcie_sson = IMX_GPIO_NR(1, 20),
803                 .wdis = IMX_GPIO_NR(5, 17),
804                 .msata_en = GP_MSATA_SEL,
805                 .rs232_en = GP_RS232_EN,
806                 .otgpwr_en = IMX_GPIO_NR(3, 22),
807                 .vsel_pin = IMX_GPIO_NR(6, 14),
808                 .mmc_cd = IMX_GPIO_NR(7, 0),
809         },
810
811         /* GW551x */
812         {
813                 .gpio_pads = gw551x_gpio_pads,
814                 .num_pads = ARRAY_SIZE(gw551x_gpio_pads)/2,
815                 .dio_cfg = gw551x_dio,
816                 .dio_num = ARRAY_SIZE(gw551x_dio),
817                 .leds = {
818                         IMX_GPIO_NR(4, 7),
819                 },
820                 .pcie_rst = IMX_GPIO_NR(1, 0),
821                 .wdis = IMX_GPIO_NR(7, 12),
822         },
823
824         /* GW552x */
825         {
826                 .gpio_pads = gw552x_gpio_pads,
827                 .num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2,
828                 .dio_cfg = gw552x_dio,
829                 .dio_num = ARRAY_SIZE(gw552x_dio),
830                 .leds = {
831                         IMX_GPIO_NR(4, 6),
832                         IMX_GPIO_NR(4, 7),
833                         IMX_GPIO_NR(4, 15),
834                 },
835                 .pcie_rst = IMX_GPIO_NR(1, 29),
836                 .usb_sel = IMX_GPIO_NR(1, 7),
837                 .wdis = IMX_GPIO_NR(7, 12),
838                 .msata_en = GP_MSATA_SEL,
839         },
840
841         /* GW553x */
842         {
843                 .gpio_pads = gw553x_gpio_pads,
844                 .num_pads = ARRAY_SIZE(gw553x_gpio_pads)/2,
845                 .dio_cfg = gw553x_dio,
846                 .dio_num = ARRAY_SIZE(gw553x_dio),
847                 .leds = {
848                         IMX_GPIO_NR(4, 10),
849                         IMX_GPIO_NR(4, 11),
850                 },
851                 .pcie_rst = IMX_GPIO_NR(1, 0),
852                 .vidin_en = IMX_GPIO_NR(5, 20),
853                 .wdis = IMX_GPIO_NR(7, 12),
854                 .otgpwr_en = IMX_GPIO_NR(3, 22),
855                 .vsel_pin = IMX_GPIO_NR(6, 14),
856                 .mmc_cd = IMX_GPIO_NR(7, 0),
857         },
858
859         /* GW5904 */
860         {
861                 .gpio_pads = gw5904_gpio_pads,
862                 .num_pads = ARRAY_SIZE(gw5904_gpio_pads)/2,
863                 .dio_cfg = gw5904_dio,
864                 .dio_num = ARRAY_SIZE(gw5904_dio),
865                 .leds = {
866                         IMX_GPIO_NR(4, 6),
867                         IMX_GPIO_NR(4, 7),
868                         IMX_GPIO_NR(4, 15),
869                 },
870                 .pcie_rst = IMX_GPIO_NR(1, 0),
871                 .mezz_pwren = IMX_GPIO_NR(2, 19),
872                 .mezz_irq = IMX_GPIO_NR(2, 18),
873                 .otgpwr_en = IMX_GPIO_NR(3, 22),
874         },
875 };
876
877 void setup_iomux_gpio(int board, struct ventana_board_info *info)
878 {
879         int i;
880
881         if (board >= GW_UNKNOWN)
882                 return;
883
884         /* board specific iomux */
885         imx_iomux_v3_setup_multiple_pads(gpio_cfg[board].gpio_pads,
886                                          gpio_cfg[board].num_pads);
887
888         /* RS232_EN# */
889         if (gpio_cfg[board].rs232_en) {
890                 gpio_request(gpio_cfg[board].rs232_en, "rs232_en#");
891                 gpio_direction_output(gpio_cfg[board].rs232_en, 0);
892         }
893
894         /* GW522x Uses GPIO3_IO23 for PCIE_RST# */
895         if (board == GW52xx && info->model[4] == '2')
896                 gpio_cfg[board].pcie_rst = IMX_GPIO_NR(3, 23);
897
898         /* assert PCI_RST# */
899         gpio_request(gpio_cfg[board].pcie_rst, "pci_rst#");
900         gpio_direction_output(gpio_cfg[board].pcie_rst, 0);
901
902         /* turn off (active-high) user LED's */
903         for (i = 0; i < ARRAY_SIZE(gpio_cfg[board].leds); i++) {
904                 char name[16];
905                 if (gpio_cfg[board].leds[i]) {
906                         sprintf(name, "led_user%d", i);
907                         gpio_request(gpio_cfg[board].leds[i], name);
908                         gpio_direction_output(gpio_cfg[board].leds[i], 1);
909                 }
910         }
911
912         /* MSATA Enable - default to PCI */
913         if (gpio_cfg[board].msata_en) {
914                 gpio_request(gpio_cfg[board].msata_en, "msata_en");
915                 gpio_direction_output(gpio_cfg[board].msata_en, 0);
916         }
917
918         /* Expansion Mezzanine IO */
919         if (gpio_cfg[board].mezz_pwren) {
920                 gpio_request(gpio_cfg[board].mezz_pwren, "mezz_pwr");
921                 gpio_direction_output(gpio_cfg[board].mezz_pwren, 0);
922         }
923         if (gpio_cfg[board].mezz_irq) {
924                 gpio_request(gpio_cfg[board].mezz_irq, "mezz_irq#");
925                 gpio_direction_input(gpio_cfg[board].mezz_irq);
926         }
927
928         /* RS485 Transmit Enable */
929         if (gpio_cfg[board].rs485en) {
930                 gpio_request(gpio_cfg[board].rs485en, "rs485_en");
931                 gpio_direction_output(gpio_cfg[board].rs485en, 0);
932         }
933
934         /* GPS_SHDN */
935         if (gpio_cfg[board].gps_shdn) {
936                 gpio_request(gpio_cfg[board].gps_shdn, "gps_shdn");
937                 gpio_direction_output(gpio_cfg[board].gps_shdn, 1);
938         }
939
940         /* Analog video codec power enable */
941         if (gpio_cfg[board].vidin_en) {
942                 gpio_request(gpio_cfg[board].vidin_en, "anavidin_en");
943                 gpio_direction_output(gpio_cfg[board].vidin_en, 1);
944         }
945
946         /* DIOI2C_DIS# */
947         if (gpio_cfg[board].dioi2c_en) {
948                 gpio_request(gpio_cfg[board].dioi2c_en, "dioi2c_dis#");
949                 gpio_direction_output(gpio_cfg[board].dioi2c_en, 0);
950         }
951
952         /* PCICK_SSON: disable spread-spectrum clock */
953         if (gpio_cfg[board].pcie_sson) {
954                 gpio_request(gpio_cfg[board].pcie_sson, "pci_sson");
955                 gpio_direction_output(gpio_cfg[board].pcie_sson, 0);
956         }
957
958         /* USBOTG mux routing */
959         if (gpio_cfg[board].usb_sel) {
960                 gpio_request(gpio_cfg[board].usb_sel, "usb_pcisel");
961                 gpio_direction_output(gpio_cfg[board].usb_sel, 0);
962         }
963
964         /* PCISKT_WDIS# (Wireless disable GPIO to miniPCIe sockets) */
965         if (gpio_cfg[board].wdis) {
966                 gpio_request(gpio_cfg[board].wdis, "wlan_dis");
967                 gpio_direction_output(gpio_cfg[board].wdis, 1);
968         }
969
970         /* OTG power off */
971         if (gpio_cfg[board].otgpwr_en) {
972                 gpio_request(gpio_cfg[board].otgpwr_en, "usbotg_pwr");
973                 gpio_direction_output(gpio_cfg[board].otgpwr_en, 0);
974         }
975
976         /* sense vselect pin to see if we support uhs-i */
977         if (gpio_cfg[board].vsel_pin) {
978                 gpio_request(gpio_cfg[board].vsel_pin, "sd3_vselect");
979                 gpio_direction_input(gpio_cfg[board].vsel_pin);
980                 gpio_cfg[board].usd_vsel = !gpio_get_value(gpio_cfg[board].vsel_pin);
981         }
982
983         /* microSD CD */
984         if (gpio_cfg[board].mmc_cd) {
985                 gpio_request(gpio_cfg[board].mmc_cd, "sd_cd");
986                 gpio_direction_input(gpio_cfg[board].mmc_cd);
987         }
988
989         /* Anything else board specific */
990         switch(board) {
991         case GW5904:
992                 gpio_request(IMX_GPIO_NR(5, 11), "skt1_wdis#");
993                 gpio_direction_output(IMX_GPIO_NR(5, 11), 1);
994                 gpio_request(IMX_GPIO_NR(5, 12), "skt1_rst#");
995                 gpio_direction_output(IMX_GPIO_NR(5, 12), 1);
996                 gpio_request(IMX_GPIO_NR(5, 13), "skt2_wdis#");
997                 gpio_direction_output(IMX_GPIO_NR(5, 13), 1);
998                 gpio_request(IMX_GPIO_NR(1, 15), "m2_off#");
999                 gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
1000                 gpio_request(IMX_GPIO_NR(1, 14), "m2_wdis#");
1001                 gpio_direction_output(IMX_GPIO_NR(1, 14), 1);
1002                 gpio_request(IMX_GPIO_NR(1, 13), "m2_rst#");
1003                 gpio_direction_output(IMX_GPIO_NR(1, 13), 1);
1004                 break;
1005         }
1006 }
1007
1008 /* setup GPIO pinmux and default configuration per baseboard and env */
1009 void setup_board_gpio(int board, struct ventana_board_info *info)
1010 {
1011         const char *s;
1012         char arg[10];
1013         size_t len;
1014         int i;
1015         int quiet = simple_strtol(getenv("quiet"), NULL, 10);
1016
1017         if (board >= GW_UNKNOWN)
1018                 return;
1019
1020         /* RS232_EN# */
1021         if (gpio_cfg[board].rs232_en) {
1022                 gpio_direction_output(gpio_cfg[board].rs232_en,
1023                                       (hwconfig("rs232")) ? 0 : 1);
1024         }
1025
1026         /* MSATA Enable */
1027         if (gpio_cfg[board].msata_en && is_cpu_type(MXC_CPU_MX6Q)) {
1028                 gpio_direction_output(GP_MSATA_SEL,
1029                                       (hwconfig("msata")) ? 1 : 0);
1030         }
1031
1032         /* USBOTG Select (PCISKT or FrontPanel) */
1033         if (gpio_cfg[board].usb_sel) {
1034                 gpio_direction_output(gpio_cfg[board].usb_sel,
1035                                       (hwconfig("usb_pcisel")) ? 1 : 0);
1036         }
1037
1038         /*
1039          * Configure DIO pinmux/padctl registers
1040          * see IMX6DQRM/IMX6SDLRM IOMUXC_SW_PAD_CTL_PAD_* register definitions
1041          */
1042         for (i = 0; i < gpio_cfg[board].dio_num; i++) {
1043                 struct dio_cfg *cfg = &gpio_cfg[board].dio_cfg[i];
1044                 iomux_v3_cfg_t ctrl = DIO_PAD_CFG;
1045                 unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1;
1046
1047                 if (!cfg->gpio_padmux[0] && !cfg->gpio_padmux[1])
1048                         continue;
1049                 sprintf(arg, "dio%d", i);
1050                 if (!hwconfig(arg))
1051                         continue;
1052                 s = hwconfig_subarg(arg, "padctrl", &len);
1053                 if (s) {
1054                         ctrl = MUX_PAD_CTRL(simple_strtoul(s, NULL, 16)
1055                                             & 0x1ffff) | MUX_MODE_SION;
1056                 }
1057                 if (hwconfig_subarg_cmp(arg, "mode", "gpio")) {
1058                         if (!quiet) {
1059                                 printf("DIO%d:  GPIO%d_IO%02d (gpio-%d)\n", i,
1060                                        (cfg->gpio_param/32)+1,
1061                                        cfg->gpio_param%32,
1062                                        cfg->gpio_param);
1063                         }
1064                         imx_iomux_v3_setup_pad(cfg->gpio_padmux[cputype] |
1065                                                ctrl);
1066                         gpio_requestf(cfg->gpio_param, "dio%d", i);
1067                         gpio_direction_input(cfg->gpio_param);
1068                 } else if (hwconfig_subarg_cmp(arg, "mode", "pwm") &&
1069                            cfg->pwm_padmux) {
1070                         if (!cfg->pwm_param) {
1071                                 printf("DIO%d:  Error: pwm config invalid\n",
1072                                         i);
1073                                 continue;
1074                         }
1075                         if (!quiet)
1076                                 printf("DIO%d:  pwm%d\n", i, cfg->pwm_param);
1077                         imx_iomux_v3_setup_pad(cfg->pwm_padmux[cputype] |
1078                                                MUX_PAD_CTRL(ctrl));
1079                 }
1080         }
1081
1082         if (!quiet) {
1083                 if (gpio_cfg[board].msata_en && is_cpu_type(MXC_CPU_MX6Q)) {
1084                         printf("MSATA: %s\n", (hwconfig("msata") ?
1085                                "enabled" : "disabled"));
1086                 }
1087                 if (gpio_cfg[board].rs232_en) {
1088                         printf("RS232: %s\n", (hwconfig("rs232")) ?
1089                                "enabled" : "disabled");
1090                 }
1091         }
1092 }
1093
1094 /* setup board specific PMIC */
1095 void setup_pmic(void)
1096 {
1097         struct pmic *p;
1098         u32 reg;
1099
1100         i2c_set_bus_num(CONFIG_I2C_PMIC);
1101
1102         /* configure PFUZE100 PMIC */
1103         if (!i2c_probe(CONFIG_POWER_PFUZE100_I2C_ADDR)) {
1104                 debug("probed PFUZE100@0x%x\n", CONFIG_POWER_PFUZE100_I2C_ADDR);
1105                 power_pfuze100_init(CONFIG_I2C_PMIC);
1106                 p = pmic_get("PFUZE100");
1107                 if (p && !pmic_probe(p)) {
1108                         pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
1109                         printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
1110
1111                         /* Set VGEN1 to 1.5V and enable */
1112                         pmic_reg_read(p, PFUZE100_VGEN1VOL, &reg);
1113                         reg &= ~(LDO_VOL_MASK);
1114                         reg |= (LDOA_1_50V | LDO_EN);
1115                         pmic_reg_write(p, PFUZE100_VGEN1VOL, reg);
1116
1117                         /* Set SWBST to 5.0V and enable */
1118                         pmic_reg_read(p, PFUZE100_SWBSTCON1, &reg);
1119                         reg &= ~(SWBST_MODE_MASK | SWBST_VOL_MASK);
1120                         reg |= (SWBST_5_00V | (SWBST_MODE_AUTO << SWBST_MODE_SHIFT));
1121                         pmic_reg_write(p, PFUZE100_SWBSTCON1, reg);
1122                 }
1123         }
1124
1125         /* configure LTC3676 PMIC */
1126         else if (!i2c_probe(CONFIG_POWER_LTC3676_I2C_ADDR)) {
1127                 debug("probed LTC3676@0x%x\n", CONFIG_POWER_LTC3676_I2C_ADDR);
1128                 power_ltc3676_init(CONFIG_I2C_PMIC);
1129                 p = pmic_get("LTC3676_PMIC");
1130                 if (p && !pmic_probe(p)) {
1131                         puts("PMIC:  LTC3676\n");
1132                         /*
1133                          * set board-specific scalar for max CPU frequency
1134                          * per CPU based on the LDO enabled Operating Ranges
1135                          * defined in the respective IMX6DQ and IMX6SDL
1136                          * datasheets. The voltage resulting from the R1/R2
1137                          * feedback inputs on Ventana is 1308mV. Note that this
1138                          * is a bit shy of the Vmin of 1350mV in the datasheet
1139                          * for LDO enabled mode but is as high as we can go.
1140                          *
1141                          * We will rely on an OS kernel driver to properly
1142                          * regulate these per CPU operating point and use LDO
1143                          * bypass mode when using the higher frequency
1144                          * operating points to compensate as LDO bypass mode
1145                          * allows the rails be 125mV lower.
1146                          */
1147                         /* mask PGOOD during SW1 transition */
1148                         pmic_reg_write(p, LTC3676_DVB1B,
1149                                        0x1f | LTC3676_PGOOD_MASK);
1150                         /* set SW1 (VDD_SOC) */
1151                         pmic_reg_write(p, LTC3676_DVB1A, 0x1f);
1152
1153                         /* mask PGOOD during SW3 transition */
1154                         pmic_reg_write(p, LTC3676_DVB3B,
1155                                        0x1f | LTC3676_PGOOD_MASK);
1156                         /* set SW3 (VDD_ARM) */
1157                         pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
1158                 }
1159         }
1160 }
1161
1162 #ifdef CONFIG_FSL_ESDHC
1163 static struct fsl_esdhc_cfg usdhc_cfg = { USDHC3_BASE_ADDR };
1164
1165 int board_mmc_init(bd_t *bis)
1166 {
1167         struct ventana_board_info ventana_info;
1168         int board_type = read_eeprom(CONFIG_I2C_GSC, &ventana_info);
1169         int ret;
1170
1171         switch (board_type) {
1172         case GW52xx:
1173         case GW53xx:
1174         case GW54xx:
1175         case GW553x:
1176                 /* usdhc3: 4bit microSD */
1177                 SETUP_IOMUX_PADS(usdhc3_pads);
1178                 usdhc_cfg.esdhc_base = USDHC3_BASE_ADDR;
1179                 usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
1180                 usdhc_cfg.max_bus_width = 4;
1181                 return fsl_esdhc_initialize(bis, &usdhc_cfg);
1182         case GW5904:
1183                 /* usdhc3: 8bit eMMC */
1184                 SETUP_IOMUX_PADS(gw5904_emmc_pads);
1185                 usdhc_cfg.esdhc_base = USDHC3_BASE_ADDR;
1186                 usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
1187                 usdhc_cfg.max_bus_width = 8;
1188                 return fsl_esdhc_initialize(bis, &usdhc_cfg);
1189         default:
1190                 /* doesn't have MMC */
1191                 return -1;
1192         }
1193 }
1194
1195 int board_mmc_getcd(struct mmc *mmc)
1196 {
1197         struct ventana_board_info ventana_info;
1198         struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
1199         int board = read_eeprom(CONFIG_I2C_GSC, &ventana_info);
1200         int gpio = gpio_cfg[board].mmc_cd;
1201
1202         /* Card Detect */
1203         switch (board) {
1204         case GW5904:
1205                 /* emmc is always present */
1206                 if (cfg->esdhc_base == USDHC3_BASE_ADDR)
1207                         return 1;
1208                 break;
1209         }
1210
1211         if (gpio) {
1212                 debug("%s: gpio%d=%d\n", __func__, gpio, gpio_get_value(gpio));
1213                 return !gpio_get_value(gpio);
1214         }
1215
1216         return -1;
1217 }
1218
1219 #endif /* CONFIG_FSL_ESDHC */