blob: 97d7e3f344abd5f88004dffd8b310ee9f3fac9ee [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>
Tim Harveyfb64cc72014-04-25 15:39:07 -070015#include <asm/arch/mxc_hdmi.h>
Tim Harvey552c3582014-03-06 07:46:30 -080016#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>
Tim Harveyfb64cc72014-04-25 15:39:07 -070023#include <asm/imx-common/video.h>
Tim Harvey552c3582014-03-06 07:46:30 -080024#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>
Tim Harvey0dff16f2014-05-05 08:22:25 -070035#include <power/ltc3676_pmic.h>
Tim Harvey552c3582014-03-06 07:46:30 -080036#include <power/pfuze100_pmic.h>
Tim Harvey552c3582014-03-06 07:46:30 -080037#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
44DECLARE_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
Tim Harvey26993362014-08-07 22:35:49 -070081#define IRQ_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
82 PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
83 PAD_CTL_DSE_34ohm | PAD_CTL_HYS | PAD_CTL_SRE_FAST)
84
85#define DIO_PAD_CFG (MUX_PAD_CTRL(DIO_PAD_CTRL) | MUX_MODE_SION)
86
87
Tim Harvey552c3582014-03-06 07:46:30 -080088/*
89 * EEPROM board info struct populated by read_eeprom so that we only have to
90 * read it once.
91 */
92static struct ventana_board_info ventana_info;
93
Tim Harvey552c3582014-03-06 07:46:30 -080094int board_type;
95
96/* UART1: Function varies per baseboard */
97iomux_v3_cfg_t const uart1_pads[] = {
Tim Harvey02fb5922014-06-02 16:13:26 -070098 IOMUX_PADS(PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
99 IOMUX_PADS(PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800100};
101
102/* UART2: Serial Console */
103iomux_v3_cfg_t const uart2_pads[] = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700104 IOMUX_PADS(PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
105 IOMUX_PADS(PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800106};
107
108#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
109
110/* I2C1: GSC */
Tim Harvey02fb5922014-06-02 16:13:26 -0700111struct i2c_pads_info mx6q_i2c_pad_info0 = {
Tim Harvey552c3582014-03-06 07:46:30 -0800112 .scl = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700113 .i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
114 .gpio_mode = MX6Q_PAD_EIM_D21__GPIO3_IO21 | PC,
Tim Harvey552c3582014-03-06 07:46:30 -0800115 .gp = IMX_GPIO_NR(3, 21)
116 },
117 .sda = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700118 .i2c_mode = MX6Q_PAD_EIM_D28__I2C1_SDA | PC,
119 .gpio_mode = MX6Q_PAD_EIM_D28__GPIO3_IO28 | PC,
Tim Harvey552c3582014-03-06 07:46:30 -0800120 .gp = IMX_GPIO_NR(3, 28)
121 }
122};
Tim Harvey02fb5922014-06-02 16:13:26 -0700123struct i2c_pads_info mx6dl_i2c_pad_info0 = {
124 .scl = {
125 .i2c_mode = MX6DL_PAD_EIM_D21__I2C1_SCL | PC,
126 .gpio_mode = MX6DL_PAD_EIM_D21__GPIO3_IO21 | PC,
127 .gp = IMX_GPIO_NR(3, 21)
128 },
129 .sda = {
130 .i2c_mode = MX6DL_PAD_EIM_D28__I2C1_SDA | PC,
131 .gpio_mode = MX6DL_PAD_EIM_D28__GPIO3_IO28 | PC,
132 .gp = IMX_GPIO_NR(3, 28)
133 }
134};
Tim Harvey552c3582014-03-06 07:46:30 -0800135
136/* I2C2: PMIC/PCIe Switch/PCIe Clock/Mezz */
Tim Harvey02fb5922014-06-02 16:13:26 -0700137struct i2c_pads_info mx6q_i2c_pad_info1 = {
Tim Harvey552c3582014-03-06 07:46:30 -0800138 .scl = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700139 .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
140 .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | PC,
Tim Harvey552c3582014-03-06 07:46:30 -0800141 .gp = IMX_GPIO_NR(4, 12)
142 },
143 .sda = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700144 .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
145 .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
Tim Harvey552c3582014-03-06 07:46:30 -0800146 .gp = IMX_GPIO_NR(4, 13)
147 }
148};
Tim Harvey02fb5922014-06-02 16:13:26 -0700149struct i2c_pads_info mx6dl_i2c_pad_info1 = {
150 .scl = {
151 .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | PC,
152 .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | PC,
153 .gp = IMX_GPIO_NR(4, 12)
154 },
155 .sda = {
156 .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
157 .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
158 .gp = IMX_GPIO_NR(4, 13)
159 }
160};
Tim Harvey552c3582014-03-06 07:46:30 -0800161
162/* I2C3: Misc/Expansion */
Tim Harvey02fb5922014-06-02 16:13:26 -0700163struct i2c_pads_info mx6q_i2c_pad_info2 = {
164 .scl = {
165 .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
166 .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
167 .gp = IMX_GPIO_NR(1, 3)
168 },
169 .sda = {
170 .i2c_mode = MX6Q_PAD_GPIO_6__I2C3_SDA | PC,
171 .gpio_mode = MX6Q_PAD_GPIO_6__GPIO1_IO06 | PC,
172 .gp = IMX_GPIO_NR(1, 6)
173 }
174};
175struct i2c_pads_info mx6dl_i2c_pad_info2 = {
Tim Harvey552c3582014-03-06 07:46:30 -0800176 .scl = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700177 .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
178 .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
Tim Harvey552c3582014-03-06 07:46:30 -0800179 .gp = IMX_GPIO_NR(1, 3)
180 },
181 .sda = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700182 .i2c_mode = MX6DL_PAD_GPIO_6__I2C3_SDA | PC,
183 .gpio_mode = MX6DL_PAD_GPIO_6__GPIO1_IO06 | PC,
Tim Harvey552c3582014-03-06 07:46:30 -0800184 .gp = IMX_GPIO_NR(1, 6)
185 }
186};
187
188/* MMC */
189iomux_v3_cfg_t const usdhc3_pads[] = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700190 IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
191 IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
192 IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
193 IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
194 IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
195 IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
196 /* CD */
Tim Harvey26993362014-08-07 22:35:49 -0700197 IOMUX_PADS(PAD_SD3_DAT5__GPIO7_IO00 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800198};
199
200/* ENET */
201iomux_v3_cfg_t const enet_pads[] = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700202 IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)),
203 IOMUX_PADS(PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
204 IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
205 IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
206 IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
207 IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
208 IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
209 IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL |
210 MUX_PAD_CTRL(ENET_PAD_CTRL)),
211 IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK |
212 MUX_PAD_CTRL(ENET_PAD_CTRL)),
213 IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
214 IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
215 IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
216 IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
217 IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
218 IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL |
219 MUX_PAD_CTRL(ENET_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800220 /* PHY nRST */
Tim Harvey26993362014-08-07 22:35:49 -0700221 IOMUX_PADS(PAD_ENET_TXD0__GPIO1_IO30 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800222};
223
224/* NAND */
225iomux_v3_cfg_t const nfc_pads[] = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700226 IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE | MUX_PAD_CTRL(NO_PAD_CTRL)),
227 IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE | MUX_PAD_CTRL(NO_PAD_CTRL)),
228 IOMUX_PADS(PAD_NANDF_WP_B__NAND_WP_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
229 IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
230 IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
231 IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
232 IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B | MUX_PAD_CTRL(NO_PAD_CTRL)),
233 IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
234 IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
235 IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
236 IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
237 IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
238 IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
239 IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
240 IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800241};
242
243#ifdef CONFIG_CMD_NAND
244static void setup_gpmi_nand(void)
245{
246 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
247
248 /* config gpmi nand iomux */
Tim Harvey02fb5922014-06-02 16:13:26 -0700249 SETUP_IOMUX_PADS(nfc_pads);
Tim Harvey552c3582014-03-06 07:46:30 -0800250
251 /* config gpmi and bch clock to 100 MHz */
252 clrsetbits_le32(&mxc_ccm->cs2cdr,
253 MXC_CCM_CS2CDR_ENFC_CLK_PODF_MASK |
254 MXC_CCM_CS2CDR_ENFC_CLK_PRED_MASK |
255 MXC_CCM_CS2CDR_ENFC_CLK_SEL_MASK,
256 MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
257 MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
258 MXC_CCM_CS2CDR_ENFC_CLK_SEL(3));
259
260 /* enable gpmi and bch clock gating */
261 setbits_le32(&mxc_ccm->CCGR4,
262 MXC_CCM_CCGR4_RAWNAND_U_BCH_INPUT_APB_MASK |
263 MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_BCH_MASK |
264 MXC_CCM_CCGR4_RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_MASK |
265 MXC_CCM_CCGR4_RAWNAND_U_GPMI_INPUT_APB_MASK |
266 MXC_CCM_CCGR4_PL301_MX6QPER1_BCH_OFFSET);
267
268 /* enable apbh clock gating */
269 setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
270}
271#endif
272
273static void setup_iomux_enet(void)
274{
Tim Harvey02fb5922014-06-02 16:13:26 -0700275 SETUP_IOMUX_PADS(enet_pads);
Tim Harvey552c3582014-03-06 07:46:30 -0800276
277 /* toggle PHY_RST# */
278 gpio_direction_output(GP_PHY_RST, 0);
279 mdelay(2);
280 gpio_set_value(GP_PHY_RST, 1);
281}
282
283static void setup_iomux_uart(void)
284{
Tim Harvey02fb5922014-06-02 16:13:26 -0700285 SETUP_IOMUX_PADS(uart1_pads);
286 SETUP_IOMUX_PADS(uart2_pads);
Tim Harvey552c3582014-03-06 07:46:30 -0800287}
288
289#ifdef CONFIG_USB_EHCI_MX6
290iomux_v3_cfg_t const usb_pads[] = {
Tim Harvey26993362014-08-07 22:35:49 -0700291 IOMUX_PADS(PAD_GPIO_1__USB_OTG_ID | DIO_PAD_CFG),
292 IOMUX_PADS(PAD_KEY_COL4__USB_OTG_OC | DIO_PAD_CFG),
Tim Harvey02fb5922014-06-02 16:13:26 -0700293 /* OTG PWR */
Tim Harvey26993362014-08-07 22:35:49 -0700294 IOMUX_PADS(PAD_EIM_D22__GPIO3_IO22 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800295};
296
297int board_ehci_hcd_init(int port)
298{
299 struct ventana_board_info *info = &ventana_info;
300
Tim Harvey02fb5922014-06-02 16:13:26 -0700301 SETUP_IOMUX_PADS(usb_pads);
Tim Harvey552c3582014-03-06 07:46:30 -0800302
303 /* Reset USB HUB (present on GW54xx/GW53xx) */
304 switch (info->model[3]) {
305 case '3': /* GW53xx */
Tim Harvey26993362014-08-07 22:35:49 -0700306 SETUP_IOMUX_PAD(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG);
Tim Harvey552c3582014-03-06 07:46:30 -0800307 gpio_direction_output(IMX_GPIO_NR(1, 9), 0);
308 mdelay(2);
309 gpio_set_value(IMX_GPIO_NR(1, 9), 1);
310 break;
311 case '4': /* GW54xx */
Tim Harvey26993362014-08-07 22:35:49 -0700312 SETUP_IOMUX_PAD(PAD_SD1_DAT0__GPIO1_IO16 | DIO_PAD_CFG);
Tim Harvey552c3582014-03-06 07:46:30 -0800313 gpio_direction_output(IMX_GPIO_NR(1, 16), 0);
314 mdelay(2);
315 gpio_set_value(IMX_GPIO_NR(1, 16), 1);
316 break;
317 }
318
319 return 0;
320}
321
322int board_ehci_power(int port, int on)
323{
324 if (port)
325 return 0;
326 gpio_set_value(GP_USB_OTG_PWR, on);
327 return 0;
328}
329#endif /* CONFIG_USB_EHCI_MX6 */
330
331#ifdef CONFIG_FSL_ESDHC
332struct fsl_esdhc_cfg usdhc_cfg = { USDHC3_BASE_ADDR };
333
334int board_mmc_getcd(struct mmc *mmc)
335{
336 /* Card Detect */
337 gpio_direction_input(GP_SD3_CD);
338 return !gpio_get_value(GP_SD3_CD);
339}
340
341int board_mmc_init(bd_t *bis)
342{
343 /* Only one USDHC controller on Ventana */
Tim Harvey02fb5922014-06-02 16:13:26 -0700344 SETUP_IOMUX_PADS(usdhc3_pads);
Tim Harvey552c3582014-03-06 07:46:30 -0800345 usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
346 usdhc_cfg.max_bus_width = 4;
347
348 return fsl_esdhc_initialize(bis, &usdhc_cfg);
349}
350#endif /* CONFIG_FSL_ESDHC */
351
352#ifdef CONFIG_MXC_SPI
353iomux_v3_cfg_t const ecspi1_pads[] = {
354 /* SS1 */
Tim Harvey02fb5922014-06-02 16:13:26 -0700355 IOMUX_PADS(PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(SPI_PAD_CTRL)),
356 IOMUX_PADS(PAD_EIM_D17__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
357 IOMUX_PADS(PAD_EIM_D18__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)),
358 IOMUX_PADS(PAD_EIM_D16__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800359};
360
361static void setup_spi(void)
362{
363 gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
Tim Harvey02fb5922014-06-02 16:13:26 -0700364 SETUP_IOMUX_PADS(ecspi1_pads);
Tim Harvey552c3582014-03-06 07:46:30 -0800365}
366#endif
367
368/* configure eth0 PHY board-specific LED behavior */
369int board_phy_config(struct phy_device *phydev)
370{
371 unsigned short val;
372
373 /* Marvel 88E1510 */
374 if (phydev->phy_id == 0x1410dd1) {
375 /*
376 * Page 3, Register 16: LED[2:0] Function Control Register
377 * LED[0] (SPD:Amber) R16_3.3:0 to 0111: on-GbE link
378 * LED[1] (LNK:Green) R16_3.7:4 to 0001: on-link, blink-activity
379 */
380 phy_write(phydev, MDIO_DEVAD_NONE, 22, 3);
381 val = phy_read(phydev, MDIO_DEVAD_NONE, 16);
382 val &= 0xff00;
383 val |= 0x0017;
384 phy_write(phydev, MDIO_DEVAD_NONE, 16, val);
385 phy_write(phydev, MDIO_DEVAD_NONE, 22, 0);
386 }
387
388 if (phydev->drv->config)
389 phydev->drv->config(phydev);
390
391 return 0;
392}
393
394int board_eth_init(bd_t *bis)
395{
396 setup_iomux_enet();
397
398#ifdef CONFIG_FEC_MXC
399 cpu_eth_init(bis);
400#endif
401
402#ifdef CONFIG_CI_UDC
403 /* For otg ethernet*/
404 usb_eth_initialize(bis);
405#endif
406
407 return 0;
408}
409
Tim Harveyfb64cc72014-04-25 15:39:07 -0700410#if defined(CONFIG_VIDEO_IPUV3)
411
412static void enable_hdmi(struct display_info_t const *dev)
413{
414 imx_enable_hdmi_phy();
415}
416
417static int detect_i2c(struct display_info_t const *dev)
418{
419 return i2c_set_bus_num(dev->bus) == 0 &&
420 i2c_probe(dev->addr) == 0;
421}
422
423static void enable_lvds(struct display_info_t const *dev)
424{
425 struct iomuxc *iomux = (struct iomuxc *)
426 IOMUXC_BASE_ADDR;
427
428 /* set CH0 data width to 24bit (IOMUXC_GPR2:5 0=18bit, 1=24bit) */
429 u32 reg = readl(&iomux->gpr[2]);
430 reg |= IOMUXC_GPR2_DATA_WIDTH_CH0_24BIT;
431 writel(reg, &iomux->gpr[2]);
432
433 /* Enable Backlight */
Tim Harvey26993362014-08-07 22:35:49 -0700434 SETUP_IOMUX_PAD(PAD_SD1_CMD__GPIO1_IO18 | DIO_PAD_CFG);
Tim Harveyfb64cc72014-04-25 15:39:07 -0700435 gpio_direction_output(IMX_GPIO_NR(1, 18), 1);
436}
437
438struct display_info_t const displays[] = {{
439 /* HDMI Output */
440 .bus = -1,
441 .addr = 0,
442 .pixfmt = IPU_PIX_FMT_RGB24,
443 .detect = detect_hdmi,
444 .enable = enable_hdmi,
445 .mode = {
446 .name = "HDMI",
447 .refresh = 60,
448 .xres = 1024,
449 .yres = 768,
450 .pixclock = 15385,
451 .left_margin = 220,
452 .right_margin = 40,
453 .upper_margin = 21,
454 .lower_margin = 7,
455 .hsync_len = 60,
456 .vsync_len = 10,
457 .sync = FB_SYNC_EXT,
458 .vmode = FB_VMODE_NONINTERLACED
459} }, {
460 /* Freescale MXC-LVDS1: HannStar HSD100PXN1-A00 w/ egalx_ts cont */
461 .bus = 2,
462 .addr = 0x4,
463 .pixfmt = IPU_PIX_FMT_LVDS666,
464 .detect = detect_i2c,
465 .enable = enable_lvds,
466 .mode = {
467 .name = "Hannstar-XGA",
468 .refresh = 60,
469 .xres = 1024,
470 .yres = 768,
471 .pixclock = 15385,
472 .left_margin = 220,
473 .right_margin = 40,
474 .upper_margin = 21,
475 .lower_margin = 7,
476 .hsync_len = 60,
477 .vsync_len = 10,
478 .sync = FB_SYNC_EXT,
479 .vmode = FB_VMODE_NONINTERLACED
480} } };
481size_t display_count = ARRAY_SIZE(displays);
482
483static void setup_display(void)
484{
485 struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
486 struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
487 int reg;
488
489 enable_ipu_clock();
490 imx_setup_hdmi();
491 /* Turn on LDB0,IPU,IPU DI0 clocks */
492 reg = __raw_readl(&mxc_ccm->CCGR3);
493 reg |= MXC_CCM_CCGR3_LDB_DI0_MASK;
494 writel(reg, &mxc_ccm->CCGR3);
495
496 /* set LDB0, LDB1 clk select to 011/011 */
497 reg = readl(&mxc_ccm->cs2cdr);
498 reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
499 |MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
500 reg |= (3<<MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
501 |(3<<MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
502 writel(reg, &mxc_ccm->cs2cdr);
503
504 reg = readl(&mxc_ccm->cscmr2);
505 reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV;
506 writel(reg, &mxc_ccm->cscmr2);
507
508 reg = readl(&mxc_ccm->chsccdr);
509 reg |= (CHSCCDR_CLK_SEL_LDB_DI0
510 <<MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
511 writel(reg, &mxc_ccm->chsccdr);
512
513 reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
514 |IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_HIGH
515 |IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
516 |IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
517 |IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
518 |IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
519 |IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
520 |IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED
521 |IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0;
522 writel(reg, &iomux->gpr[2]);
523
524 reg = readl(&iomux->gpr[3]);
525 reg = (reg & ~IOMUXC_GPR3_LVDS0_MUX_CTL_MASK)
526 | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
527 <<IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET);
528 writel(reg, &iomux->gpr[3]);
529
530 /* Backlight CABEN on LVDS connector */
Tim Harvey26993362014-08-07 22:35:49 -0700531 SETUP_IOMUX_PAD(PAD_SD2_CLK__GPIO1_IO10 | DIO_PAD_CFG);
Tim Harveyfb64cc72014-04-25 15:39:07 -0700532 gpio_direction_output(IMX_GPIO_NR(1, 10), 0);
533}
534#endif /* CONFIG_VIDEO_IPUV3 */
535
Tim Harvey552c3582014-03-06 07:46:30 -0800536/*
537 * Baseboard specific GPIO
538 */
539
540/* common to add baseboards */
541static iomux_v3_cfg_t const gw_gpio_pads[] = {
542 /* MSATA_EN */
Tim Harvey26993362014-08-07 22:35:49 -0700543 IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800544 /* RS232_EN# */
Tim Harvey26993362014-08-07 22:35:49 -0700545 IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800546};
547
548/* prototype */
549static iomux_v3_cfg_t const gwproto_gpio_pads[] = {
550 /* PANLEDG# */
Tim Harvey26993362014-08-07 22:35:49 -0700551 IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800552 /* PANLEDR# */
Tim Harvey26993362014-08-07 22:35:49 -0700553 IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800554 /* LOCLED# */
Tim Harvey26993362014-08-07 22:35:49 -0700555 IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800556 /* RS485_EN */
Tim Harvey26993362014-08-07 22:35:49 -0700557 IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800558 /* IOEXP_PWREN# */
Tim Harvey26993362014-08-07 22:35:49 -0700559 IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800560 /* IOEXP_IRQ# */
Tim Harvey26993362014-08-07 22:35:49 -0700561 IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800562 /* VID_EN */
Tim Harvey26993362014-08-07 22:35:49 -0700563 IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800564 /* DIOI2C_DIS# */
Tim Harvey26993362014-08-07 22:35:49 -0700565 IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800566 /* PCICK_SSON */
Tim Harvey26993362014-08-07 22:35:49 -0700567 IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800568 /* PCI_RST# */
Tim Harvey26993362014-08-07 22:35:49 -0700569 IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800570};
571
572static iomux_v3_cfg_t const gw51xx_gpio_pads[] = {
573 /* PANLEDG# */
Tim Harvey26993362014-08-07 22:35:49 -0700574 IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800575 /* PANLEDR# */
Tim Harvey26993362014-08-07 22:35:49 -0700576 IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800577 /* IOEXP_PWREN# */
Tim Harvey26993362014-08-07 22:35:49 -0700578 IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800579 /* IOEXP_IRQ# */
Tim Harvey26993362014-08-07 22:35:49 -0700580 IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800581
582 /* GPS_SHDN */
Tim Harvey26993362014-08-07 22:35:49 -0700583 IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800584 /* VID_PWR */
Tim Harvey26993362014-08-07 22:35:49 -0700585 IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800586 /* PCI_RST# */
Tim Harvey26993362014-08-07 22:35:49 -0700587 IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800588};
589
590static iomux_v3_cfg_t const gw52xx_gpio_pads[] = {
591 /* PANLEDG# */
Tim Harvey26993362014-08-07 22:35:49 -0700592 IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800593 /* PANLEDR# */
Tim Harvey26993362014-08-07 22:35:49 -0700594 IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800595 /* IOEXP_PWREN# */
Tim Harvey26993362014-08-07 22:35:49 -0700596 IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800597 /* IOEXP_IRQ# */
Tim Harvey26993362014-08-07 22:35:49 -0700598 IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800599
600 /* MX6_LOCLED# */
Tim Harvey26993362014-08-07 22:35:49 -0700601 IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800602 /* GPS_SHDN */
Tim Harvey26993362014-08-07 22:35:49 -0700603 IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800604 /* USBOTG_SEL */
Tim Harvey26993362014-08-07 22:35:49 -0700605 IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800606 /* VID_PWR */
Tim Harvey26993362014-08-07 22:35:49 -0700607 IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800608 /* PCI_RST# */
Tim Harvey26993362014-08-07 22:35:49 -0700609 IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800610};
611
612static iomux_v3_cfg_t const gw53xx_gpio_pads[] = {
613 /* PANLEDG# */
Tim Harvey26993362014-08-07 22:35:49 -0700614 IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800615 /* PANLEDR# */
Tim Harvey26993362014-08-07 22:35:49 -0700616 IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800617 /* IOEXP_PWREN# */
Tim Harvey26993362014-08-07 22:35:49 -0700618 IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800619 /* IOEXP_IRQ# */
Tim Harvey26993362014-08-07 22:35:49 -0700620 IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
Tim Harvey2722ac32014-08-07 22:35:48 -0700621 /* DIOI2C_DIS# */
Tim Harvey26993362014-08-07 22:35:49 -0700622 IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800623
624 /* MX6_LOCLED# */
Tim Harvey26993362014-08-07 22:35:49 -0700625 IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800626 /* GPS_SHDN */
Tim Harvey26993362014-08-07 22:35:49 -0700627 IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800628 /* VID_EN */
Tim Harvey26993362014-08-07 22:35:49 -0700629 IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800630 /* PCI_RST# */
Tim Harvey26993362014-08-07 22:35:49 -0700631 IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800632};
633
634static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
635 /* PANLEDG# */
Tim Harvey26993362014-08-07 22:35:49 -0700636 IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800637 /* PANLEDR# */
Tim Harvey26993362014-08-07 22:35:49 -0700638 IOMUX_PADS(PAD_KEY_COL2__GPIO4_IO10 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800639 /* MX6_LOCLED# */
Tim Harvey26993362014-08-07 22:35:49 -0700640 IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800641 /* MIPI_DIO */
Tim Harvey26993362014-08-07 22:35:49 -0700642 IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800643 /* RS485_EN */
Tim Harvey26993362014-08-07 22:35:49 -0700644 IOMUX_PADS(PAD_EIM_D24__GPIO3_IO24 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800645 /* IOEXP_PWREN# */
Tim Harvey26993362014-08-07 22:35:49 -0700646 IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800647 /* IOEXP_IRQ# */
Tim Harvey26993362014-08-07 22:35:49 -0700648 IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
Tim Harvey552c3582014-03-06 07:46:30 -0800649 /* DIOI2C_DIS# */
Tim Harvey26993362014-08-07 22:35:49 -0700650 IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800651 /* PCICK_SSON */
Tim Harvey26993362014-08-07 22:35:49 -0700652 IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800653 /* PCI_RST# */
Tim Harvey26993362014-08-07 22:35:49 -0700654 IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
Tim Harveyde1ef8e2014-08-07 22:35:46 -0700655 /* VID_EN */
Tim Harvey26993362014-08-07 22:35:49 -0700656 IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
Tim Harvey552c3582014-03-06 07:46:30 -0800657};
658
659/*
660 * each baseboard has 4 user configurable Digital IO lines which can
661 * be pinmuxed as a GPIO or in some cases a PWM
662 */
663struct dio_cfg {
Tim Harvey02fb5922014-06-02 16:13:26 -0700664 iomux_v3_cfg_t gpio_padmux[2];
Tim Harvey552c3582014-03-06 07:46:30 -0800665 unsigned gpio_param;
Tim Harvey02fb5922014-06-02 16:13:26 -0700666 iomux_v3_cfg_t pwm_padmux[2];
Tim Harvey552c3582014-03-06 07:46:30 -0800667 unsigned pwm_param;
668};
669
670struct ventana {
671 /* pinmux */
672 iomux_v3_cfg_t const *gpio_pads;
673 int num_pads;
674 /* DIO pinmux/val */
675 struct dio_cfg dio_cfg[4];
676 /* various gpios (0 if non-existent) */
677 int leds[3];
678 int pcie_rst;
679 int mezz_pwren;
680 int mezz_irq;
681 int rs485en;
682 int gps_shdn;
683 int vidin_en;
684 int dioi2c_en;
685 int pcie_sson;
686 int usb_sel;
687};
688
689struct ventana gpio_cfg[] = {
690 /* GW5400proto */
691 {
692 .gpio_pads = gw54xx_gpio_pads,
Tim Harvey02fb5922014-06-02 16:13:26 -0700693 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
Tim Harvey552c3582014-03-06 07:46:30 -0800694 .dio_cfg = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700695 {
696 { IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09) },
697 IMX_GPIO_NR(1, 9),
698 { IOMUX_PADS(PAD_GPIO_9__PWM1_OUT) },
699 1
700 },
701 {
702 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
703 IMX_GPIO_NR(1, 19),
704 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
705 2
706 },
707 {
708 { IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09) },
709 IMX_GPIO_NR(2, 9),
710 { IOMUX_PADS(PAD_SD4_DAT1__PWM3_OUT) },
711 3
712 },
713 {
714 { IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10) },
715 IMX_GPIO_NR(2, 10),
716 { IOMUX_PADS(PAD_SD4_DAT2__PWM4_OUT) },
717 4
718 },
Tim Harvey552c3582014-03-06 07:46:30 -0800719 },
720 .leds = {
721 IMX_GPIO_NR(4, 6),
722 IMX_GPIO_NR(4, 10),
723 IMX_GPIO_NR(4, 15),
724 },
725 .pcie_rst = IMX_GPIO_NR(1, 29),
726 .mezz_pwren = IMX_GPIO_NR(4, 7),
727 .mezz_irq = IMX_GPIO_NR(4, 9),
728 .rs485en = IMX_GPIO_NR(3, 24),
729 .dioi2c_en = IMX_GPIO_NR(4, 5),
730 .pcie_sson = IMX_GPIO_NR(1, 20),
731 },
732
733 /* GW51xx */
734 {
735 .gpio_pads = gw51xx_gpio_pads,
Tim Harvey02fb5922014-06-02 16:13:26 -0700736 .num_pads = ARRAY_SIZE(gw51xx_gpio_pads)/2,
Tim Harvey552c3582014-03-06 07:46:30 -0800737 .dio_cfg = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700738 {
739 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
740 IMX_GPIO_NR(1, 16),
741 { 0, 0 },
742 0
743 },
744 {
745 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
746 IMX_GPIO_NR(1, 19),
747 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
748 2
749 },
750 {
751 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
752 IMX_GPIO_NR(1, 17),
753 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
754 3
755 },
756 {
757 { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
758 IMX_GPIO_NR(1, 18),
759 { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
760 4
761 },
Tim Harvey552c3582014-03-06 07:46:30 -0800762 },
763 .leds = {
764 IMX_GPIO_NR(4, 6),
765 IMX_GPIO_NR(4, 10),
766 },
767 .pcie_rst = IMX_GPIO_NR(1, 0),
768 .mezz_pwren = IMX_GPIO_NR(2, 19),
769 .mezz_irq = IMX_GPIO_NR(2, 18),
770 .gps_shdn = IMX_GPIO_NR(1, 2),
771 .vidin_en = IMX_GPIO_NR(5, 20),
772 },
773
774 /* GW52xx */
775 {
776 .gpio_pads = gw52xx_gpio_pads,
Tim Harvey02fb5922014-06-02 16:13:26 -0700777 .num_pads = ARRAY_SIZE(gw52xx_gpio_pads)/2,
Tim Harvey552c3582014-03-06 07:46:30 -0800778 .dio_cfg = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700779 {
780 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
781 IMX_GPIO_NR(1, 16),
782 { 0, 0 },
783 0
784 },
785 {
786 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
787 IMX_GPIO_NR(1, 19),
788 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
789 2
790 },
791 {
792 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
793 IMX_GPIO_NR(1, 17),
794 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
795 3
796 },
797 {
798 { IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
799 IMX_GPIO_NR(1, 20),
800 { 0, 0 },
801 0
802 },
Tim Harvey552c3582014-03-06 07:46:30 -0800803 },
804 .leds = {
805 IMX_GPIO_NR(4, 6),
806 IMX_GPIO_NR(4, 7),
807 IMX_GPIO_NR(4, 15),
808 },
809 .pcie_rst = IMX_GPIO_NR(1, 29),
810 .mezz_pwren = IMX_GPIO_NR(2, 19),
811 .mezz_irq = IMX_GPIO_NR(2, 18),
812 .gps_shdn = IMX_GPIO_NR(1, 27),
813 .vidin_en = IMX_GPIO_NR(3, 31),
814 .usb_sel = IMX_GPIO_NR(1, 2),
815 },
816
817 /* GW53xx */
818 {
819 .gpio_pads = gw53xx_gpio_pads,
Tim Harvey02fb5922014-06-02 16:13:26 -0700820 .num_pads = ARRAY_SIZE(gw53xx_gpio_pads)/2,
Tim Harvey552c3582014-03-06 07:46:30 -0800821 .dio_cfg = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700822 {
823 { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
824 IMX_GPIO_NR(1, 16),
825 { 0, 0 },
826 0
827 },
828 {
829 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
830 IMX_GPIO_NR(1, 19),
831 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
832 2
833 },
834 {
835 { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
836 IMX_GPIO_NR(1, 17),
837 { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
838 3
839 },
840 {
841 {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
842 IMX_GPIO_NR(1, 20),
843 { 0, 0 },
844 0
845 },
Tim Harvey552c3582014-03-06 07:46:30 -0800846 },
847 .leds = {
848 IMX_GPIO_NR(4, 6),
849 IMX_GPIO_NR(4, 7),
850 IMX_GPIO_NR(4, 15),
851 },
852 .pcie_rst = IMX_GPIO_NR(1, 29),
853 .mezz_pwren = IMX_GPIO_NR(2, 19),
854 .mezz_irq = IMX_GPIO_NR(2, 18),
855 .gps_shdn = IMX_GPIO_NR(1, 27),
856 .vidin_en = IMX_GPIO_NR(3, 31),
857 },
858
859 /* GW54xx */
860 {
861 .gpio_pads = gw54xx_gpio_pads,
Tim Harvey02fb5922014-06-02 16:13:26 -0700862 .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
Tim Harvey552c3582014-03-06 07:46:30 -0800863 .dio_cfg = {
Tim Harvey02fb5922014-06-02 16:13:26 -0700864 {
865 { IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09) },
866 IMX_GPIO_NR(1, 9),
867 { IOMUX_PADS(PAD_GPIO_9__PWM1_OUT) },
868 1
869 },
870 {
871 { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
872 IMX_GPIO_NR(1, 19),
873 { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
874 2
875 },
876 {
877 { IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09) },
878 IMX_GPIO_NR(2, 9),
879 { IOMUX_PADS(PAD_SD4_DAT1__PWM3_OUT) },
880 3
881 },
882 {
883 { IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10) },
884 IMX_GPIO_NR(2, 10),
885 { IOMUX_PADS(PAD_SD4_DAT2__PWM4_OUT) },
886 4
887 },
Tim Harvey552c3582014-03-06 07:46:30 -0800888 },
889 .leds = {
890 IMX_GPIO_NR(4, 6),
891 IMX_GPIO_NR(4, 7),
892 IMX_GPIO_NR(4, 15),
893 },
894 .pcie_rst = IMX_GPIO_NR(1, 29),
895 .mezz_pwren = IMX_GPIO_NR(2, 19),
896 .mezz_irq = IMX_GPIO_NR(2, 18),
897 .rs485en = IMX_GPIO_NR(7, 1),
898 .vidin_en = IMX_GPIO_NR(3, 31),
899 .dioi2c_en = IMX_GPIO_NR(4, 5),
900 .pcie_sson = IMX_GPIO_NR(1, 20),
901 },
902};
903
Tim Harvey0dff16f2014-05-05 08:22:25 -0700904/* setup board specific PMIC */
905int power_init_board(void)
906{
907 struct pmic *p;
908 u32 reg;
909
910 /* configure PFUZE100 PMIC */
911 if (board_type == GW54xx || board_type == GW54proto) {
912 power_pfuze100_init(I2C_PMIC);
Fabio Estevamb96df4f2014-08-01 08:50:03 -0300913 p = pmic_get("PFUZE100");
Tim Harvey0dff16f2014-05-05 08:22:25 -0700914 if (p && !pmic_probe(p)) {
915 pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
916 printf("PMIC: PFUZE100 ID=0x%02x\n", reg);
917
918 /* Set VGEN1 to 1.5V and enable */
919 pmic_reg_read(p, PFUZE100_VGEN1VOL, &reg);
920 reg &= ~(LDO_VOL_MASK);
921 reg |= (LDOA_1_50V | LDO_EN);
922 pmic_reg_write(p, PFUZE100_VGEN1VOL, reg);
923
924 /* Set SWBST to 5.0V and enable */
925 pmic_reg_read(p, PFUZE100_SWBSTCON1, &reg);
926 reg &= ~(SWBST_MODE_MASK | SWBST_VOL_MASK);
927 reg |= (SWBST_5_00V | SWBST_MODE_AUTO);
928 pmic_reg_write(p, PFUZE100_SWBSTCON1, reg);
929 }
930 }
931
932 /* configure LTC3676 PMIC */
933 else {
934 power_ltc3676_init(I2C_PMIC);
935 p = pmic_get("LTC3676_PMIC");
936 if (p && !pmic_probe(p)) {
937 puts("PMIC: LTC3676\n");
938 /* set board-specific scalar to 1225mV for IMX6Q@1GHz */
939 if (is_cpu_type(MXC_CPU_MX6Q)) {
940 /* mask PGOOD during SW1 transition */
941 reg = 0x1d | LTC3676_PGOOD_MASK;
942 pmic_reg_write(p, LTC3676_DVB1B, reg);
943 /* set SW1 (VDD_SOC) to 1259mV */
944 reg = 0x1d;
945 pmic_reg_write(p, LTC3676_DVB1A, reg);
946
947 /* mask PGOOD during SW3 transition */
948 reg = 0x1d | LTC3676_PGOOD_MASK;
949 pmic_reg_write(p, LTC3676_DVB3B, reg);
950 /*set SW3 (VDD_ARM) to 1259mV */
951 reg = 0x1d;
952 pmic_reg_write(p, LTC3676_DVB3A, reg);
953 }
954 }
955 }
956
957 return 0;
958}
959
Tim Harvey552c3582014-03-06 07:46:30 -0800960/* setup GPIO pinmux and default configuration per baseboard */
961static void setup_board_gpio(int board)
962{
963 struct ventana_board_info *info = &ventana_info;
964 const char *s;
965 char arg[10];
966 size_t len;
967 int i;
968 int quiet = simple_strtol(getenv("quiet"), NULL, 10);
969
970 if (board >= GW_UNKNOWN)
971 return;
972
973 /* RS232_EN# */
974 gpio_direction_output(GP_RS232_EN, (hwconfig("rs232")) ? 0 : 1);
975
976 /* MSATA Enable */
977 if (is_cpu_type(MXC_CPU_MX6Q) &&
978 test_bit(EECONFIG_SATA, info->config)) {
979 gpio_direction_output(GP_MSATA_SEL,
980 (hwconfig("msata")) ? 1 : 0);
981 } else {
982 gpio_direction_output(GP_MSATA_SEL, 0);
983 }
984
985 /*
986 * assert PCI_RST# (released by OS when clock is valid)
987 * TODO: figure out why leaving this de-asserted from PCI scan on boot
988 * causes linux pcie driver to hang during enumeration
989 */
990 gpio_direction_output(gpio_cfg[board].pcie_rst, 0);
991
992 /* turn off (active-high) user LED's */
993 for (i = 0; i < 4; i++) {
994 if (gpio_cfg[board].leds[i])
995 gpio_direction_output(gpio_cfg[board].leds[i], 1);
996 }
997
998 /* Expansion Mezzanine IO */
999 gpio_direction_output(gpio_cfg[board].mezz_pwren, 0);
1000 gpio_direction_input(gpio_cfg[board].mezz_irq);
1001
1002 /* RS485 Transmit Enable */
1003 if (gpio_cfg[board].rs485en)
1004 gpio_direction_output(gpio_cfg[board].rs485en, 0);
1005
1006 /* GPS_SHDN */
1007 if (gpio_cfg[board].gps_shdn)
1008 gpio_direction_output(gpio_cfg[board].gps_shdn, 1);
1009
1010 /* Analog video codec power enable */
1011 if (gpio_cfg[board].vidin_en)
1012 gpio_direction_output(gpio_cfg[board].vidin_en, 1);
1013
1014 /* DIOI2C_DIS# */
1015 if (gpio_cfg[board].dioi2c_en)
1016 gpio_direction_output(gpio_cfg[board].dioi2c_en, 0);
1017
1018 /* PCICK_SSON: disable spread-spectrum clock */
1019 if (gpio_cfg[board].pcie_sson)
1020 gpio_direction_output(gpio_cfg[board].pcie_sson, 0);
1021
1022 /* USBOTG Select (PCISKT or FrontPanel) */
1023 if (gpio_cfg[board].usb_sel)
1024 gpio_direction_output(gpio_cfg[board].usb_sel, 0);
1025
1026 /*
1027 * Configure DIO pinmux/padctl registers
1028 * see IMX6DQRM/IMX6SDLRM IOMUXC_SW_PAD_CTL_PAD_* register definitions
1029 */
1030 for (i = 0; i < 4; i++) {
1031 struct dio_cfg *cfg = &gpio_cfg[board].dio_cfg[i];
Tim Harvey26993362014-08-07 22:35:49 -07001032 iomux_v3_cfg_t ctrl = DIO_PAD_CFG;
Tim Harvey02fb5922014-06-02 16:13:26 -07001033 unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1;
Tim Harvey552c3582014-03-06 07:46:30 -08001034
1035 sprintf(arg, "dio%d", i);
1036 if (!hwconfig(arg))
1037 continue;
1038 s = hwconfig_subarg(arg, "padctrl", &len);
Tim Harvey26993362014-08-07 22:35:49 -07001039 if (s) {
1040 ctrl = MUX_PAD_CTRL(simple_strtoul(s, NULL, 16)
1041 & 0x1ffff) | MUX_MODE_SION;
1042 }
Tim Harvey552c3582014-03-06 07:46:30 -08001043 if (hwconfig_subarg_cmp(arg, "mode", "gpio")) {
1044 if (!quiet) {
1045 printf("DIO%d: GPIO%d_IO%02d (gpio-%d)\n", i,
1046 (cfg->gpio_param/32)+1,
1047 cfg->gpio_param%32,
1048 cfg->gpio_param);
1049 }
Tim Harvey02fb5922014-06-02 16:13:26 -07001050 imx_iomux_v3_setup_pad(cfg->gpio_padmux[cputype] |
Tim Harvey26993362014-08-07 22:35:49 -07001051 ctrl);
Tim Harvey552c3582014-03-06 07:46:30 -08001052 gpio_direction_input(cfg->gpio_param);
1053 } else if (hwconfig_subarg_cmp("dio2", "mode", "pwm") &&
1054 cfg->pwm_padmux) {
1055 if (!quiet)
1056 printf("DIO%d: pwm%d\n", i, cfg->pwm_param);
Tim Harvey02fb5922014-06-02 16:13:26 -07001057 imx_iomux_v3_setup_pad(cfg->pwm_padmux[cputype] |
Tim Harvey552c3582014-03-06 07:46:30 -08001058 MUX_PAD_CTRL(ctrl));
1059 }
1060 }
1061
1062 if (!quiet) {
1063 if (is_cpu_type(MXC_CPU_MX6Q) &&
1064 (test_bit(EECONFIG_SATA, info->config))) {
1065 printf("MSATA: %s\n", (hwconfig("msata") ?
1066 "enabled" : "disabled"));
1067 }
1068 printf("RS232: %s\n", (hwconfig("rs232")) ?
1069 "enabled" : "disabled");
1070 }
1071}
1072
1073#if defined(CONFIG_CMD_PCI)
1074int imx6_pcie_toggle_reset(void)
1075{
1076 if (board_type < GW_UNKNOWN) {
Tim Harvey02fb5922014-06-02 16:13:26 -07001077 uint pin = gpio_cfg[board_type].pcie_rst;
1078 gpio_direction_output(pin, 0);
Tim Harvey552c3582014-03-06 07:46:30 -08001079 mdelay(50);
Tim Harvey02fb5922014-06-02 16:13:26 -07001080 gpio_direction_output(pin, 1);
Tim Harvey552c3582014-03-06 07:46:30 -08001081 }
1082 return 0;
1083}
1084#endif /* CONFIG_CMD_PCI */
1085
1086#ifdef CONFIG_SERIAL_TAG
1087/*
1088 * called when setting up ATAGS before booting kernel
1089 * populate serialnum from the following (in order of priority):
1090 * serial# env var
1091 * eeprom
1092 */
1093void get_board_serial(struct tag_serialnr *serialnr)
1094{
1095 char *serial = getenv("serial#");
1096
1097 if (serial) {
1098 serialnr->high = 0;
1099 serialnr->low = simple_strtoul(serial, NULL, 10);
1100 } else if (ventana_info.model[0]) {
1101 serialnr->high = 0;
1102 serialnr->low = ventana_info.serial;
1103 } else {
1104 serialnr->high = 0;
1105 serialnr->low = 0;
1106 }
1107}
1108#endif
1109
1110/*
1111 * Board Support
1112 */
1113
Tim Harveybfa2dae2014-06-02 16:13:27 -07001114/* called from SPL board_init_f() */
Tim Harvey552c3582014-03-06 07:46:30 -08001115int board_early_init_f(void)
1116{
1117 setup_iomux_uart();
1118 gpio_direction_output(GP_USB_OTG_PWR, 0); /* OTG power off */
1119
Tim Harveyfb64cc72014-04-25 15:39:07 -07001120#if defined(CONFIG_VIDEO_IPUV3)
1121 setup_display();
1122#endif
Tim Harvey552c3582014-03-06 07:46:30 -08001123 return 0;
1124}
1125
1126int dram_init(void)
1127{
Tim Harveybfa2dae2014-06-02 16:13:27 -07001128 gd->ram_size = imx_ddr_size();
Tim Harvey552c3582014-03-06 07:46:30 -08001129 return 0;
1130}
1131
1132int board_init(void)
1133{
Fabio Estevamceb74c42014-07-09 17:59:54 -03001134 struct iomuxc *const iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
Tim Harvey552c3582014-03-06 07:46:30 -08001135
1136 clrsetbits_le32(&iomuxc_regs->gpr[1],
1137 IOMUXC_GPR1_OTG_ID_MASK,
1138 IOMUXC_GPR1_OTG_ID_GPIO1);
1139
1140 /* address of linux boot parameters */
1141 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
1142
1143#ifdef CONFIG_CMD_NAND
1144 setup_gpmi_nand();
1145#endif
1146#ifdef CONFIG_MXC_SPI
1147 setup_spi();
1148#endif
Tim Harvey02fb5922014-06-02 16:13:26 -07001149 if (is_cpu_type(MXC_CPU_MX6Q)) {
1150 setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info0);
1151 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
1152 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info2);
1153 } else {
1154 setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info0);
1155 setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
1156 setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info2);
1157 }
Tim Harvey552c3582014-03-06 07:46:30 -08001158
1159#ifdef CONFIG_CMD_SATA
1160 setup_sata();
1161#endif
1162 /* read Gateworks EEPROM into global struct (used later) */
Tim Harvey0dccde72014-06-02 16:13:25 -07001163 board_type = read_eeprom(I2C_GSC, &ventana_info);
Tim Harvey552c3582014-03-06 07:46:30 -08001164
1165 /* board-specifc GPIO iomux */
Tim Harvey02fb5922014-06-02 16:13:26 -07001166 SETUP_IOMUX_PADS(gw_gpio_pads);
Tim Harvey552c3582014-03-06 07:46:30 -08001167 if (board_type < GW_UNKNOWN) {
Tim Harvey02fb5922014-06-02 16:13:26 -07001168 iomux_v3_cfg_t const *p = gpio_cfg[board_type].gpio_pads;
1169 int count = gpio_cfg[board_type].num_pads;
1170
1171 imx_iomux_v3_setup_multiple_pads(p, count);
Tim Harvey552c3582014-03-06 07:46:30 -08001172 }
1173
1174 return 0;
1175}
1176
1177#if defined(CONFIG_DISPLAY_BOARDINFO_LATE)
1178/*
1179 * called during late init (after relocation and after board_init())
1180 * by virtue of CONFIG_DISPLAY_BOARDINFO_LATE as we needed i2c initialized and
1181 * EEPROM read.
1182 */
1183int checkboard(void)
1184{
1185 struct ventana_board_info *info = &ventana_info;
1186 unsigned char buf[4];
1187 const char *p;
1188 int quiet; /* Quiet or minimal output mode */
1189
1190 quiet = 0;
1191 p = getenv("quiet");
1192 if (p)
1193 quiet = simple_strtol(p, NULL, 10);
1194 else
1195 setenv("quiet", "0");
1196
1197 puts("\nGateworks Corporation Copyright 2014\n");
1198 if (info->model[0]) {
1199 printf("Model: %s\n", info->model);
1200 printf("MFGDate: %02x-%02x-%02x%02x\n",
1201 info->mfgdate[0], info->mfgdate[1],
1202 info->mfgdate[2], info->mfgdate[3]);
1203 printf("Serial:%d\n", info->serial);
1204 } else {
1205 puts("Invalid EEPROM - board will not function fully\n");
1206 }
1207 if (quiet)
1208 return 0;
1209
1210 /* Display GSC firmware revision/CRC/status */
1211 i2c_set_bus_num(I2C_GSC);
1212 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_FWVER, 1, buf, 1)) {
1213 printf("GSC: v%d", buf[0]);
1214 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_STATUS, 1, buf, 4)) {
1215 printf(" 0x%04x", buf[2] | buf[3]<<8); /* CRC */
1216 printf(" 0x%02x", buf[0]); /* irq status */
1217 }
1218 puts("\n");
1219 }
1220 /* Display RTC */
1221 if (!gsc_i2c_read(GSC_RTC_ADDR, 0x00, 1, buf, 4)) {
1222 printf("RTC: %d\n",
1223 buf[0] | buf[1]<<8 | buf[2]<<16 | buf[3]<<24);
1224 }
1225
1226 return 0;
1227}
1228#endif
1229
1230#ifdef CONFIG_CMD_BMODE
1231/*
1232 * BOOT_CFG1, BOOT_CFG2, BOOT_CFG3, BOOT_CFG4
1233 * see Table 8-11 and Table 5-9
1234 * BOOT_CFG1[7] = 1 (boot from NAND)
1235 * BOOT_CFG1[5] = 0 - raw NAND
1236 * BOOT_CFG1[4] = 0 - default pad settings
1237 * BOOT_CFG1[3:2] = 00 - devices = 1
1238 * BOOT_CFG1[1:0] = 00 - Row Address Cycles = 3
1239 * BOOT_CFG2[4:3] = 00 - Boot Search Count = 2
1240 * BOOT_CFG2[2:1] = 01 - Pages In Block = 64
1241 * BOOT_CFG2[0] = 0 - Reset time 12ms
1242 */
1243static const struct boot_mode board_boot_modes[] = {
1244 /* NAND: 64pages per block, 3 row addr cycles, 2 copies of FCB/DBBT */
1245 { "nand", MAKE_CFGVAL(0x80, 0x02, 0x00, 0x00) },
1246 { NULL, 0 },
1247};
1248#endif
1249
1250/* late init */
1251int misc_init_r(void)
1252{
1253 struct ventana_board_info *info = &ventana_info;
1254 unsigned char reg;
1255
1256 /* set env vars based on EEPROM data */
1257 if (ventana_info.model[0]) {
1258 char str[16], fdt[36];
1259 char *p;
1260 const char *cputype = "";
1261 int i;
1262
1263 /*
1264 * FDT name will be prefixed with CPU type. Three versions
1265 * will be created each increasingly generic and bootloader
1266 * env scripts will try loading each from most specific to
1267 * least.
1268 */
Tim Harveybfa2dae2014-06-02 16:13:27 -07001269 if (is_cpu_type(MXC_CPU_MX6Q) ||
1270 is_cpu_type(MXC_CPU_MX6D))
Tim Harvey552c3582014-03-06 07:46:30 -08001271 cputype = "imx6q";
Tim Harveybfa2dae2014-06-02 16:13:27 -07001272 else if (is_cpu_type(MXC_CPU_MX6DL) ||
1273 is_cpu_type(MXC_CPU_MX6SOLO))
Tim Harvey552c3582014-03-06 07:46:30 -08001274 cputype = "imx6dl";
Tim Harvey06d87432014-08-07 22:35:41 -07001275 if (8 << (ventana_info.nand_flash_size-1) >= 2048)
1276 setenv("flash_layout", "large");
1277 else
1278 setenv("flash_layout", "normal");
Tim Harvey552c3582014-03-06 07:46:30 -08001279 memset(str, 0, sizeof(str));
1280 for (i = 0; i < (sizeof(str)-1) && info->model[i]; i++)
1281 str[i] = tolower(info->model[i]);
1282 if (!getenv("model"))
1283 setenv("model", str);
1284 if (!getenv("fdt_file")) {
1285 sprintf(fdt, "%s-%s.dtb", cputype, str);
1286 setenv("fdt_file", fdt);
1287 }
1288 p = strchr(str, '-');
1289 if (p) {
1290 *p++ = 0;
1291
1292 setenv("model_base", str);
1293 if (!getenv("fdt_file1")) {
1294 sprintf(fdt, "%s-%s.dtb", cputype, str);
1295 setenv("fdt_file1", fdt);
1296 }
1297 str[4] = 'x';
1298 str[5] = 'x';
1299 str[6] = 0;
1300 if (!getenv("fdt_file2")) {
1301 sprintf(fdt, "%s-%s.dtb", cputype, str);
1302 setenv("fdt_file2", fdt);
1303 }
1304 }
1305
1306 /* initialize env from EEPROM */
1307 if (test_bit(EECONFIG_ETH0, info->config) &&
1308 !getenv("ethaddr")) {
1309 eth_setenv_enetaddr("ethaddr", info->mac0);
1310 }
1311 if (test_bit(EECONFIG_ETH1, info->config) &&
1312 !getenv("eth1addr")) {
1313 eth_setenv_enetaddr("eth1addr", info->mac1);
1314 }
1315
1316 /* board serial-number */
1317 sprintf(str, "%6d", info->serial);
1318 setenv("serial#", str);
1319 }
1320
Tim Harvey552c3582014-03-06 07:46:30 -08001321
1322 /* setup baseboard specific GPIO pinmux and config */
1323 setup_board_gpio(board_type);
1324
1325#ifdef CONFIG_CMD_BMODE
1326 add_board_boot_modes(board_boot_modes);
1327#endif
1328
1329 /*
1330 * The Gateworks System Controller implements a boot
1331 * watchdog (always enabled) as a workaround for IMX6 boot related
1332 * errata such as:
1333 * ERR005768 - no fix
1334 * ERR006282 - fixed in silicon r1.3
1335 * ERR007117 - fixed in silicon r1.3
1336 * ERR007220 - fixed in silicon r1.3
1337 * see http://cache.freescale.com/files/32bit/doc/errata/IMX6DQCE.pdf
1338 *
1339 * Disable the boot watchdog and display/clear the timeout flag if set
1340 */
1341 i2c_set_bus_num(I2C_GSC);
1342 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 1)) {
1343 reg |= (1 << GSC_SC_CTRL1_WDDIS);
1344 if (gsc_i2c_write(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 1))
1345 puts("Error: could not disable GSC Watchdog\n");
1346 } else {
1347 puts("Error: could not disable GSC Watchdog\n");
1348 }
1349 if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_STATUS, 1, &reg, 1)) {
1350 if (reg & (1 << GSC_SC_IRQ_WATCHDOG)) { /* watchdog timeout */
Tim Harveyfc3883a2014-08-07 22:35:47 -07001351 puts("GSC boot watchdog timeout detected\n");
Tim Harvey552c3582014-03-06 07:46:30 -08001352 reg &= ~(1 << GSC_SC_IRQ_WATCHDOG); /* clear flag */
1353 gsc_i2c_write(GSC_SC_ADDR, GSC_SC_STATUS, 1, &reg, 1);
1354 }
1355 }
1356
1357 return 0;
1358}
1359
1360#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
1361
1362/* FDT aliases associated with EEPROM config bits */
1363const char *fdt_aliases[] = {
1364 "ethernet0",
1365 "ethernet1",
1366 "hdmi_out",
1367 "ahci0",
1368 "pcie",
1369 "ssi0",
1370 "ssi1",
1371 "lcd0",
1372 "lvds0",
1373 "lvds1",
1374 "usb0",
1375 "usb1",
1376 "mmc0",
1377 "mmc1",
1378 "mmc2",
1379 "mmc3",
1380 "uart0",
1381 "uart1",
1382 "uart2",
1383 "uart3",
1384 "uart4",
1385 "ipu0",
1386 "ipu1",
1387 "can0",
1388 "mipi_dsi",
1389 "mipi_csi",
1390 "tzasc0",
1391 "tzasc1",
1392 "i2c0",
1393 "i2c1",
1394 "i2c2",
1395 "vpu",
1396 "csi0",
1397 "csi1",
Tim Harvey3f5c9cc2014-08-07 22:35:43 -07001398 NULL,
Tim Harvey552c3582014-03-06 07:46:30 -08001399 NULL,
1400 NULL,
1401 NULL,
1402 NULL,
1403 NULL,
1404 "spi0",
1405 "spi1",
1406 "spi2",
1407 "spi3",
1408 "spi4",
1409 "spi5",
1410 NULL,
1411 NULL,
1412 "pps",
1413 NULL,
1414 NULL,
1415 NULL,
1416 "hdmi_in",
1417 "cvbs_out",
1418 "cvbs_in",
1419 "nand",
1420 NULL,
1421 NULL,
1422 NULL,
1423 NULL,
1424 NULL,
1425 NULL,
1426 NULL,
1427 NULL,
1428};
1429
1430/*
1431 * called prior to booting kernel or by 'fdt boardsetup' command
1432 *
1433 * unless 'fdt_noauto' env var is set we will update the following in the DTB:
1434 * - mtd partitions based on mtdparts/mtdids env
1435 * - system-serial (board serial num from EEPROM)
1436 * - board (full model from EEPROM)
1437 * - peripherals removed from DTB if not loaded on board (per EEPROM config)
1438 */
1439void ft_board_setup(void *blob, bd_t *bd)
1440{
1441 int bit;
1442 struct ventana_board_info *info = &ventana_info;
1443 struct node_info nodes[] = {
1444 { "sst,w25q256", MTD_DEV_TYPE_NOR, }, /* SPI flash */
1445 { "fsl,imx6q-gpmi-nand", MTD_DEV_TYPE_NAND, }, /* NAND flash */
1446 };
1447 const char *model = getenv("model");
1448
1449 if (getenv("fdt_noauto")) {
1450 puts(" Skiping ft_board_setup (fdt_noauto defined)\n");
1451 return;
1452 }
1453
1454 /* Update partition nodes using info from mtdparts env var */
1455 puts(" Updating MTD partitions...\n");
1456 fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
1457
1458 if (!model) {
1459 puts("invalid board info: Leaving FDT fully enabled\n");
1460 return;
1461 }
1462 printf(" Adjusting FDT per EEPROM for %s...\n", model);
1463
1464 /* board serial number */
1465 fdt_setprop(blob, 0, "system-serial", getenv("serial#"),
Tim Harveyae35ded2014-04-25 09:18:33 -07001466 strlen(getenv("serial#")) + 1);
Tim Harvey552c3582014-03-06 07:46:30 -08001467
1468 /* board (model contains model from device-tree) */
1469 fdt_setprop(blob, 0, "board", info->model,
1470 strlen((const char *)info->model) + 1);
1471
1472 /*
1473 * Peripheral Config:
1474 * remove nodes by alias path if EEPROM config tells us the
1475 * peripheral is not loaded on the board.
1476 */
1477 for (bit = 0; bit < 64; bit++) {
1478 if (!test_bit(bit, info->config))
1479 fdt_del_node_and_alias(blob, fdt_aliases[bit]);
1480 }
1481}
1482#endif /* defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) */
1483