diff options
Diffstat (limited to 'arch/arm/mach-omap2/io.c')
| -rw-r--r-- | arch/arm/mach-omap2/io.c | 88 |
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 | ||
| 174 | static 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 | ||
| 170 | void __init omap2_map_common_io(void) | 214 | void __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 | */ | ||
| 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 | |||
| 198 | void __init omap2_init_common_hw(struct omap_sdrc_params *sp) | 279 | void __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 | } |
