diff options
Diffstat (limited to 'arch/arm/mach-omap2/io.c')
-rw-r--r-- | arch/arm/mach-omap2/io.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 32afd9448216..3a86b0f66031 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/clk.h> | ||
24 | 25 | ||
25 | #include <asm/tlb.h> | 26 | #include <asm/tlb.h> |
26 | 27 | ||
@@ -241,6 +242,40 @@ void __init omap2_map_common_io(void) | |||
241 | omapfb_reserve_sdram(); | 242 | omapfb_reserve_sdram(); |
242 | } | 243 | } |
243 | 244 | ||
245 | /* | ||
246 | * omap2_init_reprogram_sdrc - reprogram SDRC timing parameters | ||
247 | * | ||
248 | * Sets the CORE DPLL3 M2 divider to the same value that it's at | ||
249 | * currently. This has the effect of setting the SDRC SDRAM AC timing | ||
250 | * registers to the values currently defined by the kernel. Currently | ||
251 | * only defined for OMAP3; will return 0 if called on OMAP2. Returns | ||
252 | * -EINVAL if the dpll3_m2_ck cannot be found, 0 if called on OMAP2, | ||
253 | * or passes along the return value of clk_set_rate(). | ||
254 | */ | ||
255 | static int __init _omap2_init_reprogram_sdrc(void) | ||
256 | { | ||
257 | struct clk *dpll3_m2_ck; | ||
258 | int v = -EINVAL; | ||
259 | long rate; | ||
260 | |||
261 | if (!cpu_is_omap34xx()) | ||
262 | return 0; | ||
263 | |||
264 | dpll3_m2_ck = clk_get(NULL, "dpll3_m2_ck"); | ||
265 | if (!dpll3_m2_ck) | ||
266 | return -EINVAL; | ||
267 | |||
268 | rate = clk_get_rate(dpll3_m2_ck); | ||
269 | pr_info("Reprogramming SDRC clock to %ld Hz\n", rate); | ||
270 | v = clk_set_rate(dpll3_m2_ck, rate); | ||
271 | if (v) | ||
272 | pr_err("dpll3_m2_clk rate change failed: %d\n", v); | ||
273 | |||
274 | clk_put(dpll3_m2_ck); | ||
275 | |||
276 | return v; | ||
277 | } | ||
278 | |||
244 | void __init omap2_init_common_hw(struct omap_sdrc_params *sp) | 279 | void __init omap2_init_common_hw(struct omap_sdrc_params *sp) |
245 | { | 280 | { |
246 | omap2_mux_init(); | 281 | omap2_mux_init(); |
@@ -249,6 +284,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sp) | |||
249 | clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); | 284 | clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); |
250 | omap2_clk_init(); | 285 | omap2_clk_init(); |
251 | omap2_sdrc_init(sp); | 286 | omap2_sdrc_init(sp); |
287 | _omap2_init_reprogram_sdrc(); | ||
252 | #endif | 288 | #endif |
253 | gpmc_init(); | 289 | gpmc_init(); |
254 | } | 290 | } |