1
2
3
4
5
6
7
8
9#include <common.h>
10#include <asm/io.h>
11#include <asm/arch/clock.h>
12#include <asm/arch/imx-regs.h>
13#include <asm/arch/iomux.h>
14#include <asm/arch/mx6-pins.h>
15#include <asm/arch/crm_regs.h>
16#include <asm/arch/sys_proto.h>
17#include <asm/gpio.h>
18#include <asm/imx-common/iomux-v3.h>
19#include <asm/imx-common/mxc_i2c.h>
20#include <asm/imx-common/boot_mode.h>
21#include <asm/imx-common/sata.h>
22#include <jffs2/load_kernel.h>
23#include <hwconfig.h>
24#include <i2c.h>
25#include <linux/ctype.h>
26#include <fdt_support.h>
27#include <fsl_esdhc.h>
28#include <miiphy.h>
29#include <mmc.h>
30#include <mtd_node.h>
31#include <netdev.h>
32#include <power/pmic.h>
33#include <power/pfuze100_pmic.h>
34#include <i2c.h>
35#include <fdt_support.h>
36#include <jffs2/load_kernel.h>
37#include <spi_flash.h>
38
39#include "gsc.h"
40#include "ventana_eeprom.h"
41
42DECLARE_GLOBAL_DATA_PTR;
43
44
45#define GP_PHY_RST IMX_GPIO_NR(1, 30)
46#define GP_USB_OTG_PWR IMX_GPIO_NR(3, 22)
47#define GP_SD3_CD IMX_GPIO_NR(7, 0)
48#define GP_RS232_EN IMX_GPIO_NR(2, 11)
49#define GP_MSATA_SEL IMX_GPIO_NR(2, 8)
50
51
52#define I2C_GSC 0
53#define I2C_PMIC 1
54
55#define UART_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
56 PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
57 PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
58
59#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
60 PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_LOW | \
61 PAD_CTL_DSE_80ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
62
63#define ENET_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
64 PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
65 PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
66
67#define SPI_PAD_CTRL (PAD_CTL_HYS | \
68 PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED | \
69 PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
70
71#define DIO_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
72 PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
73 PAD_CTL_DSE_34ohm | PAD_CTL_HYS | PAD_CTL_SRE_FAST)
74
75#define I2C_PAD_CTRL (PAD_CTL_PUS_100K_UP | \
76 PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
77 PAD_CTL_ODE | PAD_CTL_SRE_FAST)
78
79
80
81
82
83static struct ventana_board_info ventana_info;
84
85enum {
86 GW54proto,
87 GW51xx,
88 GW52xx,
89 GW53xx,
90 GW54xx,
91 GW_UNKNOWN,
92};
93
94int board_type;
95
96
97iomux_v3_cfg_t const uart1_pads[] = {
98 MX6_PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
99 MX6_PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
100};
101
102
103iomux_v3_cfg_t const uart2_pads[] = {
104 MX6_PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
105 MX6_PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
106};
107
108#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
109
110
111struct i2c_pads_info i2c_pad_info0 = {
112 .scl = {
113 .i2c_mode = MX6_PAD_EIM_D21__I2C1_SCL | PC,
114 .gpio_mode = MX6_PAD_EIM_D21__GPIO3_IO21 | PC,
115 .gp = IMX_GPIO_NR(3, 21)
116 },
117 .sda = {
118 .i2c_mode = MX6_PAD_EIM_D28__I2C1_SDA | PC,
119 .gpio_mode = MX6_PAD_EIM_D28__GPIO3_IO28 | PC,
120 .gp = IMX_GPIO_NR(3, 28)
121 }
122};
123
124
125struct i2c_pads_info i2c_pad_info1 = {
126 .scl = {
127 .i2c_mode = MX6_PAD_KEY_COL3__I2C2_SCL | PC,
128 .gpio_mode = MX6_PAD_KEY_COL3__GPIO4_IO12 | PC,
129 .gp = IMX_GPIO_NR(4, 12)
130 },
131 .sda = {
132 .i2c_mode = MX6_PAD_KEY_ROW3__I2C2_SDA | PC,
133 .gpio_mode = MX6_PAD_KEY_ROW3__GPIO4_IO13 | PC,
134 .gp = IMX_GPIO_NR(4, 13)
135 }
136};
137
138
139struct i2c_pads_info i2c_pad_info2 = {
140 .scl = {
141 .i2c_mode = MX6_PAD_GPIO_3__I2C3_SCL | PC,
142 .gpio_mode = MX6_PAD_GPIO_3__GPIO1_IO03 | PC,
143 .gp = IMX_GPIO_NR(1, 3)
144 },
145 .sda = {
146 .i2c_mode = MX6_PAD_GPIO_6__I2C3_SDA | PC,
147 .gpio_mode = MX6_PAD_GPIO_6__GPIO1_IO06 | PC,
148 .gp = IMX_GPIO_NR(1, 6)
149 }
150};
151
152
153iomux_v3_cfg_t const usdhc3_pads[] = {
154 MX6_PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
155 MX6_PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
156 MX6_PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
157 MX6_PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
158 MX6_PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
159 MX6_PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
160 MX6_PAD_SD3_DAT5__GPIO7_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL),
161};
162
163
164iomux_v3_cfg_t const enet_pads[] = {
165 MX6_PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL),
166 MX6_PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
167 MX6_PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL),
168 MX6_PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
169 MX6_PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
170 MX6_PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL),
171 MX6_PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL),
172 MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),
173 MX6_PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL),
174 MX6_PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL),
175 MX6_PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
176 MX6_PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
177 MX6_PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL),
178 MX6_PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL),
179 MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL),
180
181 MX6_PAD_ENET_TXD0__GPIO1_IO30 | MUX_PAD_CTRL(NO_PAD_CTRL),
182};
183
184
185iomux_v3_cfg_t const nfc_pads[] = {
186 MX6_PAD_NANDF_CLE__NAND_CLE | MUX_PAD_CTRL(NO_PAD_CTRL),
187 MX6_PAD_NANDF_ALE__NAND_ALE | MUX_PAD_CTRL(NO_PAD_CTRL),
188 MX6_PAD_NANDF_WP_B__NAND_WP_B | MUX_PAD_CTRL(NO_PAD_CTRL),
189 MX6_PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(NO_PAD_CTRL),
190 MX6_PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(NO_PAD_CTRL),
191 MX6_PAD_SD4_CMD__NAND_RE_B | MUX_PAD_CTRL(NO_PAD_CTRL),
192 MX6_PAD_SD4_CLK__NAND_WE_B | MUX_PAD_CTRL(NO_PAD_CTRL),
193 MX6_PAD_NANDF_D0__NAND_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL),
194 MX6_PAD_NANDF_D1__NAND_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL),
195 MX6_PAD_NANDF_D2__NAND_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL),
196 MX6_PAD_NANDF_D3__NAND_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL),
197 MX6_PAD_NANDF_D4__NAND_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL),
198 MX6_PAD_NANDF_D5__NAND_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL),
199 MX6_PAD_NANDF_D6__NAND_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL),
200 MX6_PAD_NANDF_D7__NAND_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL),
201};
202
203#ifdef CONFIG_CMD_NAND
204static void setup_gpmi_nand(void)
205{
206 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
207
208
209 imx_iomux_v3_setup_multiple_pads(nfc_pads, ARRAY_SIZE(nfc_pads));
210
211
212 clrsetbits_le32(&mxc_ccm->cs2cdr,
213 MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK |
214 MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK |
215 MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK,
216 MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
217 MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
218 MXC_CCM_CS2CDR_ENFC_CLK_SEL(3));
219
220
221 setbits_le32(&mxc_ccm->CCGR4,
222 MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK |
223 MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK |
224 MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK |
225 MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK |
226 MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_OFFSET);
227
228
229 setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
230}
231#endif
232
233static void setup_iomux_enet(void)
234{
235 imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
236
237
238 gpio_direction_output(GP_PHY_RST, 0);
239 mdelay(2);
240 gpio_set_value(GP_PHY_RST, 1);
241}
242
243static void setup_iomux_uart(void)
244{
245 imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
246 imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
247}
248
249#ifdef CONFIG_USB_EHCI_MX6
250iomux_v3_cfg_t const usb_pads[] = {
251 MX6_PAD_GPIO_1__USB_OTG_ID | MUX_PAD_CTRL(DIO_PAD_CTRL),
252 MX6_PAD_KEY_COL4__USB_OTG_OC | MUX_PAD_CTRL(DIO_PAD_CTRL),
253 MX6_PAD_EIM_D22__GPIO3_IO22 | MUX_PAD_CTRL(DIO_PAD_CTRL),
254};
255
256int board_ehci_hcd_init(int port)
257{
258 struct ventana_board_info *info = &ventana_info;
259
260 imx_iomux_v3_setup_multiple_pads(usb_pads, ARRAY_SIZE(usb_pads));
261
262
263 switch (info->model[3]) {
264 case '3':
265 imx_iomux_v3_setup_pad(MX6_PAD_GPIO_9__GPIO1_IO09|
266 MUX_PAD_CTRL(NO_PAD_CTRL));
267 gpio_direction_output(IMX_GPIO_NR(1, 9), 0);
268 mdelay(2);
269 gpio_set_value(IMX_GPIO_NR(1, 9), 1);
270 break;
271 case '4':
272 imx_iomux_v3_setup_pad(MX6_PAD_SD1_DAT0__GPIO1_IO16 |
273 MUX_PAD_CTRL(NO_PAD_CTRL));
274 gpio_direction_output(IMX_GPIO_NR(1, 16), 0);
275 mdelay(2);
276 gpio_set_value(IMX_GPIO_NR(1, 16), 1);
277 break;
278 }
279
280 return 0;
281}
282
283int board_ehci_power(int port, int on)
284{
285 if (port)
286 return 0;
287 gpio_set_value(GP_USB_OTG_PWR, on);
288 return 0;
289}
290#endif
291
292#ifdef CONFIG_FSL_ESDHC
293struct fsl_esdhc_cfg usdhc_cfg = { USDHC3_BASE_ADDR };
294
295int board_mmc_getcd(struct mmc *mmc)
296{
297
298 gpio_direction_input(GP_SD3_CD);
299 return !gpio_get_value(GP_SD3_CD);
300}
301
302int board_mmc_init(bd_t *bis)
303{
304
305 imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
306 usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
307 usdhc_cfg.max_bus_width = 4;
308
309 return fsl_esdhc_initialize(bis, &usdhc_cfg);
310}
311#endif
312
313#ifdef CONFIG_MXC_SPI
314iomux_v3_cfg_t const ecspi1_pads[] = {
315
316 MX6_PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(SPI_PAD_CTRL),
317 MX6_PAD_EIM_D17__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
318 MX6_PAD_EIM_D18__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
319 MX6_PAD_EIM_D16__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
320};
321
322static void setup_spi(void)
323{
324 gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
325 imx_iomux_v3_setup_multiple_pads(ecspi1_pads,
326 ARRAY_SIZE(ecspi1_pads));
327}
328#endif
329
330
331int board_phy_config(struct phy_device *phydev)
332{
333 unsigned short val;
334
335
336 if (phydev->phy_id == 0x1410dd1) {
337
338
339
340
341
342 phy_write(phydev, MDIO_DEVAD_NONE, 22, 3);
343 val = phy_read(phydev, MDIO_DEVAD_NONE, 16);
344 val &= 0xff00;
345 val |= 0x0017;
346 phy_write(phydev, MDIO_DEVAD_NONE, 16, val);
347 phy_write(phydev, MDIO_DEVAD_NONE, 22, 0);
348 }
349
350 if (phydev->drv->config)
351 phydev->drv->config(phydev);
352
353 return 0;
354}
355
356int board_eth_init(bd_t *bis)
357{
358 setup_iomux_enet();
359
360#ifdef CONFIG_FEC_MXC
361 cpu_eth_init(bis);
362#endif
363
364#ifdef CONFIG_CI_UDC
365
366 usb_eth_initialize(bis);
367#endif
368
369 return 0;
370}
371
372
373static int
374read_eeprom(void)
375{
376 int i;
377 int chksum;
378 char baseboard;
379 int type;
380 struct ventana_board_info *info = &ventana_info;
381 unsigned char *buf = (unsigned char *)&ventana_info;
382
383 memset(info, 0, sizeof(ventana_info));
384
385
386
387
388
389
390 while (1) {
391 if (0 == i2c_set_bus_num(I2C_GSC) &&
392 0 == i2c_probe(GSC_EEPROM_ADDR))
393 break;
394 mdelay(1);
395 }
396
397
398 if (gsc_i2c_read(GSC_EEPROM_ADDR, 0x00, 1, buf, sizeof(ventana_info))) {
399 puts("EEPROM: Failed to read EEPROM\n");
400 info->model[0] = 0;
401 return GW_UNKNOWN;
402 }
403
404
405 if (info->model[0] != 'G' || info->model[1] != 'W') {
406 puts("EEPROM: Invalid Model in EEPROM\n");
407 info->model[0] = 0;
408 return GW_UNKNOWN;
409 }
410
411
412 for (chksum = 0, i = 0; i < sizeof(*info)-2; i++)
413 chksum += buf[i];
414 if ((info->chksum[0] != chksum>>8) ||
415 (info->chksum[1] != (chksum&0xff))) {
416 puts("EEPROM: Failed EEPROM checksum\n");
417 info->model[0] = 0;
418 return GW_UNKNOWN;
419 }
420
421
422 baseboard = info->model[3];
423 if (strncasecmp((const char *)info->model, "GW5400-A", 8) == 0)
424 baseboard = '0';
425
426 switch (baseboard) {
427 case '0':
428 type = GW54proto;
429 break;
430 case '1':
431 type = GW51xx;
432 break;
433 case '2':
434 type = GW52xx;
435 break;
436 case '3':
437 type = GW53xx;
438 break;
439 case '4':
440 type = GW54xx;
441 break;
442 default:
443 printf("EEPROM: Unknown model in EEPROM: %s\n", info->model);
444 type = GW_UNKNOWN;
445 break;
446 }
447 return type;
448}
449
450
451
452
453
454
455static iomux_v3_cfg_t const gw_gpio_pads[] = {
456
457 MX6_PAD_SD4_DAT0__GPIO2_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
458
459 MX6_PAD_SD4_DAT3__GPIO2_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
460};
461
462
463static iomux_v3_cfg_t const gwproto_gpio_pads[] = {
464
465 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
466
467 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
468
469 MX6_PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
470
471 MX6_PAD_SD3_DAT4__GPIO7_IO01 | MUX_PAD_CTRL(NO_PAD_CTRL),
472
473 MX6_PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL),
474
475 MX6_PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
476
477 MX6_PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL),
478
479 MX6_PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL),
480
481 MX6_PAD_SD1_CLK__GPIO1_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL),
482
483 MX6_PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL),
484};
485
486static iomux_v3_cfg_t const gw51xx_gpio_pads[] = {
487
488 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
489
490 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
491
492 MX6_PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL),
493
494 MX6_PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
495
496
497 MX6_PAD_GPIO_2__GPIO1_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL),
498
499 MX6_PAD_CSI0_DATA_EN__GPIO5_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL),
500
501 MX6_PAD_GPIO_0__GPIO1_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL),
502};
503
504static iomux_v3_cfg_t const gw52xx_gpio_pads[] = {
505
506 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
507
508 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
509
510 MX6_PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL),
511
512 MX6_PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
513
514
515 MX6_PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
516
517 MX6_PAD_ENET_RXD0__GPIO1_IO27 | MUX_PAD_CTRL(NO_PAD_CTRL),
518
519 MX6_PAD_GPIO_2__GPIO1_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL),
520
521 MX6_PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL),
522
523 MX6_PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL),
524};
525
526static iomux_v3_cfg_t const gw53xx_gpio_pads[] = {
527
528 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
529
530 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
531
532 MX6_PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL),
533
534 MX6_PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
535
536
537 MX6_PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
538
539 MX6_PAD_ENET_RXD0__GPIO1_IO27 | MUX_PAD_CTRL(NO_PAD_CTRL),
540
541 MX6_PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL),
542
543 MX6_PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL),
544};
545
546static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
547
548 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
549
550 MX6_PAD_KEY_COL2__GPIO4_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
551
552 MX6_PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
553
554 MX6_PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL),
555
556 MX6_PAD_EIM_D24__GPIO3_IO24 | MUX_PAD_CTRL(NO_PAD_CTRL),
557
558 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
559
560 MX6_PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL),
561
562 MX6_PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL),
563
564 MX6_PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL),
565
566 MX6_PAD_SD1_CLK__GPIO1_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL),
567
568 MX6_PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL),
569};
570
571
572
573
574
575struct dio_cfg {
576 iomux_v3_cfg_t gpio_padmux;
577 unsigned gpio_param;
578 iomux_v3_cfg_t pwm_padmux;
579 unsigned pwm_param;
580};
581
582struct ventana {
583
584 iomux_v3_cfg_t const *gpio_pads;
585 int num_pads;
586
587 struct dio_cfg dio_cfg[4];
588
589 int leds[3];
590 int pcie_rst;
591 int mezz_pwren;
592 int mezz_irq;
593 int rs485en;
594 int gps_shdn;
595 int vidin_en;
596 int dioi2c_en;
597 int pcie_sson;
598 int usb_sel;
599};
600
601struct ventana gpio_cfg[] = {
602
603 {
604 .gpio_pads = gw54xx_gpio_pads,
605 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads),
606 .dio_cfg = {
607 { MX6_PAD_GPIO_9__GPIO1_IO09, IMX_GPIO_NR(1, 9),
608 MX6_PAD_GPIO_9__PWM1_OUT, 1 },
609 { MX6_PAD_SD1_DAT2__GPIO1_IO19, IMX_GPIO_NR(1, 19),
610 MX6_PAD_SD1_DAT2__PWM2_OUT, 2 },
611 { MX6_PAD_SD4_DAT1__GPIO2_IO09, IMX_GPIO_NR(2, 9),
612 MX6_PAD_SD4_DAT1__PWM3_OUT, 3 },
613 { MX6_PAD_SD4_DAT2__GPIO2_IO10, IMX_GPIO_NR(2, 10),
614 MX6_PAD_SD4_DAT2__PWM4_OUT, 4 },
615 },
616 .leds = {
617 IMX_GPIO_NR(4, 6),
618 IMX_GPIO_NR(4, 10),
619 IMX_GPIO_NR(4, 15),
620 },
621 .pcie_rst = IMX_GPIO_NR(1, 29),
622 .mezz_pwren = IMX_GPIO_NR(4, 7),
623 .mezz_irq = IMX_GPIO_NR(4, 9),
624 .rs485en = IMX_GPIO_NR(3, 24),
625 .dioi2c_en = IMX_GPIO_NR(4, 5),
626 .pcie_sson = IMX_GPIO_NR(1, 20),
627 },
628
629
630 {
631 .gpio_pads = gw51xx_gpio_pads,
632 .num_pads = ARRAY_SIZE(gw51xx_gpio_pads),
633 .dio_cfg = {
634 { MX6_PAD_SD1_DAT0__GPIO1_IO16, IMX_GPIO_NR(1, 16),
635 0, 0 },
636 { MX6_PAD_SD1_DAT2__GPIO1_IO19, IMX_GPIO_NR(1, 19),
637 MX6_PAD_SD1_DAT2__PWM2_OUT, 2 },
638 { MX6_PAD_SD1_DAT1__GPIO1_IO17, IMX_GPIO_NR(1, 17),
639 MX6_PAD_SD1_DAT1__PWM3_OUT, 3 },
640 { MX6_PAD_SD1_CMD__GPIO1_IO18, IMX_GPIO_NR(1, 18),
641 MX6_PAD_SD1_CMD__PWM4_OUT, 4 },
642 },
643 .leds = {
644 IMX_GPIO_NR(4, 6),
645 IMX_GPIO_NR(4, 10),
646 },
647 .pcie_rst = IMX_GPIO_NR(1, 0),
648 .mezz_pwren = IMX_GPIO_NR(2, 19),
649 .mezz_irq = IMX_GPIO_NR(2, 18),
650 .gps_shdn = IMX_GPIO_NR(1, 2),
651 .vidin_en = IMX_GPIO_NR(5, 20),
652 },
653
654
655 {
656 .gpio_pads = gw52xx_gpio_pads,
657 .num_pads = ARRAY_SIZE(gw52xx_gpio_pads),
658 .dio_cfg = {
659 { MX6_PAD_SD1_DAT0__GPIO1_IO16, IMX_GPIO_NR(1, 16),
660 0, 0 },
661 { MX6_PAD_SD1_DAT2__GPIO1_IO19, IMX_GPIO_NR(1, 19),
662 MX6_PAD_SD1_DAT2__PWM2_OUT, 2 },
663 { MX6_PAD_SD1_DAT1__GPIO1_IO17, IMX_GPIO_NR(1, 17),
664 MX6_PAD_SD1_DAT1__PWM3_OUT, 3 },
665 { MX6_PAD_SD1_CLK__GPIO1_IO20, IMX_GPIO_NR(1, 20),
666 0, 0 },
667 },
668 .leds = {
669 IMX_GPIO_NR(4, 6),
670 IMX_GPIO_NR(4, 7),
671 IMX_GPIO_NR(4, 15),
672 },
673 .pcie_rst = IMX_GPIO_NR(1, 29),
674 .mezz_pwren = IMX_GPIO_NR(2, 19),
675 .mezz_irq = IMX_GPIO_NR(2, 18),
676 .gps_shdn = IMX_GPIO_NR(1, 27),
677 .vidin_en = IMX_GPIO_NR(3, 31),
678 .usb_sel = IMX_GPIO_NR(1, 2),
679 },
680
681
682 {
683 .gpio_pads = gw53xx_gpio_pads,
684 .num_pads = ARRAY_SIZE(gw53xx_gpio_pads),
685 .dio_cfg = {
686 { MX6_PAD_SD1_DAT0__GPIO1_IO16, IMX_GPIO_NR(1, 16),
687 0, 0 },
688 { MX6_PAD_SD1_DAT2__GPIO1_IO19, IMX_GPIO_NR(1, 19),
689 MX6_PAD_SD1_DAT2__PWM2_OUT, 2 },
690 { MX6_PAD_SD1_DAT1__GPIO1_IO17, IMX_GPIO_NR(1, 17),
691 MX6_PAD_SD1_DAT1__PWM3_OUT, 3 },
692 { MX6_PAD_SD1_CLK__GPIO1_IO20, IMX_GPIO_NR(1, 20),
693 0, 0 },
694 },
695 .leds = {
696 IMX_GPIO_NR(4, 6),
697 IMX_GPIO_NR(4, 7),
698 IMX_GPIO_NR(4, 15),
699 },
700 .pcie_rst = IMX_GPIO_NR(1, 29),
701 .mezz_pwren = IMX_GPIO_NR(2, 19),
702 .mezz_irq = IMX_GPIO_NR(2, 18),
703 .gps_shdn = IMX_GPIO_NR(1, 27),
704 .vidin_en = IMX_GPIO_NR(3, 31),
705 },
706
707
708 {
709 .gpio_pads = gw54xx_gpio_pads,
710 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads),
711 .dio_cfg = {
712 { MX6_PAD_GPIO_9__GPIO1_IO09, IMX_GPIO_NR(1, 9),
713 MX6_PAD_GPIO_9__PWM1_OUT, 1 },
714 { MX6_PAD_SD1_DAT2__GPIO1_IO19, IMX_GPIO_NR(1, 19),
715 MX6_PAD_SD1_DAT2__PWM2_OUT, 2 },
716 { MX6_PAD_SD4_DAT1__GPIO2_IO09, IMX_GPIO_NR(2, 9),
717 MX6_PAD_SD4_DAT1__PWM3_OUT, 3 },
718 { MX6_PAD_SD4_DAT2__GPIO2_IO10, IMX_GPIO_NR(2, 10),
719 MX6_PAD_SD4_DAT2__PWM4_OUT, 4 },
720 },
721 .leds = {
722 IMX_GPIO_NR(4, 6),
723 IMX_GPIO_NR(4, 7),
724 IMX_GPIO_NR(4, 15),
725 },
726 .pcie_rst = IMX_GPIO_NR(1, 29),
727 .mezz_pwren = IMX_GPIO_NR(2, 19),
728 .mezz_irq = IMX_GPIO_NR(2, 18),
729 .rs485en = IMX_GPIO_NR(7, 1),
730 .vidin_en = IMX_GPIO_NR(3, 31),
731 .dioi2c_en = IMX_GPIO_NR(4, 5),
732 .pcie_sson = IMX_GPIO_NR(1, 20),
733 },
734};
735
736
737static void setup_board_gpio(int board)
738{
739 struct ventana_board_info *info = &ventana_info;
740 const char *s;
741 char arg[10];
742 size_t len;
743 int i;
744 int quiet = simple_strtol(getenv("quiet"), NULL, 10);
745
746 if (board >= GW_UNKNOWN)
747 return;
748
749
750 gpio_direction_output(GP_RS232_EN, (hwconfig("rs232")) ? 0 : 1);
751
752
753 if (is_cpu_type(MXC_CPU_MX6Q) &&
754 test_bit(EECONFIG_SATA, info->config)) {
755 gpio_direction_output(GP_MSATA_SEL,
756 (hwconfig("msata")) ? 1 : 0);
757 } else {
758 gpio_direction_output(GP_MSATA_SEL, 0);
759 }
760
761
762
763
764
765
766 gpio_direction_output(gpio_cfg[board].pcie_rst, 0);
767
768
769 for (i = 0; i < 4; i++) {
770 if (gpio_cfg[board].leds[i])
771 gpio_direction_output(gpio_cfg[board].leds[i], 1);
772 }
773
774
775 gpio_direction_output(gpio_cfg[board].mezz_pwren, 0);
776 gpio_direction_input(gpio_cfg[board].mezz_irq);
777
778
779 if (gpio_cfg[board].rs485en)
780 gpio_direction_output(gpio_cfg[board].rs485en, 0);
781
782
783 if (gpio_cfg[board].gps_shdn)
784 gpio_direction_output(gpio_cfg[board].gps_shdn, 1);
785
786
787 if (gpio_cfg[board].vidin_en)
788 gpio_direction_output(gpio_cfg[board].vidin_en, 1);
789
790
791 if (gpio_cfg[board].dioi2c_en)
792 gpio_direction_output(gpio_cfg[board].dioi2c_en, 0);
793
794
795 if (gpio_cfg[board].pcie_sson)
796 gpio_direction_output(gpio_cfg[board].pcie_sson, 0);
797
798
799 if (gpio_cfg[board].usb_sel)
800 gpio_direction_output(gpio_cfg[board].usb_sel, 0);
801
802
803
804
805
806 for (i = 0; i < 4; i++) {
807 struct dio_cfg *cfg = &gpio_cfg[board].dio_cfg[i];
808 unsigned ctrl = DIO_PAD_CTRL;
809
810 sprintf(arg, "dio%d", i);
811 if (!hwconfig(arg))
812 continue;
813 s = hwconfig_subarg(arg, "padctrl", &len);
814 if (s)
815 ctrl = simple_strtoul(s, NULL, 16) & 0x3ffff;
816 if (hwconfig_subarg_cmp(arg, "mode", "gpio")) {
817 if (!quiet) {
818 printf("DIO%d: GPIO%d_IO%02d (gpio-%d)\n", i,
819 (cfg->gpio_param/32)+1,
820 cfg->gpio_param%32,
821 cfg->gpio_param);
822 }
823 imx_iomux_v3_setup_pad(cfg->gpio_padmux |
824 MUX_PAD_CTRL(ctrl));
825 gpio_direction_input(cfg->gpio_param);
826 } else if (hwconfig_subarg_cmp("dio2", "mode", "pwm") &&
827 cfg->pwm_padmux) {
828 if (!quiet)
829 printf("DIO%d: pwm%d\n", i, cfg->pwm_param);
830 imx_iomux_v3_setup_pad(cfg->pwm_padmux |
831 MUX_PAD_CTRL(ctrl));
832 }
833 }
834
835 if (!quiet) {
836 if (is_cpu_type(MXC_CPU_MX6Q) &&
837 (test_bit(EECONFIG_SATA, info->config))) {
838 printf("MSATA: %s\n", (hwconfig("msata") ?
839 "enabled" : "disabled"));
840 }
841 printf("RS232: %s\n", (hwconfig("rs232")) ?
842 "enabled" : "disabled");
843 }
844}
845
846#if defined(CONFIG_CMD_PCI)
847int imx6_pcie_toggle_reset(void)
848{
849 if (board_type < GW_UNKNOWN) {
850 gpio_direction_output(gpio_cfg[board_type].pcie_rst, 0);
851 mdelay(50);
852 gpio_direction_output(gpio_cfg[board_type].pcie_rst, 1);
853 }
854 return 0;
855}
856#endif
857
858#ifdef CONFIG_SERIAL_TAG
859
860
861
862
863
864
865void get_board_serial(struct tag_serialnr *serialnr)
866{
867 char *serial = getenv("serial#");
868
869 if (serial) {
870 serialnr->high = 0;
871 serialnr->low = simple_strtoul(serial, NULL, 10);
872 } else if (ventana_info.model[0]) {
873 serialnr->high = 0;
874 serialnr->low = ventana_info.serial;
875 } else {
876 serialnr->high = 0;
877 serialnr->low = 0;
878 }
879}
880#endif
881
882
883
884
885
886int board_early_init_f(void)
887{
888 setup_iomux_uart();
889 gpio_direction_output(GP_USB_OTG_PWR, 0);
890
891 return 0;
892}
893
894int dram_init(void)
895{
896 gd->ram_size = get_ram_size((void *)PHYS_SDRAM,
897 CONFIG_DDR_MB*1024*1024);
898
899 return 0;
900}
901
902int board_init(void)
903{
904 struct iomuxc_base_regs *const iomuxc_regs
905 = (struct iomuxc_base_regs *)IOMUXC_BASE_ADDR;
906
907 clrsetbits_le32(&iomuxc_regs->gpr[1],
908 IOMUXC_GPR1_OTG_ID_MASK,
909 IOMUXC_GPR1_OTG_ID_GPIO1);
910
911
912 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
913
914#ifdef CONFIG_CMD_NAND
915 setup_gpmi_nand();
916#endif
917#ifdef CONFIG_MXC_SPI
918 setup_spi();
919#endif
920 setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info0);
921 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
922 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
923
924#ifdef CONFIG_CMD_SATA
925 setup_sata();
926#endif
927
928 board_type = read_eeprom();
929
930
931 if (board_type < GW_UNKNOWN) {
932 imx_iomux_v3_setup_multiple_pads(gw_gpio_pads,
933 ARRAY_SIZE(gw_gpio_pads));
934 imx_iomux_v3_setup_multiple_pads(gpio_cfg[board_type].gpio_pads,
935 gpio_cfg[board_type].num_pads);
936 }
937
938 return 0;
939}
940
941#if defined(CONFIG_DISPLAY_BOARDINFO_LATE)
942
943
944
945
946
947int checkboard(void)
948{
949 struct ventana_board_info *info = &ventana_info;
950 unsigned char buf[4];
951 const char *p;
952 int quiet;
953
954 quiet = 0;
955 p = getenv("quiet");
956 if (p)
957 quiet = simple_strtol(p, NULL, 10);
958 else
959 setenv("quiet", "0");
960
961 puts("\nGateworks Corporation Copyright 2014\n");
962 if (info->model[0]) {
963 printf("Model: %s\n", info->model);
964 printf("MFGDate: %02x-%02x-%02x%02x\n",
965 info->mfgdate[0], info->mfgdate[1],
966 info->mfgdate[2], info->mfgdate[3]);
967 printf("Serial:%d\n", info->serial);
968 } else {
969 puts("Invalid EEPROM - board will not function fully\n");
970 }
971 if (quiet)
972 return 0;
973
974
975 i2c_set_bus_num(I2C_GSC);
976 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_FWVER, 1, buf, 1)) {
977 printf("GSC: v%d", buf[0]);
978 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_STATUS, 1, buf, 4)) {
979 printf(" 0x%04x", buf[2] | buf[3]<<8);
980 printf(" 0x%02x", buf[0]);
981 }
982 puts("\n");
983 }
984
985 if (!gsc_i2c_read(GSC_RTC_ADDR, 0x00, 1, buf, 4)) {
986 printf("RTC: %d\n",
987 buf[0] | buf[1]<<8 | buf[2]<<16 | buf[3]<<24);
988 }
989
990 return 0;
991}
992#endif
993
994#ifdef CONFIG_CMD_BMODE
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007static const struct boot_mode board_boot_modes[] = {
1008
1009 { "nand", MAKE_CFGVAL(0x80, 0x02, 0x00, 0x00) },
1010 { NULL, 0 },
1011};
1012#endif
1013
1014
1015int misc_init_r(void)
1016{
1017 struct ventana_board_info *info = &ventana_info;
1018 unsigned char reg;
1019
1020
1021 if (ventana_info.model[0]) {
1022 char str[16], fdt[36];
1023 char *p;
1024 const char *cputype = "";
1025 int i;
1026
1027
1028
1029
1030
1031
1032
1033 if (is_cpu_type(MXC_CPU_MX6Q))
1034 cputype = "imx6q";
1035 else if (is_cpu_type(MXC_CPU_MX6DL))
1036 cputype = "imx6dl";
1037 memset(str, 0, sizeof(str));
1038 for (i = 0; i < (sizeof(str)-1) && info->model[i]; i++)
1039 str[i] = tolower(info->model[i]);
1040 if (!getenv("model"))
1041 setenv("model", str);
1042 if (!getenv("fdt_file")) {
1043 sprintf(fdt, "%s-%s.dtb", cputype, str);
1044 setenv("fdt_file", fdt);
1045 }
1046 p = strchr(str, '-');
1047 if (p) {
1048 *p++ = 0;
1049
1050 setenv("model_base", str);
1051 if (!getenv("fdt_file1")) {
1052 sprintf(fdt, "%s-%s.dtb", cputype, str);
1053 setenv("fdt_file1", fdt);
1054 }
1055 str[4] = 'x';
1056 str[5] = 'x';
1057 str[6] = 0;
1058 if (!getenv("fdt_file2")) {
1059 sprintf(fdt, "%s-%s.dtb", cputype, str);
1060 setenv("fdt_file2", fdt);
1061 }
1062 }
1063
1064
1065 if (test_bit(EECONFIG_ETH0, info->config) &&
1066 !getenv("ethaddr")) {
1067 eth_setenv_enetaddr("ethaddr", info->mac0);
1068 }
1069 if (test_bit(EECONFIG_ETH1, info->config) &&
1070 !getenv("eth1addr")) {
1071 eth_setenv_enetaddr("eth1addr", info->mac1);
1072 }
1073
1074
1075 sprintf(str, "%6d", info->serial);
1076 setenv("serial#", str);
1077 }
1078
1079
1080 if ((board_type == GW54xx || board_type == GW54proto) &&
1081 !pmic_init(I2C_PMIC)) {
1082 struct pmic *p = pmic_get("PFUZE100_PMIC");
1083 u32 reg;
1084 if (p && !pmic_probe(p)) {
1085 pmic_reg_read(p, PFUZE100_DEVICEID, ®);
1086 printf("PMIC: PFUZE100 ID=0x%02x\n", reg);
1087
1088
1089 pmic_reg_read(p, PFUZE100_VGEN1VOL, ®);
1090 reg &= ~(LDO_VOL_MASK);
1091 reg |= (LDOA_1_50V | LDO_EN);
1092 pmic_reg_write(p, PFUZE100_VGEN1VOL, reg);
1093
1094
1095 pmic_reg_read(p, PFUZE100_SWBSTCON1, ®);
1096 reg &= ~(SWBST_MODE_MASK | SWBST_VOL_MASK);
1097 reg |= (SWBST_5_00V | SWBST_MODE_AUTO);
1098 pmic_reg_write(p, PFUZE100_SWBSTCON1, reg);
1099 }
1100 }
1101
1102
1103 setup_board_gpio(board_type);
1104
1105#ifdef CONFIG_CMD_BMODE
1106 add_board_boot_modes(board_boot_modes);
1107#endif
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121 i2c_set_bus_num(I2C_GSC);
1122 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_CTRL1, 1, ®, 1)) {
1123 reg |= (1 << GSC_SC_CTRL1_WDDIS);
1124 if (gsc_i2c_write(GSC_SC_ADDR, GSC_SC_CTRL1, 1, ®, 1))
1125 puts("Error: could not disable GSC Watchdog\n");
1126 } else {
1127 puts("Error: could not disable GSC Watchdog\n");
1128 }
1129 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_STATUS, 1, ®, 1)) {
1130 if (reg & (1 << GSC_SC_IRQ_WATCHDOG)) {
1131 puts("GSC boot watchdog timeout detected");
1132 reg &= ~(1 << GSC_SC_IRQ_WATCHDOG);
1133 gsc_i2c_write(GSC_SC_ADDR, GSC_SC_STATUS, 1, ®, 1);
1134 }
1135 }
1136
1137 return 0;
1138}
1139
1140#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
1141
1142
1143const char *fdt_aliases[] = {
1144 "ethernet0",
1145 "ethernet1",
1146 "hdmi_out",
1147 "ahci0",
1148 "pcie",
1149 "ssi0",
1150 "ssi1",
1151 "lcd0",
1152 "lvds0",
1153 "lvds1",
1154 "usb0",
1155 "usb1",
1156 "mmc0",
1157 "mmc1",
1158 "mmc2",
1159 "mmc3",
1160 "uart0",
1161 "uart1",
1162 "uart2",
1163 "uart3",
1164 "uart4",
1165 "ipu0",
1166 "ipu1",
1167 "can0",
1168 "mipi_dsi",
1169 "mipi_csi",
1170 "tzasc0",
1171 "tzasc1",
1172 "i2c0",
1173 "i2c1",
1174 "i2c2",
1175 "vpu",
1176 "csi0",
1177 "csi1",
1178 "caam",
1179 NULL,
1180 NULL,
1181 NULL,
1182 NULL,
1183 NULL,
1184 "spi0",
1185 "spi1",
1186 "spi2",
1187 "spi3",
1188 "spi4",
1189 "spi5",
1190 NULL,
1191 NULL,
1192 "pps",
1193 NULL,
1194 NULL,
1195 NULL,
1196 "hdmi_in",
1197 "cvbs_out",
1198 "cvbs_in",
1199 "nand",
1200 NULL,
1201 NULL,
1202 NULL,
1203 NULL,
1204 NULL,
1205 NULL,
1206 NULL,
1207 NULL,
1208};
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219void ft_board_setup(void *blob, bd_t *bd)
1220{
1221 int bit;
1222 struct ventana_board_info *info = &ventana_info;
1223 struct node_info nodes[] = {
1224 { "sst,w25q256", MTD_DEV_TYPE_NOR, },
1225 { "fsl,imx6q-gpmi-nand", MTD_DEV_TYPE_NAND, },
1226 };
1227 const char *model = getenv("model");
1228
1229 if (getenv("fdt_noauto")) {
1230 puts(" Skiping ft_board_setup (fdt_noauto defined)\n");
1231 return;
1232 }
1233
1234
1235 puts(" Updating MTD partitions...\n");
1236 fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
1237
1238 if (!model) {
1239 puts("invalid board info: Leaving FDT fully enabled\n");
1240 return;
1241 }
1242 printf(" Adjusting FDT per EEPROM for %s...\n", model);
1243
1244
1245 fdt_setprop(blob, 0, "system-serial", getenv("serial#"),
1246 strlen(getenv("serial#") + 1));
1247
1248
1249 fdt_setprop(blob, 0, "board", info->model,
1250 strlen((const char *)info->model) + 1);
1251
1252
1253
1254
1255
1256
1257 for (bit = 0; bit < 64; bit++) {
1258 if (!test_bit(bit, info->config))
1259 fdt_del_node_and_alias(blob, fdt_aliases[bit]);
1260 }
1261}
1262#endif
1263
1264