]> git.ipfire.org Git - thirdparty/u-boot.git/blob - board/freescale/mx6sabresd/mx6sabresd.c
SPDX: Convert all of our single license tags to Linux Kernel style
[thirdparty/u-boot.git] / board / freescale / mx6sabresd / mx6sabresd.c
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