xref: /openbmc/linux/arch/arm/mach-omap2/io.c (revision cc26b3b01bc96a8b8c36671b0dc4898b2a152ea8)
11dbae815STony Lindgren /*
21dbae815STony Lindgren  * linux/arch/arm/mach-omap2/io.c
31dbae815STony Lindgren  *
41dbae815STony Lindgren  * OMAP2 I/O mapping code
51dbae815STony Lindgren  *
61dbae815STony Lindgren  * Copyright (C) 2005 Nokia Corporation
7646e3ed1STony Lindgren  * Copyright (C) 2007 Texas Instruments
8646e3ed1STony Lindgren  *
9646e3ed1STony Lindgren  * Author:
10646e3ed1STony Lindgren  *	Juha Yrjola <juha.yrjola@nokia.com>
11646e3ed1STony Lindgren  *	Syed Khasim <x0khasim@ti.com>
121dbae815STony Lindgren  *
131dbae815STony Lindgren  * This program is free software; you can redistribute it and/or modify
141dbae815STony Lindgren  * it under the terms of the GNU General Public License version 2 as
151dbae815STony Lindgren  * published by the Free Software Foundation.
161dbae815STony Lindgren  */
171dbae815STony Lindgren 
181dbae815STony Lindgren #include <linux/module.h>
191dbae815STony Lindgren #include <linux/kernel.h>
201dbae815STony Lindgren #include <linux/init.h>
211dbae815STony Lindgren 
22120db2cbSTony Lindgren #include <asm/tlb.h>
231dbae815STony Lindgren #include <asm/io.h>
24120db2cbSTony Lindgren 
25120db2cbSTony Lindgren #include <asm/mach/map.h>
26120db2cbSTony Lindgren 
27a09e64fbSRussell King #include <mach/mux.h>
28a09e64fbSRussell King #include <mach/omapfb.h>
29646e3ed1STony Lindgren #include <mach/sram.h>
30646e3ed1STony Lindgren 
31646e3ed1STony Lindgren #include "memory.h"
32646e3ed1STony Lindgren 
33646e3ed1STony Lindgren #include "clock.h"
341dbae815STony Lindgren 
359717100fSPaul Walmsley #include <mach/powerdomain.h>
369717100fSPaul Walmsley 
379717100fSPaul Walmsley #include "powerdomains.h"
389717100fSPaul Walmsley 
39801954d3SPaul Walmsley #include <mach/clockdomain.h>
40801954d3SPaul Walmsley #include "clockdomains.h"
41801954d3SPaul Walmsley 
421dbae815STony Lindgren /*
431dbae815STony Lindgren  * The machine specific code may provide the extra mapping besides the
441dbae815STony Lindgren  * default mapping provided here.
451dbae815STony Lindgren  */
46*cc26b3b0SSyed Mohammed, Khasim 
47*cc26b3b0SSyed Mohammed, Khasim #ifdef CONFIG_ARCH_OMAP24XX
48*cc26b3b0SSyed Mohammed, Khasim static struct map_desc omap24xx_io_desc[] __initdata = {
491dbae815STony Lindgren 	{
501dbae815STony Lindgren 		.virtual	= L3_24XX_VIRT,
511dbae815STony Lindgren 		.pfn		= __phys_to_pfn(L3_24XX_PHYS),
521dbae815STony Lindgren 		.length		= L3_24XX_SIZE,
531dbae815STony Lindgren 		.type		= MT_DEVICE
541dbae815STony Lindgren 	},
5509f21ed4SKyungmin Park 	{
5609f21ed4SKyungmin Park 		.virtual	= L4_24XX_VIRT,
5709f21ed4SKyungmin Park 		.pfn		= __phys_to_pfn(L4_24XX_PHYS),
5809f21ed4SKyungmin Park 		.length		= L4_24XX_SIZE,
5909f21ed4SKyungmin Park 		.type		= MT_DEVICE
6009f21ed4SKyungmin Park 	},
61*cc26b3b0SSyed Mohammed, Khasim };
62*cc26b3b0SSyed Mohammed, Khasim 
63*cc26b3b0SSyed Mohammed, Khasim #ifdef CONFIG_ARCH_OMAP2420
64*cc26b3b0SSyed Mohammed, Khasim static struct map_desc omap242x_io_desc[] __initdata = {
651dbae815STony Lindgren 	{
66c40fae95STony Lindgren 		.virtual	= DSP_MEM_24XX_VIRT,
67c40fae95STony Lindgren 		.pfn		= __phys_to_pfn(DSP_MEM_24XX_PHYS),
68c40fae95STony Lindgren 		.length		= DSP_MEM_24XX_SIZE,
69c40fae95STony Lindgren 		.type		= MT_DEVICE
70c40fae95STony Lindgren 	},
71c40fae95STony Lindgren 	{
72c40fae95STony Lindgren 		.virtual	= DSP_IPI_24XX_VIRT,
73c40fae95STony Lindgren 		.pfn		= __phys_to_pfn(DSP_IPI_24XX_PHYS),
74c40fae95STony Lindgren 		.length		= DSP_IPI_24XX_SIZE,
75c40fae95STony Lindgren 		.type		= MT_DEVICE
76c40fae95STony Lindgren 	},
77c40fae95STony Lindgren 	{
78c40fae95STony Lindgren 		.virtual	= DSP_MMU_24XX_VIRT,
79c40fae95STony Lindgren 		.pfn		= __phys_to_pfn(DSP_MMU_24XX_PHYS),
80c40fae95STony Lindgren 		.length		= DSP_MMU_24XX_SIZE,
811dbae815STony Lindgren 		.type		= MT_DEVICE
82*cc26b3b0SSyed Mohammed, Khasim 	},
831dbae815STony Lindgren };
841dbae815STony Lindgren 
85*cc26b3b0SSyed Mohammed, Khasim #endif
86*cc26b3b0SSyed Mohammed, Khasim 
87*cc26b3b0SSyed Mohammed, Khasim #ifdef CONFIG_ARCH_OMAP2430
88*cc26b3b0SSyed Mohammed, Khasim static struct map_desc omap243x_io_desc[] __initdata = {
89*cc26b3b0SSyed Mohammed, Khasim 	{
90*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_WK_243X_VIRT,
91*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_WK_243X_PHYS),
92*cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_WK_243X_SIZE,
93*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
94*cc26b3b0SSyed Mohammed, Khasim 	},
95*cc26b3b0SSyed Mohammed, Khasim 	{
96*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP243X_GPMC_VIRT,
97*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP243X_GPMC_PHYS),
98*cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP243X_GPMC_SIZE,
99*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
100*cc26b3b0SSyed Mohammed, Khasim 	},
101*cc26b3b0SSyed Mohammed, Khasim 	{
102*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP243X_SDRC_VIRT,
103*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP243X_SDRC_PHYS),
104*cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP243X_SDRC_SIZE,
105*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
106*cc26b3b0SSyed Mohammed, Khasim 	},
107*cc26b3b0SSyed Mohammed, Khasim 	{
108*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP243X_SMS_VIRT,
109*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP243X_SMS_PHYS),
110*cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP243X_SMS_SIZE,
111*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
112*cc26b3b0SSyed Mohammed, Khasim 	},
113*cc26b3b0SSyed Mohammed, Khasim };
114*cc26b3b0SSyed Mohammed, Khasim #endif
115*cc26b3b0SSyed Mohammed, Khasim #endif
116*cc26b3b0SSyed Mohammed, Khasim 
117*cc26b3b0SSyed Mohammed, Khasim #ifdef	CONFIG_ARCH_OMAP34XX
118*cc26b3b0SSyed Mohammed, Khasim static struct map_desc omap34xx_io_desc[] __initdata = {
119*cc26b3b0SSyed Mohammed, Khasim 	{
120*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L3_34XX_VIRT,
121*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L3_34XX_PHYS),
122*cc26b3b0SSyed Mohammed, Khasim 		.length		= L3_34XX_SIZE,
123*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
124*cc26b3b0SSyed Mohammed, Khasim 	},
125*cc26b3b0SSyed Mohammed, Khasim 	{
126*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_34XX_VIRT,
127*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_34XX_PHYS),
128*cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_34XX_SIZE,
129*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
130*cc26b3b0SSyed Mohammed, Khasim 	},
131*cc26b3b0SSyed Mohammed, Khasim 	{
132*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_WK_34XX_VIRT,
133*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_WK_34XX_PHYS),
134*cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_WK_34XX_SIZE,
135*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
136*cc26b3b0SSyed Mohammed, Khasim 	},
137*cc26b3b0SSyed Mohammed, Khasim 	{
138*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP34XX_GPMC_VIRT,
139*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP34XX_GPMC_PHYS),
140*cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP34XX_GPMC_SIZE,
141*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
142*cc26b3b0SSyed Mohammed, Khasim 	},
143*cc26b3b0SSyed Mohammed, Khasim 	{
144*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP343X_SMS_VIRT,
145*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP343X_SMS_PHYS),
146*cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP343X_SMS_SIZE,
147*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
148*cc26b3b0SSyed Mohammed, Khasim 	},
149*cc26b3b0SSyed Mohammed, Khasim 	{
150*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP343X_SDRC_VIRT,
151*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP343X_SDRC_PHYS),
152*cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP343X_SDRC_SIZE,
153*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
154*cc26b3b0SSyed Mohammed, Khasim 	},
155*cc26b3b0SSyed Mohammed, Khasim 	{
156*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_PER_34XX_VIRT,
157*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_PER_34XX_PHYS),
158*cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_PER_34XX_SIZE,
159*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
160*cc26b3b0SSyed Mohammed, Khasim 	},
161*cc26b3b0SSyed Mohammed, Khasim 	{
162*cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_EMU_34XX_VIRT,
163*cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_EMU_34XX_PHYS),
164*cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_EMU_34XX_SIZE,
165*cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
166*cc26b3b0SSyed Mohammed, Khasim 	},
167*cc26b3b0SSyed Mohammed, Khasim };
168*cc26b3b0SSyed Mohammed, Khasim #endif
169*cc26b3b0SSyed Mohammed, Khasim 
170120db2cbSTony Lindgren void __init omap2_map_common_io(void)
1711dbae815STony Lindgren {
172*cc26b3b0SSyed Mohammed, Khasim #if defined(CONFIG_ARCH_OMAP2420)
173*cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
174*cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap242x_io_desc, ARRAY_SIZE(omap242x_io_desc));
175*cc26b3b0SSyed Mohammed, Khasim #endif
176*cc26b3b0SSyed Mohammed, Khasim 
177*cc26b3b0SSyed Mohammed, Khasim #if defined(CONFIG_ARCH_OMAP2430)
178*cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
179*cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap243x_io_desc, ARRAY_SIZE(omap243x_io_desc));
180*cc26b3b0SSyed Mohammed, Khasim #endif
181*cc26b3b0SSyed Mohammed, Khasim 
182*cc26b3b0SSyed Mohammed, Khasim #if defined(CONFIG_ARCH_OMAP34XX)
183*cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc));
184*cc26b3b0SSyed Mohammed, Khasim #endif
185120db2cbSTony Lindgren 
186120db2cbSTony Lindgren 	/* Normally devicemaps_init() would flush caches and tlb after
187120db2cbSTony Lindgren 	 * mdesc->map_io(), but we must also do it here because of the CPU
188120db2cbSTony Lindgren 	 * revision check below.
189120db2cbSTony Lindgren 	 */
190120db2cbSTony Lindgren 	local_flush_tlb_all();
191120db2cbSTony Lindgren 	flush_cache_all();
192120db2cbSTony Lindgren 
1931dbae815STony Lindgren 	omap2_check_revision();
1941dbae815STony Lindgren 	omap_sram_init();
195b7cc6d46SImre Deak 	omapfb_reserve_sdram();
196120db2cbSTony Lindgren }
197120db2cbSTony Lindgren 
198120db2cbSTony Lindgren void __init omap2_init_common_hw(void)
199120db2cbSTony Lindgren {
2001dbae815STony Lindgren 	omap2_mux_init();
2019717100fSPaul Walmsley 	pwrdm_init(powerdomains_omap);
202801954d3SPaul Walmsley 	clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps);
2031dbae815STony Lindgren 	omap2_clk_init();
20433c99075SJuha Yrjola 	omap2_init_memory();
2054bbbc1adSJuha Yrjola 	gpmc_init();
2061dbae815STony Lindgren }
207