2 * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
4 * (C) Copyright 2009-2010 Freescale Semiconductor, Inc.
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,
27 #include <asm/arch/mx50.h>
28 #include <asm/arch/mx50_pins.h>
29 #include <asm/arch/iomux.h>
30 #include <asm/errno.h>
32 #ifdef CONFIG_IMX_CSPI
34 #include <asm/arch/imx_spi_pmic.h>
43 #include <fsl_esdhc.h>
46 #ifdef CONFIG_ARCH_MMU
48 #include <asm/arch/mmu.h>
51 #ifdef CONFIG_CMD_CLOCK
52 #include <asm/clock.h>
55 #ifdef CONFIG_MXC_EPDC
59 DECLARE_GLOBAL_DATA_PTR;
61 static u32 system_rev;
62 static enum boot_device boot_dev;
63 u32 mx51_io_base_addr;
65 static inline void setup_boot_device(void)
67 uint soc_sbmr = readl(SRC_BASE_ADDR + 0x4);
68 uint bt_mem_ctl = (soc_sbmr & 0x000000FF) >> 4 ;
69 uint bt_mem_type = (soc_sbmr & 0x00000008) >> 3;
74 boot_dev = ONE_NAND_BOOT;
76 boot_dev = WEIM_NOR_BOOT;
86 boot_dev = SPI_NOR_BOOT;
102 boot_dev = UNKNOWN_BOOT;
107 enum boot_device get_boot_device(void)
112 u32 get_board_rev(void)
117 static inline void setup_soc_rev(void)
119 system_rev = 0x50000 | CHIP_REV_1_0;
122 static inline void setup_board_rev(int rev)
124 system_rev |= (rev & 0xF) << 8;
127 inline int is_soc_rev(int rev)
129 return (system_rev & 0xFF) - rev;
132 #ifdef CONFIG_ARCH_MMU
133 void board_mmu_init(void)
135 unsigned long ttb_base = PHYS_SDRAM_1 + 0x4000;
139 * Set the TTB register
141 asm volatile ("mcr p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/);
144 * Set the Domain Access Control Register
146 i = ARM_ACCESS_DACR_DEFAULT;
147 asm volatile ("mcr p15,0,%0,c3,c0,0" : : "r"(i) /*:*/);
150 * First clear all TT entries - ie Set them to Faulting
152 memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE);
153 /* Actual Virtual Size Attributes Function */
154 /* Base Base MB cached? buffered? access permissions */
155 /* xxx00000 xxx00000 */
156 X_ARM_MMU_SECTION(0x000, 0x000, 0x10,
157 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
158 ARM_ACCESS_PERM_RW_RW); /* ROM, 16M */
159 X_ARM_MMU_SECTION(0x070, 0x070, 0x010,
160 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
161 ARM_ACCESS_PERM_RW_RW); /* IRAM */
162 X_ARM_MMU_SECTION(0x100, 0x100, 0x040,
163 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
164 ARM_ACCESS_PERM_RW_RW); /* SATA */
165 X_ARM_MMU_SECTION(0x180, 0x180, 0x100,
166 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
167 ARM_ACCESS_PERM_RW_RW); /* IPUv3M */
168 X_ARM_MMU_SECTION(0x200, 0x200, 0x200,
169 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
170 ARM_ACCESS_PERM_RW_RW); /* GPU */
171 X_ARM_MMU_SECTION(0x400, 0x400, 0x300,
172 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
173 ARM_ACCESS_PERM_RW_RW); /* periperals */
174 X_ARM_MMU_SECTION(0x700, 0x700, 0x400,
175 ARM_CACHEABLE, ARM_BUFFERABLE,
176 ARM_ACCESS_PERM_RW_RW); /* CSD0 1G */
177 X_ARM_MMU_SECTION(0x700, 0xB00, 0x400,
178 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
179 ARM_ACCESS_PERM_RW_RW); /* CSD0 1G */
180 X_ARM_MMU_SECTION(0xF00, 0xF00, 0x100,
181 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
182 ARM_ACCESS_PERM_RW_RW); /* CS1 EIM control*/
183 X_ARM_MMU_SECTION(0xF80, 0xF80, 0x001,
184 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
185 ARM_ACCESS_PERM_RW_RW); /* iRam */
187 /* Workaround for arm errata #709718 */
188 /* Setup PRRR so device is always mapped to non-shared */
189 asm volatile ("mrc p15, 0, %0, c10, c2, 0" : "=r"(i) : /*:*/);
191 asm volatile ("mcr p15, 0, %0, c10, c2, 0" : : "r"(i) /*:*/);
200 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
201 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
205 static void setup_uart(void)
209 mxc_request_iomux(MX50_PIN_UART1_RXD, IOMUX_CONFIG_ALT0);
210 mxc_iomux_set_pad(MX50_PIN_UART1_RXD, 0x1E4);
211 mxc_iomux_set_input(MUX_IN_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, 0x1);
214 mxc_request_iomux(MX50_PIN_UART1_TXD, IOMUX_CONFIG_ALT0);
215 mxc_iomux_set_pad(MX50_PIN_UART1_TXD, 0x1E4);
218 #ifdef CONFIG_I2C_MXC
219 static void setup_i2c(unsigned int module_base)
221 switch (module_base) {
224 mxc_request_iomux(MX50_PIN_I2C1_SDA,
225 IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
226 mxc_iomux_set_pad(MX50_PIN_I2C1_SDA, PAD_CTL_SRE_FAST |
227 PAD_CTL_ODE_OPENDRAIN_ENABLE |
228 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
231 mxc_request_iomux(MX50_PIN_I2C1_SCL,
232 IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
233 mxc_iomux_set_pad(MX50_PIN_I2C1_SCL, PAD_CTL_SRE_FAST |
234 PAD_CTL_ODE_OPENDRAIN_ENABLE |
235 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
240 mxc_request_iomux(MX50_PIN_I2C2_SDA,
241 IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
242 mxc_iomux_set_pad(MX50_PIN_I2C2_SDA,
244 PAD_CTL_ODE_OPENDRAIN_ENABLE |
245 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
249 mxc_request_iomux(MX50_PIN_I2C2_SCL,
250 IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
251 mxc_iomux_set_pad(MX50_PIN_I2C2_SCL,
253 PAD_CTL_ODE_OPENDRAIN_ENABLE |
254 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
259 mxc_request_iomux(MX50_PIN_I2C3_SDA,
260 IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
261 mxc_iomux_set_pad(MX50_PIN_I2C3_SDA,
263 PAD_CTL_ODE_OPENDRAIN_ENABLE |
264 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
268 mxc_request_iomux(MX50_PIN_I2C3_SCL,
269 IOMUX_CONFIG_ALT0 | IOMUX_CONFIG_SION);
270 mxc_iomux_set_pad(MX50_PIN_I2C3_SCL,
272 PAD_CTL_ODE_OPENDRAIN_ENABLE |
273 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
277 printf("Invalid I2C base: 0x%x\n", module_base);
284 #ifdef CONFIG_IMX_CSPI
285 s32 spi_get_cfg(struct imx_spi_dev_t *dev)
287 switch (dev->slave.cs) {
290 dev->base = CSPI3_BASE_ADDR;
291 dev->freq = 25000000;
292 dev->ss_pol = IMX_SPI_ACTIVE_HIGH;
299 dev->base = CSPI3_BASE_ADDR;
300 dev->freq = 25000000;
301 dev->ss_pol = IMX_SPI_ACTIVE_LOW;
307 printf("Invalid Bus ID! \n");
313 void spi_io_init(struct imx_spi_dev_t *dev)
316 case CSPI3_BASE_ADDR:
317 mxc_request_iomux(MX50_PIN_CSPI_MOSI, IOMUX_CONFIG_ALT0);
318 mxc_iomux_set_pad(MX50_PIN_CSPI_MOSI, 0x4);
320 mxc_request_iomux(MX50_PIN_CSPI_MISO, IOMUX_CONFIG_ALT0);
321 mxc_iomux_set_pad(MX50_PIN_CSPI_MISO, 0x4);
324 /* de-select SS1 of instance: cspi */
325 mxc_request_iomux(MX50_PIN_ECSPI1_MOSI,
328 mxc_request_iomux(MX50_PIN_CSPI_SS0, IOMUX_CONFIG_ALT0);
329 mxc_iomux_set_pad(MX50_PIN_CSPI_SS0, 0xE4);
330 } else if (dev->ss == 1) {
331 /* de-select SS0 of instance: cspi */
332 mxc_request_iomux(MX50_PIN_CSPI_SS0, IOMUX_CONFIG_ALT1);
334 mxc_request_iomux(MX50_PIN_ECSPI1_MOSI,
336 mxc_iomux_set_pad(MX50_PIN_ECSPI1_MOSI, 0xE4);
338 MUX_IN_CSPI_IPP_IND_SS1_B_SELECT_INPUT, 0x1);
341 mxc_request_iomux(MX50_PIN_CSPI_SCLK, IOMUX_CONFIG_ALT0);
342 mxc_iomux_set_pad(MX50_PIN_CSPI_SCLK, 0x4);
344 case CSPI2_BASE_ADDR:
345 case CSPI1_BASE_ADDR:
346 /* ecspi1-2 fall through */
354 #ifdef CONFIG_MXC_FEC
356 #ifdef CONFIG_GET_FEC_MAC_ADDR_FROM_IIM
358 #define HW_OCOTP_MACn(n) (0x00000250 + (n) * 0x10)
360 int fec_get_mac_addr(unsigned char *mac)
362 u32 *ocotp_mac_base =
363 (u32 *)(OCOTP_CTRL_BASE_ADDR + HW_OCOTP_MACn(0));
366 for (i = 0; i < 6; ++i, ++ocotp_mac_base)
367 mac[6 - 1 - i] = readl(++ocotp_mac_base);
373 static void setup_fec(void)
375 volatile unsigned int reg;
378 mxc_request_iomux(MX50_PIN_SSI_RXC, IOMUX_CONFIG_ALT6);
379 mxc_iomux_set_pad(MX50_PIN_SSI_RXC, 0xC);
380 mxc_iomux_set_input(MUX_IN_FEC_FEC_MDI_SELECT_INPUT, 0x1);
383 mxc_request_iomux(MX50_PIN_SSI_RXFS, IOMUX_CONFIG_ALT6);
384 mxc_iomux_set_pad(MX50_PIN_SSI_RXFS, 0x004);
387 mxc_request_iomux(MX50_PIN_DISP_D3, IOMUX_CONFIG_ALT2);
388 mxc_iomux_set_pad(MX50_PIN_DISP_D3, 0x0);
389 mxc_iomux_set_input(MUX_IN_FEC_FEC_RDATA_1_SELECT_INPUT, 0x0);
392 mxc_request_iomux(MX50_PIN_DISP_D4, IOMUX_CONFIG_ALT2);
393 mxc_iomux_set_pad(MX50_PIN_DISP_D4, 0x0);
394 mxc_iomux_set_input(MUX_IN_FEC_FEC_RDATA_0_SELECT_INPUT, 0x0);
397 mxc_request_iomux(MX50_PIN_DISP_D6, IOMUX_CONFIG_ALT2);
398 mxc_iomux_set_pad(MX50_PIN_DISP_D6, 0x004);
401 mxc_request_iomux(MX50_PIN_DISP_D7, IOMUX_CONFIG_ALT2);
402 mxc_iomux_set_pad(MX50_PIN_DISP_D7, 0x004);
405 mxc_request_iomux(MX50_PIN_DISP_D5, IOMUX_CONFIG_ALT2);
406 mxc_iomux_set_pad(MX50_PIN_DISP_D5, 0x004);
409 mxc_request_iomux(MX50_PIN_DISP_D0, IOMUX_CONFIG_ALT2);
410 mxc_iomux_set_pad(MX50_PIN_DISP_D0, 0x0);
411 mxc_iomux_set_input(MUX_IN_FEC_FEC_TX_CLK_SELECT_INPUT, 0x0);
414 mxc_request_iomux(MX50_PIN_DISP_D1, IOMUX_CONFIG_ALT2);
415 mxc_iomux_set_pad(MX50_PIN_DISP_D1, 0x0);
416 mxc_iomux_set_input(MUX_IN_FEC_FEC_RX_ER_SELECT_INPUT, 0);
419 mxc_request_iomux(MX50_PIN_DISP_D2, IOMUX_CONFIG_ALT2);
420 mxc_iomux_set_pad(MX50_PIN_DISP_D2, 0x0);
421 mxc_iomux_set_input(MUX_IN_FEC_FEC_RX_DV_SELECT_INPUT, 0);
423 /* phy reset: gpio4-6 */
424 mxc_request_iomux(MX50_PIN_KEY_COL3, IOMUX_CONFIG_ALT1);
426 reg = readl(GPIO4_BASE_ADDR + 0x0);
428 writel(reg, GPIO4_BASE_ADDR + 0x0);
430 reg = readl(GPIO4_BASE_ADDR + 0x4);
432 writel(reg, GPIO4_BASE_ADDR + 0x4);
436 reg = readl(GPIO4_BASE_ADDR + 0x0);
438 writel(reg, GPIO4_BASE_ADDR + 0x0);
442 #ifdef CONFIG_CMD_MMC
444 struct fsl_esdhc_cfg esdhc_cfg[3] = {
445 {MMC_SDHC1_BASE_ADDR, 1, 1},
446 {MMC_SDHC2_BASE_ADDR, 1, 1},
447 {MMC_SDHC3_BASE_ADDR, 1, 1},
451 #ifdef CONFIG_DYNAMIC_MMC_DEVNO
452 int get_mmc_env_devno()
454 uint soc_sbmr = readl(SRC_BASE_ADDR + 0x4);
457 switch (soc_sbmr & 0x00300000) {
475 int esdhc_gpio_init(bd_t *bis)
480 for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM;
484 mxc_request_iomux(MX50_PIN_SD1_CMD, IOMUX_CONFIG_ALT0);
485 mxc_request_iomux(MX50_PIN_SD1_CLK, IOMUX_CONFIG_ALT0);
486 mxc_request_iomux(MX50_PIN_SD1_D0, IOMUX_CONFIG_ALT0);
487 mxc_request_iomux(MX50_PIN_SD1_D1, IOMUX_CONFIG_ALT0);
488 mxc_request_iomux(MX50_PIN_SD1_D2, IOMUX_CONFIG_ALT0);
489 mxc_request_iomux(MX50_PIN_SD1_D3, IOMUX_CONFIG_ALT0);
491 mxc_iomux_set_pad(MX50_PIN_SD1_CMD, 0x1E4);
492 mxc_iomux_set_pad(MX50_PIN_SD1_CLK, 0xD4);
493 mxc_iomux_set_pad(MX50_PIN_SD1_D0, 0x1D4);
494 mxc_iomux_set_pad(MX50_PIN_SD1_D1, 0x1D4);
495 mxc_iomux_set_pad(MX50_PIN_SD1_D2, 0x1D4);
496 mxc_iomux_set_pad(MX50_PIN_SD1_D3, 0x1D4);
500 mxc_request_iomux(MX50_PIN_SD2_CMD, IOMUX_CONFIG_ALT0);
501 mxc_request_iomux(MX50_PIN_SD2_CLK, IOMUX_CONFIG_ALT0);
502 mxc_request_iomux(MX50_PIN_SD2_D0, IOMUX_CONFIG_ALT0);
503 mxc_request_iomux(MX50_PIN_SD2_D1, IOMUX_CONFIG_ALT0);
504 mxc_request_iomux(MX50_PIN_SD2_D2, IOMUX_CONFIG_ALT0);
505 mxc_request_iomux(MX50_PIN_SD2_D3, IOMUX_CONFIG_ALT0);
506 mxc_request_iomux(MX50_PIN_SD2_D4, IOMUX_CONFIG_ALT0);
507 mxc_request_iomux(MX50_PIN_SD2_D5, IOMUX_CONFIG_ALT0);
508 mxc_request_iomux(MX50_PIN_SD2_D6, IOMUX_CONFIG_ALT0);
509 mxc_request_iomux(MX50_PIN_SD2_D7, IOMUX_CONFIG_ALT0);
511 mxc_iomux_set_pad(MX50_PIN_SD2_CMD, 0x14);
512 mxc_iomux_set_pad(MX50_PIN_SD2_CLK, 0xD4);
513 mxc_iomux_set_pad(MX50_PIN_SD2_D0, 0x1D4);
514 mxc_iomux_set_pad(MX50_PIN_SD2_D1, 0x1D4);
515 mxc_iomux_set_pad(MX50_PIN_SD2_D2, 0x1D4);
516 mxc_iomux_set_pad(MX50_PIN_SD2_D3, 0x1D4);
517 mxc_iomux_set_pad(MX50_PIN_SD2_D4, 0x1D4);
518 mxc_iomux_set_pad(MX50_PIN_SD2_D5, 0x1D4);
519 mxc_iomux_set_pad(MX50_PIN_SD2_D6, 0x1D4);
520 mxc_iomux_set_pad(MX50_PIN_SD2_D7, 0x1D4);
524 mxc_request_iomux(MX50_PIN_SD3_CMD, IOMUX_CONFIG_ALT0);
525 mxc_request_iomux(MX50_PIN_SD3_CLK, IOMUX_CONFIG_ALT0);
526 mxc_request_iomux(MX50_PIN_SD3_D0, IOMUX_CONFIG_ALT0);
527 mxc_request_iomux(MX50_PIN_SD3_D1, IOMUX_CONFIG_ALT0);
528 mxc_request_iomux(MX50_PIN_SD3_D2, IOMUX_CONFIG_ALT0);
529 mxc_request_iomux(MX50_PIN_SD3_D3, IOMUX_CONFIG_ALT0);
530 mxc_request_iomux(MX50_PIN_SD3_D4, IOMUX_CONFIG_ALT0);
531 mxc_request_iomux(MX50_PIN_SD3_D5, IOMUX_CONFIG_ALT0);
532 mxc_request_iomux(MX50_PIN_SD3_D6, IOMUX_CONFIG_ALT0);
533 mxc_request_iomux(MX50_PIN_SD3_D7, IOMUX_CONFIG_ALT0);
535 mxc_iomux_set_pad(MX50_PIN_SD3_CMD, 0x1E4);
536 mxc_iomux_set_pad(MX50_PIN_SD3_CLK, 0xD4);
537 mxc_iomux_set_pad(MX50_PIN_SD3_D0, 0x1D4);
538 mxc_iomux_set_pad(MX50_PIN_SD3_D1, 0x1D4);
539 mxc_iomux_set_pad(MX50_PIN_SD3_D2, 0x1D4);
540 mxc_iomux_set_pad(MX50_PIN_SD3_D3, 0x1D4);
541 mxc_iomux_set_pad(MX50_PIN_SD3_D4, 0x1D4);
542 mxc_iomux_set_pad(MX50_PIN_SD3_D5, 0x1D4);
543 mxc_iomux_set_pad(MX50_PIN_SD3_D6, 0x1D4);
544 mxc_iomux_set_pad(MX50_PIN_SD3_D7, 0x1D4);
548 printf("Warning: you configured more ESDHC controller"
549 "(%d) as supported by the board(2)\n",
550 CONFIG_SYS_FSL_ESDHC_NUM);
554 status |= fsl_esdhc_initialize(bis, &esdhc_cfg[index]);
560 int board_mmc_init(bd_t *bis)
562 if (!esdhc_gpio_init(bis))
570 #ifdef CONFIG_MXC_EPDC
571 #ifdef CONFIG_SPLASH_SCREEN
572 int setup_splash_img()
574 #ifdef CONFIG_SPLASH_IS_IN_MMC
575 int mmc_dev = get_mmc_env_devno();
576 ulong offset = CONFIG_SPLASH_IMG_OFFSET;
577 ulong size = CONFIG_SPLASH_IMG_SIZE;
580 struct mmc *mmc = find_mmc_device(mmc_dev);
581 uint blk_start, blk_cnt, n;
583 s = getenv("splashimage");
586 puts("env splashimage not found!\n");
589 addr = simple_strtoul(s, NULL, 16);
592 printf("MMC Device %d not found\n",
598 puts("MMC init failed\n");
602 blk_start = ALIGN(offset, mmc->read_bl_len) / mmc->read_bl_len;
603 blk_cnt = ALIGN(size, mmc->read_bl_len) / mmc->read_bl_len;
604 n = mmc->block_dev.block_read(mmc_dev, blk_start,
605 blk_cnt, (u_char *)addr);
606 flush_cache((ulong)addr, blk_cnt * mmc->read_bl_len);
608 return (n == blk_cnt) ? 0 : -1;
613 vidinfo_t panel_info = {
617 .vl_pixclock = 17700000,
619 .vl_right_margin = 142,
620 .vl_upper_margin = 4,
621 .vl_lower_margin = 10,
631 static void setup_epdc_power()
635 /* Setup epdc voltage */
637 /* EPDC PWRSTAT - GPIO3[28] for PWR_GOOD status */
638 mxc_request_iomux(MX50_PIN_EPDC_PWRSTAT, IOMUX_CONFIG_ALT1);
640 /* EPDC VCOM0 - GPIO4[21] for VCOM control */
641 mxc_request_iomux(MX50_PIN_EPDC_VCOM0, IOMUX_CONFIG_ALT1);
643 reg = readl(GPIO4_BASE_ADDR + 0x4);
645 writel(reg, GPIO4_BASE_ADDR + 0x4);
647 /* UART4 TXD - GPIO6[16] for EPD PMIC WAKEUP */
648 mxc_request_iomux(MX50_PIN_UART4_TXD, IOMUX_CONFIG_ALT1);
650 reg = readl(GPIO6_BASE_ADDR + 0x4);
652 writel(reg, GPIO6_BASE_ADDR + 0x4);
659 /* Set PMIC Wakeup to high - enable Display power */
660 reg = readl(GPIO6_BASE_ADDR + 0x0);
662 writel(reg, GPIO6_BASE_ADDR + 0x0);
664 /* Wait for PWRGOOD == 1 */
666 reg = readl(GPIO3_BASE_ADDR + 0x0);
667 if (!(reg & (1 << 28)))
674 reg = readl(GPIO4_BASE_ADDR + 0x0);
676 writel(reg, GPIO4_BASE_ADDR + 0x0);
678 reg = readl(GPIO4_BASE_ADDR + 0x0);
683 void epdc_power_off()
686 /* Set PMIC Wakeup to low - disable Display power */
687 reg = readl(GPIO6_BASE_ADDR + 0x0);
689 writel(reg, GPIO6_BASE_ADDR + 0x0);
692 reg = readl(GPIO4_BASE_ADDR + 0x0);
694 writel(reg, GPIO4_BASE_ADDR + 0x0);
697 int setup_waveform_file()
699 #ifdef CONFIG_WAVEFORM_FILE_IN_MMC
700 int mmc_dev = get_mmc_env_devno();
701 ulong offset = CONFIG_WAVEFORM_FILE_OFFSET;
702 ulong size = CONFIG_WAVEFORM_FILE_SIZE;
703 ulong addr = CONFIG_WAVEFORM_BUF_ADDR;
705 struct mmc *mmc = find_mmc_device(mmc_dev);
706 uint blk_start, blk_cnt, n;
709 printf("MMC Device %d not found\n",
715 puts("MMC init failed\n");
719 blk_start = ALIGN(offset, mmc->read_bl_len) / mmc->read_bl_len;
720 blk_cnt = ALIGN(size, mmc->read_bl_len) / mmc->read_bl_len;
721 n = mmc->block_dev.block_read(mmc_dev, blk_start,
722 blk_cnt, (u_char *)addr);
723 flush_cache((ulong)addr, blk_cnt * mmc->read_bl_len);
725 return (n == blk_cnt) ? 0 : -1;
731 static void setup_epdc()
735 /* epdc iomux settings */
736 mxc_request_iomux(MX50_PIN_EPDC_D0, IOMUX_CONFIG_ALT0);
737 mxc_request_iomux(MX50_PIN_EPDC_D1, IOMUX_CONFIG_ALT0);
738 mxc_request_iomux(MX50_PIN_EPDC_D2, IOMUX_CONFIG_ALT0);
739 mxc_request_iomux(MX50_PIN_EPDC_D3, IOMUX_CONFIG_ALT0);
740 mxc_request_iomux(MX50_PIN_EPDC_D4, IOMUX_CONFIG_ALT0);
741 mxc_request_iomux(MX50_PIN_EPDC_D5, IOMUX_CONFIG_ALT0);
742 mxc_request_iomux(MX50_PIN_EPDC_D6, IOMUX_CONFIG_ALT0);
743 mxc_request_iomux(MX50_PIN_EPDC_D7, IOMUX_CONFIG_ALT0);
744 mxc_request_iomux(MX50_PIN_EPDC_GDCLK, IOMUX_CONFIG_ALT0);
745 mxc_request_iomux(MX50_PIN_EPDC_GDSP, IOMUX_CONFIG_ALT0);
746 mxc_request_iomux(MX50_PIN_EPDC_GDOE, IOMUX_CONFIG_ALT0);
747 mxc_request_iomux(MX50_PIN_EPDC_GDRL, IOMUX_CONFIG_ALT0);
748 mxc_request_iomux(MX50_PIN_EPDC_SDCLK, IOMUX_CONFIG_ALT0);
749 mxc_request_iomux(MX50_PIN_EPDC_SDOE, IOMUX_CONFIG_ALT0);
750 mxc_request_iomux(MX50_PIN_EPDC_SDLE, IOMUX_CONFIG_ALT0);
751 mxc_request_iomux(MX50_PIN_EPDC_SDSHR, IOMUX_CONFIG_ALT0);
752 mxc_request_iomux(MX50_PIN_EPDC_BDR0, IOMUX_CONFIG_ALT0);
753 mxc_request_iomux(MX50_PIN_EPDC_SDCE0, IOMUX_CONFIG_ALT0);
754 mxc_request_iomux(MX50_PIN_EPDC_SDCE1, IOMUX_CONFIG_ALT0);
755 mxc_request_iomux(MX50_PIN_EPDC_SDCE2, IOMUX_CONFIG_ALT0);
758 /*** epdc Maxim PMIC settings ***/
760 /* EPDC PWRSTAT - GPIO3[28] for PWR_GOOD status */
761 mxc_request_iomux(MX50_PIN_EPDC_PWRSTAT, IOMUX_CONFIG_ALT1);
763 /* EPDC VCOM0 - GPIO4[21] for VCOM control */
764 mxc_request_iomux(MX50_PIN_EPDC_VCOM0, IOMUX_CONFIG_ALT1);
766 /* UART4 TXD - GPIO6[16] for EPD PMIC WAKEUP */
767 mxc_request_iomux(MX50_PIN_UART4_TXD, IOMUX_CONFIG_ALT1);
770 /*** Set pixel clock rates for EPDC ***/
772 /* EPDC AXI clk and EPDC PIX clk from PLL1 */
773 reg = readl(CCM_BASE_ADDR + CLKCTL_CLKSEQ_BYPASS);
775 reg |= (0x2 << 4) | (0x2 << 12);
776 writel(reg, CCM_BASE_ADDR + CLKCTL_CLKSEQ_BYPASS);
778 /* EPDC AXI clk enable and set to 200MHz (800/4) */
779 reg = readl(CCM_BASE_ADDR + 0xA8);
780 reg &= ~((0x3 << 30) | 0x3F);
781 reg |= (0x2 << 30) | 0x4;
782 writel(reg, CCM_BASE_ADDR + 0xA8);
784 /* EPDC PIX clk enable and set to 20MHz (800/40) */
785 reg = readl(CCM_BASE_ADDR + 0xA0);
786 reg &= ~((0x3 << 30) | (0x3 << 12) | 0x3F);
787 reg |= (0x2 << 30) | (0x1 << 12) | 0x2D;
788 writel(reg, CCM_BASE_ADDR + 0xA0);
790 panel_info.epdc_data.working_buf_addr = CONFIG_WORKING_BUF_ADDR;
791 panel_info.epdc_data.waveform_buf_addr = CONFIG_WAVEFORM_BUF_ADDR;
793 panel_info.epdc_data.wv_modes.mode_init = 0;
794 panel_info.epdc_data.wv_modes.mode_du = 1;
795 panel_info.epdc_data.wv_modes.mode_gc4 = 3;
796 panel_info.epdc_data.wv_modes.mode_gc8 = 2;
797 panel_info.epdc_data.wv_modes.mode_gc16 = 2;
798 panel_info.epdc_data.wv_modes.mode_gc32 = 2;
803 gd->fb_base = CONFIG_FB_BASE;
807 #ifdef CONFIG_IMX_CSPI
808 static void setup_power(void)
810 struct spi_slave *slave;
814 puts("PMIC Mode: SPI\n");
816 /* Enable VGEN1 to enable ethernet */
817 slave = spi_pmic_probe();
819 val = pmic_reg(slave, 30, 0, 0);
821 pmic_reg(slave, 30, val, 1);
823 val = pmic_reg(slave, 32, 0, 0);
825 pmic_reg(slave, 32, val, 1);
828 val = pmic_reg(slave, 33, 0, 0);
830 pmic_reg(slave, 33, val, 1);
832 spi_pmic_free(slave);
835 void setup_voltage_cpu(void)
837 /* Currently VDDGP 1.05v
838 * no one tell me we need increase the core
839 * voltage to let CPU run at 800Mhz, not do it
842 /* Raise the core frequency to 800MHz */
843 writel(0x0, CCM_BASE_ADDR + CLKCTL_CACRR);
851 /* MFG firmware need reset usb to avoid host crash firstly */
853 int val = readl(OTG_BASE_ADDR + USBCMD);
854 val &= ~0x1; /*RS bit*/
855 writel(val, OTG_BASE_ADDR + USBCMD);
863 /* arch id for linux */
864 gd->bd->bi_arch_number = MACH_TYPE_MX50_ARM2;
866 /* boot parameters */
867 gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
872 #ifdef CONFIG_MXC_FEC
877 #ifdef CONFIG_MXC_EPDC
884 int board_late_init(void)
886 #ifdef CONFIG_IMX_CSPI
894 printf("Board: MX50 ARM2 board\n");
896 printf("Boot Reason: [");
898 switch (__REG(SRC_BASE_ADDR + 0x8)) {
914 printf("Boot Device: ");
915 switch (get_boot_device()) {
920 printf("ONE NAND\n");