xref: /rk3399_rockchip-uboot/board/freescale/m5235evb/m5235evb.c (revision f1683aa73c31db0a025e0254e6ce1ee7e56aad3e)
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