1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2012 Freescale Semiconductor, Inc.
4  *
5  * Author: Fabio Estevam <fabio.estevam@freescale.com>
6  */
7 
8 #include <asm/arch/clock.h>
9 #include <asm/arch/imx-regs.h>
10 #include <asm/arch/iomux.h>
11 #include <asm/arch/mx6-pins.h>
12 #include <asm/mach-imx/spi.h>
13 #include <linux/errno.h>
14 #include <asm/gpio.h>
15 #include <asm/mach-imx/mxc_i2c.h>
16 #include <asm/mach-imx/iomux-v3.h>
17 #include <asm/mach-imx/boot_mode.h>
18 #include <asm/mach-imx/video.h>
19 #include <mmc.h>
20 #include <fsl_esdhc.h>
21 #include <miiphy.h>
22 #include <netdev.h>
23 #include <asm/arch/mxc_hdmi.h>
24 #include <asm/arch/crm_regs.h>
25 #include <asm/io.h>
26 #include <asm/arch/sys_proto.h>
27 #include <i2c.h>
28 #include <input.h>
29 #include <power/pmic.h>
30 #include <power/pfuze100_pmic.h>
31 #include "../common/pfuze.h"
32 #include <usb.h>
33 #include <usb/ehci-ci.h>
34 
35 DECLARE_GLOBAL_DATA_PTR;
36 
37 #define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |			\
38 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |			\
39 	PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
40 
41 #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |			\
42 	PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |			\
43 	PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
44 
45 #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |			\
46 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
47 
48 #define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
49 		      PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
50 
51 #define I2C_PAD_CTRL  (PAD_CTL_PUS_100K_UP |			\
52 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |	\
53 	PAD_CTL_ODE | PAD_CTL_SRE_FAST)
54 
55 #define I2C_PMIC	1
56 
57 #define I2C_PAD MUX_PAD_CTRL(I2C_PAD_CTRL)
58 
59 #define DISP0_PWR_EN	IMX_GPIO_NR(1, 21)
60 
61 #define KEY_VOL_UP	IMX_GPIO_NR(1, 4)
62 
63 int dram_init(void)
64 {
65 	gd->ram_size = imx_ddr_size();
66 	return 0;
67 }
68 
69 static iomux_v3_cfg_t const uart1_pads[] = {
70 	IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
71 	IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
72 };
73 
74 static iomux_v3_cfg_t const enet_pads[] = {
75 	IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
76 	IOMUX_PADS(PAD_ENET_MDC__ENET_MDC	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
77 	IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
78 	IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
79 	IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
80 	IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
81 	IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
82 	IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
83 	IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
84 	IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
85 	IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
86 	IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
87 	IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
88 	IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
89 	IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
90 	/* AR8031 PHY Reset */
91 	IOMUX_PADS(PAD_ENET_CRS_DV__GPIO1_IO25	| MUX_PAD_CTRL(NO_PAD_CTRL)),
92 };
93 
94 static void setup_iomux_enet(void)
95 {
96 	SETUP_IOMUX_PADS(enet_pads);
97 
98 	/* Reset AR8031 PHY */
99 	gpio_direction_output(IMX_GPIO_NR(1, 25) , 0);
100 	mdelay(10);
101 	gpio_set_value(IMX_GPIO_NR(1, 25), 1);
102 	udelay(100);
103 }
104 
105 static iomux_v3_cfg_t const usdhc2_pads[] = {
106 	IOMUX_PADS(PAD_SD2_CLK__SD2_CLK	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
107 	IOMUX_PADS(PAD_SD2_CMD__SD2_CMD	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
108 	IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
109 	IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
110 	IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
111 	IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
112 	IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
113 	IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
114 	IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
115 	IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
116 	IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02	| MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
117 };
118 
119 static iomux_v3_cfg_t const usdhc3_pads[] = {
120 	IOMUX_PADS(PAD_SD3_CLK__SD3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
121 	IOMUX_PADS(PAD_SD3_CMD__SD3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
122 	IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
123 	IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
124 	IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
125 	IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
126 	IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
127 	IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
128 	IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
129 	IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
130 	IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00    | MUX_PAD_CTRL(NO_PAD_CTRL)), /* CD */
131 };
132 
133 static iomux_v3_cfg_t const usdhc4_pads[] = {
134 	IOMUX_PADS(PAD_SD4_CLK__SD4_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
135 	IOMUX_PADS(PAD_SD4_CMD__SD4_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
136 	IOMUX_PADS(PAD_SD4_DAT0__SD4_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
137 	IOMUX_PADS(PAD_SD4_DAT1__SD4_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
138 	IOMUX_PADS(PAD_SD4_DAT2__SD4_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
139 	IOMUX_PADS(PAD_SD4_DAT3__SD4_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
140 	IOMUX_PADS(PAD_SD4_DAT4__SD4_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
141 	IOMUX_PADS(PAD_SD4_DAT5__SD4_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
142 	IOMUX_PADS(PAD_SD4_DAT6__SD4_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
143 	IOMUX_PADS(PAD_SD4_DAT7__SD4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
144 };
145 
146 static iomux_v3_cfg_t const ecspi1_pads[] = {
147 	IOMUX_PADS(PAD_KEY_COL0__ECSPI1_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL)),
148 	IOMUX_PADS(PAD_KEY_COL1__ECSPI1_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL)),
149 	IOMUX_PADS(PAD_KEY_ROW0__ECSPI1_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL)),
150 	IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
151 };
152 
153 static iomux_v3_cfg_t const rgb_pads[] = {
154 	IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK | MUX_PAD_CTRL(NO_PAD_CTRL)),
155 	IOMUX_PADS(PAD_DI0_PIN15__IPU1_DI0_PIN15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
156 	IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
157 	IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
158 	IOMUX_PADS(PAD_DI0_PIN4__IPU1_DI0_PIN04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
159 	IOMUX_PADS(PAD_DISP0_DAT0__IPU1_DISP0_DATA00 | MUX_PAD_CTRL(NO_PAD_CTRL)),
160 	IOMUX_PADS(PAD_DISP0_DAT1__IPU1_DISP0_DATA01 | MUX_PAD_CTRL(NO_PAD_CTRL)),
161 	IOMUX_PADS(PAD_DISP0_DAT2__IPU1_DISP0_DATA02 | MUX_PAD_CTRL(NO_PAD_CTRL)),
162 	IOMUX_PADS(PAD_DISP0_DAT3__IPU1_DISP0_DATA03 | MUX_PAD_CTRL(NO_PAD_CTRL)),
163 	IOMUX_PADS(PAD_DISP0_DAT4__IPU1_DISP0_DATA04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
164 	IOMUX_PADS(PAD_DISP0_DAT5__IPU1_DISP0_DATA05 | MUX_PAD_CTRL(NO_PAD_CTRL)),
165 	IOMUX_PADS(PAD_DISP0_DAT6__IPU1_DISP0_DATA06 | MUX_PAD_CTRL(NO_PAD_CTRL)),
166 	IOMUX_PADS(PAD_DISP0_DAT7__IPU1_DISP0_DATA07 | MUX_PAD_CTRL(NO_PAD_CTRL)),
167 	IOMUX_PADS(PAD_DISP0_DAT8__IPU1_DISP0_DATA08 | MUX_PAD_CTRL(NO_PAD_CTRL)),
168 	IOMUX_PADS(PAD_DISP0_DAT9__IPU1_DISP0_DATA09 | MUX_PAD_CTRL(NO_PAD_CTRL)),
169 	IOMUX_PADS(PAD_DISP0_DAT10__IPU1_DISP0_DATA10 | MUX_PAD_CTRL(NO_PAD_CTRL)),
170 	IOMUX_PADS(PAD_DISP0_DAT11__IPU1_DISP0_DATA11 | MUX_PAD_CTRL(NO_PAD_CTRL)),
171 	IOMUX_PADS(PAD_DISP0_DAT12__IPU1_DISP0_DATA12 | MUX_PAD_CTRL(NO_PAD_CTRL)),
172 	IOMUX_PADS(PAD_DISP0_DAT13__IPU1_DISP0_DATA13 | MUX_PAD_CTRL(NO_PAD_CTRL)),
173 	IOMUX_PADS(PAD_DISP0_DAT14__IPU1_DISP0_DATA14 | MUX_PAD_CTRL(NO_PAD_CTRL)),
174 	IOMUX_PADS(PAD_DISP0_DAT15__IPU1_DISP0_DATA15 | MUX_PAD_CTRL(NO_PAD_CTRL)),
175 	IOMUX_PADS(PAD_DISP0_DAT16__IPU1_DISP0_DATA16 | MUX_PAD_CTRL(NO_PAD_CTRL)),
176 	IOMUX_PADS(PAD_DISP0_DAT17__IPU1_DISP0_DATA17 | MUX_PAD_CTRL(NO_PAD_CTRL)),
177 	IOMUX_PADS(PAD_DISP0_DAT18__IPU1_DISP0_DATA18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
178 	IOMUX_PADS(PAD_DISP0_DAT19__IPU1_DISP0_DATA19 | MUX_PAD_CTRL(NO_PAD_CTRL)),
179 	IOMUX_PADS(PAD_DISP0_DAT20__IPU1_DISP0_DATA20 | MUX_PAD_CTRL(NO_PAD_CTRL)),
180 	IOMUX_PADS(PAD_DISP0_DAT21__IPU1_DISP0_DATA21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
181 	IOMUX_PADS(PAD_DISP0_DAT22__IPU1_DISP0_DATA22 | MUX_PAD_CTRL(NO_PAD_CTRL)),
182 	IOMUX_PADS(PAD_DISP0_DAT23__IPU1_DISP0_DATA23 | MUX_PAD_CTRL(NO_PAD_CTRL)),
183 };
184 
185 static iomux_v3_cfg_t const bl_pads[] = {
186 	IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL)),
187 };
188 
189 static void enable_backlight(void)
190 {
191 	SETUP_IOMUX_PADS(bl_pads);
192 	gpio_direction_output(DISP0_PWR_EN, 1);
193 }
194 
195 static void enable_rgb(struct display_info_t const *dev)
196 {
197 	SETUP_IOMUX_PADS(rgb_pads);
198 	enable_backlight();
199 }
200 
201 static void enable_lvds(struct display_info_t const *dev)
202 {
203 	enable_backlight();
204 }
205 
206 static struct i2c_pads_info mx6q_i2c_pad_info1 = {
207 	.scl = {
208 		.i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
209 		.gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
210 		.gp = IMX_GPIO_NR(4, 12)
211 	},
212 	.sda = {
213 		.i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
214 		.gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
215 		.gp = IMX_GPIO_NR(4, 13)
216 	}
217 };
218 
219 static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
220 	.scl = {
221 		.i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | I2C_PAD,
222 		.gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | I2C_PAD,
223 		.gp = IMX_GPIO_NR(4, 12)
224 	},
225 	.sda = {
226 		.i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | I2C_PAD,
227 		.gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | I2C_PAD,
228 		.gp = IMX_GPIO_NR(4, 13)
229 	}
230 };
231 
232 static void setup_spi(void)
233 {
234 	SETUP_IOMUX_PADS(ecspi1_pads);
235 }
236 
237 iomux_v3_cfg_t const pcie_pads[] = {
238 	IOMUX_PADS(PAD_EIM_D19__GPIO3_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL)),	/* POWER */
239 	IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL)),	/* RESET */
240 };
241 
242 static void setup_pcie(void)
243 {
244 	SETUP_IOMUX_PADS(pcie_pads);
245 }
246 
247 iomux_v3_cfg_t const di0_pads[] = {
248 	IOMUX_PADS(PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK),	/* DISP0_CLK */
249 	IOMUX_PADS(PAD_DI0_PIN2__IPU1_DI0_PIN02),		/* DISP0_HSYNC */
250 	IOMUX_PADS(PAD_DI0_PIN3__IPU1_DI0_PIN03),		/* DISP0_VSYNC */
251 };
252 
253 static void setup_iomux_uart(void)
254 {
255 	SETUP_IOMUX_PADS(uart1_pads);
256 }
257 
258 #ifdef CONFIG_FSL_ESDHC
259 struct fsl_esdhc_cfg usdhc_cfg[3] = {
260 	{USDHC2_BASE_ADDR},
261 	{USDHC3_BASE_ADDR},
262 	{USDHC4_BASE_ADDR},
263 };
264 
265 #define USDHC2_CD_GPIO	IMX_GPIO_NR(2, 2)
266 #define USDHC3_CD_GPIO	IMX_GPIO_NR(2, 0)
267 
268 int board_mmc_get_env_dev(int devno)
269 {
270 	return devno - 1;
271 }
272 
273 int board_mmc_getcd(struct mmc *mmc)
274 {
275 	struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
276 	int ret = 0;
277 
278 	switch (cfg->esdhc_base) {
279 	case USDHC2_BASE_ADDR:
280 		ret = !gpio_get_value(USDHC2_CD_GPIO);
281 		break;
282 	case USDHC3_BASE_ADDR:
283 		ret = !gpio_get_value(USDHC3_CD_GPIO);
284 		break;
285 	case USDHC4_BASE_ADDR:
286 		ret = 1; /* eMMC/uSDHC4 is always present */
287 		break;
288 	}
289 
290 	return ret;
291 }
292 
293 int board_mmc_init(bd_t *bis)
294 {
295 #ifndef CONFIG_SPL_BUILD
296 	int ret;
297 	int i;
298 
299 	/*
300 	 * According to the board_mmc_init() the following map is done:
301 	 * (U-Boot device node)    (Physical Port)
302 	 * mmc0                    SD2
303 	 * mmc1                    SD3
304 	 * mmc2                    eMMC
305 	 */
306 	for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
307 		switch (i) {
308 		case 0:
309 			SETUP_IOMUX_PADS(usdhc2_pads);
310 			gpio_direction_input(USDHC2_CD_GPIO);
311 			usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
312 			break;
313 		case 1:
314 			SETUP_IOMUX_PADS(usdhc3_pads);
315 			gpio_direction_input(USDHC3_CD_GPIO);
316 			usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
317 			break;
318 		case 2:
319 			SETUP_IOMUX_PADS(usdhc4_pads);
320 			usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
321 			break;
322 		default:
323 			printf("Warning: you configured more USDHC controllers"
324 			       "(%d) then supported by the board (%d)\n",
325 			       i + 1, CONFIG_SYS_FSL_USDHC_NUM);
326 			return -EINVAL;
327 		}
328 
329 		ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
330 		if (ret)
331 			return ret;
332 	}
333 
334 	return 0;
335 #else
336 	struct src *psrc = (struct src *)SRC_BASE_ADDR;
337 	unsigned reg = readl(&psrc->sbmr1) >> 11;
338 	/*
339 	 * Upon reading BOOT_CFG register the following map is done:
340 	 * Bit 11 and 12 of BOOT_CFG register can determine the current
341 	 * mmc port
342 	 * 0x1                  SD1
343 	 * 0x2                  SD2
344 	 * 0x3                  SD4
345 	 */
346 
347 	switch (reg & 0x3) {
348 	case 0x1:
349 		SETUP_IOMUX_PADS(usdhc2_pads);
350 		usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
351 		usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
352 		gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
353 		break;
354 	case 0x2:
355 		SETUP_IOMUX_PADS(usdhc3_pads);
356 		usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
357 		usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
358 		gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
359 		break;
360 	case 0x3:
361 		SETUP_IOMUX_PADS(usdhc4_pads);
362 		usdhc_cfg[0].esdhc_base = USDHC4_BASE_ADDR;
363 		usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
364 		gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
365 		break;
366 	}
367 
368 	return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
369 #endif
370 }
371 #endif
372 
373 static int ar8031_phy_fixup(struct phy_device *phydev)
374 {
375 	unsigned short val;
376 
377 	/* To enable AR8031 ouput a 125MHz clk from CLK_25M */
378 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
379 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
380 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
381 
382 	val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
383 	val &= 0xffe3;
384 	val |= 0x18;
385 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
386 
387 	/* introduce tx clock delay */
388 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
389 	val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
390 	val |= 0x0100;
391 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
392 
393 	return 0;
394 }
395 
396 int board_phy_config(struct phy_device *phydev)
397 {
398 	ar8031_phy_fixup(phydev);
399 
400 	if (phydev->drv->config)
401 		phydev->drv->config(phydev);
402 
403 	return 0;
404 }
405 
406 #if defined(CONFIG_VIDEO_IPUV3)
407 static void disable_lvds(struct display_info_t const *dev)
408 {
409 	struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
410 
411 	int reg = readl(&iomux->gpr[2]);
412 
413 	reg &= ~(IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
414 		 IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
415 
416 	writel(reg, &iomux->gpr[2]);
417 }
418 
419 static void do_enable_hdmi(struct display_info_t const *dev)
420 {
421 	disable_lvds(dev);
422 	imx_enable_hdmi_phy();
423 }
424 
425 struct display_info_t const displays[] = {{
426 	.bus	= -1,
427 	.addr	= 0,
428 	.pixfmt	= IPU_PIX_FMT_RGB666,
429 	.detect	= NULL,
430 	.enable	= enable_lvds,
431 	.mode	= {
432 		.name           = "Hannstar-XGA",
433 		.refresh        = 60,
434 		.xres           = 1024,
435 		.yres           = 768,
436 		.pixclock       = 15384,
437 		.left_margin    = 160,
438 		.right_margin   = 24,
439 		.upper_margin   = 29,
440 		.lower_margin   = 3,
441 		.hsync_len      = 136,
442 		.vsync_len      = 6,
443 		.sync           = FB_SYNC_EXT,
444 		.vmode          = FB_VMODE_NONINTERLACED
445 } }, {
446 	.bus	= -1,
447 	.addr	= 0,
448 	.pixfmt	= IPU_PIX_FMT_RGB24,
449 	.detect	= detect_hdmi,
450 	.enable	= do_enable_hdmi,
451 	.mode	= {
452 		.name           = "HDMI",
453 		.refresh        = 60,
454 		.xres           = 1024,
455 		.yres           = 768,
456 		.pixclock       = 15384,
457 		.left_margin    = 160,
458 		.right_margin   = 24,
459 		.upper_margin   = 29,
460 		.lower_margin   = 3,
461 		.hsync_len      = 136,
462 		.vsync_len      = 6,
463 		.sync           = FB_SYNC_EXT,
464 		.vmode          = FB_VMODE_NONINTERLACED
465 } }, {
466 	.bus	= 0,
467 	.addr	= 0,
468 	.pixfmt	= IPU_PIX_FMT_RGB24,
469 	.detect	= NULL,
470 	.enable	= enable_rgb,
471 	.mode	= {
472 		.name           = "SEIKO-WVGA",
473 		.refresh        = 60,
474 		.xres           = 800,
475 		.yres           = 480,
476 		.pixclock       = 29850,
477 		.left_margin    = 89,
478 		.right_margin   = 164,
479 		.upper_margin   = 23,
480 		.lower_margin   = 10,
481 		.hsync_len      = 10,
482 		.vsync_len      = 10,
483 		.sync           = 0,
484 		.vmode          = FB_VMODE_NONINTERLACED
485 } } };
486 size_t display_count = ARRAY_SIZE(displays);
487 
488 static void setup_display(void)
489 {
490 	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
491 	struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
492 	int reg;
493 
494 	/* Setup HSYNC, VSYNC, DISP_CLK for debugging purposes */
495 	SETUP_IOMUX_PADS(di0_pads);
496 
497 	enable_ipu_clock();
498 	imx_setup_hdmi();
499 
500 	/* Turn on LDB0, LDB1, IPU,IPU DI0 clocks */
501 	reg = readl(&mxc_ccm->CCGR3);
502 	reg |=  MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
503 	writel(reg, &mxc_ccm->CCGR3);
504 
505 	/* set LDB0, LDB1 clk select to 011/011 */
506 	reg = readl(&mxc_ccm->cs2cdr);
507 	reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK
508 		 | MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
509 	reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET)
510 	      | (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
511 	writel(reg, &mxc_ccm->cs2cdr);
512 
513 	reg = readl(&mxc_ccm->cscmr2);
514 	reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
515 	writel(reg, &mxc_ccm->cscmr2);
516 
517 	reg = readl(&mxc_ccm->chsccdr);
518 	reg |= (CHSCCDR_CLK_SEL_LDB_DI0
519 		<< MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
520 	reg |= (CHSCCDR_CLK_SEL_LDB_DI0
521 		<< MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
522 	writel(reg, &mxc_ccm->chsccdr);
523 
524 	reg = IOMUXC_GPR2_BGREF_RRMODE_EXTERNAL_RES
525 	     | IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW
526 	     | IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW
527 	     | IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG
528 	     | IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT
529 	     | IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG
530 	     | IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT
531 	     | IOMUXC_GPR2_LVDS_CH0_MODE_DISABLED
532 	     | IOMUXC_GPR2_LVDS_CH1_MODE_ENABLED_DI0;
533 	writel(reg, &iomux->gpr[2]);
534 
535 	reg = readl(&iomux->gpr[3]);
536 	reg = (reg & ~(IOMUXC_GPR3_LVDS1_MUX_CTL_MASK
537 			| IOMUXC_GPR3_HDMI_MUX_CTL_MASK))
538 	    | (IOMUXC_GPR3_MUX_SRC_IPU1_DI0
539 	       << IOMUXC_GPR3_LVDS1_MUX_CTL_OFFSET);
540 	writel(reg, &iomux->gpr[3]);
541 }
542 #endif /* CONFIG_VIDEO_IPUV3 */
543 
544 /*
545  * Do not overwrite the console
546  * Use always serial for U-Boot console
547  */
548 int overwrite_console(void)
549 {
550 	return 1;
551 }
552 
553 int board_eth_init(bd_t *bis)
554 {
555 	setup_iomux_enet();
556 	setup_pcie();
557 
558 	return cpu_eth_init(bis);
559 }
560 
561 #ifdef CONFIG_USB_EHCI_MX6
562 #define USB_OTHERREGS_OFFSET	0x800
563 #define UCTRL_PWR_POL		(1 << 9)
564 
565 static iomux_v3_cfg_t const usb_otg_pads[] = {
566 	IOMUX_PADS(PAD_EIM_D22__USB_OTG_PWR | MUX_PAD_CTRL(NO_PAD_CTRL)),
567 	IOMUX_PADS(PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL)),
568 };
569 
570 static iomux_v3_cfg_t const usb_hc1_pads[] = {
571 	IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL)),
572 };
573 
574 static void setup_usb(void)
575 {
576 	SETUP_IOMUX_PADS(usb_otg_pads);
577 
578 	/*
579 	 * set daisy chain for otg_pin_id on 6q.
580 	 * for 6dl, this bit is reserved
581 	 */
582 	imx_iomux_set_gpr_register(1, 13, 1, 0);
583 
584 	SETUP_IOMUX_PADS(usb_hc1_pads);
585 }
586 
587 int board_ehci_hcd_init(int port)
588 {
589 	u32 *usbnc_usb_ctrl;
590 
591 	if (port > 1)
592 		return -EINVAL;
593 
594 	usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET +
595 				 port * 4);
596 
597 	setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL);
598 
599 	return 0;
600 }
601 
602 int board_ehci_power(int port, int on)
603 {
604 	switch (port) {
605 	case 0:
606 		break;
607 	case 1:
608 		if (on)
609 			gpio_direction_output(IMX_GPIO_NR(1, 29), 1);
610 		else
611 			gpio_direction_output(IMX_GPIO_NR(1, 29), 0);
612 		break;
613 	default:
614 		printf("MXC USB port %d not yet supported\n", port);
615 		return -EINVAL;
616 	}
617 
618 	return 0;
619 }
620 #endif
621 
622 int board_early_init_f(void)
623 {
624 	setup_iomux_uart();
625 
626 	return 0;
627 }
628 
629 int board_init(void)
630 {
631 	/* address of boot parameters */
632 	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
633 
634 #ifdef CONFIG_MXC_SPI
635 	setup_spi();
636 #endif
637 	if (is_mx6dq() || is_mx6dqp())
638 		setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
639 	else
640 		setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
641 #if defined(CONFIG_VIDEO_IPUV3)
642 	setup_display();
643 #endif
644 #ifdef CONFIG_USB_EHCI_MX6
645 	setup_usb();
646 #endif
647 
648 	return 0;
649 }
650 
651 int power_init_board(void)
652 {
653 	struct pmic *p;
654 	unsigned int reg;
655 	int ret;
656 
657 	p = pfuze_common_init(I2C_PMIC);
658 	if (!p)
659 		return -ENODEV;
660 
661 	ret = pfuze_mode_init(p, APS_PFM);
662 	if (ret < 0)
663 		return ret;
664 
665 	/* Increase VGEN3 from 2.5 to 2.8V */
666 	pmic_reg_read(p, PFUZE100_VGEN3VOL, &reg);
667 	reg &= ~LDO_VOL_MASK;
668 	reg |= LDOB_2_80V;
669 	pmic_reg_write(p, PFUZE100_VGEN3VOL, reg);
670 
671 	/* Increase VGEN5 from 2.8 to 3V */
672 	pmic_reg_read(p, PFUZE100_VGEN5VOL, &reg);
673 	reg &= ~LDO_VOL_MASK;
674 	reg |= LDOB_3_00V;
675 	pmic_reg_write(p, PFUZE100_VGEN5VOL, reg);
676 
677 	return 0;
678 }
679 
680 #ifdef CONFIG_MXC_SPI
681 int board_spi_cs_gpio(unsigned bus, unsigned cs)
682 {
683 	return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
684 }
685 #endif
686 
687 #ifdef CONFIG_CMD_BMODE
688 static const struct boot_mode board_boot_modes[] = {
689 	/* 4 bit bus width */
690 	{"sd2",	 MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
691 	{"sd3",	 MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
692 	/* 8 bit bus width */
693 	{"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)},
694 	{NULL,	 0},
695 };
696 #endif
697 
698 int board_late_init(void)
699 {
700 #ifdef CONFIG_CMD_BMODE
701 	add_board_boot_modes(board_boot_modes);
702 #endif
703 
704 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
705 	env_set("board_name", "SABRESD");
706 
707 	if (is_mx6dqp())
708 		env_set("board_rev", "MX6QP");
709 	else if (is_mx6dq())
710 		env_set("board_rev", "MX6Q");
711 	else if (is_mx6sdl())
712 		env_set("board_rev", "MX6DL");
713 #endif
714 
715 	return 0;
716 }
717 
718 int checkboard(void)
719 {
720 	puts("Board: MX6-SabreSD\n");
721 	return 0;
722 }
723 
724 #ifdef CONFIG_SPL_BUILD
725 #include <asm/arch/mx6-ddr.h>
726 #include <spl.h>
727 #include <linux/libfdt.h>
728 
729 #ifdef CONFIG_SPL_OS_BOOT
730 int spl_start_uboot(void)
731 {
732 	gpio_direction_input(KEY_VOL_UP);
733 
734 	/* Only enter in Falcon mode if KEY_VOL_UP is pressed */
735 	return gpio_get_value(KEY_VOL_UP);
736 }
737 #endif
738 
739 static void ccgr_init(void)
740 {
741 	struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
742 
743 	writel(0x00C03F3F, &ccm->CCGR0);
744 	writel(0x0030FC03, &ccm->CCGR1);
745 	writel(0x0FFFC000, &ccm->CCGR2);
746 	writel(0x3FF00000, &ccm->CCGR3);
747 	writel(0x00FFF300, &ccm->CCGR4);
748 	writel(0x0F0000C3, &ccm->CCGR5);
749 	writel(0x000003FF, &ccm->CCGR6);
750 }
751 
752 static int mx6q_dcd_table[] = {
753 	0x020e0798, 0x000C0000,
754 	0x020e0758, 0x00000000,
755 	0x020e0588, 0x00000030,
756 	0x020e0594, 0x00000030,
757 	0x020e056c, 0x00000030,
758 	0x020e0578, 0x00000030,
759 	0x020e074c, 0x00000030,
760 	0x020e057c, 0x00000030,
761 	0x020e058c, 0x00000000,
762 	0x020e059c, 0x00000030,
763 	0x020e05a0, 0x00000030,
764 	0x020e078c, 0x00000030,
765 	0x020e0750, 0x00020000,
766 	0x020e05a8, 0x00000030,
767 	0x020e05b0, 0x00000030,
768 	0x020e0524, 0x00000030,
769 	0x020e051c, 0x00000030,
770 	0x020e0518, 0x00000030,
771 	0x020e050c, 0x00000030,
772 	0x020e05b8, 0x00000030,
773 	0x020e05c0, 0x00000030,
774 	0x020e0774, 0x00020000,
775 	0x020e0784, 0x00000030,
776 	0x020e0788, 0x00000030,
777 	0x020e0794, 0x00000030,
778 	0x020e079c, 0x00000030,
779 	0x020e07a0, 0x00000030,
780 	0x020e07a4, 0x00000030,
781 	0x020e07a8, 0x00000030,
782 	0x020e0748, 0x00000030,
783 	0x020e05ac, 0x00000030,
784 	0x020e05b4, 0x00000030,
785 	0x020e0528, 0x00000030,
786 	0x020e0520, 0x00000030,
787 	0x020e0514, 0x00000030,
788 	0x020e0510, 0x00000030,
789 	0x020e05bc, 0x00000030,
790 	0x020e05c4, 0x00000030,
791 	0x021b0800, 0xa1390003,
792 	0x021b080c, 0x001F001F,
793 	0x021b0810, 0x001F001F,
794 	0x021b480c, 0x001F001F,
795 	0x021b4810, 0x001F001F,
796 	0x021b083c, 0x43270338,
797 	0x021b0840, 0x03200314,
798 	0x021b483c, 0x431A032F,
799 	0x021b4840, 0x03200263,
800 	0x021b0848, 0x4B434748,
801 	0x021b4848, 0x4445404C,
802 	0x021b0850, 0x38444542,
803 	0x021b4850, 0x4935493A,
804 	0x021b081c, 0x33333333,
805 	0x021b0820, 0x33333333,
806 	0x021b0824, 0x33333333,
807 	0x021b0828, 0x33333333,
808 	0x021b481c, 0x33333333,
809 	0x021b4820, 0x33333333,
810 	0x021b4824, 0x33333333,
811 	0x021b4828, 0x33333333,
812 	0x021b08b8, 0x00000800,
813 	0x021b48b8, 0x00000800,
814 	0x021b0004, 0x00020036,
815 	0x021b0008, 0x09444040,
816 	0x021b000c, 0x555A7975,
817 	0x021b0010, 0xFF538F64,
818 	0x021b0014, 0x01FF00DB,
819 	0x021b0018, 0x00001740,
820 	0x021b001c, 0x00008000,
821 	0x021b002c, 0x000026d2,
822 	0x021b0030, 0x005A1023,
823 	0x021b0040, 0x00000027,
824 	0x021b0000, 0x831A0000,
825 	0x021b001c, 0x04088032,
826 	0x021b001c, 0x00008033,
827 	0x021b001c, 0x00048031,
828 	0x021b001c, 0x09408030,
829 	0x021b001c, 0x04008040,
830 	0x021b0020, 0x00005800,
831 	0x021b0818, 0x00011117,
832 	0x021b4818, 0x00011117,
833 	0x021b0004, 0x00025576,
834 	0x021b0404, 0x00011006,
835 	0x021b001c, 0x00000000,
836 };
837 
838 static int mx6qp_dcd_table[] = {
839 	0x020e0798, 0x000c0000,
840 	0x020e0758, 0x00000000,
841 	0x020e0588, 0x00000030,
842 	0x020e0594, 0x00000030,
843 	0x020e056c, 0x00000030,
844 	0x020e0578, 0x00000030,
845 	0x020e074c, 0x00000030,
846 	0x020e057c, 0x00000030,
847 	0x020e058c, 0x00000000,
848 	0x020e059c, 0x00000030,
849 	0x020e05a0, 0x00000030,
850 	0x020e078c, 0x00000030,
851 	0x020e0750, 0x00020000,
852 	0x020e05a8, 0x00000030,
853 	0x020e05b0, 0x00000030,
854 	0x020e0524, 0x00000030,
855 	0x020e051c, 0x00000030,
856 	0x020e0518, 0x00000030,
857 	0x020e050c, 0x00000030,
858 	0x020e05b8, 0x00000030,
859 	0x020e05c0, 0x00000030,
860 	0x020e0774, 0x00020000,
861 	0x020e0784, 0x00000030,
862 	0x020e0788, 0x00000030,
863 	0x020e0794, 0x00000030,
864 	0x020e079c, 0x00000030,
865 	0x020e07a0, 0x00000030,
866 	0x020e07a4, 0x00000030,
867 	0x020e07a8, 0x00000030,
868 	0x020e0748, 0x00000030,
869 	0x020e05ac, 0x00000030,
870 	0x020e05b4, 0x00000030,
871 	0x020e0528, 0x00000030,
872 	0x020e0520, 0x00000030,
873 	0x020e0514, 0x00000030,
874 	0x020e0510, 0x00000030,
875 	0x020e05bc, 0x00000030,
876 	0x020e05c4, 0x00000030,
877 	0x021b0800, 0xa1390003,
878 	0x021b080c, 0x001b001e,
879 	0x021b0810, 0x002e0029,
880 	0x021b480c, 0x001b002a,
881 	0x021b4810, 0x0019002c,
882 	0x021b083c, 0x43240334,
883 	0x021b0840, 0x0324031a,
884 	0x021b483c, 0x43340344,
885 	0x021b4840, 0x03280276,
886 	0x021b0848, 0x44383A3E,
887 	0x021b4848, 0x3C3C3846,
888 	0x021b0850, 0x2e303230,
889 	0x021b4850, 0x38283E34,
890 	0x021b081c, 0x33333333,
891 	0x021b0820, 0x33333333,
892 	0x021b0824, 0x33333333,
893 	0x021b0828, 0x33333333,
894 	0x021b481c, 0x33333333,
895 	0x021b4820, 0x33333333,
896 	0x021b4824, 0x33333333,
897 	0x021b4828, 0x33333333,
898 	0x021b08c0, 0x24912249,
899 	0x021b48c0, 0x24914289,
900 	0x021b08b8, 0x00000800,
901 	0x021b48b8, 0x00000800,
902 	0x021b0004, 0x00020036,
903 	0x021b0008, 0x24444040,
904 	0x021b000c, 0x555A7955,
905 	0x021b0010, 0xFF320F64,
906 	0x021b0014, 0x01ff00db,
907 	0x021b0018, 0x00001740,
908 	0x021b001c, 0x00008000,
909 	0x021b002c, 0x000026d2,
910 	0x021b0030, 0x005A1023,
911 	0x021b0040, 0x00000027,
912 	0x021b0400, 0x14420000,
913 	0x021b0000, 0x831A0000,
914 	0x021b0890, 0x00400C58,
915 	0x00bb0008, 0x00000000,
916 	0x00bb000c, 0x2891E41A,
917 	0x00bb0038, 0x00000564,
918 	0x00bb0014, 0x00000040,
919 	0x00bb0028, 0x00000020,
920 	0x00bb002c, 0x00000020,
921 	0x021b001c, 0x04088032,
922 	0x021b001c, 0x00008033,
923 	0x021b001c, 0x00048031,
924 	0x021b001c, 0x09408030,
925 	0x021b001c, 0x04008040,
926 	0x021b0020, 0x00005800,
927 	0x021b0818, 0x00011117,
928 	0x021b4818, 0x00011117,
929 	0x021b0004, 0x00025576,
930 	0x021b0404, 0x00011006,
931 	0x021b001c, 0x00000000,
932 };
933 
934 static int mx6dl_dcd_table[] = {
935 	0x020e0774, 0x000C0000,
936 	0x020e0754, 0x00000000,
937 	0x020e04ac, 0x00000030,
938 	0x020e04b0, 0x00000030,
939 	0x020e0464, 0x00000030,
940 	0x020e0490, 0x00000030,
941 	0x020e074c, 0x00000030,
942 	0x020e0494, 0x00000030,
943 	0x020e04a0, 0x00000000,
944 	0x020e04b4, 0x00000030,
945 	0x020e04b8, 0x00000030,
946 	0x020e076c, 0x00000030,
947 	0x020e0750, 0x00020000,
948 	0x020e04bc, 0x00000030,
949 	0x020e04c0, 0x00000030,
950 	0x020e04c4, 0x00000030,
951 	0x020e04c8, 0x00000030,
952 	0x020e04cc, 0x00000030,
953 	0x020e04d0, 0x00000030,
954 	0x020e04d4, 0x00000030,
955 	0x020e04d8, 0x00000030,
956 	0x020e0760, 0x00020000,
957 	0x020e0764, 0x00000030,
958 	0x020e0770, 0x00000030,
959 	0x020e0778, 0x00000030,
960 	0x020e077c, 0x00000030,
961 	0x020e0780, 0x00000030,
962 	0x020e0784, 0x00000030,
963 	0x020e078c, 0x00000030,
964 	0x020e0748, 0x00000030,
965 	0x020e0470, 0x00000030,
966 	0x020e0474, 0x00000030,
967 	0x020e0478, 0x00000030,
968 	0x020e047c, 0x00000030,
969 	0x020e0480, 0x00000030,
970 	0x020e0484, 0x00000030,
971 	0x020e0488, 0x00000030,
972 	0x020e048c, 0x00000030,
973 	0x021b0800, 0xa1390003,
974 	0x021b080c, 0x001F001F,
975 	0x021b0810, 0x001F001F,
976 	0x021b480c, 0x001F001F,
977 	0x021b4810, 0x001F001F,
978 	0x021b083c, 0x4220021F,
979 	0x021b0840, 0x0207017E,
980 	0x021b483c, 0x4201020C,
981 	0x021b4840, 0x01660172,
982 	0x021b0848, 0x4A4D4E4D,
983 	0x021b4848, 0x4A4F5049,
984 	0x021b0850, 0x3F3C3D31,
985 	0x021b4850, 0x3238372B,
986 	0x021b081c, 0x33333333,
987 	0x021b0820, 0x33333333,
988 	0x021b0824, 0x33333333,
989 	0x021b0828, 0x33333333,
990 	0x021b481c, 0x33333333,
991 	0x021b4820, 0x33333333,
992 	0x021b4824, 0x33333333,
993 	0x021b4828, 0x33333333,
994 	0x021b08b8, 0x00000800,
995 	0x021b48b8, 0x00000800,
996 	0x021b0004, 0x0002002D,
997 	0x021b0008, 0x00333030,
998 	0x021b000c, 0x3F435313,
999 	0x021b0010, 0xB66E8B63,
1000 	0x021b0014, 0x01FF00DB,
1001 	0x021b0018, 0x00001740,
1002 	0x021b001c, 0x00008000,
1003 	0x021b002c, 0x000026d2,
1004 	0x021b0030, 0x00431023,
1005 	0x021b0040, 0x00000027,
1006 	0x021b0000, 0x831A0000,
1007 	0x021b001c, 0x04008032,
1008 	0x021b001c, 0x00008033,
1009 	0x021b001c, 0x00048031,
1010 	0x021b001c, 0x05208030,
1011 	0x021b001c, 0x04008040,
1012 	0x021b0020, 0x00005800,
1013 	0x021b0818, 0x00011117,
1014 	0x021b4818, 0x00011117,
1015 	0x021b0004, 0x0002556D,
1016 	0x021b0404, 0x00011006,
1017 	0x021b001c, 0x00000000,
1018 };
1019 
1020 static void ddr_init(int *table, int size)
1021 {
1022 	int i;
1023 
1024 	for (i = 0; i < size / 2 ; i++)
1025 		writel(table[2 * i + 1], table[2 * i]);
1026 }
1027 
1028 static void spl_dram_init(void)
1029 {
1030 	if (is_mx6dq())
1031 		ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
1032 	else if (is_mx6dqp())
1033 		ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
1034 	else if (is_mx6sdl())
1035 		ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
1036 }
1037 
1038 void board_init_f(ulong dummy)
1039 {
1040 	/* DDR initialization */
1041 	spl_dram_init();
1042 
1043 	/* setup AIPS and disable watchdog */
1044 	arch_cpu_init();
1045 
1046 	ccgr_init();
1047 	gpr_init();
1048 
1049 	/* iomux and setup of i2c */
1050 	board_early_init_f();
1051 
1052 	/* setup GP timer */
1053 	timer_init();
1054 
1055 	/* UART clocks enabled and gd valid - init serial console */
1056 	preloader_console_init();
1057 
1058 	/* Clear the BSS. */
1059 	memset(__bss_start, 0, __bss_end - __bss_start);
1060 
1061 	/* load/boot image from boot device */
1062 	board_init_r(NULL, 0);
1063 }
1064 #endif
1065 
1066 #ifdef CONFIG_SPL_LOAD_FIT
1067 int board_fit_config_name_match(const char *name)
1068 {
1069 	if (is_mx6dq()) {
1070 		if (!strcmp(name, "imx6q-sabresd"))
1071 			return 0;
1072 	} else if (is_mx6dqp()) {
1073 		if (!strcmp(name, "imx6qp-sabresd"))
1074 			return 0;
1075 	} else if (is_mx6dl()) {
1076 		if (!strcmp(name, "imx6dl-sabresd"))
1077 			return 0;
1078 	}
1079 
1080 	return -1;
1081 }
1082 #endif
1083