1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
21552af70STsiChungLiew /*
31552af70STsiChungLiew  * (C) Copyright 2000-2003
41552af70STsiChungLiew  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
51552af70STsiChungLiew  *
6849fc424SAlison Wang  * Copyright (C) 2004-2007, 2012 Freescale Semiconductor, Inc.
71552af70STsiChungLiew  * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
81552af70STsiChungLiew  */
91552af70STsiChungLiew 
101552af70STsiChungLiew #include <common.h>
111552af70STsiChungLiew #include <asm/immap.h>
12849fc424SAlison Wang #include <asm/io.h>
131552af70STsiChungLiew 
141552af70STsiChungLiew DECLARE_GLOBAL_DATA_PTR;
151552af70STsiChungLiew 
checkboard(void)161552af70STsiChungLiew int checkboard(void)
171552af70STsiChungLiew {
181552af70STsiChungLiew 	puts("Board: ");
191552af70STsiChungLiew 	puts("Freescale M52277 EVB\n");
201552af70STsiChungLiew 	return 0;
211552af70STsiChungLiew };
221552af70STsiChungLiew 
dram_init(void)23f1683aa7SSimon Glass int dram_init(void)
241552af70STsiChungLiew {
25a21d0c2cSTsiChung Liew 	u32 dramsize;
26a21d0c2cSTsiChung Liew 
27a21d0c2cSTsiChung Liew #ifdef CONFIG_CF_SBF
28a21d0c2cSTsiChung Liew 	/*
29a21d0c2cSTsiChung Liew 	 * Serial Boot: The dram is already initialized in start.S
30a21d0c2cSTsiChung Liew 	 * only require to return DRAM size
31a21d0c2cSTsiChung Liew 	 */
32a21d0c2cSTsiChung Liew 	dramsize = CONFIG_SYS_SDRAM_SIZE * 0x100000;
33a21d0c2cSTsiChung Liew #else
34849fc424SAlison Wang 	sdramc_t *sdram = (sdramc_t *)(MMAP_SDRAM);
35849fc424SAlison Wang 	gpio_t *gpio = (gpio_t *)(MMAP_GPIO);
36a21d0c2cSTsiChung Liew 	u32 i;
371552af70STsiChungLiew 
386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	dramsize = CONFIG_SYS_SDRAM_SIZE * 0x100000;
391552af70STsiChungLiew 
401552af70STsiChungLiew 	for (i = 0x13; i < 0x20; i++) {
411552af70STsiChungLiew 		if (dramsize == (1 << i))
421552af70STsiChungLiew 			break;
431552af70STsiChungLiew 	}
441552af70STsiChungLiew 	i--;
451552af70STsiChungLiew 
46849fc424SAlison Wang 	out_8(&gpio->mscr_sdram, CONFIG_SYS_SDRAM_DRV_STRENGTH);
47a21d0c2cSTsiChung Liew 
48849fc424SAlison Wang 	out_be32(&sdram->sdcs0, CONFIG_SYS_SDRAM_BASE | i);
491552af70STsiChungLiew 
50849fc424SAlison Wang 	out_be32(&sdram->sdcfg1, CONFIG_SYS_SDRAM_CFG1);
51849fc424SAlison Wang 	out_be32(&sdram->sdcfg2, CONFIG_SYS_SDRAM_CFG2);
521552af70STsiChungLiew 
531552af70STsiChungLiew 	/* Issue PALL */
54849fc424SAlison Wang 	out_be32(&sdram->sdcr, CONFIG_SYS_SDRAM_CTRL | 2);
55a21d0c2cSTsiChung Liew 	__asm__("nop");
561552af70STsiChungLiew 
571552af70STsiChungLiew 	/* Issue LEMR */
58849fc424SAlison Wang 	out_be32(&sdram->sdmr, CONFIG_SYS_SDRAM_MODE);
59a21d0c2cSTsiChung Liew 	__asm__("nop");
60849fc424SAlison Wang 	out_be32(&sdram->sdmr, CONFIG_SYS_SDRAM_EMOD);
61a21d0c2cSTsiChung Liew 	__asm__("nop");
621552af70STsiChungLiew 
631552af70STsiChungLiew 	udelay(1000);
641552af70STsiChungLiew 
651552af70STsiChungLiew 	/* Issue PALL */
66849fc424SAlison Wang 	out_be32(&sdram->sdcr, CONFIG_SYS_SDRAM_CTRL | 2);
67a21d0c2cSTsiChung Liew 	__asm__("nop");
681552af70STsiChungLiew 
691552af70STsiChungLiew 	/* Perform two refresh cycles */
70849fc424SAlison Wang 	out_be32(&sdram->sdcr, CONFIG_SYS_SDRAM_CTRL | 4);
71a21d0c2cSTsiChung Liew 	__asm__("nop");
72849fc424SAlison Wang 	out_be32(&sdram->sdcr, CONFIG_SYS_SDRAM_CTRL | 4);
73a21d0c2cSTsiChung Liew 	__asm__("nop");
741552af70STsiChungLiew 
75849fc424SAlison Wang 	out_be32(&sdram->sdcr,
76849fc424SAlison Wang 		(CONFIG_SYS_SDRAM_CTRL & ~0x80000000) | 0x10000c00);
771552af70STsiChungLiew 
781552af70STsiChungLiew 	udelay(100);
79a21d0c2cSTsiChung Liew #endif
80088454cdSSimon Glass 	gd->ram_size = dramsize;
81088454cdSSimon Glass 
82088454cdSSimon Glass 	return 0;
831552af70STsiChungLiew };
841552af70STsiChungLiew 
testdram(void)851552af70STsiChungLiew int testdram(void)
861552af70STsiChungLiew {
871552af70STsiChungLiew 	/* TODO: XXX XXX XXX */
881552af70STsiChungLiew 	printf("DRAM test not implemented!\n");
891552af70STsiChungLiew 
901552af70STsiChungLiew 	return (0);
911552af70STsiChungLiew }
92