110db3a17STsiChung Liew /* 210db3a17STsiChung Liew * (C) Copyright 2000-2003 310db3a17STsiChung Liew * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 410db3a17STsiChung Liew * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 610db3a17STsiChung Liew */ 710db3a17STsiChung Liew 810db3a17STsiChung Liew #include <common.h> 910db3a17STsiChung Liew #include <asm/immap.h> 1010db3a17STsiChung Liew 1110db3a17STsiChung Liew DECLARE_GLOBAL_DATA_PTR; 1210db3a17STsiChung Liew checkboard(void)1310db3a17STsiChung Liewint checkboard (void) 1410db3a17STsiChung Liew { 1510db3a17STsiChung Liew puts ("Board: Freescale M5282EVB Evaluation Board\n"); 1610db3a17STsiChung Liew return 0; 1710db3a17STsiChung Liew } 1810db3a17STsiChung Liew dram_init(void)19*f1683aa7SSimon Glassint dram_init(void) 2010db3a17STsiChung Liew { 2110db3a17STsiChung Liew u32 dramsize, i, dramclk; 2210db3a17STsiChung Liew 236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD dramsize = CONFIG_SYS_SDRAM_SIZE * 0x100000; 2410db3a17STsiChung Liew for (i = 0x13; i < 0x20; i++) { 2510db3a17STsiChung Liew if (dramsize == (1 << i)) 2610db3a17STsiChung Liew break; 2710db3a17STsiChung Liew } 2810db3a17STsiChung Liew i--; 2910db3a17STsiChung Liew 3010db3a17STsiChung Liew if (!(MCFSDRAMC_DACR0 & MCFSDRAMC_DACR_RE)) 3110db3a17STsiChung Liew { 326d0f6bcfSJean-Christophe PLAGNIOL-VILLARD dramclk = gd->bus_clk / (CONFIG_SYS_HZ * CONFIG_SYS_HZ); 3310db3a17STsiChung Liew 3410db3a17STsiChung Liew /* Initialize DRAM Control Register: DCR */ 3510db3a17STsiChung Liew MCFSDRAMC_DCR = (0 3610db3a17STsiChung Liew | MCFSDRAMC_DCR_RTIM_6 3710db3a17STsiChung Liew | MCFSDRAMC_DCR_RC((15 * dramclk)>>4)); 384cb4e654STsiChung Liew asm("nop"); 3910db3a17STsiChung Liew 4010db3a17STsiChung Liew /* Initialize DACR0 */ 4110db3a17STsiChung Liew MCFSDRAMC_DACR0 = (0 426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD | MCFSDRAMC_DACR_BASE(CONFIG_SYS_SDRAM_BASE) 4310db3a17STsiChung Liew | MCFSDRAMC_DACR_CASL(1) 4410db3a17STsiChung Liew | MCFSDRAMC_DACR_CBM(3) 4510db3a17STsiChung Liew | MCFSDRAMC_DACR_PS_32); 464cb4e654STsiChung Liew asm("nop"); 4710db3a17STsiChung Liew 4810db3a17STsiChung Liew /* Initialize DMR0 */ 4910db3a17STsiChung Liew MCFSDRAMC_DMR0 = (0 5010db3a17STsiChung Liew | ((dramsize - 1) & 0xFFFC0000) 5110db3a17STsiChung Liew | MCFSDRAMC_DMR_V); 524cb4e654STsiChung Liew asm("nop"); 5310db3a17STsiChung Liew 5410db3a17STsiChung Liew /* Set IP (bit 3) in DACR */ 5510db3a17STsiChung Liew MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IP; 564cb4e654STsiChung Liew asm("nop"); 5710db3a17STsiChung Liew 5810db3a17STsiChung Liew /* Wait 30ns to allow banks to precharge */ 5910db3a17STsiChung Liew for (i = 0; i < 5; i++) { 6010db3a17STsiChung Liew asm ("nop"); 6110db3a17STsiChung Liew } 6210db3a17STsiChung Liew 6310db3a17STsiChung Liew /* Write to this block to initiate precharge */ 646d0f6bcfSJean-Christophe PLAGNIOL-VILLARD *(u32 *)(CONFIG_SYS_SDRAM_BASE) = 0xA5A59696; 654cb4e654STsiChung Liew asm("nop"); 6610db3a17STsiChung Liew 6710db3a17STsiChung Liew /* Set RE (bit 15) in DACR */ 6810db3a17STsiChung Liew MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_RE; 694cb4e654STsiChung Liew asm("nop"); 7010db3a17STsiChung Liew 7110db3a17STsiChung Liew /* Wait for at least 8 auto refresh cycles to occur */ 7210db3a17STsiChung Liew for (i = 0; i < 2000; i++) { 7310db3a17STsiChung Liew asm(" nop"); 7410db3a17STsiChung Liew } 7510db3a17STsiChung Liew 7610db3a17STsiChung Liew /* Finish the configuration by issuing the IMRS. */ 7710db3a17STsiChung Liew MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IMRS; 784cb4e654STsiChung Liew asm("nop"); 7910db3a17STsiChung Liew 8010db3a17STsiChung Liew /* Write to the SDRAM Mode Register */ 816d0f6bcfSJean-Christophe PLAGNIOL-VILLARD *(u32 *)(CONFIG_SYS_SDRAM_BASE + 0x400) = 0xA5A59696; 8210db3a17STsiChung Liew } 83088454cdSSimon Glass gd->ram_size = dramsize; 84088454cdSSimon Glass 85088454cdSSimon Glass return 0; 8610db3a17STsiChung Liew } 87