diff options
Diffstat (limited to 'arch/arm/mach-omap2/sdrc.c')
-rw-r--r-- | arch/arm/mach-omap2/sdrc.c | 38 |
1 files changed, 37 insertions, 1 deletions
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 | ||
35 | static struct omap_sdrc_params *sdrc_init_params; | ||
36 | |||
34 | void __iomem *omap2_sdrc_base; | 37 | void __iomem *omap2_sdrc_base; |
35 | void __iomem *omap2_sms_base; | 38 | void __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 | */ | ||
55 | struct 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 | |||
37 | void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals) | 71 | void __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 */ |
44 | void __init omap2_sdrc_init(void) | 78 | void __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 | } |