14a442d31STsiChungLiew /*
24a442d31STsiChungLiew * (C) Copyright 2000-2003
34a442d31STsiChungLiew * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
44a442d31STsiChungLiew *
5c6d88630SAlison Wang * Copyright (C) 2004-2007, 2012 Freescale Semiconductor, Inc.
64a442d31STsiChungLiew * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
74a442d31STsiChungLiew *
81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
94a442d31STsiChungLiew */
104a442d31STsiChungLiew
114a442d31STsiChungLiew #include <config.h>
124a442d31STsiChungLiew #include <common.h>
134a442d31STsiChungLiew #include <asm/immap.h>
14c6d88630SAlison Wang #include <asm/io.h>
154a442d31STsiChungLiew
164a442d31STsiChungLiew DECLARE_GLOBAL_DATA_PTR;
174a442d31STsiChungLiew
checkboard(void)184a442d31STsiChungLiew int checkboard(void)
194a442d31STsiChungLiew {
204a442d31STsiChungLiew puts("Board: ");
214a442d31STsiChungLiew puts("Freescale M5235 EVB\n");
224a442d31STsiChungLiew return 0;
234a442d31STsiChungLiew };
244a442d31STsiChungLiew
dram_init(void)25*f1683aa7SSimon Glass int dram_init(void)
264a442d31STsiChungLiew {
27c6d88630SAlison Wang sdram_t *sdram = (sdram_t *)(MMAP_SDRAM);
28c6d88630SAlison Wang gpio_t *gpio = (gpio_t *)(MMAP_GPIO);
294a442d31STsiChungLiew u32 dramsize, i, dramclk;
304a442d31STsiChungLiew
314a442d31STsiChungLiew /*
324a442d31STsiChungLiew * When booting from external Flash, the port-size is less than
334a442d31STsiChungLiew * the port-size of SDRAM. In this case it is necessary to enable
344a442d31STsiChungLiew * Data[15:0] on Port Address/Data.
354a442d31STsiChungLiew */
36c6d88630SAlison Wang out_8(&gpio->par_ad,
374a442d31STsiChungLiew GPIO_PAR_AD_ADDR23 | GPIO_PAR_AD_ADDR22 | GPIO_PAR_AD_ADDR21 |
38c6d88630SAlison Wang GPIO_PAR_AD_DATAL);
394a442d31STsiChungLiew
404a442d31STsiChungLiew /* Initialize PAR to enable SDRAM signals */
41c6d88630SAlison Wang out_8(&gpio->par_sdram,
42c6d88630SAlison Wang GPIO_PAR_SDRAM_SDWE | GPIO_PAR_SDRAM_SCAS |
43c6d88630SAlison Wang GPIO_PAR_SDRAM_SRAS | GPIO_PAR_SDRAM_SCKE |
44c6d88630SAlison Wang GPIO_PAR_SDRAM_SDCS(3));
454a442d31STsiChungLiew
466d0f6bcfSJean-Christophe PLAGNIOL-VILLARD dramsize = CONFIG_SYS_SDRAM_SIZE * 0x100000;
474a442d31STsiChungLiew for (i = 0x13; i < 0x20; i++) {
484a442d31STsiChungLiew if (dramsize == (1 << i))
494a442d31STsiChungLiew break;
504a442d31STsiChungLiew }
514a442d31STsiChungLiew i--;
524a442d31STsiChungLiew
53c6d88630SAlison Wang if (!(in_be32(&sdram->dacr0) & SDRAMC_DARCn_RE)) {
546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD dramclk = gd->bus_clk / (CONFIG_SYS_HZ * CONFIG_SYS_HZ);
554a442d31STsiChungLiew
564a442d31STsiChungLiew /* Initialize DRAM Control Register: DCR */
57c6d88630SAlison Wang out_be16(&sdram->dcr, SDRAMC_DCR_RTIM_9CLKS |
58c6d88630SAlison Wang SDRAMC_DCR_RTIM_6CLKS |
59c6d88630SAlison Wang SDRAMC_DCR_RC((15 * dramclk) >> 4));
604a442d31STsiChungLiew
614a442d31STsiChungLiew /* Initialize DACR0 */
62c6d88630SAlison Wang out_be32(&sdram->dacr0,
63c6d88630SAlison Wang SDRAMC_DARCn_BA(CONFIG_SYS_SDRAM_BASE) |
64c6d88630SAlison Wang SDRAMC_DARCn_CASL_C1 | SDRAMC_DARCn_CBM_CMD20 |
65c6d88630SAlison Wang SDRAMC_DARCn_PS_32);
66ab4860b2STsiChung Liew asm("nop");
674a442d31STsiChungLiew
684a442d31STsiChungLiew /* Initialize DMR0 */
69c6d88630SAlison Wang out_be32(&sdram->dmr0,
70c6d88630SAlison Wang ((dramsize - 1) & 0xFFFC0000) | SDRAMC_DMRn_V);
71ab4860b2STsiChung Liew asm("nop");
724a442d31STsiChungLiew
734a442d31STsiChungLiew /* Set IP (bit 3) in DACR */
74c6d88630SAlison Wang setbits_be32(&sdram->dacr0, SDRAMC_DARCn_IP);
754a442d31STsiChungLiew
764a442d31STsiChungLiew /* Wait 30ns to allow banks to precharge */
774a442d31STsiChungLiew for (i = 0; i < 5; i++) {
784a442d31STsiChungLiew asm("nop");
794a442d31STsiChungLiew }
804a442d31STsiChungLiew
814a442d31STsiChungLiew /* Write to this block to initiate precharge */
826d0f6bcfSJean-Christophe PLAGNIOL-VILLARD *(u32 *) (CONFIG_SYS_SDRAM_BASE) = 0xA5A59696;
834a442d31STsiChungLiew
844a442d31STsiChungLiew /* Set RE (bit 15) in DACR */
85c6d88630SAlison Wang setbits_be32(&sdram->dacr0, SDRAMC_DARCn_RE);
864a442d31STsiChungLiew
874a442d31STsiChungLiew /* Wait for at least 8 auto refresh cycles to occur */
884a442d31STsiChungLiew for (i = 0; i < 0x2000; i++) {
894a442d31STsiChungLiew asm("nop");
904a442d31STsiChungLiew }
914a442d31STsiChungLiew
924a442d31STsiChungLiew /* Finish the configuration by issuing the MRS. */
93c6d88630SAlison Wang setbits_be32(&sdram->dacr0, SDRAMC_DARCn_IMRS);
94ab4860b2STsiChung Liew asm("nop");
954a442d31STsiChungLiew
964a442d31STsiChungLiew /* Write to the SDRAM Mode Register */
976d0f6bcfSJean-Christophe PLAGNIOL-VILLARD *(u32 *) (CONFIG_SYS_SDRAM_BASE + 0x400) = 0xA5A59696;
984a442d31STsiChungLiew }
994a442d31STsiChungLiew
100088454cdSSimon Glass gd->ram_size = dramsize;
101088454cdSSimon Glass
102088454cdSSimon Glass return 0;
1034a442d31STsiChungLiew };
1044a442d31STsiChungLiew
testdram(void)1054a442d31STsiChungLiew int testdram(void)
1064a442d31STsiChungLiew {
1074a442d31STsiChungLiew /* TODO: XXX XXX XXX */
1084a442d31STsiChungLiew printf("DRAM test not implemented!\n");
1094a442d31STsiChungLiew
1104a442d31STsiChungLiew return (0);
1114a442d31STsiChungLiew }
112