xref: /openbmc/linux/arch/arm/mach-omap2/io.c (revision f8de9b2c45c4506702da4bd3a5bc7630754077f9)
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>
21fced80c7SRussell King #include <linux/io.h>
221dbae815STony Lindgren 
23120db2cbSTony Lindgren #include <asm/tlb.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>
30*f8de9b2cSPaul Walmsley #include <mach/sdrc.h>
31*f8de9b2cSPaul Walmsley #include <mach/gpmc.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"
411dbae815STony Lindgren 
421dbae815STony Lindgren /*
431dbae815STony Lindgren  * The machine specific code may provide the extra mapping besides the
441dbae815STony Lindgren  * default mapping provided here.
451dbae815STony Lindgren  */
46cc26b3b0SSyed Mohammed, Khasim 
47cc26b3b0SSyed Mohammed, Khasim #ifdef CONFIG_ARCH_OMAP24XX
48cc26b3b0SSyed 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 	},
61cc26b3b0SSyed Mohammed, Khasim };
62cc26b3b0SSyed Mohammed, Khasim 
63cc26b3b0SSyed Mohammed, Khasim #ifdef CONFIG_ARCH_OMAP2420
64cc26b3b0SSyed 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
82cc26b3b0SSyed Mohammed, Khasim 	},
831dbae815STony Lindgren };
841dbae815STony Lindgren 
85cc26b3b0SSyed Mohammed, Khasim #endif
86cc26b3b0SSyed Mohammed, Khasim 
87cc26b3b0SSyed Mohammed, Khasim #ifdef CONFIG_ARCH_OMAP2430
88cc26b3b0SSyed Mohammed, Khasim static struct map_desc omap243x_io_desc[] __initdata = {
89cc26b3b0SSyed Mohammed, Khasim 	{
90cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_WK_243X_VIRT,
91cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_WK_243X_PHYS),
92cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_WK_243X_SIZE,
93cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
94cc26b3b0SSyed Mohammed, Khasim 	},
95cc26b3b0SSyed Mohammed, Khasim 	{
96cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP243X_GPMC_VIRT,
97cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP243X_GPMC_PHYS),
98cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP243X_GPMC_SIZE,
99cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
100cc26b3b0SSyed Mohammed, Khasim 	},
101cc26b3b0SSyed Mohammed, Khasim 	{
102cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP243X_SDRC_VIRT,
103cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP243X_SDRC_PHYS),
104cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP243X_SDRC_SIZE,
105cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
106cc26b3b0SSyed Mohammed, Khasim 	},
107cc26b3b0SSyed Mohammed, Khasim 	{
108cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP243X_SMS_VIRT,
109cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP243X_SMS_PHYS),
110cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP243X_SMS_SIZE,
111cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
112cc26b3b0SSyed Mohammed, Khasim 	},
113cc26b3b0SSyed Mohammed, Khasim };
114cc26b3b0SSyed Mohammed, Khasim #endif
115cc26b3b0SSyed Mohammed, Khasim #endif
116cc26b3b0SSyed Mohammed, Khasim 
117cc26b3b0SSyed Mohammed, Khasim #ifdef	CONFIG_ARCH_OMAP34XX
118cc26b3b0SSyed Mohammed, Khasim static struct map_desc omap34xx_io_desc[] __initdata = {
119cc26b3b0SSyed Mohammed, Khasim 	{
120cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L3_34XX_VIRT,
121cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L3_34XX_PHYS),
122cc26b3b0SSyed Mohammed, Khasim 		.length		= L3_34XX_SIZE,
123cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
124cc26b3b0SSyed Mohammed, Khasim 	},
125cc26b3b0SSyed Mohammed, Khasim 	{
126cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_34XX_VIRT,
127cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_34XX_PHYS),
128cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_34XX_SIZE,
129cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
130cc26b3b0SSyed Mohammed, Khasim 	},
131cc26b3b0SSyed Mohammed, Khasim 	{
132cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_WK_34XX_VIRT,
133cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_WK_34XX_PHYS),
134cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_WK_34XX_SIZE,
135cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
136cc26b3b0SSyed Mohammed, Khasim 	},
137cc26b3b0SSyed Mohammed, Khasim 	{
138cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP34XX_GPMC_VIRT,
139cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP34XX_GPMC_PHYS),
140cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP34XX_GPMC_SIZE,
141cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
142cc26b3b0SSyed Mohammed, Khasim 	},
143cc26b3b0SSyed Mohammed, Khasim 	{
144cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP343X_SMS_VIRT,
145cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP343X_SMS_PHYS),
146cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP343X_SMS_SIZE,
147cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
148cc26b3b0SSyed Mohammed, Khasim 	},
149cc26b3b0SSyed Mohammed, Khasim 	{
150cc26b3b0SSyed Mohammed, Khasim 		.virtual	= OMAP343X_SDRC_VIRT,
151cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(OMAP343X_SDRC_PHYS),
152cc26b3b0SSyed Mohammed, Khasim 		.length		= OMAP343X_SDRC_SIZE,
153cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
154cc26b3b0SSyed Mohammed, Khasim 	},
155cc26b3b0SSyed Mohammed, Khasim 	{
156cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_PER_34XX_VIRT,
157cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_PER_34XX_PHYS),
158cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_PER_34XX_SIZE,
159cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
160cc26b3b0SSyed Mohammed, Khasim 	},
161cc26b3b0SSyed Mohammed, Khasim 	{
162cc26b3b0SSyed Mohammed, Khasim 		.virtual	= L4_EMU_34XX_VIRT,
163cc26b3b0SSyed Mohammed, Khasim 		.pfn		= __phys_to_pfn(L4_EMU_34XX_PHYS),
164cc26b3b0SSyed Mohammed, Khasim 		.length		= L4_EMU_34XX_SIZE,
165cc26b3b0SSyed Mohammed, Khasim 		.type		= MT_DEVICE
166cc26b3b0SSyed Mohammed, Khasim 	},
167cc26b3b0SSyed Mohammed, Khasim };
168cc26b3b0SSyed Mohammed, Khasim #endif
169cc26b3b0SSyed Mohammed, Khasim 
170120db2cbSTony Lindgren void __init omap2_map_common_io(void)
1711dbae815STony Lindgren {
172cc26b3b0SSyed Mohammed, Khasim #if defined(CONFIG_ARCH_OMAP2420)
173cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
174cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap242x_io_desc, ARRAY_SIZE(omap242x_io_desc));
175cc26b3b0SSyed Mohammed, Khasim #endif
176cc26b3b0SSyed Mohammed, Khasim 
177cc26b3b0SSyed Mohammed, Khasim #if defined(CONFIG_ARCH_OMAP2430)
178cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
179cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap243x_io_desc, ARRAY_SIZE(omap243x_io_desc));
180cc26b3b0SSyed Mohammed, Khasim #endif
181cc26b3b0SSyed Mohammed, Khasim 
182cc26b3b0SSyed Mohammed, Khasim #if defined(CONFIG_ARCH_OMAP34XX)
183cc26b3b0SSyed Mohammed, Khasim 	iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc));
184cc26b3b0SSyed 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