blob: c130e2c1ed6cfdb059124b8b390da2da8de0765e [file] [log] [blame]
Tim Harvey552c3582014-03-06 07:46:30 -08001/*
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 <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/* GPIO's common to all baseboards */
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/* I2C bus numbers */
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 * EEPROM board info struct populated by read_eeprom so that we only have to
81 * read it once.
82 */
83static struct ventana_board_info ventana_info;
84
85enum {
86 GW54proto, /* original GW5400-A prototype */
87 GW51xx,
88 GW52xx,
89 GW53xx,
90 GW54xx,
91 GW_UNKNOWN,
92};
93
94int board_type;
95
96/* UART1: Function varies per baseboard */
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/* UART2: Serial Console */
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/* I2C1: GSC */
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/* I2C2: PMIC/PCIe Switch/PCIe Clock/Mezz */
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/* I2C3: Misc/Expansion */
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/* MMC */
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), /* CD */
161};
162
163/* ENET */
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 /* PHY nRST */
181 MX6_PAD_ENET_TXD0__GPIO1_IO30 | MUX_PAD_CTRL(NO_PAD_CTRL),
182};
183
184/* NAND */
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 /* config gpmi nand iomux */
209 imx_iomux_v3_setup_multiple_pads(nfc_pads, ARRAY_SIZE(nfc_pads));
210
211 /* config gpmi and bch clock to 100 MHz */
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 /* enable gpmi and bch clock gating */
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 /* enable apbh clock gating */
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 /* toggle PHY_RST# */
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), /* OTG PWR */
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 /* Reset USB HUB (present on GW54xx/GW53xx) */
263 switch (info->model[3]) {
264 case '3': /* GW53xx */
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': /* GW54xx */
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 /* CONFIG_USB_EHCI_MX6 */
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 /* Card Detect */
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 /* Only one USDHC controller on Ventana */
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 /* CONFIG_FSL_ESDHC */
312
313#ifdef CONFIG_MXC_SPI
314iomux_v3_cfg_t const ecspi1_pads[] = {
315 /* SS1 */
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/* configure eth0 PHY board-specific LED behavior */
331int board_phy_config(struct phy_device *phydev)
332{
333 unsigned short val;
334
335 /* Marvel 88E1510 */
336 if (phydev->phy_id == 0x1410dd1) {
337 /*
338 * Page 3, Register 16: LED[2:0] Function Control Register
339 * LED[0] (SPD:Amber) R16_3.3:0 to 0111: on-GbE link
340 * LED[1] (LNK:Green) R16_3.7:4 to 0001: on-link, blink-activity
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 /* For otg ethernet*/
366 usb_eth_initialize(bis);
367#endif
368
369 return 0;
370}
371
372/* read ventana EEPROM, check for validity, and return baseboard type */
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 * On a board with a missing/depleted backup battery for GSC, the
387 * board may be ready to probe the GSC before its firmware is
388 * running. We will wait here indefinately for the GSC/EEPROM.
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 /* read eeprom config section */
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 /* sanity checks */
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 /* validate checksum */
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 /* original GW5400-A prototype */
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': /* original GW5400-A prototype */
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 * Baseboard specific GPIO
452 */
453
454/* common to add baseboards */
455static iomux_v3_cfg_t const gw_gpio_pads[] = {
456 /* MSATA_EN */
457 MX6_PAD_SD4_DAT0__GPIO2_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
458 /* RS232_EN# */
459 MX6_PAD_SD4_DAT3__GPIO2_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
460};
461
462/* prototype */
463static iomux_v3_cfg_t const gwproto_gpio_pads[] = {
464 /* PANLEDG# */
465 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
466 /* PANLEDR# */
467 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
468 /* LOCLED# */
469 MX6_PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
470 /* RS485_EN */
471 MX6_PAD_SD3_DAT4__GPIO7_IO01 | MUX_PAD_CTRL(NO_PAD_CTRL),
472 /* IOEXP_PWREN# */
473 MX6_PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL),
474 /* IOEXP_IRQ# */
475 MX6_PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
476 /* VID_EN */
477 MX6_PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL),
478 /* DIOI2C_DIS# */
479 MX6_PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL),
480 /* PCICK_SSON */
481 MX6_PAD_SD1_CLK__GPIO1_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL),
482 /* PCI_RST# */
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 /* PANLEDG# */
488 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
489 /* PANLEDR# */
490 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
491 /* IOEXP_PWREN# */
492 MX6_PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL),
493 /* IOEXP_IRQ# */
494 MX6_PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
495
496 /* GPS_SHDN */
497 MX6_PAD_GPIO_2__GPIO1_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL),
498 /* VID_PWR */
499 MX6_PAD_CSI0_DATA_EN__GPIO5_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL),
500 /* PCI_RST# */
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 /* PANLEDG# */
506 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
507 /* PANLEDR# */
508 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
509 /* IOEXP_PWREN# */
510 MX6_PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL),
511 /* IOEXP_IRQ# */
512 MX6_PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
513
514 /* MX6_LOCLED# */
515 MX6_PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
516 /* GPS_SHDN */
517 MX6_PAD_ENET_RXD0__GPIO1_IO27 | MUX_PAD_CTRL(NO_PAD_CTRL),
518 /* USBOTG_SEL */
519 MX6_PAD_GPIO_2__GPIO1_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL),
520 /* VID_PWR */
521 MX6_PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL),
522 /* PCI_RST# */
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 /* PANLEDG# */
528 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
529 /* PANLEDR# */
530 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
531 /* IOEXP_PWREN# */
532 MX6_PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL),
533 /* IOEXP_IRQ# */
534 MX6_PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
535
536 /* MX6_LOCLED# */
537 MX6_PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
538 /* GPS_SHDN */
539 MX6_PAD_ENET_RXD0__GPIO1_IO27 | MUX_PAD_CTRL(NO_PAD_CTRL),
540 /* VID_EN */
541 MX6_PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL),
542 /* PCI_RST# */
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 /* PANLEDG# */
548 MX6_PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
549 /* PANLEDR# */
550 MX6_PAD_KEY_COL2__GPIO4_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
551 /* MX6_LOCLED# */
552 MX6_PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
553 /* MIPI_DIO */
554 MX6_PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL),
555 /* RS485_EN */
556 MX6_PAD_EIM_D24__GPIO3_IO24 | MUX_PAD_CTRL(NO_PAD_CTRL),
557 /* IOEXP_PWREN# */
558 MX6_PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
559 /* IOEXP_IRQ# */
560 MX6_PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL),
561 /* DIOI2C_DIS# */
562 MX6_PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL),
563 /* DIOI2C_DIS# */
564 MX6_PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL),
565 /* PCICK_SSON */
566 MX6_PAD_SD1_CLK__GPIO1_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL),
567 /* PCI_RST# */
568 MX6_PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL),
569};
570
571/*
572 * each baseboard has 4 user configurable Digital IO lines which can
573 * be pinmuxed as a GPIO or in some cases a PWM
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 /* pinmux */
584 iomux_v3_cfg_t const *gpio_pads;
585 int num_pads;
586 /* DIO pinmux/val */
587 struct dio_cfg dio_cfg[4];
588 /* various gpios (0 if non-existent) */
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 /* GW5400proto */
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 /* GW51xx */
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 /* GW52xx */
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 /* GW53xx */
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 /* GW54xx */
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/* setup GPIO pinmux and default configuration per baseboard */
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 /* RS232_EN# */
750 gpio_direction_output(GP_RS232_EN, (hwconfig("rs232")) ? 0 : 1);
751
752 /* MSATA Enable */
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 * assert PCI_RST# (released by OS when clock is valid)
763 * TODO: figure out why leaving this de-asserted from PCI scan on boot
764 * causes linux pcie driver to hang during enumeration
765 */
766 gpio_direction_output(gpio_cfg[board].pcie_rst, 0);
767
768 /* turn off (active-high) user LED's */
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 /* Expansion Mezzanine IO */
775 gpio_direction_output(gpio_cfg[board].mezz_pwren, 0);
776 gpio_direction_input(gpio_cfg[board].mezz_irq);
777
778 /* RS485 Transmit Enable */
779 if (gpio_cfg[board].rs485en)
780 gpio_direction_output(gpio_cfg[board].rs485en, 0);
781
782 /* GPS_SHDN */
783 if (gpio_cfg[board].gps_shdn)
784 gpio_direction_output(gpio_cfg[board].gps_shdn, 1);
785
786 /* Analog video codec power enable */
787 if (gpio_cfg[board].vidin_en)
788 gpio_direction_output(gpio_cfg[board].vidin_en, 1);
789
790 /* DIOI2C_DIS# */
791 if (gpio_cfg[board].dioi2c_en)
792 gpio_direction_output(gpio_cfg[board].dioi2c_en, 0);
793
794 /* PCICK_SSON: disable spread-spectrum clock */
795 if (gpio_cfg[board].pcie_sson)
796 gpio_direction_output(gpio_cfg[board].pcie_sson, 0);
797
798 /* USBOTG Select (PCISKT or FrontPanel) */
799 if (gpio_cfg[board].usb_sel)
800 gpio_direction_output(gpio_cfg[board].usb_sel, 0);
801
802 /*
803 * Configure DIO pinmux/padctl registers
804 * see IMX6DQRM/IMX6SDLRM IOMUXC_SW_PAD_CTL_PAD_* register definitions
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 /* CONFIG_CMD_PCI */
857
858#ifdef CONFIG_SERIAL_TAG
859/*
860 * called when setting up ATAGS before booting kernel
861 * populate serialnum from the following (in order of priority):
862 * serial# env var
863 * eeprom
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 * Board Support
884 */
885
886int board_early_init_f(void)
887{
888 setup_iomux_uart();
889 gpio_direction_output(GP_USB_OTG_PWR, 0); /* OTG power off */
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 /* address of linux boot parameters */
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 /* read Gateworks EEPROM into global struct (used later) */
928 board_type = read_eeprom();
929
930 /* board-specifc GPIO iomux */
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 * called during late init (after relocation and after board_init())
944 * by virtue of CONFIG_DISPLAY_BOARDINFO_LATE as we needed i2c initialized and
945 * EEPROM read.
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; /* Quiet or minimal output mode */
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 /* Display GSC firmware revision/CRC/status */
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); /* CRC */
980 printf(" 0x%02x", buf[0]); /* irq status */
981 }
982 puts("\n");
983 }
984 /* Display RTC */
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 * BOOT_CFG1, BOOT_CFG2, BOOT_CFG3, BOOT_CFG4
997 * see Table 8-11 and Table 5-9
998 * BOOT_CFG1[7] = 1 (boot from NAND)
999 * BOOT_CFG1[5] = 0 - raw NAND
1000 * BOOT_CFG1[4] = 0 - default pad settings
1001 * BOOT_CFG1[3:2] = 00 - devices = 1
1002 * BOOT_CFG1[1:0] = 00 - Row Address Cycles = 3
1003 * BOOT_CFG2[4:3] = 00 - Boot Search Count = 2
1004 * BOOT_CFG2[2:1] = 01 - Pages In Block = 64
1005 * BOOT_CFG2[0] = 0 - Reset time 12ms
1006 */
1007static const struct boot_mode board_boot_modes[] = {
1008 /* NAND: 64pages per block, 3 row addr cycles, 2 copies of FCB/DBBT */
1009 { "nand", MAKE_CFGVAL(0x80, 0x02, 0x00, 0x00) },
1010 { NULL, 0 },
1011};
1012#endif
1013
1014/* late init */
1015int misc_init_r(void)
1016{
1017 struct ventana_board_info *info = &ventana_info;
1018 unsigned char reg;
1019
1020 /* set env vars based on EEPROM data */
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 * FDT name will be prefixed with CPU type. Three versions
1029 * will be created each increasingly generic and bootloader
1030 * env scripts will try loading each from most specific to
1031 * least.
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 /* initialize env from EEPROM */
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 /* board serial-number */
1075 sprintf(str, "%6d", info->serial);
1076 setenv("serial#", str);
1077 }
1078
1079 /* configure PFUZE100 PMIC (not used on all Ventana baseboards) */
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, &reg);
1086 printf("PMIC: PFUZE100 ID=0x%02x\n", reg);
1087
1088 /* Set VGEN1 to 1.5V and enable */
1089 pmic_reg_read(p, PFUZE100_VGEN1VOL, &reg);
1090 reg &= ~(LDO_VOL_MASK);
1091 reg |= (LDOA_1_50V | LDO_EN);
1092 pmic_reg_write(p, PFUZE100_VGEN1VOL, reg);
1093
1094 /* Set SWBST to 5.0V and enable */
1095 pmic_reg_read(p, PFUZE100_SWBSTCON1, &reg);
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 /* setup baseboard specific GPIO pinmux and config */
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 * The Gateworks System Controller implements a boot
1111 * watchdog (always enabled) as a workaround for IMX6 boot related
1112 * errata such as:
1113 * ERR005768 - no fix
1114 * ERR006282 - fixed in silicon r1.3
1115 * ERR007117 - fixed in silicon r1.3
1116 * ERR007220 - fixed in silicon r1.3
1117 * see http://cache.freescale.com/files/32bit/doc/errata/IMX6DQCE.pdf
1118 *
1119 * Disable the boot watchdog and display/clear the timeout flag if set
1120 */
1121 i2c_set_bus_num(I2C_GSC);
1122 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 1)) {
1123 reg |= (1 << GSC_SC_CTRL1_WDDIS);
1124 if (gsc_i2c_write(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 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, &reg, 1)) {
1130 if (reg & (1 << GSC_SC_IRQ_WATCHDOG)) { /* watchdog timeout */
1131 puts("GSC boot watchdog timeout detected");
1132 reg &= ~(1 << GSC_SC_IRQ_WATCHDOG); /* clear flag */
1133 gsc_i2c_write(GSC_SC_ADDR, GSC_SC_STATUS, 1, &reg, 1);
1134 }
1135 }
1136
1137 return 0;
1138}
1139
1140#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
1141
1142/* FDT aliases associated with EEPROM config bits */
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 * called prior to booting kernel or by 'fdt boardsetup' command
1212 *
1213 * unless 'fdt_noauto' env var is set we will update the following in the DTB:
1214 * - mtd partitions based on mtdparts/mtdids env
1215 * - system-serial (board serial num from EEPROM)
1216 * - board (full model from EEPROM)
1217 * - peripherals removed from DTB if not loaded on board (per EEPROM config)
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, }, /* SPI flash */
1225 { "fsl,imx6q-gpmi-nand", MTD_DEV_TYPE_NAND, }, /* NAND flash */
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 /* Update partition nodes using info from mtdparts env var */
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 /* board serial number */
1245 fdt_setprop(blob, 0, "system-serial", getenv("serial#"),
1246 strlen(getenv("serial#") + 1));
1247
1248 /* board (model contains model from device-tree) */
1249 fdt_setprop(blob, 0, "board", info->model,
1250 strlen((const char *)info->model) + 1);
1251
1252 /*
1253 * Peripheral Config:
1254 * remove nodes by alias path if EEPROM config tells us the
1255 * peripheral is not loaded on the board.
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 /* defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) */
1263