1 1.3 matt /* $Id: emi_prep.c,v 1.3 2013/10/07 17:36:40 matt Exp $ */ 2 1.1 jkunz 3 1.1 jkunz /* 4 1.1 jkunz * Copyright (c) 2012 The NetBSD Foundation, Inc. 5 1.1 jkunz * All rights reserved. 6 1.1 jkunz * 7 1.1 jkunz * This code is derived from software contributed to The NetBSD Foundation 8 1.1 jkunz * by Petri Laakso. 9 1.1 jkunz * 10 1.1 jkunz * Redistribution and use in source and binary forms, with or without 11 1.1 jkunz * modification, are permitted provided that the following conditions 12 1.1 jkunz * are met: 13 1.1 jkunz * 1. Redistributions of source code must retain the above copyright 14 1.1 jkunz * notice, this list of conditions and the following disclaimer. 15 1.1 jkunz * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 jkunz * notice, this list of conditions and the following disclaimer in the 17 1.1 jkunz * documentation and/or other materials provided with the distribution. 18 1.1 jkunz * 19 1.1 jkunz * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 jkunz * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 jkunz * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 jkunz * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 jkunz * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 jkunz * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 jkunz * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 jkunz * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 jkunz * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 jkunz * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 jkunz * POSSIBILITY OF SUCH DAMAGE. 30 1.1 jkunz */ 31 1.3 matt #include <sys/cdefs.h> 32 1.1 jkunz #include <sys/param.h> 33 1.1 jkunz #include <sys/types.h> 34 1.1 jkunz 35 1.1 jkunz #include <arm/imx/imx23_emireg.h> 36 1.1 jkunz 37 1.1 jkunz #include "common.h" 38 1.1 jkunz 39 1.2 jkunz static void init_dram_registers(void); 40 1.2 jkunz static uint32_t get_dram_int_status(void); 41 1.1 jkunz 42 1.3 matt #define DRAM_REGS 41 43 1.3 matt 44 1.3 matt uint32_t dram_regs[DRAM_REGS] = { 45 1.3 matt 0x01010001, 0x00010100, 0x01000101, 0x00000001, 46 1.3 matt 0x00000101, 0x00000000, 0x00010000, 0x01000001, 47 1.3 matt 0x00000000, 0x00000001, 0x07000200, 0x00070202, 48 1.3 matt 0x02020000, 0x04040a01, 0x00000201, 0x02040000, 49 1.3 matt 0x02000000, 0x19000f08, 0x0d0d0000, 0x02021313, 50 1.3 matt 0x02061521, 0x0000000a, 0x00080008, 0x00200020, 51 1.3 matt 0x00200020, 0x00200020, 0x000003f7, 0x00000000, 52 1.3 matt 0x00000000, 0x00000020, 0x00000020, 0x00c80000, 53 1.3 matt 0x000a23cd, 0x000000c8, 0x00006665, 0x00000000, 54 1.3 matt 0x00000101, 0x00040001, 0x00000000, 0x00000000, 55 1.3 matt 0x00010000 56 1.3 matt }; 57 1.3 matt 58 1.1 jkunz /* 59 1.3 matt * Initialize DRAM memory. 60 1.1 jkunz */ 61 1.1 jkunz int 62 1.1 jkunz emi_prep(void) 63 1.1 jkunz { 64 1.3 matt uint32_t tmp_r; 65 1.3 matt 66 1.3 matt REG_WR(HW_EMI_CTRL_BASE + HW_EMI_CTRL_CLR, HW_EMI_CTRL_SFTRST); 67 1.3 matt delay(10000); 68 1.3 matt 69 1.3 matt tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL08); 70 1.3 matt tmp_r &= ~(HW_DRAM_CTL08_START | HW_DRAM_CTL08_SREFRESH); 71 1.3 matt REG_WR(HW_DRAM_BASE + HW_DRAM_CTL08, tmp_r); 72 1.1 jkunz 73 1.1 jkunz init_dram_registers(); 74 1.3 matt 75 1.3 matt /* START */ 76 1.3 matt tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL08); 77 1.3 matt tmp_r |= HW_DRAM_CTL08_START; 78 1.3 matt REG_WR(HW_DRAM_BASE + HW_DRAM_CTL08, tmp_r); 79 1.3 matt 80 1.3 matt delay(20000); 81 1.3 matt 82 1.3 matt /* 83 1.3 matt * Set memory power-down with memory 84 1.3 matt * clock gating mode (Mode 2). 85 1.3 matt */ 86 1.3 matt tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL16); 87 1.3 matt tmp_r |= (1 << 19); 88 1.3 matt REG_WR(HW_DRAM_BASE + HW_DRAM_CTL16, tmp_r); 89 1.3 matt 90 1.3 matt tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL16); 91 1.3 matt tmp_r |= (1<<11); 92 1.3 matt REG_WR(HW_DRAM_BASE + HW_DRAM_CTL16, tmp_r); 93 1.3 matt 94 1.3 matt /* Wait until DRAM initialization is complete. */ 95 1.3 matt while(!(get_dram_int_status() & (1<<2))); 96 1.3 matt 97 1.3 matt delay(20000); 98 1.1 jkunz 99 1.1 jkunz return 0; 100 1.1 jkunz } 101 1.1 jkunz /* 102 1.3 matt * Set DRAM register values. 103 1.1 jkunz */ 104 1.2 jkunz static void 105 1.1 jkunz init_dram_registers(void) 106 1.1 jkunz { 107 1.3 matt volatile uint32_t *dram_r; 108 1.3 matt int i; 109 1.1 jkunz 110 1.3 matt dram_r = (uint32_t *)(HW_DRAM_BASE); 111 1.1 jkunz 112 1.3 matt for (i=0; i < DRAM_REGS; i++) { 113 1.3 matt /* Skip ctrl register 8, obsolete registers 27 and 28, 114 1.3 matt * read only register 35 */ 115 1.3 matt if (i == 8 || i == 27 || i == 28 || i == 35) 116 1.3 matt continue; 117 1.3 matt *(dram_r + i) = dram_regs[i]; 118 1.3 matt } 119 1.2 jkunz 120 1.3 matt /* Set tRAS lockout on. */ 121 1.3 matt *(dram_r + 8) |= HW_DRAM_CTL08_TRAS_LOCKOUT; 122 1.1 jkunz 123 1.1 jkunz return; 124 1.1 jkunz } 125 1.1 jkunz /* 126 1.1 jkunz * Return DRAM controller interrupt status register. 127 1.1 jkunz */ 128 1.2 jkunz static uint32_t 129 1.1 jkunz get_dram_int_status(void) 130 1.1 jkunz { 131 1.1 jkunz uint32_t reg; 132 1.2 jkunz 133 1.2 jkunz reg = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL18); 134 1.1 jkunz return __SHIFTOUT(reg, HW_DRAM_CTL18_INT_STATUS); 135 1.1 jkunz } 136