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 <common.h>
9 #include <asm/io.h>
10 #include <asm/arch/clock.h>
11 #include <asm/arch/imx-regs.h>
12 #include <asm/arch/iomux.h>
13 #include <asm/arch/mx6-pins.h>
14 #include <linux/errno.h>
15 #include <asm/gpio.h>
16 #include <asm/mach-imx/iomux-v3.h>
17 #include <asm/mach-imx/mxc_i2c.h>
18 #include <asm/mach-imx/boot_mode.h>
19 #include <asm/mach-imx/spi.h>
20 #include <mmc.h>
21 #include <fsl_esdhc.h>
22 #include <miiphy.h>
23 #include <netdev.h>
24 #include <asm/arch/sys_proto.h>
25 #include <i2c.h>
26 #include <input.h>
27 #include <asm/arch/mxc_hdmi.h>
28 #include <asm/mach-imx/video.h>
29 #include <asm/arch/crm_regs.h>
30 #include <pca953x.h>
31 #include <power/pmic.h>
32 #include <power/pfuze100_pmic.h>
33 #include "../common/pfuze.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 I2C_PAD_CTRL	(PAD_CTL_PUS_100K_UP |			\
49 	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |	\
50 	PAD_CTL_ODE | PAD_CTL_SRE_FAST)
51 
52 #define GPMI_PAD_CTRL0 (PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_PUS_100K_UP)
53 #define GPMI_PAD_CTRL1 (PAD_CTL_DSE_40ohm | PAD_CTL_SPEED_MED | \
54 			PAD_CTL_SRE_FAST)
55 #define GPMI_PAD_CTRL2 (GPMI_PAD_CTRL0 | GPMI_PAD_CTRL1)
56 
57 #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
58 
59 #define WEIM_NOR_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |          \
60 	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |               \
61 	PAD_CTL_DSE_40ohm   | PAD_CTL_SRE_FAST)
62 
63 #define I2C_PMIC	1
64 
65 int dram_init(void)
66 {
67 	gd->ram_size = imx_ddr_size();
68 
69 	return 0;
70 }
71 
72 static iomux_v3_cfg_t const uart4_pads[] = {
73 	IOMUX_PADS(PAD_KEY_COL0__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
74 	IOMUX_PADS(PAD_KEY_ROW0__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
75 };
76 
77 static iomux_v3_cfg_t const enet_pads[] = {
78 	IOMUX_PADS(PAD_KEY_COL1__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
79 	IOMUX_PADS(PAD_KEY_COL2__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
80 	IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
81 	IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
82 	IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
83 	IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
84 	IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
85 	IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
86 	IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
87 	IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
88 	IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
89 	IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
90 	IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
91 	IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
92 	IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
93 };
94 
95 /* I2C2 PMIC, iPod, Tuner, Codec, Touch, HDMI EDID, MIPI CSI2 card */
96 static struct i2c_pads_info mx6q_i2c_pad_info1 = {
97 	.scl = {
98 		.i2c_mode = MX6Q_PAD_EIM_EB2__I2C2_SCL | PC,
99 		.gpio_mode = MX6Q_PAD_EIM_EB2__GPIO2_IO30 | PC,
100 		.gp = IMX_GPIO_NR(2, 30)
101 	},
102 	.sda = {
103 		.i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
104 		.gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
105 		.gp = IMX_GPIO_NR(4, 13)
106 	}
107 };
108 
109 static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
110 	.scl = {
111 		.i2c_mode = MX6DL_PAD_EIM_EB2__I2C2_SCL | PC,
112 		.gpio_mode = MX6DL_PAD_EIM_EB2__GPIO2_IO30 | PC,
113 		.gp = IMX_GPIO_NR(2, 30)
114 	},
115 	.sda = {
116 		.i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
117 		.gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
118 		.gp = IMX_GPIO_NR(4, 13)
119 	}
120 };
121 
122 #ifndef CONFIG_SYS_FLASH_CFI
123 /*
124  * I2C3 MLB, Port Expanders (A, B, C), Video ADC, Light Sensor,
125  * Compass Sensor, Accelerometer, Res Touch
126  */
127 static struct i2c_pads_info mx6q_i2c_pad_info2 = {
128 	.scl = {
129 		.i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
130 		.gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
131 		.gp = IMX_GPIO_NR(1, 3)
132 	},
133 	.sda = {
134 		.i2c_mode = MX6Q_PAD_EIM_D18__I2C3_SDA | PC,
135 		.gpio_mode = MX6Q_PAD_EIM_D18__GPIO3_IO18 | PC,
136 		.gp = IMX_GPIO_NR(3, 18)
137 	}
138 };
139 
140 static struct i2c_pads_info mx6dl_i2c_pad_info2 = {
141 	.scl = {
142 		.i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
143 		.gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
144 		.gp = IMX_GPIO_NR(1, 3)
145 	},
146 	.sda = {
147 		.i2c_mode = MX6DL_PAD_EIM_D18__I2C3_SDA | PC,
148 		.gpio_mode = MX6DL_PAD_EIM_D18__GPIO3_IO18 | PC,
149 		.gp = IMX_GPIO_NR(3, 18)
150 	}
151 };
152 #endif
153 
154 static iomux_v3_cfg_t const i2c3_pads[] = {
155 	IOMUX_PADS(PAD_EIM_A24__GPIO5_IO04	| MUX_PAD_CTRL(NO_PAD_CTRL)),
156 };
157 
158 static iomux_v3_cfg_t const port_exp[] = {
159 	IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15	| MUX_PAD_CTRL(NO_PAD_CTRL)),
160 };
161 
162 #ifdef CONFIG_MTD_NOR_FLASH
163 static iomux_v3_cfg_t const eimnor_pads[] = {
164 	IOMUX_PADS(PAD_EIM_D16__EIM_DATA16	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
165 	IOMUX_PADS(PAD_EIM_D17__EIM_DATA17	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
166 	IOMUX_PADS(PAD_EIM_D18__EIM_DATA18	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
167 	IOMUX_PADS(PAD_EIM_D19__EIM_DATA19	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
168 	IOMUX_PADS(PAD_EIM_D20__EIM_DATA20	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
169 	IOMUX_PADS(PAD_EIM_D21__EIM_DATA21	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
170 	IOMUX_PADS(PAD_EIM_D22__EIM_DATA22	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
171 	IOMUX_PADS(PAD_EIM_D23__EIM_DATA23	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
172 	IOMUX_PADS(PAD_EIM_D24__EIM_DATA24	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
173 	IOMUX_PADS(PAD_EIM_D25__EIM_DATA25	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
174 	IOMUX_PADS(PAD_EIM_D26__EIM_DATA26	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
175 	IOMUX_PADS(PAD_EIM_D27__EIM_DATA27	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
176 	IOMUX_PADS(PAD_EIM_D28__EIM_DATA28	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
177 	IOMUX_PADS(PAD_EIM_D29__EIM_DATA29	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
178 	IOMUX_PADS(PAD_EIM_D30__EIM_DATA30	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
179 	IOMUX_PADS(PAD_EIM_D31__EIM_DATA31	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
180 	IOMUX_PADS(PAD_EIM_DA0__EIM_AD00	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
181 	IOMUX_PADS(PAD_EIM_DA1__EIM_AD01	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
182 	IOMUX_PADS(PAD_EIM_DA2__EIM_AD02	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
183 	IOMUX_PADS(PAD_EIM_DA3__EIM_AD03	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
184 	IOMUX_PADS(PAD_EIM_DA4__EIM_AD04	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
185 	IOMUX_PADS(PAD_EIM_DA5__EIM_AD05	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
186 	IOMUX_PADS(PAD_EIM_DA6__EIM_AD06	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
187 	IOMUX_PADS(PAD_EIM_DA7__EIM_AD07	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
188 	IOMUX_PADS(PAD_EIM_DA8__EIM_AD08	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
189 	IOMUX_PADS(PAD_EIM_DA9__EIM_AD09	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
190 	IOMUX_PADS(PAD_EIM_DA10__EIM_AD10	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
191 	IOMUX_PADS(PAD_EIM_DA11__EIM_AD11	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
192 	IOMUX_PADS(PAD_EIM_DA12__EIM_AD12	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
193 	IOMUX_PADS(PAD_EIM_DA13__EIM_AD13	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
194 	IOMUX_PADS(PAD_EIM_DA14__EIM_AD14	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
195 	IOMUX_PADS(PAD_EIM_DA15__EIM_AD15	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
196 	IOMUX_PADS(PAD_EIM_A16__EIM_ADDR16	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
197 	IOMUX_PADS(PAD_EIM_A17__EIM_ADDR17	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
198 	IOMUX_PADS(PAD_EIM_A18__EIM_ADDR18	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
199 	IOMUX_PADS(PAD_EIM_A19__EIM_ADDR19	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
200 	IOMUX_PADS(PAD_EIM_A20__EIM_ADDR20	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
201 	IOMUX_PADS(PAD_EIM_A21__EIM_ADDR21	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
202 	IOMUX_PADS(PAD_EIM_A22__EIM_ADDR22	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
203 	IOMUX_PADS(PAD_EIM_A23__EIM_ADDR23	| MUX_PAD_CTRL(WEIM_NOR_PAD_CTRL)),
204 	IOMUX_PADS(PAD_EIM_OE__EIM_OE_B		| MUX_PAD_CTRL(NO_PAD_CTRL)),
205 	IOMUX_PADS(PAD_EIM_RW__EIM_RW		| MUX_PAD_CTRL(NO_PAD_CTRL)),
206 	IOMUX_PADS(PAD_EIM_CS0__EIM_CS0_B	| MUX_PAD_CTRL(NO_PAD_CTRL)),
207 };
208 
209 static void eimnor_cs_setup(void)
210 {
211 	struct weim *weim_regs = (struct weim *)WEIM_BASE_ADDR;
212 
213 	writel(0x00020181, &weim_regs->cs0gcr1);
214 	writel(0x00000001, &weim_regs->cs0gcr2);
215 	writel(0x0a020000, &weim_regs->cs0rcr1);
216 	writel(0x0000c000, &weim_regs->cs0rcr2);
217 	writel(0x0804a240, &weim_regs->cs0wcr1);
218 	writel(0x00000120, &weim_regs->wcr);
219 
220 	set_chipselect_size(CS0_128);
221 }
222 
223 static void eim_clk_setup(void)
224 {
225 	struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
226 	int cscmr1, ccgr6;
227 
228 
229 	/* Turn off EIM clock */
230 	ccgr6 = readl(&imx_ccm->CCGR6);
231 	ccgr6 &= ~(0x3 << 10);
232 	writel(ccgr6, &imx_ccm->CCGR6);
233 
234 	/*
235 	 * Configure clk_eim_slow_sel = 00 --> derive clock from AXI clk root
236 	 * and aclk_eim_slow_podf = 01 --> divide by 2
237 	 * so that we can have EIM at the maximum clock of 132MHz
238 	 */
239 	cscmr1 = readl(&imx_ccm->cscmr1);
240 	cscmr1 &= ~(MXC_CCM_CSCMR1_ACLK_EMI_SLOW_MASK |
241 		    MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK);
242 	cscmr1 |= (1 << MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET);
243 	writel(cscmr1, &imx_ccm->cscmr1);
244 
245 	/* Turn on EIM clock */
246 	ccgr6 |= (0x3 << 10);
247 	writel(ccgr6, &imx_ccm->CCGR6);
248 }
249 
250 static void setup_iomux_eimnor(void)
251 {
252 	SETUP_IOMUX_PADS(eimnor_pads);
253 
254 	gpio_direction_output(IMX_GPIO_NR(5, 4), 0);
255 
256 	eimnor_cs_setup();
257 }
258 #endif
259 
260 static void setup_iomux_enet(void)
261 {
262 	SETUP_IOMUX_PADS(enet_pads);
263 }
264 
265 static iomux_v3_cfg_t const usdhc3_pads[] = {
266 	IOMUX_PADS(PAD_SD3_CLK__SD3_CLK		| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
267 	IOMUX_PADS(PAD_SD3_CMD__SD3_CMD		| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
268 	IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
269 	IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
270 	IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
271 	IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
272 	IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
273 	IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
274 	IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
275 	IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
276 	IOMUX_PADS(PAD_GPIO_18__SD3_VSELECT	| MUX_PAD_CTRL(USDHC_PAD_CTRL)),
277 	IOMUX_PADS(PAD_NANDF_CS2__GPIO6_IO15	| MUX_PAD_CTRL(NO_PAD_CTRL)),
278 };
279 
280 static void setup_iomux_uart(void)
281 {
282 	SETUP_IOMUX_PADS(uart4_pads);
283 }
284 
285 #ifdef CONFIG_FSL_ESDHC
286 static struct fsl_esdhc_cfg usdhc_cfg[1] = {
287 	{USDHC3_BASE_ADDR},
288 };
289 
290 int board_mmc_getcd(struct mmc *mmc)
291 {
292 	gpio_direction_input(IMX_GPIO_NR(6, 15));
293 	return !gpio_get_value(IMX_GPIO_NR(6, 15));
294 }
295 
296 int board_mmc_init(bd_t *bis)
297 {
298 	SETUP_IOMUX_PADS(usdhc3_pads);
299 
300 	usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
301 	return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
302 }
303 #endif
304 
305 #ifdef CONFIG_NAND_MXS
306 static iomux_v3_cfg_t gpmi_pads[] = {
307 	IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
308 	IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
309 	IOMUX_PADS(PAD_NANDF_WP_B__NAND_WP_B	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
310 	IOMUX_PADS(PAD_NANDF_RB0__NAND_READY_B	| MUX_PAD_CTRL(GPMI_PAD_CTRL0)),
311 	IOMUX_PADS(PAD_NANDF_CS0__NAND_CE0_B	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
312 	IOMUX_PADS(PAD_SD4_CMD__NAND_RE_B	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
313 	IOMUX_PADS(PAD_SD4_CLK__NAND_WE_B	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
314 	IOMUX_PADS(PAD_NANDF_D0__NAND_DATA00	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
315 	IOMUX_PADS(PAD_NANDF_D1__NAND_DATA01	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
316 	IOMUX_PADS(PAD_NANDF_D2__NAND_DATA02	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
317 	IOMUX_PADS(PAD_NANDF_D3__NAND_DATA03	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
318 	IOMUX_PADS(PAD_NANDF_D4__NAND_DATA04	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
319 	IOMUX_PADS(PAD_NANDF_D5__NAND_DATA05	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
320 	IOMUX_PADS(PAD_NANDF_D6__NAND_DATA06	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
321 	IOMUX_PADS(PAD_NANDF_D7__NAND_DATA07	| MUX_PAD_CTRL(GPMI_PAD_CTRL2)),
322 	IOMUX_PADS(PAD_SD4_DAT0__NAND_DQS	| MUX_PAD_CTRL(GPMI_PAD_CTRL1)),
323 };
324 
325 static void setup_gpmi_nand(void)
326 {
327 	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
328 
329 	/* config gpmi nand iomux */
330 	SETUP_IOMUX_PADS(gpmi_pads);
331 
332 	setup_gpmi_io_clk((MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
333 			MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
334 			MXC_CCM_CS2CDR_ENFC_CLK_SEL(3)));
335 
336 	/* enable apbh clock gating */
337 	setbits_le32(&mxc_ccm->CCGR0, MXC_CCM_CCGR0_APBHDMA_MASK);
338 }
339 #endif
340 
341 static void setup_fec(void)
342 {
343 	if (is_mx6dqp()) {
344 		/*
345 		 * select ENET MAC0 TX clock from PLL
346 		 */
347 		imx_iomux_set_gpr_register(5, 9, 1, 1);
348 		enable_fec_anatop_clock(0, ENET_125MHZ);
349 	}
350 
351 	setup_iomux_enet();
352 }
353 
354 int board_eth_init(bd_t *bis)
355 {
356 	setup_fec();
357 
358 	return cpu_eth_init(bis);
359 }
360 
361 u32 get_board_rev(void)
362 {
363 	int rev = nxp_board_rev();
364 
365 	return (get_cpu_rev() & ~(0xF << 8)) | rev;
366 }
367 
368 static int ar8031_phy_fixup(struct phy_device *phydev)
369 {
370 	unsigned short val;
371 
372 	/* To enable AR8031 ouput a 125MHz clk from CLK_25M */
373 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
374 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
375 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
376 
377 	val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
378 	val &= 0xffe3;
379 	val |= 0x18;
380 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
381 
382 	/* introduce tx clock delay */
383 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
384 	val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
385 	val |= 0x0100;
386 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
387 
388 	return 0;
389 }
390 
391 int board_phy_config(struct phy_device *phydev)
392 {
393 	ar8031_phy_fixup(phydev);
394 
395 	if (phydev->drv->config)
396 		phydev->drv->config(phydev);
397 
398 	return 0;
399 }
400 
401 #if defined(CONFIG_VIDEO_IPUV3)
402 static void disable_lvds(struct display_info_t const *dev)
403 {
404 	struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
405 
406 	clrbits_le32(&iomux->gpr[2],
407 		     IOMUXC_GPR2_LVDS_CH0_MODE_MASK |
408 		     IOMUXC_GPR2_LVDS_CH1_MODE_MASK);
409 }
410 
411 static void do_enable_hdmi(struct display_info_t const *dev)
412 {
413 	disable_lvds(dev);
414 	imx_enable_hdmi_phy();
415 }
416 
417 struct display_info_t const displays[] = {{
418 	.bus	= -1,
419 	.addr	= 0,
420 	.pixfmt	= IPU_PIX_FMT_RGB666,
421 	.detect	= NULL,
422 	.enable	= NULL,
423 	.mode	= {
424 		.name           = "Hannstar-XGA",
425 		.refresh        = 60,
426 		.xres           = 1024,
427 		.yres           = 768,
428 		.pixclock       = 15385,
429 		.left_margin    = 220,
430 		.right_margin   = 40,
431 		.upper_margin   = 21,
432 		.lower_margin   = 7,
433 		.hsync_len      = 60,
434 		.vsync_len      = 10,
435 		.sync           = FB_SYNC_EXT,
436 		.vmode          = FB_VMODE_NONINTERLACED
437 } }, {
438 	.bus	= -1,
439 	.addr	= 0,
440 	.pixfmt	= IPU_PIX_FMT_RGB24,
441 	.detect	= detect_hdmi,
442 	.enable	= do_enable_hdmi,
443 	.mode	= {
444 		.name           = "HDMI",
445 		.refresh        = 60,
446 		.xres           = 1024,
447 		.yres           = 768,
448 		.pixclock       = 15385,
449 		.left_margin    = 220,
450 		.right_margin   = 40,
451 		.upper_margin   = 21,
452 		.lower_margin   = 7,
453 		.hsync_len      = 60,
454 		.vsync_len      = 10,
455 		.sync           = FB_SYNC_EXT,
456 		.vmode          = FB_VMODE_NONINTERLACED,
457 } } };
458 size_t display_count = ARRAY_SIZE(displays);
459 
460 iomux_v3_cfg_t const backlight_pads[] = {
461 	IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
462 };
463 
464 static void setup_iomux_backlight(void)
465 {
466 	gpio_request(IMX_GPIO_NR(2, 9), "backlight");
467 	gpio_direction_output(IMX_GPIO_NR(2, 9), 1);
468 	SETUP_IOMUX_PADS(backlight_pads);
469 }
470 
471 static void setup_display(void)
472 {
473 	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
474 	struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
475 	int reg;
476 
477 	setup_iomux_backlight();
478 	enable_ipu_clock();
479 	imx_setup_hdmi();
480 
481 	/* Turn on LDB_DI0 and LDB_DI1 clocks */
482 	reg = readl(&mxc_ccm->CCGR3);
483 	reg |= MXC_CCM_CCGR3_LDB_DI0_MASK | MXC_CCM_CCGR3_LDB_DI1_MASK;
484 	writel(reg, &mxc_ccm->CCGR3);
485 
486 	/* Set LDB_DI0 and LDB_DI1 clk select to 3b'011 */
487 	reg = readl(&mxc_ccm->cs2cdr);
488 	reg &= ~(MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_MASK |
489 		 MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_MASK);
490 	reg |= (3 << MXC_CCM_CS2CDR_LDB_DI0_CLK_SEL_OFFSET) |
491 	       (3 << MXC_CCM_CS2CDR_LDB_DI1_CLK_SEL_OFFSET);
492 	writel(reg, &mxc_ccm->cs2cdr);
493 
494 	reg = readl(&mxc_ccm->cscmr2);
495 	reg |= MXC_CCM_CSCMR2_LDB_DI0_IPU_DIV | MXC_CCM_CSCMR2_LDB_DI1_IPU_DIV;
496 	writel(reg, &mxc_ccm->cscmr2);
497 
498 	reg = readl(&mxc_ccm->chsccdr);
499 	reg |= (CHSCCDR_CLK_SEL_LDB_DI0
500 		<< MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET);
501 	reg |= (CHSCCDR_CLK_SEL_LDB_DI0 <<
502 		MXC_CCM_CHSCCDR_IPU1_DI1_CLK_SEL_OFFSET);
503 	writel(reg, &mxc_ccm->chsccdr);
504 
505 	reg = IOMUXC_GPR2_DI1_VS_POLARITY_ACTIVE_LOW |
506 	      IOMUXC_GPR2_DI0_VS_POLARITY_ACTIVE_LOW |
507 	      IOMUXC_GPR2_BIT_MAPPING_CH1_SPWG |
508 	      IOMUXC_GPR2_DATA_WIDTH_CH1_18BIT |
509 	      IOMUXC_GPR2_BIT_MAPPING_CH0_SPWG |
510 	      IOMUXC_GPR2_DATA_WIDTH_CH0_18BIT |
511 	      IOMUXC_GPR2_LVDS_CH0_MODE_ENABLED_DI0 |
512 	      IOMUXC_GPR2_LVDS_CH1_MODE_DISABLED;
513 	writel(reg, &iomux->gpr[2]);
514 
515 	reg = readl(&iomux->gpr[3]);
516 	reg &= ~(IOMUXC_GPR3_LVDS0_MUX_CTL_MASK |
517 		 IOMUXC_GPR3_HDMI_MUX_CTL_MASK);
518 	reg |= (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
519 		IOMUXC_GPR3_LVDS0_MUX_CTL_OFFSET) |
520 	       (IOMUXC_GPR3_MUX_SRC_IPU1_DI0 <<
521 		IOMUXC_GPR3_HDMI_MUX_CTL_OFFSET);
522 	writel(reg, &iomux->gpr[3]);
523 }
524 #endif /* CONFIG_VIDEO_IPUV3 */
525 
526 /*
527  * Do not overwrite the console
528  * Use always serial for U-Boot console
529  */
530 int overwrite_console(void)
531 {
532 	return 1;
533 }
534 
535 int board_early_init_f(void)
536 {
537 	setup_iomux_uart();
538 
539 #ifdef CONFIG_NAND_MXS
540 	setup_gpmi_nand();
541 #endif
542 
543 #ifdef CONFIG_MTD_NOR_FLASH
544 	eim_clk_setup();
545 #endif
546 	return 0;
547 }
548 
549 int board_init(void)
550 {
551 	/* address of boot parameters */
552 	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
553 
554 	/* I2C 2 and 3 setup - I2C 3 hw mux with EIM */
555 	if (is_mx6dq() || is_mx6dqp())
556 		setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info1);
557 	else
558 		setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info1);
559 	/* I2C 3 Steer */
560 	gpio_request(IMX_GPIO_NR(5, 4), "steer logic");
561 	gpio_direction_output(IMX_GPIO_NR(5, 4), 1);
562 	SETUP_IOMUX_PADS(i2c3_pads);
563 #ifndef CONFIG_SYS_FLASH_CFI
564 	if (is_mx6dq() || is_mx6dqp())
565 		setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6q_i2c_pad_info2);
566 	else
567 		setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &mx6dl_i2c_pad_info2);
568 #endif
569 	gpio_request(IMX_GPIO_NR(1, 15), "expander en");
570 	gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
571 	SETUP_IOMUX_PADS(port_exp);
572 
573 #ifdef CONFIG_VIDEO_IPUV3
574 	setup_display();
575 #endif
576 
577 #ifdef CONFIG_MTD_NOR_FLASH
578 	setup_iomux_eimnor();
579 #endif
580 	return 0;
581 }
582 
583 #ifdef CONFIG_MXC_SPI
584 int board_spi_cs_gpio(unsigned bus, unsigned cs)
585 {
586 	return (bus == 0 && cs == 0) ? (IMX_GPIO_NR(4, 9)) : -1;
587 }
588 #endif
589 
590 int power_init_board(void)
591 {
592 	struct pmic *p;
593 	unsigned int value;
594 
595 	p = pfuze_common_init(I2C_PMIC);
596 	if (!p)
597 		return -ENODEV;
598 
599 	if (is_mx6dqp()) {
600 		/* set SW2 staby volatage 0.975V*/
601 		pmic_reg_read(p, PFUZE100_SW2STBY, &value);
602 		value &= ~0x3f;
603 		value |= 0x17;
604 		pmic_reg_write(p, PFUZE100_SW2STBY, value);
605 	}
606 
607 	return pfuze_mode_init(p, APS_PFM);
608 }
609 
610 #ifdef CONFIG_CMD_BMODE
611 static const struct boot_mode board_boot_modes[] = {
612 	/* 4 bit bus width */
613 	{"mmc0", MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
614 	{NULL,   0},
615 };
616 #endif
617 
618 int board_late_init(void)
619 {
620 #ifdef CONFIG_CMD_BMODE
621 	add_board_boot_modes(board_boot_modes);
622 #endif
623 
624 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
625 	env_set("board_name", "SABREAUTO");
626 
627 	if (is_mx6dqp())
628 		env_set("board_rev", "MX6QP");
629 	else if (is_mx6dq())
630 		env_set("board_rev", "MX6Q");
631 	else if (is_mx6sdl())
632 		env_set("board_rev", "MX6DL");
633 #endif
634 
635 	return 0;
636 }
637 
638 int checkboard(void)
639 {
640 	printf("Board: MX6Q-Sabreauto rev%c\n", nxp_board_rev_string());
641 
642 	return 0;
643 }
644 
645 #ifdef CONFIG_USB_EHCI_MX6
646 int board_ehci_hcd_init(int port)
647 {
648 	switch (port) {
649 	case 0:
650 		/*
651 		  * Set daisy chain for otg_pin_id on 6q.
652 		 *  For 6dl, this bit is reserved.
653 		 */
654 		imx_iomux_set_gpr_register(1, 13, 1, 0);
655 		break;
656 	case 1:
657 		break;
658 	default:
659 		printf("MXC USB port %d not yet supported\n", port);
660 		return -EINVAL;
661 	}
662 	return 0;
663 }
664 #endif
665 
666 #ifdef CONFIG_SPL_BUILD
667 #include <asm/arch/mx6-ddr.h>
668 #include <spl.h>
669 #include <linux/libfdt.h>
670 
671 #ifdef CONFIG_SPL_OS_BOOT
672 int spl_start_uboot(void)
673 {
674 	return 0;
675 }
676 #endif
677 
678 static void ccgr_init(void)
679 {
680 	struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
681 
682 	writel(0x00C03F3F, &ccm->CCGR0);
683 	writel(0x0030FC03, &ccm->CCGR1);
684 	writel(0x0FFFC000, &ccm->CCGR2);
685 	writel(0x3FF00000, &ccm->CCGR3);
686 	writel(0x00FFF300, &ccm->CCGR4);
687 	writel(0x0F0000C3, &ccm->CCGR5);
688 	writel(0x000003FF, &ccm->CCGR6);
689 }
690 
691 static int mx6q_dcd_table[] = {
692 	0x020e0798, 0x000C0000,
693 	0x020e0758, 0x00000000,
694 	0x020e0588, 0x00000030,
695 	0x020e0594, 0x00000030,
696 	0x020e056c, 0x00000030,
697 	0x020e0578, 0x00000030,
698 	0x020e074c, 0x00000030,
699 	0x020e057c, 0x00000030,
700 	0x020e058c, 0x00000000,
701 	0x020e059c, 0x00000030,
702 	0x020e05a0, 0x00000030,
703 	0x020e078c, 0x00000030,
704 	0x020e0750, 0x00020000,
705 	0x020e05a8, 0x00000028,
706 	0x020e05b0, 0x00000028,
707 	0x020e0524, 0x00000028,
708 	0x020e051c, 0x00000028,
709 	0x020e0518, 0x00000028,
710 	0x020e050c, 0x00000028,
711 	0x020e05b8, 0x00000028,
712 	0x020e05c0, 0x00000028,
713 	0x020e0774, 0x00020000,
714 	0x020e0784, 0x00000028,
715 	0x020e0788, 0x00000028,
716 	0x020e0794, 0x00000028,
717 	0x020e079c, 0x00000028,
718 	0x020e07a0, 0x00000028,
719 	0x020e07a4, 0x00000028,
720 	0x020e07a8, 0x00000028,
721 	0x020e0748, 0x00000028,
722 	0x020e05ac, 0x00000028,
723 	0x020e05b4, 0x00000028,
724 	0x020e0528, 0x00000028,
725 	0x020e0520, 0x00000028,
726 	0x020e0514, 0x00000028,
727 	0x020e0510, 0x00000028,
728 	0x020e05bc, 0x00000028,
729 	0x020e05c4, 0x00000028,
730 	0x021b0800, 0xa1390003,
731 	0x021b080c, 0x001F001F,
732 	0x021b0810, 0x001F001F,
733 	0x021b480c, 0x001F001F,
734 	0x021b4810, 0x001F001F,
735 	0x021b083c, 0x43260335,
736 	0x021b0840, 0x031A030B,
737 	0x021b483c, 0x4323033B,
738 	0x021b4840, 0x0323026F,
739 	0x021b0848, 0x483D4545,
740 	0x021b4848, 0x44433E48,
741 	0x021b0850, 0x41444840,
742 	0x021b4850, 0x4835483E,
743 	0x021b081c, 0x33333333,
744 	0x021b0820, 0x33333333,
745 	0x021b0824, 0x33333333,
746 	0x021b0828, 0x33333333,
747 	0x021b481c, 0x33333333,
748 	0x021b4820, 0x33333333,
749 	0x021b4824, 0x33333333,
750 	0x021b4828, 0x33333333,
751 	0x021b08b8, 0x00000800,
752 	0x021b48b8, 0x00000800,
753 	0x021b0004, 0x00020036,
754 	0x021b0008, 0x09444040,
755 	0x021b000c, 0x8A8F7955,
756 	0x021b0010, 0xFF328F64,
757 	0x021b0014, 0x01FF00DB,
758 	0x021b0018, 0x00001740,
759 	0x021b001c, 0x00008000,
760 	0x021b002c, 0x000026d2,
761 	0x021b0030, 0x008F1023,
762 	0x021b0040, 0x00000047,
763 	0x021b0000, 0x841A0000,
764 	0x021b001c, 0x04088032,
765 	0x021b001c, 0x00008033,
766 	0x021b001c, 0x00048031,
767 	0x021b001c, 0x09408030,
768 	0x021b001c, 0x04008040,
769 	0x021b0020, 0x00005800,
770 	0x021b0818, 0x00011117,
771 	0x021b4818, 0x00011117,
772 	0x021b0004, 0x00025576,
773 	0x021b0404, 0x00011006,
774 	0x021b001c, 0x00000000,
775 	0x020c4068, 0x00C03F3F,
776 	0x020c406c, 0x0030FC03,
777 	0x020c4070, 0x0FFFC000,
778 	0x020c4074, 0x3FF00000,
779 	0x020c4078, 0xFFFFF300,
780 	0x020c407c, 0x0F0000F3,
781 	0x020c4080, 0x00000FFF,
782 	0x020e0010, 0xF00000CF,
783 	0x020e0018, 0x007F007F,
784 	0x020e001c, 0x007F007F,
785 };
786 
787 static int mx6qp_dcd_table[] = {
788 	0x020e0798, 0x000C0000,
789 	0x020e0758, 0x00000000,
790 	0x020e0588, 0x00000030,
791 	0x020e0594, 0x00000030,
792 	0x020e056c, 0x00000030,
793 	0x020e0578, 0x00000030,
794 	0x020e074c, 0x00000030,
795 	0x020e057c, 0x00000030,
796 	0x020e058c, 0x00000000,
797 	0x020e059c, 0x00000030,
798 	0x020e05a0, 0x00000030,
799 	0x020e078c, 0x00000030,
800 	0x020e0750, 0x00020000,
801 	0x020e05a8, 0x00000030,
802 	0x020e05b0, 0x00000030,
803 	0x020e0524, 0x00000030,
804 	0x020e051c, 0x00000030,
805 	0x020e0518, 0x00000030,
806 	0x020e050c, 0x00000030,
807 	0x020e05b8, 0x00000030,
808 	0x020e05c0, 0x00000030,
809 	0x020e0774, 0x00020000,
810 	0x020e0784, 0x00000030,
811 	0x020e0788, 0x00000030,
812 	0x020e0794, 0x00000030,
813 	0x020e079c, 0x00000030,
814 	0x020e07a0, 0x00000030,
815 	0x020e07a4, 0x00000030,
816 	0x020e07a8, 0x00000030,
817 	0x020e0748, 0x00000030,
818 	0x020e05ac, 0x00000030,
819 	0x020e05b4, 0x00000030,
820 	0x020e0528, 0x00000030,
821 	0x020e0520, 0x00000030,
822 	0x020e0514, 0x00000030,
823 	0x020e0510, 0x00000030,
824 	0x020e05bc, 0x00000030,
825 	0x020e05c4, 0x00000030,
826 	0x021b0800, 0xa1390003,
827 	0x021b080c, 0x001b001e,
828 	0x021b0810, 0x002e0029,
829 	0x021b480c, 0x001b002a,
830 	0x021b4810, 0x0019002c,
831 	0x021b083c, 0x43240334,
832 	0x021b0840, 0x0324031a,
833 	0x021b483c, 0x43340344,
834 	0x021b4840, 0x03280276,
835 	0x021b0848, 0x44383A3E,
836 	0x021b4848, 0x3C3C3846,
837 	0x021b0850, 0x2e303230,
838 	0x021b4850, 0x38283E34,
839 	0x021b081c, 0x33333333,
840 	0x021b0820, 0x33333333,
841 	0x021b0824, 0x33333333,
842 	0x021b0828, 0x33333333,
843 	0x021b481c, 0x33333333,
844 	0x021b4820, 0x33333333,
845 	0x021b4824, 0x33333333,
846 	0x021b4828, 0x33333333,
847 	0x021b08c0, 0x24912492,
848 	0x021b48c0, 0x24912492,
849 	0x021b08b8, 0x00000800,
850 	0x021b48b8, 0x00000800,
851 	0x021b0004, 0x00020036,
852 	0x021b0008, 0x09444040,
853 	0x021b000c, 0x898E7955,
854 	0x021b0010, 0xFF328F64,
855 	0x021b0014, 0x01FF00DB,
856 	0x021b0018, 0x00001740,
857 	0x021b001c, 0x00008000,
858 	0x021b002c, 0x000026d2,
859 	0x021b0030, 0x008E1023,
860 	0x021b0040, 0x00000047,
861 	0x021b0400, 0x14420000,
862 	0x021b0000, 0x841A0000,
863 	0x00bb0008, 0x00000004,
864 	0x00bb000c, 0x2891E41A,
865 	0x00bb0038, 0x00000564,
866 	0x00bb0014, 0x00000040,
867 	0x00bb0028, 0x00000020,
868 	0x00bb002c, 0x00000020,
869 	0x021b001c, 0x04088032,
870 	0x021b001c, 0x00008033,
871 	0x021b001c, 0x00048031,
872 	0x021b001c, 0x09408030,
873 	0x021b001c, 0x04008040,
874 	0x021b0020, 0x00005800,
875 	0x021b0818, 0x00011117,
876 	0x021b4818, 0x00011117,
877 	0x021b0004, 0x00025576,
878 	0x021b0404, 0x00011006,
879 	0x021b001c, 0x00000000,
880 	0x020c4068, 0x00C03F3F,
881 	0x020c406c, 0x0030FC03,
882 	0x020c4070, 0x0FFFC000,
883 	0x020c4074, 0x3FF00000,
884 	0x020c4078, 0xFFFFF300,
885 	0x020c407c, 0x0F0000F3,
886 	0x020c4080, 0x00000FFF,
887 	0x020e0010, 0xF00000CF,
888 	0x020e0018, 0x77177717,
889 	0x020e001c, 0x77177717,
890 };
891 
892 static int mx6dl_dcd_table[] = {
893 	0x020e0774, 0x000C0000,
894 	0x020e0754, 0x00000000,
895 	0x020e04ac, 0x00000030,
896 	0x020e04b0, 0x00000030,
897 	0x020e0464, 0x00000030,
898 	0x020e0490, 0x00000030,
899 	0x020e074c, 0x00000030,
900 	0x020e0494, 0x00000030,
901 	0x020e04a0, 0x00000000,
902 	0x020e04b4, 0x00000030,
903 	0x020e04b8, 0x00000030,
904 	0x020e076c, 0x00000030,
905 	0x020e0750, 0x00020000,
906 	0x020e04bc, 0x00000028,
907 	0x020e04c0, 0x00000028,
908 	0x020e04c4, 0x00000028,
909 	0x020e04c8, 0x00000028,
910 	0x020e04cc, 0x00000028,
911 	0x020e04d0, 0x00000028,
912 	0x020e04d4, 0x00000028,
913 	0x020e04d8, 0x00000028,
914 	0x020e0760, 0x00020000,
915 	0x020e0764, 0x00000028,
916 	0x020e0770, 0x00000028,
917 	0x020e0778, 0x00000028,
918 	0x020e077c, 0x00000028,
919 	0x020e0780, 0x00000028,
920 	0x020e0784, 0x00000028,
921 	0x020e078c, 0x00000028,
922 	0x020e0748, 0x00000028,
923 	0x020e0470, 0x00000028,
924 	0x020e0474, 0x00000028,
925 	0x020e0478, 0x00000028,
926 	0x020e047c, 0x00000028,
927 	0x020e0480, 0x00000028,
928 	0x020e0484, 0x00000028,
929 	0x020e0488, 0x00000028,
930 	0x020e048c, 0x00000028,
931 	0x021b0800, 0xa1390003,
932 	0x021b080c, 0x001F001F,
933 	0x021b0810, 0x001F001F,
934 	0x021b480c, 0x001F001F,
935 	0x021b4810, 0x001F001F,
936 	0x021b083c, 0x42190217,
937 	0x021b0840, 0x017B017B,
938 	0x021b483c, 0x4176017B,
939 	0x021b4840, 0x015F016C,
940 	0x021b0848, 0x4C4C4D4C,
941 	0x021b4848, 0x4A4D4C48,
942 	0x021b0850, 0x3F3F3F40,
943 	0x021b4850, 0x3538382E,
944 	0x021b081c, 0x33333333,
945 	0x021b0820, 0x33333333,
946 	0x021b0824, 0x33333333,
947 	0x021b0828, 0x33333333,
948 	0x021b481c, 0x33333333,
949 	0x021b4820, 0x33333333,
950 	0x021b4824, 0x33333333,
951 	0x021b4828, 0x33333333,
952 	0x021b08b8, 0x00000800,
953 	0x021b48b8, 0x00000800,
954 	0x021b0004, 0x00020025,
955 	0x021b0008, 0x00333030,
956 	0x021b000c, 0x676B5313,
957 	0x021b0010, 0xB66E8B63,
958 	0x021b0014, 0x01FF00DB,
959 	0x021b0018, 0x00001740,
960 	0x021b001c, 0x00008000,
961 	0x021b002c, 0x000026d2,
962 	0x021b0030, 0x006B1023,
963 	0x021b0040, 0x00000047,
964 	0x021b0000, 0x841A0000,
965 	0x021b001c, 0x04008032,
966 	0x021b001c, 0x00008033,
967 	0x021b001c, 0x00048031,
968 	0x021b001c, 0x05208030,
969 	0x021b001c, 0x04008040,
970 	0x021b0020, 0x00005800,
971 	0x021b0818, 0x00011117,
972 	0x021b4818, 0x00011117,
973 	0x021b0004, 0x00025565,
974 	0x021b0404, 0x00011006,
975 	0x021b001c, 0x00000000,
976 	0x020c4068, 0x00C03F3F,
977 	0x020c406c, 0x0030FC03,
978 	0x020c4070, 0x0FFFC000,
979 	0x020c4074, 0x3FF00000,
980 	0x020c4078, 0xFFFFF300,
981 	0x020c407c, 0x0F0000C3,
982 	0x020c4080, 0x00000FFF,
983 	0x020e0010, 0xF00000CF,
984 	0x020e0018, 0x007F007F,
985 	0x020e001c, 0x007F007F,
986 };
987 
988 static void ddr_init(int *table, int size)
989 {
990 	int i;
991 
992 	for (i = 0; i < size / 2 ; i++)
993 		writel(table[2 * i + 1], table[2 * i]);
994 }
995 
996 static void spl_dram_init(void)
997 {
998 	if (is_mx6dq())
999 		ddr_init(mx6q_dcd_table, ARRAY_SIZE(mx6q_dcd_table));
1000 	else if (is_mx6dqp())
1001 		ddr_init(mx6qp_dcd_table, ARRAY_SIZE(mx6qp_dcd_table));
1002 	else if (is_mx6sdl())
1003 		ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
1004 }
1005 
1006 void board_init_f(ulong dummy)
1007 {
1008 	/* DDR initialization */
1009 	spl_dram_init();
1010 
1011 	/* setup AIPS and disable watchdog */
1012 	arch_cpu_init();
1013 
1014 	ccgr_init();
1015 	gpr_init();
1016 
1017 	/* iomux and setup of i2c */
1018 	board_early_init_f();
1019 
1020 	/* setup GP timer */
1021 	timer_init();
1022 
1023 	/* UART clocks enabled and gd valid - init serial console */
1024 	preloader_console_init();
1025 
1026 	/* Clear the BSS. */
1027 	memset(__bss_start, 0, __bss_end - __bss_start);
1028 
1029 	/* load/boot image from boot device */
1030 	board_init_r(NULL, 0);
1031 }
1032 #endif
1033 
1034 #ifdef CONFIG_SPL_LOAD_FIT
1035 int board_fit_config_name_match(const char *name)
1036 {
1037 	if (is_mx6dq()) {
1038 		if (!strcmp(name, "imx6q-sabreauto"))
1039 			return 0;
1040 	} else if (is_mx6dqp()) {
1041 		if (!strcmp(name, "imx6qp-sabreauto"))
1042 			return 0;
1043 	} else if (is_mx6dl()) {
1044 		if (!strcmp(name, "imx6dl-sabreauto"))
1045 			return 0;
1046 	}
1047 
1048 	return -1;
1049 }
1050 #endif
1051