]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/gateworks/gw_ventana/common.c
imx: ventana: detect pmic using i2c probe instead of board model
[karo-tx-uboot.git] / 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/mx6-pins.h>
10 #include <asm/arch/sys_proto.h>
11 #include <asm/gpio.h>
12 #include <asm/imx-common/mxc_i2c.h>
13 #include <hwconfig.h>
14 #include <power/pmic.h>
15 #include <power/ltc3676_pmic.h>
16 #include <power/pfuze100_pmic.h>
17
18 #include "common.h"
19
20 /* UART1: Function varies per baseboard */
21 static iomux_v3_cfg_t const uart1_pads[] = {
22         IOMUX_PADS(PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
23         IOMUX_PADS(PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
24 };
25
26 /* UART2: Serial Console */
27 static iomux_v3_cfg_t const uart2_pads[] = {
28         IOMUX_PADS(PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
29         IOMUX_PADS(PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
30 };
31
32 void setup_iomux_uart(void)
33 {
34         SETUP_IOMUX_PADS(uart1_pads);
35         SETUP_IOMUX_PADS(uart2_pads);
36 }
37
38 /* I2C1: GSC */
39 static struct i2c_pads_info mx6q_i2c_pad_info0 = {
40         .scl = {
41                 .i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
42                 .gpio_mode = MX6Q_PAD_EIM_D21__GPIO3_IO21 | PC,
43                 .gp = IMX_GPIO_NR(3, 21)
44         },
45         .sda = {
46                 .i2c_mode = MX6Q_PAD_EIM_D28__I2C1_SDA | PC,
47                 .gpio_mode = MX6Q_PAD_EIM_D28__GPIO3_IO28 | PC,
48                 .gp = IMX_GPIO_NR(3, 28)
49         }
50 };
51 static struct i2c_pads_info mx6dl_i2c_pad_info0 = {
52         .scl = {
53                 .i2c_mode = MX6DL_PAD_EIM_D21__I2C1_SCL | PC,
54                 .gpio_mode = MX6DL_PAD_EIM_D21__GPIO3_IO21 | PC,
55                 .gp = IMX_GPIO_NR(3, 21)
56         },
57         .sda = {
58                 .i2c_mode = MX6DL_PAD_EIM_D28__I2C1_SDA | PC,
59                 .gpio_mode = MX6DL_PAD_EIM_D28__GPIO3_IO28 | PC,
60                 .gp = IMX_GPIO_NR(3, 28)
61         }
62 };
63
64 /* I2C2: PMIC/PCIe Switch/PCIe Clock/Mezz */
65 static struct i2c_pads_info mx6q_i2c_pad_info1 = {
66         .scl = {
67                 .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
68                 .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | PC,
69                 .gp = IMX_GPIO_NR(4, 12)
70         },
71         .sda = {
72                 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
73                 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
74                 .gp = IMX_GPIO_NR(4, 13)
75         }
76 };
77 static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
78         .scl = {
79                 .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | PC,
80                 .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | PC,
81                 .gp = IMX_GPIO_NR(4, 12)
82         },
83         .sda = {
84                 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
85                 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
86                 .gp = IMX_GPIO_NR(4, 13)
87         }
88 };
89
90 /* I2C3: Misc/Expansion */
91 static struct i2c_pads_info mx6q_i2c_pad_info2 = {
92         .scl = {
93                 .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
94                 .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
95                 .gp = IMX_GPIO_NR(1, 3)
96         },
97         .sda = {
98                 .i2c_mode = MX6Q_PAD_GPIO_6__I2C3_SDA | PC,
99                 .gpio_mode = MX6Q_PAD_GPIO_6__GPIO1_IO06 | PC,
100                 .gp = IMX_GPIO_NR(1, 6)
101         }
102 };
103 static struct i2c_pads_info mx6dl_i2c_pad_info2 = {
104         .scl = {
105                 .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
106                 .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
107                 .gp = IMX_GPIO_NR(1, 3)
108         },
109         .sda = {
110                 .i2c_mode = MX6DL_PAD_GPIO_6__I2C3_SDA | PC,
111                 .gpio_mode = MX6DL_PAD_GPIO_6__GPIO1_IO06 | PC,
112                 .gp = IMX_GPIO_NR(1, 6)
113         }
114 };
115
116 void setup_ventana_i2c(void)
117 {
118         if (is_cpu_type(MXC_CPU_MX6Q)) {
119                 setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info0);
120                 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
121                 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info2);
122         } else {
123                 setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info0);
124                 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
125                 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info2);
126         }
127 }
128
129 /*
130  * Baseboard specific GPIO
131  */
132
133 /* common to add baseboards */
134 static iomux_v3_cfg_t const gw_gpio_pads[] = {
135         /* MSATA_EN */
136         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
137         /* RS232_EN# */
138         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
139 };
140
141 /* prototype */
142 static iomux_v3_cfg_t const gwproto_gpio_pads[] = {
143         /* PANLEDG# */
144         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
145         /* PANLEDR# */
146         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
147         /* LOCLED# */
148         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
149         /* RS485_EN */
150         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
151         /* IOEXP_PWREN# */
152         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
153         /* IOEXP_IRQ# */
154         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
155         /* VID_EN */
156         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
157         /* DIOI2C_DIS# */
158         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
159         /* PCICK_SSON */
160         IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20 | DIO_PAD_CFG),
161         /* PCI_RST# */
162         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
163 };
164
165 static iomux_v3_cfg_t const gw51xx_gpio_pads[] = {
166         /* PANLEDG# */
167         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
168         /* PANLEDR# */
169         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
170         /* IOEXP_PWREN# */
171         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
172         /* IOEXP_IRQ# */
173         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
174
175         /* GPS_SHDN */
176         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
177         /* VID_PWR */
178         IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
179         /* PCI_RST# */
180         IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
181         /* PCIESKT_WDIS# */
182         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
183 };
184
185 static iomux_v3_cfg_t const gw52xx_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         /* MX6_LOCLED# */
196         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
197         /* GPS_SHDN */
198         IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
199         /* USBOTG_SEL */
200         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
201         /* VID_PWR */
202         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
203         /* PCI_RST# */
204         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
205         /* PCI_RST# (GW522x) */
206         IOMUX_PADS(PAD_EIM_D23__GPIO3_IO23 | DIO_PAD_CFG),
207         /* PCIESKT_WDIS# */
208         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
209 };
210
211 static iomux_v3_cfg_t const gw53xx_gpio_pads[] = {
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         /* MX6_LOCLED# */
217         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
218         /* IOEXP_PWREN# */
219         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
220         /* IOEXP_IRQ# */
221         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
222         /* DIOI2C_DIS# */
223         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
224         /* GPS_SHDN */
225         IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
226         /* VID_EN */
227         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
228         /* PCI_RST# */
229         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
230         /* PCIESKT_WDIS# */
231         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
232 };
233
234 static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
235         /* PANLEDG# */
236         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
237         /* PANLEDR# */
238         IOMUX_PADS(PAD_KEY_COL2__GPIO4_IO10 | DIO_PAD_CFG),
239         /* MX6_LOCLED# */
240         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
241         /* MIPI_DIO */
242         IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | DIO_PAD_CFG),
243         /* RS485_EN */
244         IOMUX_PADS(PAD_EIM_D24__GPIO3_IO24 | DIO_PAD_CFG),
245         /* IOEXP_PWREN# */
246         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
247         /* IOEXP_IRQ# */
248         IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
249         /* DIOI2C_DIS# */
250         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
251         /* PCI_RST# */
252         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
253         /* VID_EN */
254         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
255         /* PCIESKT_WDIS# */
256         IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
257 };
258
259 static iomux_v3_cfg_t const gw551x_gpio_pads[] = {
260         /* PANLED# */
261         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
262         /* PCI_RST# */
263         IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
264         /* PCIESKT_WDIS# */
265         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
266 };
267
268 static iomux_v3_cfg_t const gw552x_gpio_pads[] = {
269         /* PANLEDG# */
270         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
271         /* PANLEDR# */
272         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
273         /* MX6_LOCLED# */
274         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
275         /* PCI_RST# */
276         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
277         /* MX6_DIO[4:9] */
278         IOMUX_PADS(PAD_CSI0_PIXCLK__GPIO5_IO18 | DIO_PAD_CFG),
279         IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
280         IOMUX_PADS(PAD_CSI0_VSYNC__GPIO5_IO21 | DIO_PAD_CFG),
281         IOMUX_PADS(PAD_CSI0_DAT4__GPIO5_IO22 | DIO_PAD_CFG),
282         IOMUX_PADS(PAD_CSI0_DAT5__GPIO5_IO23 | DIO_PAD_CFG),
283         IOMUX_PADS(PAD_CSI0_DAT7__GPIO5_IO25 | DIO_PAD_CFG),
284         /* PCIEGBE1_OFF# */
285         IOMUX_PADS(PAD_GPIO_1__GPIO1_IO01 | DIO_PAD_CFG),
286         /* PCIEGBE2_OFF# */
287         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
288         /* PCIESKT_WDIS# */
289         IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
290 };
291
292
293 /*
294  * Board Specific GPIO
295  */
296 struct ventana gpio_cfg[GW_UNKNOWN] = {
297         /* GW5400proto */
298         {
299                 .gpio_pads = gw54xx_gpio_pads,
300                 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
301                 .dio_cfg = {
302                         {
303                                 { IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09) },
304                                 IMX_GPIO_NR(1, 9),
305                                 { IOMUX_PADS(PAD_GPIO_9__PWM1_OUT) },
306                                 1
307                         },
308                         {
309                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
310                                 IMX_GPIO_NR(1, 19),
311                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
312                                 2
313                         },
314                         {
315                                 { IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09) },
316                                 IMX_GPIO_NR(2, 9),
317                                 { IOMUX_PADS(PAD_SD4_DAT1__PWM3_OUT) },
318                                 3
319                         },
320                         {
321                                 { IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10) },
322                                 IMX_GPIO_NR(2, 10),
323                                 { IOMUX_PADS(PAD_SD4_DAT2__PWM4_OUT) },
324                                 4
325                         },
326                 },
327                 .num_gpios = 4,
328                 .leds = {
329                         IMX_GPIO_NR(4, 6),
330                         IMX_GPIO_NR(4, 10),
331                         IMX_GPIO_NR(4, 15),
332                 },
333                 .pcie_rst = IMX_GPIO_NR(1, 29),
334                 .mezz_pwren = IMX_GPIO_NR(4, 7),
335                 .mezz_irq = IMX_GPIO_NR(4, 9),
336                 .rs485en = IMX_GPIO_NR(3, 24),
337                 .dioi2c_en = IMX_GPIO_NR(4,  5),
338                 .pcie_sson = IMX_GPIO_NR(1, 20),
339         },
340
341         /* GW51xx */
342         {
343                 .gpio_pads = gw51xx_gpio_pads,
344                 .num_pads = ARRAY_SIZE(gw51xx_gpio_pads)/2,
345                 .dio_cfg = {
346                         {
347                                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
348                                 IMX_GPIO_NR(1, 16),
349                                 { 0, 0 },
350                                 0
351                         },
352                         {
353                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
354                                 IMX_GPIO_NR(1, 19),
355                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
356                                 2
357                         },
358                         {
359                                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
360                                 IMX_GPIO_NR(1, 17),
361                                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
362                                 3
363                         },
364                         {
365                                 { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
366                                 IMX_GPIO_NR(1, 18),
367                                 { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
368                                 4
369                         },
370                 },
371                 .num_gpios = 4,
372                 .leds = {
373                         IMX_GPIO_NR(4, 6),
374                         IMX_GPIO_NR(4, 10),
375                 },
376                 .pcie_rst = IMX_GPIO_NR(1, 0),
377                 .mezz_pwren = IMX_GPIO_NR(2, 19),
378                 .mezz_irq = IMX_GPIO_NR(2, 18),
379                 .gps_shdn = IMX_GPIO_NR(1, 2),
380                 .vidin_en = IMX_GPIO_NR(5, 20),
381                 .wdis = IMX_GPIO_NR(7, 12),
382         },
383
384         /* GW52xx */
385         {
386                 .gpio_pads = gw52xx_gpio_pads,
387                 .num_pads = ARRAY_SIZE(gw52xx_gpio_pads)/2,
388                 .dio_cfg = {
389                         {
390                                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
391                                 IMX_GPIO_NR(1, 16),
392                                 { 0, 0 },
393                                 0
394                         },
395                         {
396                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
397                                 IMX_GPIO_NR(1, 19),
398                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
399                                 2
400                         },
401                         {
402                                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
403                                 IMX_GPIO_NR(1, 17),
404                                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
405                                 3
406                         },
407                         {
408                                 { IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
409                                 IMX_GPIO_NR(1, 20),
410                                 { 0, 0 },
411                                 0
412                         },
413                 },
414                 .num_gpios = 4,
415                 .leds = {
416                         IMX_GPIO_NR(4, 6),
417                         IMX_GPIO_NR(4, 7),
418                         IMX_GPIO_NR(4, 15),
419                 },
420                 .pcie_rst = IMX_GPIO_NR(1, 29),
421                 .mezz_pwren = IMX_GPIO_NR(2, 19),
422                 .mezz_irq = IMX_GPIO_NR(2, 18),
423                 .gps_shdn = IMX_GPIO_NR(1, 27),
424                 .vidin_en = IMX_GPIO_NR(3, 31),
425                 .usb_sel = IMX_GPIO_NR(1, 2),
426                 .wdis = IMX_GPIO_NR(7, 12),
427         },
428
429         /* GW53xx */
430         {
431                 .gpio_pads = gw53xx_gpio_pads,
432                 .num_pads = ARRAY_SIZE(gw53xx_gpio_pads)/2,
433                 .dio_cfg = {
434                         {
435                                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
436                                 IMX_GPIO_NR(1, 16),
437                                 { 0, 0 },
438                                 0
439                         },
440                         {
441                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
442                                 IMX_GPIO_NR(1, 19),
443                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
444                                 2
445                         },
446                         {
447                                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
448                                 IMX_GPIO_NR(1, 17),
449                                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
450                                 3
451                         },
452                         {
453                                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
454                                 IMX_GPIO_NR(1, 20),
455                                 { 0, 0 },
456                                 0
457                         },
458                 },
459                 .num_gpios = 4,
460                 .leds = {
461                         IMX_GPIO_NR(4, 6),
462                         IMX_GPIO_NR(4, 7),
463                         IMX_GPIO_NR(4, 15),
464                 },
465                 .pcie_rst = IMX_GPIO_NR(1, 29),
466                 .mezz_pwren = IMX_GPIO_NR(2, 19),
467                 .mezz_irq = IMX_GPIO_NR(2, 18),
468                 .gps_shdn = IMX_GPIO_NR(1, 27),
469                 .vidin_en = IMX_GPIO_NR(3, 31),
470                 .wdis = IMX_GPIO_NR(7, 12),
471         },
472
473         /* GW54xx */
474         {
475                 .gpio_pads = gw54xx_gpio_pads,
476                 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
477                 .dio_cfg = {
478                         {
479                                 { IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09) },
480                                 IMX_GPIO_NR(1, 9),
481                                 { IOMUX_PADS(PAD_GPIO_9__PWM1_OUT) },
482                                 1
483                         },
484                         {
485                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
486                                 IMX_GPIO_NR(1, 19),
487                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
488                                 2
489                         },
490                         {
491                                 { IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09) },
492                                 IMX_GPIO_NR(2, 9),
493                                 { IOMUX_PADS(PAD_SD4_DAT1__PWM3_OUT) },
494                                 3
495                         },
496                         {
497                                 { IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10) },
498                                 IMX_GPIO_NR(2, 10),
499                                 { IOMUX_PADS(PAD_SD4_DAT2__PWM4_OUT) },
500                                 4
501                         },
502                 },
503                 .num_gpios = 4,
504                 .leds = {
505                         IMX_GPIO_NR(4, 6),
506                         IMX_GPIO_NR(4, 7),
507                         IMX_GPIO_NR(4, 15),
508                 },
509                 .pcie_rst = IMX_GPIO_NR(1, 29),
510                 .mezz_pwren = IMX_GPIO_NR(2, 19),
511                 .mezz_irq = IMX_GPIO_NR(2, 18),
512                 .rs485en = IMX_GPIO_NR(7, 1),
513                 .vidin_en = IMX_GPIO_NR(3, 31),
514                 .dioi2c_en = IMX_GPIO_NR(4,  5),
515                 .pcie_sson = IMX_GPIO_NR(1, 20),
516                 .wdis = IMX_GPIO_NR(5, 17),
517         },
518
519         /* GW551x */
520         {
521                 .gpio_pads = gw551x_gpio_pads,
522                 .num_pads = ARRAY_SIZE(gw551x_gpio_pads)/2,
523                 .dio_cfg = {
524                         {
525                                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
526                                 IMX_GPIO_NR(1, 16),
527                                 { 0, 0 },
528                                 0
529                         },
530                         {
531                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
532                                 IMX_GPIO_NR(1, 19),
533                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
534                                 2
535                         },
536                         {
537                                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
538                                 IMX_GPIO_NR(1, 17),
539                                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
540                                 3
541                         },
542                         {
543                                 { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
544                                 IMX_GPIO_NR(1, 18),
545                                 { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
546                                 4
547                         },
548                 },
549                 .num_gpios = 2,
550                 .leds = {
551                         IMX_GPIO_NR(4, 7),
552                 },
553                 .pcie_rst = IMX_GPIO_NR(1, 0),
554                 .wdis = IMX_GPIO_NR(7, 12),
555         },
556
557         /* GW552x */
558         {
559                 .gpio_pads = gw552x_gpio_pads,
560                 .num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2,
561                 .dio_cfg = {
562                         {
563                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
564                                 IMX_GPIO_NR(1, 19),
565                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
566                                 2
567                         },
568                         {
569                                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
570                                 IMX_GPIO_NR(1, 17),
571                                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
572                                 3
573                         },
574                 },
575                 .num_gpios = 4,
576                 .leds = {
577                         IMX_GPIO_NR(4, 6),
578                         IMX_GPIO_NR(4, 7),
579                         IMX_GPIO_NR(4, 15),
580                 },
581                 .pcie_rst = IMX_GPIO_NR(1, 29),
582                 .wdis = IMX_GPIO_NR(7, 12),
583         },
584 };
585
586 void setup_iomux_gpio(int board, struct ventana_board_info *info)
587 {
588         int i;
589
590         /* iomux common to all Ventana boards */
591         SETUP_IOMUX_PADS(gw_gpio_pads);
592
593         /* OTG power off */
594         gpio_request(GP_USB_OTG_PWR, "usbotg_pwr");
595         gpio_direction_output(GP_USB_OTG_PWR, 0);
596
597         /* MSATA Enable - default to PCI */
598         gpio_request(GP_MSATA_SEL, "msata_en");
599         gpio_direction_output(GP_MSATA_SEL, 0);
600
601         /* RS232_EN# */
602         gpio_request(GP_RS232_EN, "rs232_en");
603         gpio_direction_output(GP_RS232_EN, 0);
604
605         if (board >= GW_UNKNOWN)
606                 return;
607
608         /* board specific iomux */
609         imx_iomux_v3_setup_multiple_pads(gpio_cfg[board].gpio_pads,
610                                          gpio_cfg[board].num_pads);
611
612         /* GW522x Uses GPIO3_IO23 for PCIE_RST# */
613         if (board == GW52xx && info->model[4] == '2')
614                 gpio_cfg[board].pcie_rst = IMX_GPIO_NR(3, 23);
615
616         /* assert PCI_RST# */
617         gpio_request(gpio_cfg[board].pcie_rst, "pci_rst#");
618         gpio_direction_output(gpio_cfg[board].pcie_rst, 0);
619
620         /* turn off (active-high) user LED's */
621         for (i = 0; i < ARRAY_SIZE(gpio_cfg[board].leds); i++) {
622                 char name[16];
623                 if (gpio_cfg[board].leds[i]) {
624                         sprintf(name, "led_user%d", i);
625                         gpio_request(gpio_cfg[board].leds[i], name);
626                         gpio_direction_output(gpio_cfg[board].leds[i], 1);
627                 }
628         }
629
630         /* Expansion Mezzanine IO */
631         if (gpio_cfg[board].mezz_pwren) {
632                 gpio_request(gpio_cfg[board].mezz_pwren, "mezz_pwr");
633                 gpio_direction_output(gpio_cfg[board].mezz_pwren, 0);
634         }
635         if (gpio_cfg[board].mezz_irq) {
636                 gpio_request(gpio_cfg[board].mezz_irq, "mezz_irq#");
637                 gpio_direction_input(gpio_cfg[board].mezz_irq);
638         }
639
640         /* RS485 Transmit Enable */
641         if (gpio_cfg[board].rs485en) {
642                 gpio_request(gpio_cfg[board].rs485en, "rs485_en");
643                 gpio_direction_output(gpio_cfg[board].rs485en, 0);
644         }
645
646         /* GPS_SHDN */
647         if (gpio_cfg[board].gps_shdn) {
648                 gpio_request(gpio_cfg[board].gps_shdn, "gps_shdn");
649                 gpio_direction_output(gpio_cfg[board].gps_shdn, 1);
650         }
651
652         /* Analog video codec power enable */
653         if (gpio_cfg[board].vidin_en) {
654                 gpio_request(gpio_cfg[board].vidin_en, "anavidin_en");
655                 gpio_direction_output(gpio_cfg[board].vidin_en, 1);
656         }
657
658         /* DIOI2C_DIS# */
659         if (gpio_cfg[board].dioi2c_en) {
660                 gpio_request(gpio_cfg[board].dioi2c_en, "dioi2c_dis#");
661                 gpio_direction_output(gpio_cfg[board].dioi2c_en, 0);
662         }
663
664         /* PCICK_SSON: disable spread-spectrum clock */
665         if (gpio_cfg[board].pcie_sson) {
666                 gpio_request(gpio_cfg[board].pcie_sson, "pci_sson");
667                 gpio_direction_output(gpio_cfg[board].pcie_sson, 0);
668         }
669
670         /* USBOTG mux routing */
671         if (gpio_cfg[board].usb_sel) {
672                 gpio_request(gpio_cfg[board].usb_sel, "usb_pcisel");
673                 gpio_direction_output(gpio_cfg[board].usb_sel, 0);
674         }
675
676         /* PCISKT_WDIS# (Wireless disable GPIO to miniPCIe sockets) */
677         if (gpio_cfg[board].wdis) {
678                 gpio_request(gpio_cfg[board].wdis, "wlan_dis");
679                 gpio_direction_output(gpio_cfg[board].wdis, 1);
680         }
681 }
682
683 /* setup GPIO pinmux and default configuration per baseboard and env */
684 void setup_board_gpio(int board, struct ventana_board_info *info)
685 {
686         const char *s;
687         char arg[10];
688         size_t len;
689         int i;
690         int quiet = simple_strtol(getenv("quiet"), NULL, 10);
691
692         if (board >= GW_UNKNOWN)
693                 return;
694
695         /* RS232_EN# */
696         gpio_direction_output(GP_RS232_EN, (hwconfig("rs232")) ? 0 : 1);
697
698         /* MSATA Enable */
699         if (is_cpu_type(MXC_CPU_MX6Q) &&
700             test_bit(EECONFIG_SATA, info->config)) {
701                 gpio_direction_output(GP_MSATA_SEL,
702                                       (hwconfig("msata")) ?  1 : 0);
703         }
704
705         /* USBOTG Select (PCISKT or FrontPanel) */
706         if (gpio_cfg[board].usb_sel) {
707                 gpio_direction_output(gpio_cfg[board].usb_sel,
708                                       (hwconfig("usb_pcisel")) ? 1 : 0);
709         }
710
711         /*
712          * Configure DIO pinmux/padctl registers
713          * see IMX6DQRM/IMX6SDLRM IOMUXC_SW_PAD_CTL_PAD_* register definitions
714          */
715         for (i = 0; i < 4; i++) {
716                 struct dio_cfg *cfg = &gpio_cfg[board].dio_cfg[i];
717                 iomux_v3_cfg_t ctrl = DIO_PAD_CFG;
718                 unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1;
719
720                 if (!cfg->gpio_padmux[0] && !cfg->gpio_padmux[1])
721                         continue;
722                 sprintf(arg, "dio%d", i);
723                 if (!hwconfig(arg))
724                         continue;
725                 s = hwconfig_subarg(arg, "padctrl", &len);
726                 if (s) {
727                         ctrl = MUX_PAD_CTRL(simple_strtoul(s, NULL, 16)
728                                             & 0x1ffff) | MUX_MODE_SION;
729                 }
730                 if (hwconfig_subarg_cmp(arg, "mode", "gpio")) {
731                         if (!quiet) {
732                                 printf("DIO%d:  GPIO%d_IO%02d (gpio-%d)\n", i,
733                                        (cfg->gpio_param/32)+1,
734                                        cfg->gpio_param%32,
735                                        cfg->gpio_param);
736                         }
737                         imx_iomux_v3_setup_pad(cfg->gpio_padmux[cputype] |
738                                                ctrl);
739                         gpio_requestf(cfg->gpio_param, "dio%d", i);
740                         gpio_direction_input(cfg->gpio_param);
741                 } else if (hwconfig_subarg_cmp("dio2", "mode", "pwm") &&
742                            cfg->pwm_padmux) {
743                         if (!quiet)
744                                 printf("DIO%d:  pwm%d\n", i, cfg->pwm_param);
745                         imx_iomux_v3_setup_pad(cfg->pwm_padmux[cputype] |
746                                                MUX_PAD_CTRL(ctrl));
747                 }
748         }
749
750         if (!quiet) {
751                 if (is_cpu_type(MXC_CPU_MX6Q) &&
752                     (test_bit(EECONFIG_SATA, info->config))) {
753                         printf("MSATA: %s\n", (hwconfig("msata") ?
754                                "enabled" : "disabled"));
755                 }
756                 printf("RS232: %s\n", (hwconfig("rs232")) ?
757                        "enabled" : "disabled");
758         }
759 }
760
761 /* setup board specific PMIC */
762 void setup_pmic(void)
763 {
764         struct pmic *p;
765         u32 reg;
766
767         i2c_set_bus_num(CONFIG_I2C_PMIC);
768
769         /* configure PFUZE100 PMIC */
770         if (!i2c_probe(CONFIG_POWER_PFUZE100_I2C_ADDR)) {
771                 debug("probed PFUZE100@0x%x\n", CONFIG_POWER_PFUZE100_I2C_ADDR);
772                 power_pfuze100_init(CONFIG_I2C_PMIC);
773                 p = pmic_get("PFUZE100");
774                 if (p && !pmic_probe(p)) {
775                         pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
776                         printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
777
778                         /* Set VGEN1 to 1.5V and enable */
779                         pmic_reg_read(p, PFUZE100_VGEN1VOL, &reg);
780                         reg &= ~(LDO_VOL_MASK);
781                         reg |= (LDOA_1_50V | LDO_EN);
782                         pmic_reg_write(p, PFUZE100_VGEN1VOL, reg);
783
784                         /* Set SWBST to 5.0V and enable */
785                         pmic_reg_read(p, PFUZE100_SWBSTCON1, &reg);
786                         reg &= ~(SWBST_MODE_MASK | SWBST_VOL_MASK);
787                         reg |= (SWBST_5_00V | SWBST_MODE_AUTO);
788                         pmic_reg_write(p, PFUZE100_SWBSTCON1, reg);
789                 }
790         }
791
792         /* configure LTC3676 PMIC */
793         else if (!i2c_probe(CONFIG_POWER_LTC3676_I2C_ADDR)) {
794                 debug("probed LTC3676@0x%x\n", CONFIG_POWER_LTC3676_I2C_ADDR);
795                 power_ltc3676_init(CONFIG_I2C_PMIC);
796                 p = pmic_get("LTC3676_PMIC");
797                 if (p && !pmic_probe(p)) {
798                         puts("PMIC:  LTC3676\n");
799                         /*
800                          * set board-specific scalar for max CPU frequency
801                          * per CPU based on the LDO enabled Operating Ranges
802                          * defined in the respective IMX6DQ and IMX6SDL
803                          * datasheets. The voltage resulting from the R1/R2
804                          * feedback inputs on Ventana is 1308mV. Note that this
805                          * is a bit shy of the Vmin of 1350mV in the datasheet
806                          * for LDO enabled mode but is as high as we can go.
807                          *
808                          * We will rely on an OS kernel driver to properly
809                          * regulate these per CPU operating point and use LDO
810                          * bypass mode when using the higher frequency
811                          * operating points to compensate as LDO bypass mode
812                          * allows the rails be 125mV lower.
813                          */
814                         /* mask PGOOD during SW1 transition */
815                         pmic_reg_write(p, LTC3676_DVB1B,
816                                        0x1f | LTC3676_PGOOD_MASK);
817                         /* set SW1 (VDD_SOC) */
818                         pmic_reg_write(p, LTC3676_DVB1A, 0x1f);
819
820                         /* mask PGOOD during SW3 transition */
821                         pmic_reg_write(p, LTC3676_DVB3B,
822                                        0x1f | LTC3676_PGOOD_MASK);
823                         /* set SW3 (VDD_ARM) */
824                         pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
825                 }
826         }
827 }