aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2009-01-28 14:27:39 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2009-02-08 12:50:39 -0500
commit87246b7567f7d1951bfcea29875523ef435c0ebf (patch)
treeef95c7ee66f97630f5afa59ebf7054c371743767 /arch/arm/mach-omap2
parentf2ab99778a1a04ddbae38f4de4ef40f2edb92080 (diff)
[ARM] OMAP2 SDRC: add SDRAM timing parameter infrastructure
For a given SDRAM clock rate, SDRAM chips require memory controllers to use a specific set of timing minimums and maximums to transfer data reliably. These parameters can be different for different memory chips and can also potentially vary by board. This patch adds the infrastructure for board-*.c files to pass this timing data to the SDRAM controller init function. The timing data is specified in an 'omap_sdrc_params' structure, in terms of SDRC controller register values. An array of these structs, one per SDRC target clock rate, is passed by the board-*.c file to omap2_init_common_hw(). This patch does not define the values for different memory chips, nor does it use the values for anything; those will come in subsequent patches. linux-omap source commit is bc84ecfc795c2d1c5cda8da4127cf972f488a696. Signed-off-by: Paul Walmsley <paul@pwsan.com> Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r--arch/arm/mach-omap2/board-2430sdp.c2
-rw-r--r--arch/arm/mach-omap2/board-apollon.c2
-rw-r--r--arch/arm/mach-omap2/board-generic.c2
-rw-r--r--arch/arm/mach-omap2/board-h4.c2
-rw-r--r--arch/arm/mach-omap2/board-ldp.c2
-rw-r--r--arch/arm/mach-omap2/board-omap3beagle.c2
-rw-r--r--arch/arm/mach-omap2/io.c4
-rw-r--r--arch/arm/mach-omap2/sdrc.c38
8 files changed, 45 insertions, 9 deletions
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c
index 83fa37211d77..7b29e1d00f23 100644
--- a/arch/arm/mach-omap2/board-2430sdp.c
+++ b/arch/arm/mach-omap2/board-2430sdp.c
@@ -185,7 +185,7 @@ out:
185 185
186static void __init omap_2430sdp_init_irq(void) 186static void __init omap_2430sdp_init_irq(void)
187{ 187{
188 omap2_init_common_hw(); 188 omap2_init_common_hw(NULL);
189 omap_init_irq(); 189 omap_init_irq();
190 omap_gpio_init(); 190 omap_gpio_init();
191 sdp2430_init_smc91x(); 191 sdp2430_init_smc91x();
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c
index 0a7b24ba1652..0c911f414d8d 100644
--- a/arch/arm/mach-omap2/board-apollon.c
+++ b/arch/arm/mach-omap2/board-apollon.c
@@ -249,7 +249,7 @@ out:
249 249
250static void __init omap_apollon_init_irq(void) 250static void __init omap_apollon_init_irq(void)
251{ 251{
252 omap2_init_common_hw(); 252 omap2_init_common_hw(NULL);
253 omap_init_irq(); 253 omap_init_irq();
254 omap_gpio_init(); 254 omap_gpio_init();
255 apollon_init_smc91x(); 255 apollon_init_smc91x();
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c
index 3b34c20d1df4..3492162a65c3 100644
--- a/arch/arm/mach-omap2/board-generic.c
+++ b/arch/arm/mach-omap2/board-generic.c
@@ -33,7 +33,7 @@
33 33
34static void __init omap_generic_init_irq(void) 34static void __init omap_generic_init_irq(void)
35{ 35{
36 omap2_init_common_hw(); 36 omap2_init_common_hw(NULL);
37 omap_init_irq(); 37 omap_init_irq();
38} 38}
39 39
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c
index 5e9b14675b1e..ef55b45ab769 100644
--- a/arch/arm/mach-omap2/board-h4.c
+++ b/arch/arm/mach-omap2/board-h4.c
@@ -363,7 +363,7 @@ static void __init h4_init_flash(void)
363 363
364static void __init omap_h4_init_irq(void) 364static void __init omap_h4_init_irq(void)
365{ 365{
366 omap2_init_common_hw(); 366 omap2_init_common_hw(NULL);
367 omap_init_irq(); 367 omap_init_irq();
368 omap_gpio_init(); 368 omap_gpio_init();
369 h4_init_flash(); 369 h4_init_flash();
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c
index f6a13451d1fd..61f7c365a28c 100644
--- a/arch/arm/mach-omap2/board-ldp.c
+++ b/arch/arm/mach-omap2/board-ldp.c
@@ -98,7 +98,7 @@ static inline void __init ldp_init_smc911x(void)
98 98
99static void __init omap_ldp_init_irq(void) 99static void __init omap_ldp_init_irq(void)
100{ 100{
101 omap2_init_common_hw(); 101 omap2_init_common_hw(NULL);
102 omap_init_irq(); 102 omap_init_irq();
103 omap_gpio_init(); 103 omap_gpio_init();
104 ldp_init_smc911x(); 104 ldp_init_smc911x();
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
index 38c88fbe658d..ad312ccf2ec5 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
@@ -184,7 +184,7 @@ static int __init omap3_beagle_i2c_init(void)
184 184
185static void __init omap3_beagle_init_irq(void) 185static void __init omap3_beagle_init_irq(void)
186{ 186{
187 omap2_init_common_hw(); 187 omap2_init_common_hw(NULL);
188 omap_init_irq(); 188 omap_init_irq();
189 omap_gpio_init(); 189 omap_gpio_init();
190} 190}
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 3c1de3615eb8..916fcd3a2328 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -195,12 +195,12 @@ void __init omap2_map_common_io(void)
195 omapfb_reserve_sdram(); 195 omapfb_reserve_sdram();
196} 196}
197 197
198void __init omap2_init_common_hw(void) 198void __init omap2_init_common_hw(struct omap_sdrc_params *sp)
199{ 199{
200 omap2_mux_init(); 200 omap2_mux_init();
201 pwrdm_init(powerdomains_omap); 201 pwrdm_init(powerdomains_omap);
202 clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); 202 clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps);
203 omap2_clk_init(); 203 omap2_clk_init();
204 omap2_sdrc_init(); 204 omap2_sdrc_init(sp);
205 gpmc_init(); 205 gpmc_init();
206} 206}
diff --git a/arch/arm/mach-omap2/sdrc.c b/arch/arm/mach-omap2/sdrc.c
index 24b54d50b893..2a30060cb4b7 100644
--- a/arch/arm/mach-omap2/sdrc.c
+++ b/arch/arm/mach-omap2/sdrc.c
@@ -12,6 +12,7 @@
12 * it under the terms of the GNU General Public License version 2 as 12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation. 13 * published by the Free Software Foundation.
14 */ 14 */
15#undef DEBUG
15 16
16#include <linux/module.h> 17#include <linux/module.h>
17#include <linux/kernel.h> 18#include <linux/kernel.h>
@@ -31,9 +32,42 @@
31#include <mach/sdrc.h> 32#include <mach/sdrc.h>
32#include "sdrc.h" 33#include "sdrc.h"
33 34
35static struct omap_sdrc_params *sdrc_init_params;
36
34void __iomem *omap2_sdrc_base; 37void __iomem *omap2_sdrc_base;
35void __iomem *omap2_sms_base; 38void __iomem *omap2_sms_base;
36 39
40
41/**
42 * omap2_sdrc_get_params - return SDRC register values for a given clock rate
43 * @r: SDRC clock rate (in Hz)
44 *
45 * Return pre-calculated values for the SDRC_ACTIM_CTRLA,
46 * SDRC_ACTIM_CTRLB, SDRC_RFR_CTRL, and SDRC_MR registers, for a given
47 * SDRC clock rate 'r'. These parameters control various timing
48 * delays in the SDRAM controller that are expressed in terms of the
49 * number of SDRC clock cycles to wait; hence the clock rate
50 * dependency. Note that sdrc_init_params must be sorted rate
51 * descending. Also assumes that both chip-selects use the same
52 * timing parameters. Returns a struct omap_sdrc_params * upon
53 * success, or NULL upon failure.
54 */
55struct omap_sdrc_params *omap2_sdrc_get_params(unsigned long r)
56{
57 struct omap_sdrc_params *sp;
58
59 sp = sdrc_init_params;
60
61 while (sp->rate != r)
62 sp++;
63
64 if (!sp->rate)
65 return NULL;
66
67 return sp;
68}
69
70
37void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals) 71void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals)
38{ 72{
39 omap2_sdrc_base = omap2_globals->sdrc; 73 omap2_sdrc_base = omap2_globals->sdrc;
@@ -41,7 +75,7 @@ void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals)
41} 75}
42 76
43/* turn on smart idle modes for SDRAM scheduler and controller */ 77/* turn on smart idle modes for SDRAM scheduler and controller */
44void __init omap2_sdrc_init(void) 78void __init omap2_sdrc_init(struct omap_sdrc_params *sp)
45{ 79{
46 u32 l; 80 u32 l;
47 81
@@ -54,4 +88,6 @@ void __init omap2_sdrc_init(void)
54 l &= ~(0x3 << 3); 88 l &= ~(0x3 << 3);
55 l |= (0x2 << 3); 89 l |= (0x2 << 3);
56 sdrc_write_reg(l, SDRC_SYSCONFIG); 90 sdrc_write_reg(l, SDRC_SYSCONFIG);
91
92 sdrc_init_params = sp;
57} 93}