aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/io.c')
-rw-r--r--arch/arm/mach-omap2/io.c88
1 files changed, 86 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 916fcd3a2328..3a86b0f66031 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -4,12 +4,14 @@
4 * OMAP2 I/O mapping code 4 * OMAP2 I/O mapping code
5 * 5 *
6 * Copyright (C) 2005 Nokia Corporation 6 * Copyright (C) 2005 Nokia Corporation
7 * Copyright (C) 2007 Texas Instruments 7 * Copyright (C) 2007-2009 Texas Instruments
8 * 8 *
9 * Author: 9 * Author:
10 * Juha Yrjola <juha.yrjola@nokia.com> 10 * Juha Yrjola <juha.yrjola@nokia.com>
11 * Syed Khasim <x0khasim@ti.com> 11 * Syed Khasim <x0khasim@ti.com>
12 * 12 *
13 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
14 *
13 * This program is free software; you can redistribute it and/or modify 15 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as 16 * it under the terms of the GNU General Public License version 2 as
15 * published by the Free Software Foundation. 17 * published by the Free Software Foundation.
@@ -19,6 +21,7 @@
19#include <linux/kernel.h> 21#include <linux/kernel.h>
20#include <linux/init.h> 22#include <linux/init.h>
21#include <linux/io.h> 23#include <linux/io.h>
24#include <linux/clk.h>
22 25
23#include <asm/tlb.h> 26#include <asm/tlb.h>
24 27
@@ -30,6 +33,7 @@
30#include <mach/sdrc.h> 33#include <mach/sdrc.h>
31#include <mach/gpmc.h> 34#include <mach/gpmc.h>
32 35
36#ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdev is ready */
33#include "clock.h" 37#include "clock.h"
34 38
35#include <mach/powerdomain.h> 39#include <mach/powerdomain.h>
@@ -38,7 +42,7 @@
38 42
39#include <mach/clockdomain.h> 43#include <mach/clockdomain.h>
40#include "clockdomains.h" 44#include "clockdomains.h"
41 45#endif
42/* 46/*
43 * The machine specific code may provide the extra mapping besides the 47 * The machine specific code may provide the extra mapping besides the
44 * default mapping provided here. 48 * default mapping provided here.
@@ -166,6 +170,46 @@ static struct map_desc omap34xx_io_desc[] __initdata = {
166 }, 170 },
167}; 171};
168#endif 172#endif
173#ifdef CONFIG_ARCH_OMAP4
174static struct map_desc omap44xx_io_desc[] __initdata = {
175 {
176 .virtual = L3_44XX_VIRT,
177 .pfn = __phys_to_pfn(L3_44XX_PHYS),
178 .length = L3_44XX_SIZE,
179 .type = MT_DEVICE,
180 },
181 {
182 .virtual = L4_44XX_VIRT,
183 .pfn = __phys_to_pfn(L4_44XX_PHYS),
184 .length = L4_44XX_SIZE,
185 .type = MT_DEVICE,
186 },
187 {
188 .virtual = L4_WK_44XX_VIRT,
189 .pfn = __phys_to_pfn(L4_WK_44XX_PHYS),
190 .length = L4_WK_44XX_SIZE,
191 .type = MT_DEVICE,
192 },
193 {
194 .virtual = OMAP44XX_GPMC_VIRT,
195 .pfn = __phys_to_pfn(OMAP44XX_GPMC_PHYS),
196 .length = OMAP44XX_GPMC_SIZE,
197 .type = MT_DEVICE,
198 },
199 {
200 .virtual = L4_PER_44XX_VIRT,
201 .pfn = __phys_to_pfn(L4_PER_44XX_PHYS),
202 .length = L4_PER_44XX_SIZE,
203 .type = MT_DEVICE,
204 },
205 {
206 .virtual = L4_EMU_44XX_VIRT,
207 .pfn = __phys_to_pfn(L4_EMU_44XX_PHYS),
208 .length = L4_EMU_44XX_SIZE,
209 .type = MT_DEVICE,
210 },
211};
212#endif
169 213
170void __init omap2_map_common_io(void) 214void __init omap2_map_common_io(void)
171{ 215{
@@ -183,6 +227,9 @@ void __init omap2_map_common_io(void)
183 iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc)); 227 iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc));
184#endif 228#endif
185 229
230#if defined(CONFIG_ARCH_OMAP4)
231 iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc));
232#endif
186 /* Normally devicemaps_init() would flush caches and tlb after 233 /* Normally devicemaps_init() would flush caches and tlb after
187 * mdesc->map_io(), but we must also do it here because of the CPU 234 * mdesc->map_io(), but we must also do it here because of the CPU
188 * revision check below. 235 * revision check below.
@@ -195,12 +242,49 @@ void __init omap2_map_common_io(void)
195 omapfb_reserve_sdram(); 242 omapfb_reserve_sdram();
196} 243}
197 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 */
255static 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
198void __init omap2_init_common_hw(struct omap_sdrc_params *sp) 279void __init omap2_init_common_hw(struct omap_sdrc_params *sp)
199{ 280{
200 omap2_mux_init(); 281 omap2_mux_init();
282#ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once the clkdev is ready */
201 pwrdm_init(powerdomains_omap); 283 pwrdm_init(powerdomains_omap);
202 clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); 284 clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps);
203 omap2_clk_init(); 285 omap2_clk_init();
204 omap2_sdrc_init(sp); 286 omap2_sdrc_init(sp);
287 _omap2_init_reprogram_sdrc();
288#endif
205 gpmc_init(); 289 gpmc_init();
206} 290}