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/mx53.h>
28 #include <asm/arch/mx53_pins.h>
29 #include <asm/arch/iomux.h>
30 #include <asm/errno.h>
39 #include <fsl_esdhc.h>
42 #ifdef CONFIG_ARCH_MMU
44 #include <asm/arch/mmu.h>
47 #ifdef CONFIG_GET_FEC_MAC_ADDR_FROM_IIM
48 #include <asm/imx_iim.h>
51 #ifdef CONFIG_CMD_CLOCK
52 #include <asm/clock.h>
55 DECLARE_GLOBAL_DATA_PTR;
57 static u32 system_rev;
58 static enum boot_device boot_dev;
60 static inline void setup_boot_device(void)
62 uint soc_sbmr = readl(SRC_BASE_ADDR + 0x4);
63 uint bt_mem_ctl = (soc_sbmr & 0x000000FF) >> 4 ;
64 uint bt_mem_type = (soc_sbmr & 0x00000008) >> 3;
69 boot_dev = ONE_NAND_BOOT;
71 boot_dev = WEIM_NOR_BOOT;
81 boot_dev = SPI_NOR_BOOT;
97 boot_dev = UNKNOWN_BOOT;
102 enum boot_device get_boot_device(void)
107 u32 get_board_rev(void)
112 static inline void setup_soc_rev(void)
114 system_rev = 0x53000 | CHIP_REV_1_0;
117 static inline void setup_board_rev(int rev)
119 system_rev |= (rev & 0xF) << 8;
122 inline int is_soc_rev(int rev)
124 return (system_rev & 0xFF) - rev;
127 #ifdef CONFIG_ARCH_MMU
128 void board_mmu_init(void)
130 unsigned long ttb_base = PHYS_SDRAM_1 + 0x4000;
134 * Set the TTB register
136 asm volatile ("mcr p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/);
139 * Set the Domain Access Control Register
141 i = ARM_ACCESS_DACR_DEFAULT;
142 asm volatile ("mcr p15,0,%0,c3,c0,0" : : "r"(i) /*:*/);
145 * First clear all TT entries - ie Set them to Faulting
147 memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE);
148 /* Actual Virtual Size Attributes Function */
149 /* Base Base MB cached? buffered? access permissions */
150 /* xxx00000 xxx00000 */
151 X_ARM_MMU_SECTION(0x000, 0x000, 0x10,
152 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
153 ARM_ACCESS_PERM_RW_RW); /* ROM, 16M */
154 X_ARM_MMU_SECTION(0x070, 0x070, 0x010,
155 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
156 ARM_ACCESS_PERM_RW_RW); /* IRAM */
157 X_ARM_MMU_SECTION(0x100, 0x100, 0x040,
158 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
159 ARM_ACCESS_PERM_RW_RW); /* SATA */
160 X_ARM_MMU_SECTION(0x180, 0x180, 0x100,
161 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
162 ARM_ACCESS_PERM_RW_RW); /* IPUv3M */
163 X_ARM_MMU_SECTION(0x200, 0x200, 0x200,
164 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
165 ARM_ACCESS_PERM_RW_RW); /* GPU */
166 X_ARM_MMU_SECTION(0x400, 0x400, 0x300,
167 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
168 ARM_ACCESS_PERM_RW_RW); /* periperals */
169 X_ARM_MMU_SECTION(0x700, 0x700, 0x400,
170 ARM_CACHEABLE, ARM_BUFFERABLE,
171 ARM_ACCESS_PERM_RW_RW); /* CSD0 1G */
172 X_ARM_MMU_SECTION(0x700, 0xB00, 0x400,
173 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
174 ARM_ACCESS_PERM_RW_RW); /* CSD0 1G */
175 X_ARM_MMU_SECTION(0xF00, 0xF00, 0x100,
176 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
177 ARM_ACCESS_PERM_RW_RW); /* CS1 EIM control*/
178 X_ARM_MMU_SECTION(0xF7F, 0xF7F, 0x040,
179 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
180 ARM_ACCESS_PERM_RW_RW); /* NAND Flash buffer */
181 X_ARM_MMU_SECTION(0xF80, 0xF80, 0x001,
182 ARM_UNCACHEABLE, ARM_UNBUFFERABLE,
183 ARM_ACCESS_PERM_RW_RW); /* iRam */
185 /* Workaround for arm errata #709718 */
186 /* Setup PRRR so device is always mapped to non-shared */
187 asm volatile ("mrc p15, 0, %0, c10, c2, 0" : "=r"(i) : /*:*/);
189 asm volatile ("mcr p15, 0, %0, c10, c2, 0" : : "r"(i) /*:*/);
198 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
199 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
203 static void setup_uart(void)
207 mxc_request_iomux(MX53_PIN_CSI0_D11, IOMUX_CONFIG_ALT2);
208 mxc_iomux_set_pad(MX53_PIN_CSI0_D11, 0x1E4);
209 mxc_iomux_set_input(MUX_IN_UART1_IPP_UART_RXD_MUX_SELECT_INPUT, 0x1);
212 mxc_request_iomux(MX53_PIN_CSI0_D10, IOMUX_CONFIG_ALT2);
213 mxc_iomux_set_pad(MX53_PIN_CSI0_D10, 0x1E4);
216 #ifdef CONFIG_I2C_MXC
217 static void setup_i2c(unsigned int module_base)
219 switch (module_base) {
222 mxc_request_iomux(MX53_PIN_CSI0_D8,
223 IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION);
224 mxc_iomux_set_input(MUX_IN_I2C1_IPP_SDA_IN_SELECT_INPUT,
226 mxc_iomux_set_pad(MX53_PIN_CSI0_D8, PAD_CTL_SRE_FAST |
227 PAD_CTL_ODE_OPENDRAIN_ENABLE |
228 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
231 mxc_request_iomux(MX53_PIN_CSI0_D9,
232 IOMUX_CONFIG_ALT5 | IOMUX_CONFIG_SION);
233 mxc_iomux_set_input(MUX_IN_I2C1_IPP_SCL_IN_SELECT_INPUT,
235 mxc_iomux_set_pad(MX53_PIN_CSI0_D9, PAD_CTL_SRE_FAST |
236 PAD_CTL_ODE_OPENDRAIN_ENABLE |
237 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
242 mxc_request_iomux(MX53_PIN_KEY_ROW3,
243 IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION);
244 mxc_iomux_set_input(MUX_IN_I2C2_IPP_SDA_IN_SELECT_INPUT,
246 mxc_iomux_set_pad(MX53_PIN_KEY_ROW3,
248 PAD_CTL_ODE_OPENDRAIN_ENABLE |
249 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
253 mxc_request_iomux(MX53_PIN_KEY_COL3,
254 IOMUX_CONFIG_ALT4 | IOMUX_CONFIG_SION);
255 mxc_iomux_set_input(MUX_IN_I2C2_IPP_SCL_IN_SELECT_INPUT,
257 mxc_iomux_set_pad(MX53_PIN_KEY_COL3,
259 PAD_CTL_ODE_OPENDRAIN_ENABLE |
260 PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU |
264 printf("Invalid I2C base: 0x%x\n", module_base);
269 void setup_core_voltages(void)
271 unsigned char buf[4] = { 0 };
273 i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
275 /* Set core voltage VDDGP to 1.05V for 800MHZ */
279 if (i2c_write(0x8, 24, 1, buf, 3))
282 /* Set DDR voltage VDDA to 1.25V */
286 if (i2c_write(0x8, 26, 1, buf, 3))
289 /* Raise the core frequency to 800MHz */
290 writel(0x0, CCM_BASE_ADDR + CLKCTL_CACRR);
293 #ifndef CONFIG_MX53_ARM2
294 static int __read_adc_channel(unsigned int chan)
296 unsigned char buf[4] = { 0 };
298 buf[0] = (0xb0 | ((chan & 0x1) << 3) | ((chan >> 1) & 0x7));
300 /* LTC2495 need 410ms delay */
303 if (i2c_write(0x14, chan, 0, &buf[0], 1)) {
304 printf("%s:i2c_write:error\n", __func__);
308 /* LTC2495 need 410ms delay*/
311 if (i2c_read(0x14, chan, 0, &buf[0], 3)) {
312 printf("%s:i2c_read:error\n", __func__);
316 return buf[0] << 16 | buf[1] << 8 | buf[2];
319 static int __lookup_board_id(int adc_val)
323 if (adc_val < 0x3FFFC0)
325 else if (adc_val < 0x461863)
327 else if (adc_val < 0x4C30C4)
329 else if (adc_val < 0x524926)
331 else if (adc_val < 0x586187)
333 else if (adc_val < 0x5E79E9)
335 else if (adc_val < 0x64924A)
337 else if (adc_val < 0x6AAAAC)
339 else if (adc_val < 0x70C30D)
341 else if (adc_val < 0x76DB6F)
343 else if (adc_val < 0x7CF3D0)
345 else if (adc_val < 0x830C32)
347 else if (adc_val < 0x892493)
349 else if (adc_val < 0x8F3CF5)
351 else if (adc_val < 0x955556)
353 else if (adc_val < 0x9B6DB8)
355 else if (adc_val < 0xA18619)
357 else if (adc_val < 0xA79E7B)
359 else if (adc_val < 0xADB6DC)
361 else if (adc_val < 0xB3CF3E)
363 else if (adc_val < 0xB9E79F)
365 else if (adc_val <= 0xC00000)
373 static int __print_board_info(int id0, int id1)
381 printf("MX53-EVK with DDR2 1GByte RevB\n");
385 printf("MX53-EVK with DDR2 2GByte RevA1\n");
389 printf("MX53-EVK with DDR2 2GByte RevA2\n");
392 printf("Unkown board id1:%d\n", id1);
402 printf("MX53 1.5V DDR3 x8 CPU Card, Rev. A\n");
406 printf("MX53 1.8V DDR2 x8 CPU Card, Rev. A\n");
410 printf("Unkown board id1:%d\n", id1);
418 printf("Unkown board id0:%d\n", id0);
426 static int _identify_board_fix_up(int id0, int id1)
430 #ifdef CONFIG_CMD_CLOCK
431 /* For EVK RevB, set DDR to 400MHz */
432 if (id0 == 21 && id1 == 15) {
433 ret = clk_config(CONFIG_REF_CLK_FREQ, 400, PERIPH_CLK);
437 ret = clk_config(CONFIG_REF_CLK_FREQ, 400, DDR_CLK);
441 /* set up rev #2 for EVK RevB board */
448 int identify_board_id(void)
453 #define CPU_CHANNEL_ID0 0xc
454 #define CPU_CHANNEL_ID1 0xd
456 ret = bd_id0 = __read_adc_channel(CPU_CHANNEL_ID0);
460 ret = bd_id1 = __read_adc_channel(CPU_CHANNEL_ID1);
464 ret = bd_id0 = __lookup_board_id(bd_id0);
468 ret = bd_id1 = __lookup_board_id(bd_id1);
472 ret = __print_board_info(bd_id0, bd_id1);
476 ret = _identify_board_fix_up(bd_id0, bd_id1);
484 #ifdef CONFIG_IMX_ECSPI
485 s32 spi_get_cfg(struct imx_spi_dev_t *dev)
487 switch (dev->slave.cs) {
490 dev->base = CSPI1_BASE_ADDR;
492 dev->ss_pol = IMX_SPI_ACTIVE_HIGH;
494 dev->fifo_sz = 64 * 4;
499 dev->base = CSPI1_BASE_ADDR;
501 dev->ss_pol = IMX_SPI_ACTIVE_LOW;
503 dev->fifo_sz = 64 * 4;
507 printf("Invalid Bus ID! \n");
514 void spi_io_init(struct imx_spi_dev_t *dev)
517 case CSPI1_BASE_ADDR:
518 /* Select mux mode: ALT4 mux port: MOSI of instance: ecspi1 */
519 mxc_request_iomux(MX53_PIN_EIM_D18, IOMUX_CONFIG_ALT4);
520 mxc_iomux_set_pad(MX53_PIN_EIM_D18, 0x104);
522 MUX_IN_ECSPI1_IPP_IND_MOSI_SELECT_INPUT, 0x3);
524 /* Select mux mode: ALT4 mux port: MISO of instance: ecspi1. */
525 mxc_request_iomux(MX53_PIN_EIM_D17, IOMUX_CONFIG_ALT4);
526 mxc_iomux_set_pad(MX53_PIN_EIM_D17, 0x104);
528 MUX_IN_ECSPI1_IPP_IND_MISO_SELECT_INPUT, 0x3);
531 /* de-select SS1 of instance: ecspi1. */
532 mxc_request_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT1);
533 mxc_iomux_set_pad(MX53_PIN_EIM_D19, 0x1E4);
535 /* mux mode: ALT4 mux port: SS0 of instance: ecspi1. */
536 mxc_request_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT4);
537 mxc_iomux_set_pad(MX53_PIN_EIM_EB2, 0x104);
539 MUX_IN_ECSPI1_IPP_IND_SS_B_1_SELECT_INPUT, 0x3);
540 } else if (dev->ss == 1) {
541 /* de-select SS0 of instance: ecspi1. */
542 mxc_request_iomux(MX53_PIN_EIM_EB2, IOMUX_CONFIG_ALT1);
543 mxc_iomux_set_pad(MX53_PIN_EIM_EB2, 0x1E4);
545 /* mux mode: ALT0 mux port: SS1 of instance: ecspi1. */
546 mxc_request_iomux(MX53_PIN_EIM_D19, IOMUX_CONFIG_ALT4);
547 mxc_iomux_set_pad(MX53_PIN_EIM_D19, 0x104);
549 MUX_IN_ECSPI1_IPP_IND_SS_B_2_SELECT_INPUT, 0x2);
552 /* Select mux mode: ALT0 mux port: SCLK of instance: ecspi1. */
553 mxc_request_iomux(MX53_PIN_EIM_D16, IOMUX_CONFIG_ALT4);
554 mxc_iomux_set_pad(MX53_PIN_EIM_D16, 0x104);
556 MUX_IN_CSPI_IPP_CSPI_CLK_IN_SELECT_INPUT, 0x3);
559 case CSPI2_BASE_ADDR:
567 #ifdef CONFIG_MXC_FEC
569 #ifdef CONFIG_GET_FEC_MAC_ADDR_FROM_IIM
571 int fec_get_mac_addr(unsigned char *mac)
574 (u32 *)(IIM_BASE_ADDR + IIM_BANK_AREA_1_OFFSET +
575 CONFIG_IIM_MAC_ADDR_OFFSET);
578 for (i = 0; i < 6; ++i, ++iim1_mac_base)
579 mac[i] = (u8)readl(iim1_mac_base);
585 static void setup_fec(void)
587 volatile unsigned int reg;
590 mxc_request_iomux(MX53_PIN_FEC_MDIO, IOMUX_CONFIG_ALT0);
591 mxc_iomux_set_pad(MX53_PIN_FEC_MDIO, 0x1FC);
592 mxc_iomux_set_input(MUX_IN_FEC_FEC_MDI_SELECT_INPUT, 0x1);
595 mxc_request_iomux(MX53_PIN_FEC_MDC, IOMUX_CONFIG_ALT0);
596 mxc_iomux_set_pad(MX53_PIN_FEC_MDC, 0x004);
599 mxc_request_iomux(MX53_PIN_FEC_RXD1, IOMUX_CONFIG_ALT0);
600 mxc_iomux_set_pad(MX53_PIN_FEC_RXD1, 0x180);
603 mxc_request_iomux(MX53_PIN_FEC_RXD0, IOMUX_CONFIG_ALT0);
604 mxc_iomux_set_pad(MX53_PIN_FEC_RXD0, 0x180);
607 mxc_request_iomux(MX53_PIN_FEC_TXD1, IOMUX_CONFIG_ALT0);
608 mxc_iomux_set_pad(MX53_PIN_FEC_TXD1, 0x004);
611 mxc_request_iomux(MX53_PIN_FEC_TXD0, IOMUX_CONFIG_ALT0);
612 mxc_iomux_set_pad(MX53_PIN_FEC_TXD0, 0x004);
615 mxc_request_iomux(MX53_PIN_FEC_TX_EN, IOMUX_CONFIG_ALT0);
616 mxc_iomux_set_pad(MX53_PIN_FEC_TX_EN, 0x004);
619 mxc_request_iomux(MX53_PIN_FEC_REF_CLK, IOMUX_CONFIG_ALT0);
620 mxc_iomux_set_pad(MX53_PIN_FEC_REF_CLK, 0x180);
623 mxc_request_iomux(MX53_PIN_FEC_RX_ER, IOMUX_CONFIG_ALT0);
624 mxc_iomux_set_pad(MX53_PIN_FEC_RX_ER, 0x180);
627 mxc_request_iomux(MX53_PIN_FEC_CRS_DV, IOMUX_CONFIG_ALT0);
628 mxc_iomux_set_pad(MX53_PIN_FEC_CRS_DV, 0x180);
630 /* phy reset: gpio7-6 */
631 mxc_request_iomux(MX53_PIN_ATA_DA_0, IOMUX_CONFIG_ALT1);
633 reg = readl(GPIO7_BASE_ADDR + 0x0);
635 writel(reg, GPIO7_BASE_ADDR + 0x0);
637 reg = readl(GPIO7_BASE_ADDR + 0x4);
639 writel(reg, GPIO7_BASE_ADDR + 0x4);
643 reg = readl(GPIO7_BASE_ADDR + 0x0);
645 writel(reg, GPIO7_BASE_ADDR + 0x0);
650 #ifdef CONFIG_CMD_MMC
652 struct fsl_esdhc_cfg esdhc_cfg[2] = {
653 {MMC_SDHC1_BASE_ADDR, 1, 1},
654 {MMC_SDHC3_BASE_ADDR, 1, 1},
657 #ifdef CONFIG_DYNAMIC_MMC_DEVNO
658 int get_mmc_env_devno()
660 uint soc_sbmr = readl(SRC_BASE_ADDR + 0x4);
661 return (soc_sbmr & 0x00300000) ? 1 : 0;
666 int esdhc_gpio_init(bd_t *bis)
671 for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM;
675 mxc_request_iomux(MX53_PIN_SD1_CMD, IOMUX_CONFIG_ALT0);
676 mxc_request_iomux(MX53_PIN_SD1_CLK, IOMUX_CONFIG_ALT0);
677 mxc_request_iomux(MX53_PIN_SD1_DATA0,
679 mxc_request_iomux(MX53_PIN_SD1_DATA1,
681 mxc_request_iomux(MX53_PIN_SD1_DATA2,
683 mxc_request_iomux(MX53_PIN_SD1_DATA3,
686 mxc_iomux_set_pad(MX53_PIN_SD1_CMD, 0x1E4);
687 mxc_iomux_set_pad(MX53_PIN_SD1_CLK, 0xD4);
688 mxc_iomux_set_pad(MX53_PIN_SD1_DATA0, 0x1D4);
689 mxc_iomux_set_pad(MX53_PIN_SD1_DATA1, 0x1D4);
690 mxc_iomux_set_pad(MX53_PIN_SD1_DATA2, 0x1D4);
691 mxc_iomux_set_pad(MX53_PIN_SD1_DATA3, 0x1D4);
694 mxc_request_iomux(MX53_PIN_ATA_RESET_B,
696 mxc_request_iomux(MX53_PIN_ATA_IORDY,
698 mxc_request_iomux(MX53_PIN_ATA_DATA8,
700 mxc_request_iomux(MX53_PIN_ATA_DATA9,
702 mxc_request_iomux(MX53_PIN_ATA_DATA10,
704 mxc_request_iomux(MX53_PIN_ATA_DATA11,
706 mxc_request_iomux(MX53_PIN_ATA_DATA0,
708 mxc_request_iomux(MX53_PIN_ATA_DATA1,
710 mxc_request_iomux(MX53_PIN_ATA_DATA2,
712 mxc_request_iomux(MX53_PIN_ATA_DATA3,
715 mxc_iomux_set_pad(MX53_PIN_ATA_RESET_B, 0x1E4);
716 mxc_iomux_set_pad(MX53_PIN_ATA_IORDY, 0xD4);
717 mxc_iomux_set_pad(MX53_PIN_ATA_DATA8, 0x1D4);
718 mxc_iomux_set_pad(MX53_PIN_ATA_DATA9, 0x1D4);
719 mxc_iomux_set_pad(MX53_PIN_ATA_DATA10, 0x1D4);
720 mxc_iomux_set_pad(MX53_PIN_ATA_DATA11, 0x1D4);
721 mxc_iomux_set_pad(MX53_PIN_ATA_DATA0, 0x1D4);
722 mxc_iomux_set_pad(MX53_PIN_ATA_DATA1, 0x1D4);
723 mxc_iomux_set_pad(MX53_PIN_ATA_DATA2, 0x1D4);
724 mxc_iomux_set_pad(MX53_PIN_ATA_DATA3, 0x1D4);
728 printf("Warning: you configured more ESDHC controller"
729 "(%d) as supported by the board(2)\n",
730 CONFIG_SYS_FSL_ESDHC_NUM);
734 status |= fsl_esdhc_initialize(bis, &esdhc_cfg[index]);
740 int board_mmc_init(bd_t *bis)
742 if (!esdhc_gpio_init(bis))
753 /* MFG firmware need reset usb to avoid host crash firstly */
755 int val = readl(OTG_BASE_ADDR + USBCMD);
756 val &= ~0x1; /*RS bit*/
757 writel(val, OTG_BASE_ADDR + USBCMD);
761 #if defined(CONFIG_MX53_ARM2) || defined(CONFIG_MX53_ARM2_DDR3)
764 gd->bd->bi_arch_number = MACH_TYPE_MX53_EVK; /* board id for linux */
765 /* address of boot parameters */
766 gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
771 #ifdef CONFIG_I2C_MXC
772 setup_i2c(CONFIG_SYS_I2C_PORT);
773 setup_core_voltages();
779 int board_late_init(void)
788 #ifdef CONFIG_MX53_ARM2
789 printf("Board: MX53 ARMADILLO2 ");
792 #ifdef CONFIG_I2C_MXC
795 printf("Boot Reason: [");
799 switch (__REG(SRC_BASE_ADDR + 0x8)) {
815 printf("Boot Device: ");
816 switch (get_boot_device()) {
821 printf("ONE NAND\n");