Pull bugzilla-5452 into release branch
[linux-2.6] / arch / arm / mach-omap1 / io.c
1 /*
2  * linux/arch/arm/mach-omap1/io.c
3  *
4  * OMAP1 I/O mapping code
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10
11 #include <linux/config.h>
12 #include <linux/module.h>
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15
16 #include <asm/tlb.h>
17 #include <asm/mach/map.h>
18 #include <asm/io.h>
19 #include <asm/arch/mux.h>
20 #include <asm/arch/tc.h>
21 #include <asm/arch/omapfb.h>
22
23 extern int omap1_clk_init(void);
24 extern void omap_check_revision(void);
25 extern void omap_sram_init(void);
26
27 /*
28  * The machine specific code may provide the extra mapping besides the
29  * default mapping provided here.
30  */
31 static struct map_desc omap_io_desc[] __initdata = {
32         {
33                 .virtual        = IO_VIRT,
34                 .pfn            = __phys_to_pfn(IO_PHYS),
35                 .length         = IO_SIZE,
36                 .type           = MT_DEVICE
37         }
38 };
39
40 #ifdef CONFIG_ARCH_OMAP730
41 static struct map_desc omap730_io_desc[] __initdata = {
42         {
43                 .virtual        = OMAP730_DSP_BASE,
44                 .pfn            = __phys_to_pfn(OMAP730_DSP_START),
45                 .length         = OMAP730_DSP_SIZE,
46                 .type           = MT_DEVICE
47         }, {
48                 .virtual        = OMAP730_DSPREG_BASE,
49                 .pfn            = __phys_to_pfn(OMAP730_DSPREG_START),
50                 .length         = OMAP730_DSPREG_SIZE,
51                 .type           = MT_DEVICE
52         }
53 };
54 #endif
55
56 #ifdef CONFIG_ARCH_OMAP15XX
57 static struct map_desc omap1510_io_desc[] __initdata = {
58         {
59                 .virtual        = OMAP1510_DSP_BASE,
60                 .pfn            = __phys_to_pfn(OMAP1510_DSP_START),
61                 .length         = OMAP1510_DSP_SIZE,
62                 .type           = MT_DEVICE
63         }, {
64                 .virtual        = OMAP1510_DSPREG_BASE,
65                 .pfn            = __phys_to_pfn(OMAP1510_DSPREG_START),
66                 .length         = OMAP1510_DSPREG_SIZE,
67                 .type           = MT_DEVICE
68         }
69 };
70 #endif
71
72 #if defined(CONFIG_ARCH_OMAP16XX)
73 static struct map_desc omap16xx_io_desc[] __initdata = {
74         {
75                 .virtual        = OMAP16XX_DSP_BASE,
76                 .pfn            = __phys_to_pfn(OMAP16XX_DSP_START),
77                 .length         = OMAP16XX_DSP_SIZE,
78                 .type           = MT_DEVICE
79         }, {
80                 .virtual        = OMAP16XX_DSPREG_BASE,
81                 .pfn            = __phys_to_pfn(OMAP16XX_DSPREG_START),
82                 .length         = OMAP16XX_DSPREG_SIZE,
83                 .type           = MT_DEVICE
84         }
85 };
86 #endif
87
88 /*
89  * Maps common IO regions for omap1. This should only get called from
90  * board specific init.
91  */
92 void __init omap1_map_common_io(void)
93 {
94         iotable_init(omap_io_desc, ARRAY_SIZE(omap_io_desc));
95
96         /* Normally devicemaps_init() would flush caches and tlb after
97          * mdesc->map_io(), but we must also do it here because of the CPU
98          * revision check below.
99          */
100         local_flush_tlb_all();
101         flush_cache_all();
102
103         /* We want to check CPU revision early for cpu_is_omapxxxx() macros.
104          * IO space mapping must be initialized before we can do that.
105          */
106         omap_check_revision();
107
108 #ifdef CONFIG_ARCH_OMAP730
109         if (cpu_is_omap730()) {
110                 iotable_init(omap730_io_desc, ARRAY_SIZE(omap730_io_desc));
111         }
112 #endif
113 #ifdef CONFIG_ARCH_OMAP15XX
114         if (cpu_is_omap15xx()) {
115                 iotable_init(omap1510_io_desc, ARRAY_SIZE(omap1510_io_desc));
116         }
117 #endif
118 #if defined(CONFIG_ARCH_OMAP16XX)
119         if (cpu_is_omap16xx()) {
120                 iotable_init(omap16xx_io_desc, ARRAY_SIZE(omap16xx_io_desc));
121         }
122 #endif
123
124         omap_sram_init();
125         omapfb_reserve_mem();
126 }
127
128 /*
129  * Common low-level hardware init for omap1. This should only get called from
130  * board specific init.
131  */
132 void __init omap1_init_common_hw()
133 {
134         /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
135          * on a Posted Write in the TIPB Bridge".
136          */
137         omap_writew(0x0, MPU_PUBLIC_TIPB_CNTL);
138         omap_writew(0x0, MPU_PRIVATE_TIPB_CNTL);
139
140         /* Must init clocks early to assure that timer interrupt works
141          */
142         omap1_clk_init();
143
144         omap1_mux_init();
145 }
146