1*545c8e0aSMatthew Fettke /* 2*545c8e0aSMatthew Fettke * (C) Copyright 2000-2003 3*545c8e0aSMatthew Fettke * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4*545c8e0aSMatthew Fettke * 5*545c8e0aSMatthew Fettke * Copyright (C) 2005-2008 Arthur Shipkowski (art@videon-central.com) 6*545c8e0aSMatthew Fettke * 7*545c8e0aSMatthew Fettke * See file CREDITS for list of people who contributed to this 8*545c8e0aSMatthew Fettke * project. 9*545c8e0aSMatthew Fettke * 10*545c8e0aSMatthew Fettke * This program is free software; you can redistribute it and/or 11*545c8e0aSMatthew Fettke * modify it under the terms of the GNU General Public License as 12*545c8e0aSMatthew Fettke * published by the Free Software Foundation; either version 2 of 13*545c8e0aSMatthew Fettke * the License, or (at your option) any later version. 14*545c8e0aSMatthew Fettke * 15*545c8e0aSMatthew Fettke * This program is distributed in the hope that it will be useful, 16*545c8e0aSMatthew Fettke * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*545c8e0aSMatthew Fettke * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*545c8e0aSMatthew Fettke * GNU General Public License for more details. 19*545c8e0aSMatthew Fettke * 20*545c8e0aSMatthew Fettke * You should have received a copy of the GNU General Public License 21*545c8e0aSMatthew Fettke * along with this program; if not, write to the Free Software 22*545c8e0aSMatthew Fettke * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 23*545c8e0aSMatthew Fettke * MA 02111-1307 USA 24*545c8e0aSMatthew Fettke */ 25*545c8e0aSMatthew Fettke 26*545c8e0aSMatthew Fettke #include <common.h> 27*545c8e0aSMatthew Fettke #include <asm/immap.h> 28*545c8e0aSMatthew Fettke 29*545c8e0aSMatthew Fettke #define PERIOD 13 /* system bus period in ns */ 30*545c8e0aSMatthew Fettke #define SDRAM_TREFI 7800 /* in ns */ 31*545c8e0aSMatthew Fettke 32*545c8e0aSMatthew Fettke int checkboard(void) 33*545c8e0aSMatthew Fettke { 34*545c8e0aSMatthew Fettke puts("Board: "); 35*545c8e0aSMatthew Fettke puts("Freescale MCF5275 EVB\n"); 36*545c8e0aSMatthew Fettke return 0; 37*545c8e0aSMatthew Fettke }; 38*545c8e0aSMatthew Fettke 39*545c8e0aSMatthew Fettke long int initdram(int board_type) 40*545c8e0aSMatthew Fettke { 41*545c8e0aSMatthew Fettke volatile sdramctrl_t *sdp = (sdramctrl_t *)(MMAP_SDRAM); 42*545c8e0aSMatthew Fettke volatile gpio_t *gpio_reg = (gpio_t *)(MMAP_GPIO); 43*545c8e0aSMatthew Fettke 44*545c8e0aSMatthew Fettke gpio_reg->par_sdram = 0x3FF; /* Enable SDRAM */ 45*545c8e0aSMatthew Fettke 46*545c8e0aSMatthew Fettke /* Set up chip select */ 47*545c8e0aSMatthew Fettke sdp->sdbar0 = CFG_SDRAM_BASE; 48*545c8e0aSMatthew Fettke sdp->sdbmr0 = MCF_SDRAMC_SDMRn_BAM_32M | MCF_SDRAMC_SDMRn_V; 49*545c8e0aSMatthew Fettke 50*545c8e0aSMatthew Fettke /* Set up timing */ 51*545c8e0aSMatthew Fettke sdp->sdcfg1 = 0x83711630; 52*545c8e0aSMatthew Fettke sdp->sdcfg2 = 0x46770000; 53*545c8e0aSMatthew Fettke 54*545c8e0aSMatthew Fettke /* Enable clock */ 55*545c8e0aSMatthew Fettke sdp->sdcr = MCF_SDRAMC_SDCR_MODE_EN | MCF_SDRAMC_SDCR_CKE; 56*545c8e0aSMatthew Fettke 57*545c8e0aSMatthew Fettke /* Set precharge */ 58*545c8e0aSMatthew Fettke sdp->sdcr |= MCF_SDRAMC_SDCR_IPALL; 59*545c8e0aSMatthew Fettke 60*545c8e0aSMatthew Fettke /* Dummy write to start SDRAM */ 61*545c8e0aSMatthew Fettke *((volatile unsigned long *)CFG_SDRAM_BASE) = 0xa5a59696; 62*545c8e0aSMatthew Fettke 63*545c8e0aSMatthew Fettke /* Send LEMR */ 64*545c8e0aSMatthew Fettke sdp->sdmr = MCF_SDRAMC_SDMR_BNKAD_LEMR 65*545c8e0aSMatthew Fettke | MCF_SDRAMC_SDMR_AD(0x0) 66*545c8e0aSMatthew Fettke | MCF_SDRAMC_SDMR_CMD; 67*545c8e0aSMatthew Fettke *((volatile unsigned long *)CFG_SDRAM_BASE) = 0xa5a59696; 68*545c8e0aSMatthew Fettke 69*545c8e0aSMatthew Fettke /* Send LMR */ 70*545c8e0aSMatthew Fettke sdp->sdmr = 0x058d0000; 71*545c8e0aSMatthew Fettke *((volatile unsigned long *)CFG_SDRAM_BASE) = 0xa5a59696; 72*545c8e0aSMatthew Fettke 73*545c8e0aSMatthew Fettke /* Stop sending commands */ 74*545c8e0aSMatthew Fettke sdp->sdmr &= ~(MCF_SDRAMC_SDMR_CMD); 75*545c8e0aSMatthew Fettke 76*545c8e0aSMatthew Fettke /* Set precharge */ 77*545c8e0aSMatthew Fettke sdp->sdcr |= MCF_SDRAMC_SDCR_IPALL; 78*545c8e0aSMatthew Fettke *((volatile unsigned long *)CFG_SDRAM_BASE) = 0xa5a59696; 79*545c8e0aSMatthew Fettke 80*545c8e0aSMatthew Fettke /* Stop manual precharge, send 2 IREF */ 81*545c8e0aSMatthew Fettke sdp->sdcr &= ~(MCF_SDRAMC_SDCR_IPALL); 82*545c8e0aSMatthew Fettke sdp->sdcr |= MCF_SDRAMC_SDCR_IREF; 83*545c8e0aSMatthew Fettke *((volatile unsigned long *)CFG_SDRAM_BASE) = 0xa5a59696; 84*545c8e0aSMatthew Fettke *((volatile unsigned long *)CFG_SDRAM_BASE) = 0xa5a59696; 85*545c8e0aSMatthew Fettke 86*545c8e0aSMatthew Fettke /* Write mode register, clear reset DLL */ 87*545c8e0aSMatthew Fettke sdp->sdmr = 0x018d0000; 88*545c8e0aSMatthew Fettke *((volatile unsigned long *)CFG_SDRAM_BASE) = 0xa5a59696; 89*545c8e0aSMatthew Fettke 90*545c8e0aSMatthew Fettke /* Stop sending commands */ 91*545c8e0aSMatthew Fettke sdp->sdmr &= ~(MCF_SDRAMC_SDMR_CMD); 92*545c8e0aSMatthew Fettke sdp->sdcr &= ~(MCF_SDRAMC_SDCR_MODE_EN); 93*545c8e0aSMatthew Fettke 94*545c8e0aSMatthew Fettke /* Turn on auto refresh, lock SDMR */ 95*545c8e0aSMatthew Fettke sdp->sdcr = 96*545c8e0aSMatthew Fettke MCF_SDRAMC_SDCR_CKE 97*545c8e0aSMatthew Fettke | MCF_SDRAMC_SDCR_REF 98*545c8e0aSMatthew Fettke | MCF_SDRAMC_SDCR_MUX(1) 99*545c8e0aSMatthew Fettke /* 1 added to round up */ 100*545c8e0aSMatthew Fettke | MCF_SDRAMC_SDCR_RCNT((SDRAM_TREFI/(PERIOD*64)) - 1 + 1) 101*545c8e0aSMatthew Fettke | MCF_SDRAMC_SDCR_DQS_OE(0x3); 102*545c8e0aSMatthew Fettke 103*545c8e0aSMatthew Fettke return CFG_SDRAM_SIZE * 1024 * 1024; 104*545c8e0aSMatthew Fettke }; 105*545c8e0aSMatthew Fettke 106*545c8e0aSMatthew Fettke int testdram(void) 107*545c8e0aSMatthew Fettke { 108*545c8e0aSMatthew Fettke /* TODO: XXX XXX XXX */ 109*545c8e0aSMatthew Fettke printf("DRAM test not implemented!\n"); 110*545c8e0aSMatthew Fettke 111*545c8e0aSMatthew Fettke return (0); 112*545c8e0aSMatthew Fettke } 113