Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
sdrc.c
Go to the documentation of this file.
1 /*
2  * SMS/SDRC (SDRAM controller) common code for OMAP2/3
3  *
4  * Copyright (C) 2005, 2008 Texas Instruments Inc.
5  * Copyright (C) 2005, 2008 Nokia Corporation
6  *
7  * Tony Lindgren <[email protected]>
8  * Paul Walmsley
9  * Richard Woodruff <[email protected]>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  */
15 #undef DEBUG
16 
17 #include <linux/module.h>
18 #include <linux/kernel.h>
19 #include <linux/device.h>
20 #include <linux/list.h>
21 #include <linux/errno.h>
22 #include <linux/delay.h>
23 #include <linux/clk.h>
24 #include <linux/io.h>
25 
26 #include "common.h"
27 #include <plat/clock.h>
28 #include <plat/sram.h>
29 
30 #include <plat/sdrc.h>
31 #include "sdrc.h"
32 
33 static struct omap_sdrc_params *sdrc_init_params_cs0, *sdrc_init_params_cs1;
34 
37 
40 };
41 
42 static struct omap2_sms_regs sms_context;
43 
44 /* SDRC_POWER register bits */
45 #define SDRC_POWER_EXTCLKDIS_SHIFT 3
46 #define SDRC_POWER_PWDENA_SHIFT 2
47 #define SDRC_POWER_PAGEPOLICY_SHIFT 0
48 
55 {
56  sms_context.sms_sysconfig = sms_read_reg(SMS_SYSCONFIG);
57 }
58 
65 {
66  sms_write_reg(sms_context.sms_sysconfig, SMS_SYSCONFIG);
67 }
68 
91 int omap2_sdrc_get_params(unsigned long r,
92  struct omap_sdrc_params **sdrc_cs0,
93  struct omap_sdrc_params **sdrc_cs1)
94 {
95  struct omap_sdrc_params *sp0, *sp1;
96 
97  if (!sdrc_init_params_cs0)
98  return -1;
99 
100  sp0 = sdrc_init_params_cs0;
101  sp1 = sdrc_init_params_cs1;
102 
103  while (sp0->rate && sp0->rate != r) {
104  sp0++;
105  if (sdrc_init_params_cs1)
106  sp1++;
107  }
108 
109  if (!sp0->rate)
110  return -1;
111 
112  *sdrc_cs0 = sp0;
113  *sdrc_cs1 = sp1;
114  return 0;
115 }
116 
117 
118 void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals)
119 {
120  if (omap2_globals->sdrc)
121  omap2_sdrc_base = omap2_globals->sdrc;
122  if (omap2_globals->sms)
123  omap2_sms_base = omap2_globals->sms;
124 }
125 
136  struct omap_sdrc_params *sdrc_cs1)
137 {
138  u32 l;
139 
140  l = sms_read_reg(SMS_SYSCONFIG);
141  l &= ~(0x3 << 3);
142  l |= (0x2 << 3);
143  sms_write_reg(l, SMS_SYSCONFIG);
144 
145  l = sdrc_read_reg(SDRC_SYSCONFIG);
146  l &= ~(0x3 << 3);
147  l |= (0x2 << 3);
148  sdrc_write_reg(l, SDRC_SYSCONFIG);
149 
150  sdrc_init_params_cs0 = sdrc_cs0;
151  sdrc_init_params_cs1 = sdrc_cs1;
152 
153  /* XXX Enable SRFRONIDLEREQ here also? */
154  /*
155  * PWDENA should not be set due to 34xx erratum 1.150 - PWDENA
156  * can cause random memory corruption
157  */
158  l = (1 << SDRC_POWER_EXTCLKDIS_SHIFT) |
160  sdrc_write_reg(l, SDRC_POWER);
162 }
163 
165 {
166  sms_write_reg(val, SMS_ROT_CONTROL(ctx));
167 }
168 
170 {
171  sms_write_reg(val, SMS_ROT_SIZE(ctx));
172 }
173 
175 {
176  sms_write_reg(val, SMS_ROT_PHYSICAL_BA(ctx));
177 }
178