]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/gateworks/gw_ventana/gw_ventana.c
Merge branch 'master' of http://git.denx.de/u-boot-sunxi
[karo-tx-uboot.git] / board / gateworks / gw_ventana / gw_ventana.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 <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/mxc_hdmi.h>
16 #include <asm/arch/crm_regs.h>
17 #include <asm/arch/sys_proto.h>
18 #include <asm/gpio.h>
19 #include <asm/imx-common/iomux-v3.h>
20 #include <asm/imx-common/mxc_i2c.h>
21 #include <asm/imx-common/boot_mode.h>
22 #include <asm/imx-common/sata.h>
23 #include <asm/imx-common/video.h>
24 #include <jffs2/load_kernel.h>
25 #include <hwconfig.h>
26 #include <i2c.h>
27 #include <linux/ctype.h>
28 #include <fdt_support.h>
29 #include <fsl_esdhc.h>
30 #include <miiphy.h>
31 #include <mmc.h>
32 #include <mtd_node.h>
33 #include <netdev.h>
34 #include <power/pmic.h>
35 #include <power/ltc3676_pmic.h>
36 #include <power/pfuze100_pmic.h>
37 #include <fdt_support.h>
38 #include <jffs2/load_kernel.h>
39 #include <spi_flash.h>
40
41 #include "gsc.h"
42 #include "ventana_eeprom.h"
43
44 DECLARE_GLOBAL_DATA_PTR;
45
46 /* GPIO's common to all baseboards */
47 #define GP_PHY_RST      IMX_GPIO_NR(1, 30)
48 #define GP_USB_OTG_PWR  IMX_GPIO_NR(3, 22)
49 #define GP_SD3_CD       IMX_GPIO_NR(7, 0)
50 #define GP_RS232_EN     IMX_GPIO_NR(2, 11)
51 #define GP_MSATA_SEL    IMX_GPIO_NR(2, 8)
52
53 /* I2C bus numbers */
54 #define I2C_GSC         0
55 #define I2C_PMIC        1
56
57 #define UART_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |             \
58         PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
59         PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
60
61 #define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |             \
62         PAD_CTL_PUS_47K_UP  | PAD_CTL_SPEED_LOW |               \
63         PAD_CTL_DSE_80ohm   | PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
64
65 #define ENET_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |             \
66         PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |             \
67         PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
68
69 #define SPI_PAD_CTRL (PAD_CTL_HYS |                             \
70         PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |             \
71         PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
72
73 #define DIO_PAD_CTRL  (PAD_CTL_PKE | PAD_CTL_PUE |              \
74         PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
75         PAD_CTL_DSE_34ohm | PAD_CTL_HYS | PAD_CTL_SRE_FAST)
76
77 #define I2C_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                    \
78         PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
79         PAD_CTL_ODE | PAD_CTL_SRE_FAST)
80
81 /*
82  * EEPROM board info struct populated by read_eeprom so that we only have to
83  * read it once.
84  */
85 static struct ventana_board_info ventana_info;
86
87 int board_type;
88
89 /* UART1: Function varies per baseboard */
90 iomux_v3_cfg_t const uart1_pads[] = {
91         IOMUX_PADS(PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
92         IOMUX_PADS(PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
93 };
94
95 /* UART2: Serial Console */
96 iomux_v3_cfg_t const uart2_pads[] = {
97         IOMUX_PADS(PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
98         IOMUX_PADS(PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
99 };
100
101 #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
102
103 /* I2C1: GSC */
104 struct i2c_pads_info mx6q_i2c_pad_info0 = {
105         .scl = {
106                 .i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
107                 .gpio_mode = MX6Q_PAD_EIM_D21__GPIO3_IO21 | PC,
108                 .gp = IMX_GPIO_NR(3, 21)
109         },
110         .sda = {
111                 .i2c_mode = MX6Q_PAD_EIM_D28__I2C1_SDA | PC,
112                 .gpio_mode = MX6Q_PAD_EIM_D28__GPIO3_IO28 | PC,
113                 .gp = IMX_GPIO_NR(3, 28)
114         }
115 };
116 struct i2c_pads_info mx6dl_i2c_pad_info0 = {
117         .scl = {
118                 .i2c_mode = MX6DL_PAD_EIM_D21__I2C1_SCL | PC,
119                 .gpio_mode = MX6DL_PAD_EIM_D21__GPIO3_IO21 | PC,
120                 .gp = IMX_GPIO_NR(3, 21)
121         },
122         .sda = {
123                 .i2c_mode = MX6DL_PAD_EIM_D28__I2C1_SDA | PC,
124                 .gpio_mode = MX6DL_PAD_EIM_D28__GPIO3_IO28 | PC,
125                 .gp = IMX_GPIO_NR(3, 28)
126         }
127 };
128
129 /* I2C2: PMIC/PCIe Switch/PCIe Clock/Mezz */
130 struct i2c_pads_info mx6q_i2c_pad_info1 = {
131         .scl = {
132                 .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
133                 .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | PC,
134                 .gp = IMX_GPIO_NR(4, 12)
135         },
136         .sda = {
137                 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
138                 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
139                 .gp = IMX_GPIO_NR(4, 13)
140         }
141 };
142 struct i2c_pads_info mx6dl_i2c_pad_info1 = {
143         .scl = {
144                 .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | PC,
145                 .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | PC,
146                 .gp = IMX_GPIO_NR(4, 12)
147         },
148         .sda = {
149                 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
150                 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
151                 .gp = IMX_GPIO_NR(4, 13)
152         }
153 };
154
155 /* I2C3: Misc/Expansion */
156 struct i2c_pads_info mx6q_i2c_pad_info2 = {
157         .scl = {
158                 .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
159                 .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
160                 .gp = IMX_GPIO_NR(1, 3)
161         },
162         .sda = {
163                 .i2c_mode = MX6Q_PAD_GPIO_6__I2C3_SDA | PC,
164                 .gpio_mode = MX6Q_PAD_GPIO_6__GPIO1_IO06 | PC,
165                 .gp = IMX_GPIO_NR(1, 6)
166         }
167 };
168 struct i2c_pads_info mx6dl_i2c_pad_info2 = {
169         .scl = {
170                 .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
171                 .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
172                 .gp = IMX_GPIO_NR(1, 3)
173         },
174         .sda = {
175                 .i2c_mode = MX6DL_PAD_GPIO_6__I2C3_SDA | PC,
176                 .gpio_mode = MX6DL_PAD_GPIO_6__GPIO1_IO06 | PC,
177                 .gp = IMX_GPIO_NR(1, 6)
178         }
179 };
180
181 /* MMC */
182 iomux_v3_cfg_t const usdhc3_pads[] = {
183         IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
184         IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
185         IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
186         IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
187         IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
188         IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
189         /* CD */
190         IOMUX_PADS(PAD_SD3_DAT5__GPIO7_IO00  | MUX_PAD_CTRL(NO_PAD_CTRL)),
191 };
192
193 /* ENET */
194 iomux_v3_cfg_t const enet_pads[] = {
195         IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
196         IOMUX_PADS(PAD_ENET_MDC__ENET_MDC    | MUX_PAD_CTRL(ENET_PAD_CTRL)),
197         IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
198         IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
199         IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
200         IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
201         IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
202         IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL |
203                    MUX_PAD_CTRL(ENET_PAD_CTRL)),
204         IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK |
205                    MUX_PAD_CTRL(ENET_PAD_CTRL)),
206         IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
207         IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
208         IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
209         IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
210         IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
211         IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL |
212                    MUX_PAD_CTRL(ENET_PAD_CTRL)),
213         /* PHY nRST */
214         IOMUX_PADS(PAD_ENET_TXD0__GPIO1_IO30 | MUX_PAD_CTRL(NO_PAD_CTRL)),
215 };
216
217 /* NAND */
218 iomux_v3_cfg_t const nfc_pads[] = {
219         IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE     | MUX_PAD_CTRL(NO_PAD_CTRL)),
220         IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE     | MUX_PAD_CTRL(NO_PAD_CTRL)),
221         IOMUX_PADS(PAD_NANDF_WP_B__NAND_WP_B   | MUX_PAD_CTRL(NO_PAD_CTRL)),
222         IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
223         IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B   | MUX_PAD_CTRL(NO_PAD_CTRL)),
224         IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B      | MUX_PAD_CTRL(NO_PAD_CTRL)),
225         IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B      | MUX_PAD_CTRL(NO_PAD_CTRL)),
226         IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00   | MUX_PAD_CTRL(NO_PAD_CTRL)),
227         IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01   | MUX_PAD_CTRL(NO_PAD_CTRL)),
228         IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02   | MUX_PAD_CTRL(NO_PAD_CTRL)),
229         IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03   | MUX_PAD_CTRL(NO_PAD_CTRL)),
230         IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04   | MUX_PAD_CTRL(NO_PAD_CTRL)),
231         IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05   | MUX_PAD_CTRL(NO_PAD_CTRL)),
232         IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06   | MUX_PAD_CTRL(NO_PAD_CTRL)),
233         IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07   | MUX_PAD_CTRL(NO_PAD_CTRL)),
234 };
235
236 #ifdef CONFIG_CMD_NAND
237 static void setup_gpmi_nand(void)
238 {
239         struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
240
241         /* config gpmi nand iomux */
242         SETUP_IOMUX_PADS(nfc_pads);
243
244         /* config gpmi and bch clock to 100 MHz */
245         clrsetbits_le32(&mxc_ccm->cs2cdr,
246                         MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK |
247                         MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK |
248                         MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK,
249                         MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
250                         MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
251                         MXC_CCM_CS2CDR_ENFC_CLK_SEL(3));
252
253         /* enable gpmi and bch clock gating */
254         setbits_le32(&mxc_ccm->CCGR4,
255                      MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK |
256                      MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK |
257                      MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK |
258                      MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK |
259                      MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_OFFSET);
260
261         /* enable apbh clock gating */
262         setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
263 }
264 #endif
265
266 static void setup_iomux_enet(void)
267 {
268         SETUP_IOMUX_PADS(enet_pads);
269
270         /* toggle PHY_RST# */
271         gpio_direction_output(GP_PHY_RST, 0);
272         mdelay(2);
273         gpio_set_value(GP_PHY_RST, 1);
274 }
275
276 static void setup_iomux_uart(void)
277 {
278         SETUP_IOMUX_PADS(uart1_pads);
279         SETUP_IOMUX_PADS(uart2_pads);
280 }
281
282 #ifdef CONFIG_USB_EHCI_MX6
283 iomux_v3_cfg_t const usb_pads[] = {
284         IOMUX_PADS(PAD_GPIO_1__USB_OTG_ID   | MUX_PAD_CTRL(DIO_PAD_CTRL)),
285         IOMUX_PADS(PAD_KEY_COL4__USB_OTG_OC | MUX_PAD_CTRL(DIO_PAD_CTRL)),
286         /* OTG PWR */
287         IOMUX_PADS(PAD_EIM_D22__GPIO3_IO22  | MUX_PAD_CTRL(DIO_PAD_CTRL)),
288 };
289
290 int board_ehci_hcd_init(int port)
291 {
292         struct ventana_board_info *info = &ventana_info;
293
294         SETUP_IOMUX_PADS(usb_pads);
295
296         /* Reset USB HUB (present on GW54xx/GW53xx) */
297         switch (info->model[3]) {
298         case '3': /* GW53xx */
299                 SETUP_IOMUX_PAD(PAD_GPIO_9__GPIO1_IO09 |
300                                 MUX_PAD_CTRL(NO_PAD_CTRL));
301                 gpio_direction_output(IMX_GPIO_NR(1, 9), 0);
302                 mdelay(2);
303                 gpio_set_value(IMX_GPIO_NR(1, 9), 1);
304                 break;
305         case '4': /* GW54xx */
306                 SETUP_IOMUX_PAD(PAD_SD1_DAT0__GPIO1_IO16 |
307                                 MUX_PAD_CTRL(NO_PAD_CTRL));
308                 gpio_direction_output(IMX_GPIO_NR(1, 16), 0);
309                 mdelay(2);
310                 gpio_set_value(IMX_GPIO_NR(1, 16), 1);
311                 break;
312         }
313
314         return 0;
315 }
316
317 int board_ehci_power(int port, int on)
318 {
319         if (port)
320                 return 0;
321         gpio_set_value(GP_USB_OTG_PWR, on);
322         return 0;
323 }
324 #endif /* CONFIG_USB_EHCI_MX6 */
325
326 #ifdef CONFIG_FSL_ESDHC
327 struct fsl_esdhc_cfg usdhc_cfg = { USDHC3_BASE_ADDR };
328
329 int board_mmc_getcd(struct mmc *mmc)
330 {
331         /* Card Detect */
332         gpio_direction_input(GP_SD3_CD);
333         return !gpio_get_value(GP_SD3_CD);
334 }
335
336 int board_mmc_init(bd_t *bis)
337 {
338         /* Only one USDHC controller on Ventana */
339         SETUP_IOMUX_PADS(usdhc3_pads);
340         usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
341         usdhc_cfg.max_bus_width = 4;
342
343         return fsl_esdhc_initialize(bis, &usdhc_cfg);
344 }
345 #endif /* CONFIG_FSL_ESDHC */
346
347 #ifdef CONFIG_MXC_SPI
348 iomux_v3_cfg_t const ecspi1_pads[] = {
349         /* SS1 */
350         IOMUX_PADS(PAD_EIM_D19__GPIO3_IO19  | MUX_PAD_CTRL(SPI_PAD_CTRL)),
351         IOMUX_PADS(PAD_EIM_D17__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
352         IOMUX_PADS(PAD_EIM_D18__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)),
353         IOMUX_PADS(PAD_EIM_D16__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
354 };
355
356 static void setup_spi(void)
357 {
358         gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
359         SETUP_IOMUX_PADS(ecspi1_pads);
360 }
361 #endif
362
363 /* configure eth0 PHY board-specific LED behavior */
364 int board_phy_config(struct phy_device *phydev)
365 {
366         unsigned short val;
367
368         /* Marvel 88E1510 */
369         if (phydev->phy_id == 0x1410dd1) {
370                 /*
371                  * Page 3, Register 16: LED[2:0] Function Control Register
372                  * LED[0] (SPD:Amber) R16_3.3:0 to 0111: on-GbE link
373                  * LED[1] (LNK:Green) R16_3.7:4 to 0001: on-link, blink-activity
374                  */
375                 phy_write(phydev, MDIO_DEVAD_NONE, 22, 3);
376                 val = phy_read(phydev, MDIO_DEVAD_NONE, 16);
377                 val &= 0xff00;
378                 val |= 0x0017;
379                 phy_write(phydev, MDIO_DEVAD_NONE, 16, val);
380                 phy_write(phydev, MDIO_DEVAD_NONE, 22, 0);
381         }
382
383         if (phydev->drv->config)
384                 phydev->drv->config(phydev);
385
386         return 0;
387 }
388
389 int board_eth_init(bd_t *bis)
390 {
391         setup_iomux_enet();
392
393 #ifdef CONFIG_FEC_MXC
394         cpu_eth_init(bis);
395 #endif
396
397 #ifdef CONFIG_CI_UDC
398         /* For otg ethernet*/
399         usb_eth_initialize(bis);
400 #endif
401
402         return 0;
403 }
404
405 #if defined(CONFIG_VIDEO_IPUV3)
406
407 static void enable_hdmi(struct display_info_t const *dev)
408 {
409         imx_enable_hdmi_phy();
410 }
411
412 static int detect_i2c(struct display_info_t const *dev)
413 {
414         return i2c_set_bus_num(dev->bus) == 0 &&
415                 i2c_probe(dev->addr) == 0;
416 }
417
418 static void enable_lvds(struct display_info_t const *dev)
419 {
420         struct iomuxc *iomux = (struct iomuxc *)
421                                 IOMUXC_BASE_ADDR;
422
423         /* set CH0 data width to 24bit (IOMUXC_GPR2:5 0=18bit, 1=24bit) */
424         u32 reg = readl(&iomux->gpr[2]);
425         reg |= IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT;
426         writel(reg, &iomux->gpr[2]);
427
428         /* Enable Backlight */
429         SETUP_IOMUX_PAD(PAD_SD1_CMD__GPIO1_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL));
430         gpio_direction_output(IMX_GPIO_NR(1, 18), 1);
431 }
432
433 struct display_info_t const displays[] = {{
434         /* HDMI Output */
435         .bus    = -1,
436         .addr   = 0,
437         .pixfmt = IPU_PIX_FMT_RGB24,
438         .detect = detect_hdmi,
439         .enable = enable_hdmi,
440         .mode   = {
441                 .name           = "HDMI",
442                 .refresh        = 60,
443                 .xres           = 1024,
444                 .yres           = 768,
445                 .pixclock       = 15385,
446                 .left_margin    = 220,
447                 .right_margin   = 40,
448                 .upper_margin   = 21,
449                 .lower_margin   = 7,
450                 .hsync_len      = 60,
451                 .vsync_len      = 10,
452                 .sync           = FB_SYNC_EXT,
453                 .vmode          = FB_VMODE_NONINTERLACED
454 } }, {
455         /* Freescale MXC-LVDS1: HannStar HSD100PXN1-A00 w/ egalx_ts cont */
456         .bus    = 2,
457         .addr   = 0x4,
458         .pixfmt = IPU_PIX_FMT_LVDS666,
459         .detect = detect_i2c,
460         .enable = enable_lvds,
461         .mode   = {
462                 .name           = "Hannstar-XGA",
463                 .refresh        = 60,
464                 .xres           = 1024,
465                 .yres           = 768,
466                 .pixclock       = 15385,
467                 .left_margin    = 220,
468                 .right_margin   = 40,
469                 .upper_margin   = 21,
470                 .lower_margin   = 7,
471                 .hsync_len      = 60,
472                 .vsync_len      = 10,
473                 .sync           = FB_SYNC_EXT,
474                 .vmode          = FB_VMODE_NONINTERLACED
475 } } };
476 size_t display_count = ARRAY_SIZE(displays);
477
478 static void setup_display(void)
479 {
480         struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
481         struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
482         int reg;
483
484         enable_ipu_clock();
485         imx_setup_hdmi();
486         /* Turn on LDB0,IPU,IPU DI0 clocks */
487         reg = __raw_readl(&mxc_ccm->CCGR3);
488         reg |= MXC_CCM_CCGR3_LDB_DI0_MASK;
489         writel(reg, &mxc_ccm->CCGR3);
490
491         /* set LDB0, LDB1 clk select to 011/011 */
492         reg = readl(&mxc_ccm->cs2cdr);
493         reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
494                  |MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
495         reg |= (3<<MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
496               |(3<<MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
497         writel(reg, &mxc_ccm->cs2cdr);
498
499         reg = readl(&mxc_ccm->cscmr2);
500         reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
501         writel(reg, &mxc_ccm->cscmr2);
502
503         reg = readl(&mxc_ccm->chsccdr);
504         reg |= (CHSCCDR_CLK_SEL_LDB_DI0
505                 <<MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
506         writel(reg, &mxc_ccm->chsccdr);
507
508         reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
509              |IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_HIGH
510              |IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
511              |IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
512              |IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
513              |IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
514              |IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
515              |IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED
516              |IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0;
517         writel(reg, &iomux->gpr[2]);
518
519         reg = readl(&iomux->gpr[3]);
520         reg = (reg & ~IOMUXC_GPR3_LVDS0_MUX_CTL_MASK)
521             | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
522                <<IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET);
523         writel(reg, &iomux->gpr[3]);
524
525         /* Backlight CABEN on LVDS connector */
526         SETUP_IOMUX_PAD(PAD_SD2_CLK__GPIO1_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL));
527         gpio_direction_output(IMX_GPIO_NR(1, 10), 0);
528 }
529 #endif /* CONFIG_VIDEO_IPUV3 */
530
531 /*
532  * Baseboard specific GPIO
533  */
534
535 /* common to add baseboards */
536 static iomux_v3_cfg_t const gw_gpio_pads[] = {
537         /* MSATA_EN */
538         IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL)),
539         /* RS232_EN# */
540         IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL)),
541 };
542
543 /* prototype */
544 static iomux_v3_cfg_t const gwproto_gpio_pads[] = {
545         /* PANLEDG# */
546         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
547         /* PANLEDR# */
548         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
549         /* LOCLED# */
550         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
551         /* RS485_EN */
552         IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
553         /* IOEXP_PWREN# */
554         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
555         /* IOEXP_IRQ# */
556         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
557         /* VID_EN */
558         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL)),
559         /* DIOI2C_DIS# */
560         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
561         /* PCICK_SSON */
562         IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL)),
563         /* PCI_RST# */
564         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL)),
565 };
566
567 static iomux_v3_cfg_t const gw51xx_gpio_pads[] = {
568         /* PANLEDG# */
569         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
570         /* PANLEDR# */
571         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
572         /* IOEXP_PWREN# */
573         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
574         /* IOEXP_IRQ# */
575         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
576
577         /* GPS_SHDN */
578         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
579         /* VID_PWR */
580         IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL)),
581         /* PCI_RST# */
582         IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
583 };
584
585 static iomux_v3_cfg_t const gw52xx_gpio_pads[] = {
586         /* PANLEDG# */
587         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
588         /* PANLEDR# */
589         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
590         /* IOEXP_PWREN# */
591         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
592         /* IOEXP_IRQ# */
593         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
594
595         /* MX6_LOCLED# */
596         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
597         /* GPS_SHDN */
598         IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | MUX_PAD_CTRL(NO_PAD_CTRL)),
599         /* USBOTG_SEL */
600         IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
601         /* VID_PWR */
602         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL)),
603         /* PCI_RST# */
604         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL)),
605 };
606
607 static iomux_v3_cfg_t const gw53xx_gpio_pads[] = {
608         /* PANLEDG# */
609         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
610         /* PANLEDR# */
611         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
612         /* IOEXP_PWREN# */
613         IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
614         /* IOEXP_IRQ# */
615         IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
616
617         /* MX6_LOCLED# */
618         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
619         /* GPS_SHDN */
620         IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | MUX_PAD_CTRL(NO_PAD_CTRL)),
621         /* VID_EN */
622         IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | MUX_PAD_CTRL(NO_PAD_CTRL)),
623         /* PCI_RST# */
624         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL)),
625 };
626
627 static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
628         /* PANLEDG# */
629         IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
630         /* PANLEDR# */
631         IOMUX_PADS(PAD_KEY_COL2__GPIO4_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL)),
632         /* MX6_LOCLED# */
633         IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
634         /* MIPI_DIO */
635         IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
636         /* RS485_EN */
637         IOMUX_PADS(PAD_EIM_D24__GPIO3_IO24 | MUX_PAD_CTRL(NO_PAD_CTRL)),
638         /* IOEXP_PWREN# */
639         IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
640         /* IOEXP_IRQ# */
641         IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
642         /* DIOI2C_DIS# */
643         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
644         /* DIOI2C_DIS# */
645         IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
646         /* PCICK_SSON */
647         IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL)),
648         /* PCI_RST# */
649         IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL)),
650 };
651
652 /*
653  * each baseboard has 4 user configurable Digital IO lines which can
654  * be pinmuxed as a GPIO or in some cases a PWM
655  */
656 struct dio_cfg {
657         iomux_v3_cfg_t gpio_padmux[2];
658         unsigned gpio_param;
659         iomux_v3_cfg_t pwm_padmux[2];
660         unsigned pwm_param;
661 };
662
663 struct ventana {
664         /* pinmux */
665         iomux_v3_cfg_t const *gpio_pads;
666         int num_pads;
667         /* DIO pinmux/val */
668         struct dio_cfg dio_cfg[4];
669         /* various gpios (0 if non-existent) */
670         int leds[3];
671         int pcie_rst;
672         int mezz_pwren;
673         int mezz_irq;
674         int rs485en;
675         int gps_shdn;
676         int vidin_en;
677         int dioi2c_en;
678         int pcie_sson;
679         int usb_sel;
680 };
681
682 struct ventana gpio_cfg[] = {
683         /* GW5400proto */
684         {
685                 .gpio_pads = gw54xx_gpio_pads,
686                 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
687                 .dio_cfg = {
688                         {
689                                 { IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09) },
690                                 IMX_GPIO_NR(1, 9),
691                                 { IOMUX_PADS(PAD_GPIO_9__PWM1_OUT) },
692                                 1
693                         },
694                         {
695                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
696                                 IMX_GPIO_NR(1, 19),
697                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
698                                 2
699                         },
700                         {
701                                 { IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09) },
702                                 IMX_GPIO_NR(2, 9),
703                                 { IOMUX_PADS(PAD_SD4_DAT1__PWM3_OUT) },
704                                 3
705                         },
706                         {
707                                 { IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10) },
708                                 IMX_GPIO_NR(2, 10),
709                                 { IOMUX_PADS(PAD_SD4_DAT2__PWM4_OUT) },
710                                 4
711                         },
712                 },
713                 .leds = {
714                         IMX_GPIO_NR(4, 6),
715                         IMX_GPIO_NR(4, 10),
716                         IMX_GPIO_NR(4, 15),
717                 },
718                 .pcie_rst = IMX_GPIO_NR(1, 29),
719                 .mezz_pwren = IMX_GPIO_NR(4, 7),
720                 .mezz_irq = IMX_GPIO_NR(4, 9),
721                 .rs485en = IMX_GPIO_NR(3, 24),
722                 .dioi2c_en = IMX_GPIO_NR(4,  5),
723                 .pcie_sson = IMX_GPIO_NR(1, 20),
724         },
725
726         /* GW51xx */
727         {
728                 .gpio_pads = gw51xx_gpio_pads,
729                 .num_pads = ARRAY_SIZE(gw51xx_gpio_pads)/2,
730                 .dio_cfg = {
731                         {
732                                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
733                                 IMX_GPIO_NR(1, 16),
734                                 { 0, 0 },
735                                 0
736                         },
737                         {
738                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
739                                 IMX_GPIO_NR(1, 19),
740                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
741                                 2
742                         },
743                         {
744                                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
745                                 IMX_GPIO_NR(1, 17),
746                                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
747                                 3
748                         },
749                         {
750                                 { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
751                                 IMX_GPIO_NR(1, 18),
752                                 { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
753                                 4
754                         },
755                 },
756                 .leds = {
757                         IMX_GPIO_NR(4, 6),
758                         IMX_GPIO_NR(4, 10),
759                 },
760                 .pcie_rst = IMX_GPIO_NR(1, 0),
761                 .mezz_pwren = IMX_GPIO_NR(2, 19),
762                 .mezz_irq = IMX_GPIO_NR(2, 18),
763                 .gps_shdn = IMX_GPIO_NR(1, 2),
764                 .vidin_en = IMX_GPIO_NR(5, 20),
765         },
766
767         /* GW52xx */
768         {
769                 .gpio_pads = gw52xx_gpio_pads,
770                 .num_pads = ARRAY_SIZE(gw52xx_gpio_pads)/2,
771                 .dio_cfg = {
772                         {
773                                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
774                                 IMX_GPIO_NR(1, 16),
775                                 { 0, 0 },
776                                 0
777                         },
778                         {
779                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
780                                 IMX_GPIO_NR(1, 19),
781                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
782                                 2
783                         },
784                         {
785                                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
786                                 IMX_GPIO_NR(1, 17),
787                                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
788                                 3
789                         },
790                         {
791                                 { IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
792                                 IMX_GPIO_NR(1, 20),
793                                 { 0, 0 },
794                                 0
795                         },
796                 },
797                 .leds = {
798                         IMX_GPIO_NR(4, 6),
799                         IMX_GPIO_NR(4, 7),
800                         IMX_GPIO_NR(4, 15),
801                 },
802                 .pcie_rst = IMX_GPIO_NR(1, 29),
803                 .mezz_pwren = IMX_GPIO_NR(2, 19),
804                 .mezz_irq = IMX_GPIO_NR(2, 18),
805                 .gps_shdn = IMX_GPIO_NR(1, 27),
806                 .vidin_en = IMX_GPIO_NR(3, 31),
807                 .usb_sel = IMX_GPIO_NR(1, 2),
808         },
809
810         /* GW53xx */
811         {
812                 .gpio_pads = gw53xx_gpio_pads,
813                 .num_pads = ARRAY_SIZE(gw53xx_gpio_pads)/2,
814                 .dio_cfg = {
815                         {
816                                 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
817                                 IMX_GPIO_NR(1, 16),
818                                 { 0, 0 },
819                                 0
820                         },
821                         {
822                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
823                                 IMX_GPIO_NR(1, 19),
824                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
825                                 2
826                         },
827                         {
828                                 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
829                                 IMX_GPIO_NR(1, 17),
830                                 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
831                                 3
832                         },
833                         {
834                                 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
835                                 IMX_GPIO_NR(1, 20),
836                                 { 0, 0 },
837                                 0
838                         },
839                 },
840                 .leds = {
841                         IMX_GPIO_NR(4, 6),
842                         IMX_GPIO_NR(4, 7),
843                         IMX_GPIO_NR(4, 15),
844                 },
845                 .pcie_rst = IMX_GPIO_NR(1, 29),
846                 .mezz_pwren = IMX_GPIO_NR(2, 19),
847                 .mezz_irq = IMX_GPIO_NR(2, 18),
848                 .gps_shdn = IMX_GPIO_NR(1, 27),
849                 .vidin_en = IMX_GPIO_NR(3, 31),
850         },
851
852         /* GW54xx */
853         {
854                 .gpio_pads = gw54xx_gpio_pads,
855                 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
856                 .dio_cfg = {
857                         {
858                                 { IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09) },
859                                 IMX_GPIO_NR(1, 9),
860                                 { IOMUX_PADS(PAD_GPIO_9__PWM1_OUT) },
861                                 1
862                         },
863                         {
864                                 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
865                                 IMX_GPIO_NR(1, 19),
866                                 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
867                                 2
868                         },
869                         {
870                                 { IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09) },
871                                 IMX_GPIO_NR(2, 9),
872                                 { IOMUX_PADS(PAD_SD4_DAT1__PWM3_OUT) },
873                                 3
874                         },
875                         {
876                                 { IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10) },
877                                 IMX_GPIO_NR(2, 10),
878                                 { IOMUX_PADS(PAD_SD4_DAT2__PWM4_OUT) },
879                                 4
880                         },
881                 },
882                 .leds = {
883                         IMX_GPIO_NR(4, 6),
884                         IMX_GPIO_NR(4, 7),
885                         IMX_GPIO_NR(4, 15),
886                 },
887                 .pcie_rst = IMX_GPIO_NR(1, 29),
888                 .mezz_pwren = IMX_GPIO_NR(2, 19),
889                 .mezz_irq = IMX_GPIO_NR(2, 18),
890                 .rs485en = IMX_GPIO_NR(7, 1),
891                 .vidin_en = IMX_GPIO_NR(3, 31),
892                 .dioi2c_en = IMX_GPIO_NR(4,  5),
893                 .pcie_sson = IMX_GPIO_NR(1, 20),
894         },
895 };
896
897 /* setup board specific PMIC */
898 int power_init_board(void)
899 {
900         struct pmic *p;
901         u32 reg;
902
903         /* configure PFUZE100 PMIC */
904         if (board_type == GW54xx || board_type == GW54proto) {
905                 power_pfuze100_init(I2C_PMIC);
906                 p = pmic_get("PFUZE100_PMIC");
907                 if (p && !pmic_probe(p)) {
908                         pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
909                         printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
910
911                         /* Set VGEN1 to 1.5V and enable */
912                         pmic_reg_read(p, PFUZE100_VGEN1VOL, &reg);
913                         reg &= ~(LDO_VOL_MASK);
914                         reg |= (LDOA_1_50V | LDO_EN);
915                         pmic_reg_write(p, PFUZE100_VGEN1VOL, reg);
916
917                         /* Set SWBST to 5.0V and enable */
918                         pmic_reg_read(p, PFUZE100_SWBSTCON1, &reg);
919                         reg &= ~(SWBST_MODE_MASK | SWBST_VOL_MASK);
920                         reg |= (SWBST_5_00V | SWBST_MODE_AUTO);
921                         pmic_reg_write(p, PFUZE100_SWBSTCON1, reg);
922                 }
923         }
924
925         /* configure LTC3676 PMIC */
926         else {
927                 power_ltc3676_init(I2C_PMIC);
928                 p = pmic_get("LTC3676_PMIC");
929                 if (p && !pmic_probe(p)) {
930                         puts("PMIC:  LTC3676\n");
931                         /* set board-specific scalar to 1225mV for IMX6Q@1GHz */
932                         if (is_cpu_type(MXC_CPU_MX6Q)) {
933                                 /* mask PGOOD during SW1 transition */
934                                 reg = 0x1d | LTC3676_PGOOD_MASK;
935                                 pmic_reg_write(p, LTC3676_DVB1B, reg);
936                                 /* set SW1 (VDD_SOC) to 1259mV */
937                                 reg = 0x1d;
938                                 pmic_reg_write(p, LTC3676_DVB1A, reg);
939
940                                 /* mask PGOOD during SW3 transition */
941                                 reg = 0x1d | LTC3676_PGOOD_MASK;
942                                 pmic_reg_write(p, LTC3676_DVB3B, reg);
943                                 /*set SW3 (VDD_ARM) to 1259mV */
944                                 reg = 0x1d;
945                                 pmic_reg_write(p, LTC3676_DVB3A, reg);
946                         }
947                 }
948         }
949
950         return 0;
951 }
952
953 /* setup GPIO pinmux and default configuration per baseboard */
954 static void setup_board_gpio(int board)
955 {
956         struct ventana_board_info *info = &ventana_info;
957         const char *s;
958         char arg[10];
959         size_t len;
960         int i;
961         int quiet = simple_strtol(getenv("quiet"), NULL, 10);
962
963         if (board >= GW_UNKNOWN)
964                 return;
965
966         /* RS232_EN# */
967         gpio_direction_output(GP_RS232_EN, (hwconfig("rs232")) ? 0 : 1);
968
969         /* MSATA Enable */
970         if (is_cpu_type(MXC_CPU_MX6Q) &&
971             test_bit(EECONFIG_SATA, info->config)) {
972                 gpio_direction_output(GP_MSATA_SEL,
973                                       (hwconfig("msata")) ?  1 : 0);
974         } else {
975                 gpio_direction_output(GP_MSATA_SEL, 0);
976         }
977
978         /*
979          * assert PCI_RST# (released by OS when clock is valid)
980          * TODO: figure out why leaving this de-asserted from PCI scan on boot
981          *       causes linux pcie driver to hang during enumeration
982          */
983         gpio_direction_output(gpio_cfg[board].pcie_rst, 0);
984
985         /* turn off (active-high) user LED's */
986         for (i = 0; i < 4; i++) {
987                 if (gpio_cfg[board].leds[i])
988                         gpio_direction_output(gpio_cfg[board].leds[i], 1);
989         }
990
991         /* Expansion Mezzanine IO */
992         gpio_direction_output(gpio_cfg[board].mezz_pwren, 0);
993         gpio_direction_input(gpio_cfg[board].mezz_irq);
994
995         /* RS485 Transmit Enable */
996         if (gpio_cfg[board].rs485en)
997                 gpio_direction_output(gpio_cfg[board].rs485en, 0);
998
999         /* GPS_SHDN */
1000         if (gpio_cfg[board].gps_shdn)
1001                 gpio_direction_output(gpio_cfg[board].gps_shdn, 1);
1002
1003         /* Analog video codec power enable */
1004         if (gpio_cfg[board].vidin_en)
1005                 gpio_direction_output(gpio_cfg[board].vidin_en, 1);
1006
1007         /* DIOI2C_DIS# */
1008         if (gpio_cfg[board].dioi2c_en)
1009                 gpio_direction_output(gpio_cfg[board].dioi2c_en, 0);
1010
1011         /* PCICK_SSON: disable spread-spectrum clock */
1012         if (gpio_cfg[board].pcie_sson)
1013                 gpio_direction_output(gpio_cfg[board].pcie_sson, 0);
1014
1015         /* USBOTG Select (PCISKT or FrontPanel) */
1016         if (gpio_cfg[board].usb_sel)
1017                 gpio_direction_output(gpio_cfg[board].usb_sel, 0);
1018
1019         /*
1020          * Configure DIO pinmux/padctl registers
1021          * see IMX6DQRM/IMX6SDLRM IOMUXC_SW_PAD_CTL_PAD_* register definitions
1022          */
1023         for (i = 0; i < 4; i++) {
1024                 struct dio_cfg *cfg = &gpio_cfg[board].dio_cfg[i];
1025                 unsigned ctrl = DIO_PAD_CTRL;
1026                 unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1;
1027
1028                 sprintf(arg, "dio%d", i);
1029                 if (!hwconfig(arg))
1030                         continue;
1031                 s = hwconfig_subarg(arg, "padctrl", &len);
1032                 if (s)
1033                         ctrl = simple_strtoul(s, NULL, 16) & 0x3ffff;
1034                 if (hwconfig_subarg_cmp(arg, "mode", "gpio")) {
1035                         if (!quiet) {
1036                                 printf("DIO%d:  GPIO%d_IO%02d (gpio-%d)\n", i,
1037                                        (cfg->gpio_param/32)+1,
1038                                        cfg->gpio_param%32,
1039                                        cfg->gpio_param);
1040                         }
1041                         imx_iomux_v3_setup_pad(cfg->gpio_padmux[cputype] |
1042                                                MUX_PAD_CTRL(ctrl));
1043                         gpio_direction_input(cfg->gpio_param);
1044                 } else if (hwconfig_subarg_cmp("dio2", "mode", "pwm") &&
1045                            cfg->pwm_padmux) {
1046                         if (!quiet)
1047                                 printf("DIO%d:  pwm%d\n", i, cfg->pwm_param);
1048                         imx_iomux_v3_setup_pad(cfg->pwm_padmux[cputype] |
1049                                                MUX_PAD_CTRL(ctrl));
1050                 }
1051         }
1052
1053         if (!quiet) {
1054                 if (is_cpu_type(MXC_CPU_MX6Q) &&
1055                     (test_bit(EECONFIG_SATA, info->config))) {
1056                         printf("MSATA: %s\n", (hwconfig("msata") ?
1057                                "enabled" : "disabled"));
1058                 }
1059                 printf("RS232: %s\n", (hwconfig("rs232")) ?
1060                        "enabled" : "disabled");
1061         }
1062 }
1063
1064 #if defined(CONFIG_CMD_PCI)
1065 int imx6_pcie_toggle_reset(void)
1066 {
1067         if (board_type < GW_UNKNOWN) {
1068                 uint pin = gpio_cfg[board_type].pcie_rst;
1069                 gpio_direction_output(pin, 0);
1070                 mdelay(50);
1071                 gpio_direction_output(pin, 1);
1072         }
1073         return 0;
1074 }
1075 #endif /* CONFIG_CMD_PCI */
1076
1077 #ifdef CONFIG_SERIAL_TAG
1078 /*
1079  * called when setting up ATAGS before booting kernel
1080  * populate serialnum from the following (in order of priority):
1081  *   serial# env var
1082  *   eeprom
1083  */
1084 void get_board_serial(struct tag_serialnr *serialnr)
1085 {
1086         char *serial = getenv("serial#");
1087
1088         if (serial) {
1089                 serialnr->high = 0;
1090                 serialnr->low = simple_strtoul(serial, NULL, 10);
1091         } else if (ventana_info.model[0]) {
1092                 serialnr->high = 0;
1093                 serialnr->low = ventana_info.serial;
1094         } else {
1095                 serialnr->high = 0;
1096                 serialnr->low = 0;
1097         }
1098 }
1099 #endif
1100
1101 /*
1102  * Board Support
1103  */
1104
1105 /* called from SPL board_init_f() */
1106 int board_early_init_f(void)
1107 {
1108         setup_iomux_uart();
1109         gpio_direction_output(GP_USB_OTG_PWR, 0); /* OTG power off */
1110
1111 #if defined(CONFIG_VIDEO_IPUV3)
1112         setup_display();
1113 #endif
1114         return 0;
1115 }
1116
1117 int dram_init(void)
1118 {
1119         gd->ram_size = imx_ddr_size();
1120         return 0;
1121 }
1122
1123 int board_init(void)
1124 {
1125         struct iomuxc_base_regs *const iomuxc_regs
1126                 = (struct iomuxc_base_regs *)IOMUXC_BASE_ADDR;
1127
1128         clrsetbits_le32(&iomuxc_regs->gpr[1],
1129                         IOMUXC_GPR1_OTG_ID_MASK,
1130                         IOMUXC_GPR1_OTG_ID_GPIO1);
1131
1132         /* address of linux boot parameters */
1133         gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
1134
1135 #ifdef CONFIG_CMD_NAND
1136         setup_gpmi_nand();
1137 #endif
1138 #ifdef CONFIG_MXC_SPI
1139         setup_spi();
1140 #endif
1141         if (is_cpu_type(MXC_CPU_MX6Q)) {
1142                 setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info0);
1143                 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
1144                 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info2);
1145         } else {
1146                 setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info0);
1147                 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
1148                 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info2);
1149         }
1150
1151 #ifdef CONFIG_CMD_SATA
1152         setup_sata();
1153 #endif
1154         /* read Gateworks EEPROM into global struct (used later) */
1155         board_type = read_eeprom(I2C_GSC, &ventana_info);
1156
1157         /* board-specifc GPIO iomux */
1158         SETUP_IOMUX_PADS(gw_gpio_pads);
1159         if (board_type < GW_UNKNOWN) {
1160                 iomux_v3_cfg_t const *p = gpio_cfg[board_type].gpio_pads;
1161                 int count = gpio_cfg[board_type].num_pads;
1162
1163                 imx_iomux_v3_setup_multiple_pads(p, count);
1164         }
1165
1166         return 0;
1167 }
1168
1169 #if defined(CONFIG_DISPLAY_BOARDINFO_LATE)
1170 /*
1171  * called during late init (after relocation and after board_init())
1172  * by virtue of CONFIG_DISPLAY_BOARDINFO_LATE as we needed i2c initialized and
1173  * EEPROM read.
1174  */
1175 int checkboard(void)
1176 {
1177         struct ventana_board_info *info = &ventana_info;
1178         unsigned char buf[4];
1179         const char *p;
1180         int quiet; /* Quiet or minimal output mode */
1181
1182         quiet = 0;
1183         p = getenv("quiet");
1184         if (p)
1185                 quiet = simple_strtol(p, NULL, 10);
1186         else
1187                 setenv("quiet", "0");
1188
1189         puts("\nGateworks Corporation Copyright 2014\n");
1190         if (info->model[0]) {
1191                 printf("Model: %s\n", info->model);
1192                 printf("MFGDate: %02x-%02x-%02x%02x\n",
1193                        info->mfgdate[0], info->mfgdate[1],
1194                        info->mfgdate[2], info->mfgdate[3]);
1195                 printf("Serial:%d\n", info->serial);
1196         } else {
1197                 puts("Invalid EEPROM - board will not function fully\n");
1198         }
1199         if (quiet)
1200                 return 0;
1201
1202         /* Display GSC firmware revision/CRC/status */
1203         i2c_set_bus_num(I2C_GSC);
1204         if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_FWVER, 1, buf, 1)) {
1205                 printf("GSC:   v%d", buf[0]);
1206                 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_STATUS, 1, buf, 4)) {
1207                         printf(" 0x%04x", buf[2] | buf[3]<<8); /* CRC */
1208                         printf(" 0x%02x", buf[0]); /* irq status */
1209                 }
1210                 puts("\n");
1211         }
1212         /* Display RTC */
1213         if (!gsc_i2c_read(GSC_RTC_ADDR, 0x00, 1, buf, 4)) {
1214                 printf("RTC:   %d\n",
1215                        buf[0] | buf[1]<<8 | buf[2]<<16 | buf[3]<<24);
1216         }
1217
1218         return 0;
1219 }
1220 #endif
1221
1222 #ifdef CONFIG_CMD_BMODE
1223 /*
1224  * BOOT_CFG1, BOOT_CFG2, BOOT_CFG3, BOOT_CFG4
1225  * see Table 8-11 and Table 5-9
1226  *  BOOT_CFG1[7] = 1 (boot from NAND)
1227  *  BOOT_CFG1[5] = 0 - raw NAND
1228  *  BOOT_CFG1[4] = 0 - default pad settings
1229  *  BOOT_CFG1[3:2] = 00 - devices = 1
1230  *  BOOT_CFG1[1:0] = 00 - Row Address Cycles = 3
1231  *  BOOT_CFG2[4:3] = 00 - Boot Search Count = 2
1232  *  BOOT_CFG2[2:1] = 01 - Pages In Block = 64
1233  *  BOOT_CFG2[0] = 0 - Reset time 12ms
1234  */
1235 static const struct boot_mode board_boot_modes[] = {
1236         /* NAND: 64pages per block, 3 row addr cycles, 2 copies of FCB/DBBT */
1237         { "nand", MAKE_CFGVAL(0x80, 0x02, 0x00, 0x00) },
1238         { NULL, 0 },
1239 };
1240 #endif
1241
1242 /* late init */
1243 int misc_init_r(void)
1244 {
1245         struct ventana_board_info *info = &ventana_info;
1246         unsigned char reg;
1247
1248         /* set env vars based on EEPROM data */
1249         if (ventana_info.model[0]) {
1250                 char str[16], fdt[36];
1251                 char *p;
1252                 const char *cputype = "";
1253                 int i;
1254
1255                 /*
1256                  * FDT name will be prefixed with CPU type.  Three versions
1257                  * will be created each increasingly generic and bootloader
1258                  * env scripts will try loading each from most specific to
1259                  * least.
1260                  */
1261                 if (is_cpu_type(MXC_CPU_MX6Q) ||
1262                     is_cpu_type(MXC_CPU_MX6D))
1263                         cputype = "imx6q";
1264                 else if (is_cpu_type(MXC_CPU_MX6DL) ||
1265                          is_cpu_type(MXC_CPU_MX6SOLO))
1266                         cputype = "imx6dl";
1267                 memset(str, 0, sizeof(str));
1268                 for (i = 0; i < (sizeof(str)-1) && info->model[i]; i++)
1269                         str[i] = tolower(info->model[i]);
1270                 if (!getenv("model"))
1271                         setenv("model", str);
1272                 if (!getenv("fdt_file")) {
1273                         sprintf(fdt, "%s-%s.dtb", cputype, str);
1274                         setenv("fdt_file", fdt);
1275                 }
1276                 p = strchr(str, '-');
1277                 if (p) {
1278                         *p++ = 0;
1279
1280                         setenv("model_base", str);
1281                         if (!getenv("fdt_file1")) {
1282                                 sprintf(fdt, "%s-%s.dtb", cputype, str);
1283                                 setenv("fdt_file1", fdt);
1284                         }
1285                         str[4] = 'x';
1286                         str[5] = 'x';
1287                         str[6] = 0;
1288                         if (!getenv("fdt_file2")) {
1289                                 sprintf(fdt, "%s-%s.dtb", cputype, str);
1290                                 setenv("fdt_file2", fdt);
1291                         }
1292                 }
1293
1294                 /* initialize env from EEPROM */
1295                 if (test_bit(EECONFIG_ETH0, info->config) &&
1296                     !getenv("ethaddr")) {
1297                         eth_setenv_enetaddr("ethaddr", info->mac0);
1298                 }
1299                 if (test_bit(EECONFIG_ETH1, info->config) &&
1300                     !getenv("eth1addr")) {
1301                         eth_setenv_enetaddr("eth1addr", info->mac1);
1302                 }
1303
1304                 /* board serial-number */
1305                 sprintf(str, "%6d", info->serial);
1306                 setenv("serial#", str);
1307         }
1308
1309
1310         /* setup baseboard specific GPIO pinmux and config */
1311         setup_board_gpio(board_type);
1312
1313 #ifdef CONFIG_CMD_BMODE
1314         add_board_boot_modes(board_boot_modes);
1315 #endif
1316
1317         /*
1318          *  The Gateworks System Controller implements a boot
1319          *  watchdog (always enabled) as a workaround for IMX6 boot related
1320          *  errata such as:
1321          *    ERR005768 - no fix
1322          *    ERR006282 - fixed in silicon r1.3
1323          *    ERR007117 - fixed in silicon r1.3
1324          *    ERR007220 - fixed in silicon r1.3
1325          *  see http://cache.freescale.com/files/32bit/doc/errata/IMX6DQCE.pdf
1326          *
1327          * Disable the boot watchdog and display/clear the timeout flag if set
1328          */
1329         i2c_set_bus_num(I2C_GSC);
1330         if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 1)) {
1331                 reg |= (1 << GSC_SC_CTRL1_WDDIS);
1332                 if (gsc_i2c_write(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 1))
1333                         puts("Error: could not disable GSC Watchdog\n");
1334         } else {
1335                 puts("Error: could not disable GSC Watchdog\n");
1336         }
1337         if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_STATUS, 1, &reg, 1)) {
1338                 if (reg & (1 << GSC_SC_IRQ_WATCHDOG)) { /* watchdog timeout */
1339                         puts("GSC boot watchdog timeout detected");
1340                         reg &= ~(1 << GSC_SC_IRQ_WATCHDOG); /* clear flag */
1341                         gsc_i2c_write(GSC_SC_ADDR, GSC_SC_STATUS, 1, &reg, 1);
1342                 }
1343         }
1344
1345         return 0;
1346 }
1347
1348 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
1349
1350 /* FDT aliases associated with EEPROM config bits */
1351 const char *fdt_aliases[] = {
1352         "ethernet0",
1353         "ethernet1",
1354         "hdmi_out",
1355         "ahci0",
1356         "pcie",
1357         "ssi0",
1358         "ssi1",
1359         "lcd0",
1360         "lvds0",
1361         "lvds1",
1362         "usb0",
1363         "usb1",
1364         "mmc0",
1365         "mmc1",
1366         "mmc2",
1367         "mmc3",
1368         "uart0",
1369         "uart1",
1370         "uart2",
1371         "uart3",
1372         "uart4",
1373         "ipu0",
1374         "ipu1",
1375         "can0",
1376         "mipi_dsi",
1377         "mipi_csi",
1378         "tzasc0",
1379         "tzasc1",
1380         "i2c0",
1381         "i2c1",
1382         "i2c2",
1383         "vpu",
1384         "csi0",
1385         "csi1",
1386         "caam",
1387         NULL,
1388         NULL,
1389         NULL,
1390         NULL,
1391         NULL,
1392         "spi0",
1393         "spi1",
1394         "spi2",
1395         "spi3",
1396         "spi4",
1397         "spi5",
1398         NULL,
1399         NULL,
1400         "pps",
1401         NULL,
1402         NULL,
1403         NULL,
1404         "hdmi_in",
1405         "cvbs_out",
1406         "cvbs_in",
1407         "nand",
1408         NULL,
1409         NULL,
1410         NULL,
1411         NULL,
1412         NULL,
1413         NULL,
1414         NULL,
1415         NULL,
1416 };
1417
1418 /*
1419  * called prior to booting kernel or by 'fdt boardsetup' command
1420  *
1421  * unless 'fdt_noauto' env var is set we will update the following in the DTB:
1422  *  - mtd partitions based on mtdparts/mtdids env
1423  *  - system-serial (board serial num from EEPROM)
1424  *  - board (full model from EEPROM)
1425  *  - peripherals removed from DTB if not loaded on board (per EEPROM config)
1426  */
1427 void ft_board_setup(void *blob, bd_t *bd)
1428 {
1429         int bit;
1430         struct ventana_board_info *info = &ventana_info;
1431         struct node_info nodes[] = {
1432                 { "sst,w25q256",          MTD_DEV_TYPE_NOR, },  /* SPI flash */
1433                 { "fsl,imx6q-gpmi-nand",  MTD_DEV_TYPE_NAND, }, /* NAND flash */
1434         };
1435         const char *model = getenv("model");
1436
1437         if (getenv("fdt_noauto")) {
1438                 puts("   Skiping ft_board_setup (fdt_noauto defined)\n");
1439                 return;
1440         }
1441
1442         /* Update partition nodes using info from mtdparts env var */
1443         puts("   Updating MTD partitions...\n");
1444         fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
1445
1446         if (!model) {
1447                 puts("invalid board info: Leaving FDT fully enabled\n");
1448                 return;
1449         }
1450         printf("   Adjusting FDT per EEPROM for %s...\n", model);
1451
1452         /* board serial number */
1453         fdt_setprop(blob, 0, "system-serial", getenv("serial#"),
1454                     strlen(getenv("serial#")) + 1);
1455
1456         /* board (model contains model from device-tree) */
1457         fdt_setprop(blob, 0, "board", info->model,
1458                     strlen((const char *)info->model) + 1);
1459
1460         /*
1461          * Peripheral Config:
1462          *  remove nodes by alias path if EEPROM config tells us the
1463          *  peripheral is not loaded on the board.
1464          */
1465         for (bit = 0; bit < 64; bit++) {
1466                 if (!test_bit(bit, info->config))
1467                         fdt_del_node_and_alias(blob, fdt_aliases[bit]);
1468         }
1469 }
1470 #endif /* defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) */
1471