2 * (c) Copyright 2009-2010 Freescale Semiconductor
4 * (c) 2007 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de>
6 * See file CREDITS for list of people who contributed to this
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of
12 * the License, or (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
28 #include <asm/errno.h>
29 #include <asm/arch/mx25.h>
30 #include <asm/arch/mx25-regs.h>
31 #include <asm/arch/mx25_pins.h>
32 #include <asm/arch/iomux.h>
33 #include <asm/arch/gpio.h>
41 #ifdef CONFIG_GET_FEC_MAC_ADDR_FROM_IIM
42 #include <asm/imx_iim.h>
47 #include <fsl_esdhc.h>
50 DECLARE_GLOBAL_DATA_PTR;
52 static u32 system_rev;
57 u32 get_board_rev(void)
62 static inline void setup_soc_rev(void)
65 reg = __REG(IIM_BASE + IIM_SREV);
67 reg = __REG(ROMPATCH_REV);
71 system_rev = 0x25000 + (reg & 0xFF);
74 inline int is_soc_rev(int rev)
76 return (system_rev & 0xFF) - rev;
81 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
82 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
89 struct fsl_esdhc_cfg esdhc_cfg[2] = {
90 {MMC_SDHC1_BASE, 1, 1},
91 {MMC_SDHC2_BASE, 1, 1},
94 int esdhc_gpio_init(bd_t *bis)
100 for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM;
105 writel(0x10, IOMUXC_BASE + 0x190); /* SD1_CMD */
106 writel(0x10, IOMUXC_BASE + 0x194); /* SD1_CLK */
107 writel(0x00, IOMUXC_BASE + 0x198); /* SD1_DATA0 */
108 writel(0x00, IOMUXC_BASE + 0x19c); /* SD1_DATA1 */
109 writel(0x00, IOMUXC_BASE + 0x1a0); /* SD1_DATA2 */
110 writel(0x00, IOMUXC_BASE + 0x1a4); /* SD1_DATA3 */
111 writel(0x06, IOMUXC_BASE + 0x094); /* D12 (SD1_DATA4) */
112 writel(0x06, IOMUXC_BASE + 0x090); /* D13 (SD1_DATA5) */
113 writel(0x06, IOMUXC_BASE + 0x08c); /* D14 (SD1_DATA6) */
114 writel(0x06, IOMUXC_BASE + 0x088); /* D15 (SD1_DATA7) */
115 writel(0x05, IOMUXC_BASE + 0x010); /* A14 (SD1_WP) */
116 writel(0x05, IOMUXC_BASE + 0x014); /* A15 (SD1_DET) */
119 writel(0xD1, IOMUXC_BASE + 0x388); /* SD1_CMD */
120 writel(0xD1, IOMUXC_BASE + 0x38c); /* SD1_CLK */
121 writel(0xD1, IOMUXC_BASE + 0x390); /* SD1_DATA0 */
122 writel(0xD1, IOMUXC_BASE + 0x394); /* SD1_DATA1 */
123 writel(0xD1, IOMUXC_BASE + 0x398); /* SD1_DATA2 */
124 writel(0xD1, IOMUXC_BASE + 0x39c); /* SD1_DATA3 */
125 writel(0xD1, IOMUXC_BASE + 0x28c); /* D12 (SD1_DATA4) */
126 writel(0xD1, IOMUXC_BASE + 0x288); /* D13 (SD1_DATA5) */
127 writel(0xD1, IOMUXC_BASE + 0x284); /* D14 (SD1_DATA6) */
128 writel(0xD1, IOMUXC_BASE + 0x280); /* D15 (SD1_DATA7) */
129 writel(0xD1, IOMUXC_BASE + 0x230); /* A14 (SD1_WP) */
130 writel(0xD1, IOMUXC_BASE + 0x234); /* A15 (SD1_DET) */
133 * Set write protect and card detect gpio as inputs
134 * A14 (SD1_WP) and A15 (SD1_DET)
136 val = ~(3 << 0) & readl(GPIO1_BASE + GPIO_GDIR);
137 writel(val, GPIO1_BASE + GPIO_GDIR);
141 writel(0x16, IOMUXC_BASE + 0x0e8); /* LD8 (SD1_CMD) */
142 writel(0x16, IOMUXC_BASE + 0x0ec); /* LD9 (SD1_CLK) */
143 writel(0x06, IOMUXC_BASE + 0x0f0); /* LD10 (SD1_DATA0)*/
144 writel(0x06, IOMUXC_BASE + 0x0f4); /* LD11 (SD1_DATA1)*/
145 writel(0x06, IOMUXC_BASE + 0x0f8); /* LD12 (SD1_DATA2)*/
146 writel(0x06, IOMUXC_BASE + 0x0fc); /* LD13 (SD1_DATA3)*/
147 /* CSI_D2 (SD1_DATA4) */
148 writel(0x02, IOMUXC_BASE + 0x120);
149 /* CSI_D3 (SD1_DATA5) */
150 writel(0x02, IOMUXC_BASE + 0x124);
151 /* CSI_D4 (SD1_DATA6) */
152 writel(0x02, IOMUXC_BASE + 0x128);
153 /* CSI_D5 (SD1_DATA7) */
154 writel(0x02, IOMUXC_BASE + 0x12c);
157 writel(0xD1, IOMUXC_BASE + 0x2e0); /* LD8 (SD1_CMD) */
158 writel(0xD1, IOMUXC_BASE + 0x2e4); /* LD9 (SD1_CLK) */
159 writel(0xD1, IOMUXC_BASE + 0x2e8); /* LD10 (SD1_DATA0)*/
160 writel(0xD1, IOMUXC_BASE + 0x2ec); /* LD11 (SD1_DATA1)*/
161 writel(0xD1, IOMUXC_BASE + 0x2f0); /* LD12 (SD1_DATA2)*/
162 writel(0xD1, IOMUXC_BASE + 0x2f4); /* LD13 (SD1_DATA3)*/
163 /* CSI_D2 (SD1_DATA4) */
164 writel(0xD1, IOMUXC_BASE + 0x318);
165 /* CSI_D3 (SD1_DATA5) */
166 writel(0xD1, IOMUXC_BASE + 0x31c);
167 /* CSI_D4 (SD1_DATA6) */
168 writel(0xD1, IOMUXC_BASE + 0x320);
169 /* CSI_D5 (SD1_DATA7) */
170 writel(0xD1, IOMUXC_BASE + 0x324);
173 printf("Warning: you configured more ESDHC controller"
174 "(%d) as supported by the board(2)\n",
175 CONFIG_SYS_FSL_ESDHC_NUM);
179 status |= fsl_esdhc_initialize(bis, &esdhc_cfg[index]);
184 int board_mmc_init(bd_t *bis)
186 if (!esdhc_gpio_init(bis))
193 s32 spi_get_cfg(struct imx_spi_dev_t *dev)
195 switch (dev->slave.cs) {
198 dev->base = CSPI1_BASE;
199 dev->freq = 25000000;
200 dev->ss_pol = IMX_SPI_ACTIVE_LOW;
206 printf("Invalid Bus ID! \n");
213 void spi_io_init(struct imx_spi_dev_t *dev)
217 writel(0, IOMUXC_BASE + 0x180); /* CSPI1 SCLK */
218 writel(0x1C0, IOMUXC_BASE + 0x5c4);
219 writel(0, IOMUXC_BASE + 0x184); /* SPI_RDY */
220 writel(0x1E0, IOMUXC_BASE + 0x5c8);
221 writel(0, IOMUXC_BASE + 0x170); /* MOSI */
222 writel(0x1C0, IOMUXC_BASE + 0x5b4);
223 writel(0, IOMUXC_BASE + 0x174); /* MISO */
224 writel(0x1C0, IOMUXC_BASE + 0x5b8);
225 writel(0, IOMUXC_BASE + 0x17C); /* SS1 */
226 writel(0x1E0, IOMUXC_BASE + 0x5C0);
235 vidinfo_t panel_info = {
246 vl_sync : FB_SYNC_CLK_LAT_FALL,
250 cmap : (void *)lcd_cmap,
253 void lcdc_hw_init(void)
255 /* Set VSTBY_REQ as GPIO3[17] on ALT5 */
256 mxc_request_iomux(MX25_PIN_VSTBY_REQ, MUX_CONFIG_ALT5);
258 /* Set GPIO3[17] as output */
259 writel(0x20000, GPIO3_BASE + 0x04);
261 /* Set GPIOE as LCDC_LD[16] on ALT2 */
262 mxc_request_iomux(MX25_PIN_GPIO_E, MUX_CONFIG_ALT2);
264 /* Set GPIOF as LCDC_LD[17] on ALT2 */
265 mxc_request_iomux(MX25_PIN_GPIO_F, MUX_CONFIG_ALT2);
267 /* Enable pull up on LCDC_LD[16] */
268 mxc_iomux_set_pad(MX25_PIN_GPIO_E,
269 PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU);
271 /* Enable pull up on LCDC_LD[17] */
272 mxc_iomux_set_pad(MX25_PIN_GPIO_F,
273 PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU);
275 /* Enable Pull/Keeper for pad LSCKL */
276 mxc_iomux_set_pad(MX25_PIN_LSCLK,
277 PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PUD |
278 PAD_CTL_100K_PU | PAD_CTL_SRE_FAST);
280 gd->fb_base = CONFIG_FB_BASE;
283 #ifdef CONFIG_SPLASH_SCREEN
284 int setup_splash_img()
286 #ifdef CONFIG_SPLASH_IS_IN_MMC
287 int mmc_dev = CONFIG_SPLASH_IMG_MMC_DEV;
288 ulong offset = CONFIG_SPLASH_IMG_OFFSET;
289 ulong size = CONFIG_SPLASH_IMG_SIZE;
292 struct mmc *mmc = find_mmc_device(mmc_dev);
293 uint blk_start, blk_cnt, n;
295 s = getenv("splashimage");
298 puts("env splashimage not found!\n");
301 addr = simple_strtoul(s, NULL, 16);
304 printf("MMC Device %d not found\n",
310 puts("MMC init failed\n");
314 blk_start = ALIGN(offset, mmc->read_bl_len) / mmc->read_bl_len;
315 blk_cnt = ALIGN(size, mmc->read_bl_len) / mmc->read_bl_len;
316 n = mmc->block_dev.block_read(mmc_dev, blk_start,
317 blk_cnt, (u_char *)addr);
318 flush_cache((ulong)addr, blk_cnt * mmc->read_bl_len);
320 return (n == blk_cnt) ? 0 : -1;
326 #ifdef CONFIG_GET_FEC_MAC_ADDR_FROM_IIM
328 int fec_get_mac_addr(unsigned char *mac)
331 (u32 *)(IIM_BASE + IIM_BANK_AREA_0_OFFSET +
332 CONFIG_IIM_MAC_ADDR_OFFSET);
335 for (i = 0; i < 6; ++i, ++iim0_mac_base)
336 mac[i] = readl(iim0_mac_base);
346 /* MFG firmware need reset usb to avoid host crash firstly */
348 int val = readl(USB_BASE + USBCMD);
349 val &= ~0x1; /*RS bit*/
350 writel(val, USB_BASE + USBCMD);
355 /* setup pins for UART1 */
356 /* UART 1 IOMUX Configs */
357 mxc_request_iomux(MX25_PIN_UART1_RXD, MUX_CONFIG_FUNC);
358 mxc_request_iomux(MX25_PIN_UART1_TXD, MUX_CONFIG_FUNC);
359 mxc_request_iomux(MX25_PIN_UART1_RTS, MUX_CONFIG_FUNC);
360 mxc_request_iomux(MX25_PIN_UART1_CTS, MUX_CONFIG_FUNC);
361 mxc_iomux_set_pad(MX25_PIN_UART1_RXD,
362 PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE |
363 PAD_CTL_PUE_PUD | PAD_CTL_100K_PU);
364 mxc_iomux_set_pad(MX25_PIN_UART1_TXD,
365 PAD_CTL_PUE_PUD | PAD_CTL_100K_PD);
366 mxc_iomux_set_pad(MX25_PIN_UART1_RTS,
367 PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE |
368 PAD_CTL_PUE_PUD | PAD_CTL_100K_PU);
369 mxc_iomux_set_pad(MX25_PIN_UART1_CTS,
370 PAD_CTL_PUE_PUD | PAD_CTL_100K_PD);
372 /* setup pins for FEC */
373 mxc_request_iomux(MX25_PIN_FEC_TX_CLK, MUX_CONFIG_FUNC);
374 mxc_request_iomux(MX25_PIN_FEC_RX_DV, MUX_CONFIG_FUNC);
375 mxc_request_iomux(MX25_PIN_FEC_RDATA0, MUX_CONFIG_FUNC);
376 mxc_request_iomux(MX25_PIN_FEC_TDATA0, MUX_CONFIG_FUNC);
377 mxc_request_iomux(MX25_PIN_FEC_TX_EN, MUX_CONFIG_FUNC);
378 mxc_request_iomux(MX25_PIN_FEC_MDC, MUX_CONFIG_FUNC);
379 mxc_request_iomux(MX25_PIN_FEC_MDIO, MUX_CONFIG_FUNC);
380 mxc_request_iomux(MX25_PIN_FEC_RDATA1, MUX_CONFIG_FUNC);
381 mxc_request_iomux(MX25_PIN_FEC_TDATA1, MUX_CONFIG_FUNC);
382 mxc_request_iomux(MX25_PIN_POWER_FAIL, MUX_CONFIG_FUNC); /* PHY INT */
384 #define FEC_PAD_CTL1 (PAD_CTL_HYS_SCHMITZ | PAD_CTL_PUE_PUD | \
386 #define FEC_PAD_CTL2 (PAD_CTL_PUE_PUD)
388 mxc_iomux_set_pad(MX25_PIN_FEC_TX_CLK, FEC_PAD_CTL1);
389 mxc_iomux_set_pad(MX25_PIN_FEC_RX_DV, FEC_PAD_CTL1);
390 mxc_iomux_set_pad(MX25_PIN_FEC_RDATA0, FEC_PAD_CTL1);
391 mxc_iomux_set_pad(MX25_PIN_FEC_TDATA0, FEC_PAD_CTL2);
392 mxc_iomux_set_pad(MX25_PIN_FEC_TX_EN, FEC_PAD_CTL2);
393 mxc_iomux_set_pad(MX25_PIN_FEC_MDC, FEC_PAD_CTL2);
394 mxc_iomux_set_pad(MX25_PIN_FEC_MDIO, FEC_PAD_CTL1 | PAD_CTL_22K_PU);
395 mxc_iomux_set_pad(MX25_PIN_FEC_RDATA1, FEC_PAD_CTL1);
396 mxc_iomux_set_pad(MX25_PIN_FEC_TDATA1, FEC_PAD_CTL2);
397 mxc_iomux_set_pad(MX25_PIN_POWER_FAIL, FEC_PAD_CTL1);
400 * Set up the FEC_RESET_B and FEC_ENABLE GPIO pins.
401 * Assert FEC_RESET_B, then power up the PHY by asserting
402 * FEC_ENABLE, at the same time lifting FEC_RESET_B.
404 * FEC_RESET_B: gpio2[3] is ALT 5 mode of pin D12
405 * FEC_ENABLE_B: gpio4[8] is ALT 5 mode of pin A17
407 mxc_request_iomux(MX25_PIN_A17, MUX_CONFIG_ALT5); /* FEC_EN */
408 mxc_request_iomux(MX25_PIN_D12, MUX_CONFIG_ALT5); /* FEC_RESET_B */
410 mxc_iomux_set_pad(MX25_PIN_A17, PAD_CTL_ODE_OpenDrain);
411 mxc_iomux_set_pad(MX25_PIN_D12, 0);
413 mxc_set_gpio_direction(MX25_PIN_A17, 0); /* FEC_EN */
414 mxc_set_gpio_direction(MX25_PIN_D12, 0); /* FEC_RESET_B */
417 mxc_set_gpio_dataout(MX25_PIN_A17, 0); /* FEC_EN */
420 mxc_set_gpio_dataout(MX25_PIN_D12, 0); /* FEC_RESET_B */
421 udelay(2); /* spec says 1us min */
423 /* turn on PHY power and lift reset */
424 mxc_set_gpio_dataout(MX25_PIN_A17, 1); /* FEC_EN */
425 mxc_set_gpio_dataout(MX25_PIN_D12, 1); /* FEC_RESET_B */
427 #define I2C_PAD_CTL (PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE | \
428 PAD_CTL_PUE_PUD | PAD_CTL_100K_PU | PAD_CTL_ODE_OpenDrain)
430 mxc_request_iomux(MX25_PIN_I2C1_CLK, MUX_CONFIG_SION);
431 mxc_request_iomux(MX25_PIN_I2C1_DAT, MUX_CONFIG_SION);
432 mxc_iomux_set_pad(MX25_PIN_I2C1_CLK, 0x1E8);
433 mxc_iomux_set_pad(MX25_PIN_I2C1_DAT, 0x1E8);
439 gd->bd->bi_arch_number = MACH_TYPE_MX25_3DS; /* board id for linux */
440 gd->bd->bi_boot_params = 0x80000100; /* address of boot parameters */
449 #ifdef BOARD_LATE_INIT
450 int board_late_init(void)
456 i2c_write(0x54, 0x02, 1, reg, 1);
458 #ifdef CONFIG_IMX_SPI_CPLD
462 #ifdef CONFIG_SPLASH_SCREEN
463 if (!setup_splash_img())
464 printf("Read splash screen failed!\n");
474 printf("Board: i.MX25 MAX PDK (3DS)\n");
478 int board_eth_init(bd_t *bis)
481 #if defined(CONFIG_SMC911X)
482 rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);