diff options
Diffstat (limited to 'arch/arm/mach-realview/realview_eb.c')
-rw-r--r-- | arch/arm/mach-realview/realview_eb.c | 234 |
1 files changed, 195 insertions, 39 deletions
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index ecec2f85c4cd..60d9eb810246 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
@@ -36,7 +36,9 @@ | |||
36 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
37 | #include <asm/mach/map.h> | 37 | #include <asm/mach/map.h> |
38 | #include <asm/mach/mmc.h> | 38 | #include <asm/mach/mmc.h> |
39 | #include <asm/mach/time.h> | ||
39 | 40 | ||
41 | #include <asm/arch/board-eb.h> | ||
40 | #include <asm/arch/irqs.h> | 42 | #include <asm/arch/irqs.h> |
41 | 43 | ||
42 | #include "core.h" | 44 | #include "core.h" |
@@ -58,26 +60,7 @@ static struct map_desc realview_eb_io_desc[] __initdata = { | |||
58 | .pfn = __phys_to_pfn(REALVIEW_GIC_DIST_BASE), | 60 | .pfn = __phys_to_pfn(REALVIEW_GIC_DIST_BASE), |
59 | .length = SZ_4K, | 61 | .length = SZ_4K, |
60 | .type = MT_DEVICE, | 62 | .type = MT_DEVICE, |
61 | }, | ||
62 | #ifdef CONFIG_REALVIEW_MPCORE | ||
63 | { | ||
64 | .virtual = IO_ADDRESS(REALVIEW_GIC1_CPU_BASE), | ||
65 | .pfn = __phys_to_pfn(REALVIEW_GIC1_CPU_BASE), | ||
66 | .length = SZ_4K, | ||
67 | .type = MT_DEVICE, | ||
68 | }, { | 63 | }, { |
69 | .virtual = IO_ADDRESS(REALVIEW_GIC1_DIST_BASE), | ||
70 | .pfn = __phys_to_pfn(REALVIEW_GIC1_DIST_BASE), | ||
71 | .length = SZ_4K, | ||
72 | .type = MT_DEVICE, | ||
73 | }, { | ||
74 | .virtual = IO_ADDRESS(REALVIEW_MPCORE_L220_BASE), | ||
75 | .pfn = __phys_to_pfn(REALVIEW_MPCORE_L220_BASE), | ||
76 | .length = SZ_8K, | ||
77 | .type = MT_DEVICE, | ||
78 | }, | ||
79 | #endif | ||
80 | { | ||
81 | .virtual = IO_ADDRESS(REALVIEW_SCTL_BASE), | 64 | .virtual = IO_ADDRESS(REALVIEW_SCTL_BASE), |
82 | .pfn = __phys_to_pfn(REALVIEW_SCTL_BASE), | 65 | .pfn = __phys_to_pfn(REALVIEW_SCTL_BASE), |
83 | .length = SZ_4K, | 66 | .length = SZ_4K, |
@@ -103,11 +86,95 @@ static struct map_desc realview_eb_io_desc[] __initdata = { | |||
103 | #endif | 86 | #endif |
104 | }; | 87 | }; |
105 | 88 | ||
89 | static struct map_desc realview_eb11mp_io_desc[] __initdata = { | ||
90 | { | ||
91 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_GIC_CPU_BASE), | ||
92 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_GIC_CPU_BASE), | ||
93 | .length = SZ_4K, | ||
94 | .type = MT_DEVICE, | ||
95 | }, { | ||
96 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_GIC_DIST_BASE), | ||
97 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_GIC_DIST_BASE), | ||
98 | .length = SZ_4K, | ||
99 | .type = MT_DEVICE, | ||
100 | }, { | ||
101 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_L220_BASE), | ||
102 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_L220_BASE), | ||
103 | .length = SZ_8K, | ||
104 | .type = MT_DEVICE, | ||
105 | } | ||
106 | }; | ||
107 | |||
106 | static void __init realview_eb_map_io(void) | 108 | static void __init realview_eb_map_io(void) |
107 | { | 109 | { |
108 | iotable_init(realview_eb_io_desc, ARRAY_SIZE(realview_eb_io_desc)); | 110 | iotable_init(realview_eb_io_desc, ARRAY_SIZE(realview_eb_io_desc)); |
111 | if (core_tile_eb11mp()) | ||
112 | iotable_init(realview_eb11mp_io_desc, ARRAY_SIZE(realview_eb11mp_io_desc)); | ||
109 | } | 113 | } |
110 | 114 | ||
115 | /* | ||
116 | * RealView EB AMBA devices | ||
117 | */ | ||
118 | |||
119 | /* | ||
120 | * These devices are connected via the core APB bridge | ||
121 | */ | ||
122 | #define GPIO2_IRQ { IRQ_EB_GPIO2, NO_IRQ } | ||
123 | #define GPIO2_DMA { 0, 0 } | ||
124 | #define GPIO3_IRQ { IRQ_EB_GPIO3, NO_IRQ } | ||
125 | #define GPIO3_DMA { 0, 0 } | ||
126 | |||
127 | #define AACI_IRQ { IRQ_EB_AACI, NO_IRQ } | ||
128 | #define AACI_DMA { 0x80, 0x81 } | ||
129 | #define MMCI0_IRQ { IRQ_EB_MMCI0A, IRQ_EB_MMCI0B } | ||
130 | #define MMCI0_DMA { 0x84, 0 } | ||
131 | #define KMI0_IRQ { IRQ_EB_KMI0, NO_IRQ } | ||
132 | #define KMI0_DMA { 0, 0 } | ||
133 | #define KMI1_IRQ { IRQ_EB_KMI1, NO_IRQ } | ||
134 | #define KMI1_DMA { 0, 0 } | ||
135 | |||
136 | /* | ||
137 | * These devices are connected directly to the multi-layer AHB switch | ||
138 | */ | ||
139 | #define SMC_IRQ { NO_IRQ, NO_IRQ } | ||
140 | #define SMC_DMA { 0, 0 } | ||
141 | #define MPMC_IRQ { NO_IRQ, NO_IRQ } | ||
142 | #define MPMC_DMA { 0, 0 } | ||
143 | #define CLCD_IRQ { IRQ_EB_CLCD, NO_IRQ } | ||
144 | #define CLCD_DMA { 0, 0 } | ||
145 | #define DMAC_IRQ { IRQ_EB_DMA, NO_IRQ } | ||
146 | #define DMAC_DMA { 0, 0 } | ||
147 | |||
148 | /* | ||
149 | * These devices are connected via the core APB bridge | ||
150 | */ | ||
151 | #define SCTL_IRQ { NO_IRQ, NO_IRQ } | ||
152 | #define SCTL_DMA { 0, 0 } | ||
153 | #define WATCHDOG_IRQ { IRQ_EB_WDOG, NO_IRQ } | ||
154 | #define WATCHDOG_DMA { 0, 0 } | ||
155 | #define GPIO0_IRQ { IRQ_EB_GPIO0, NO_IRQ } | ||
156 | #define GPIO0_DMA { 0, 0 } | ||
157 | #define GPIO1_IRQ { IRQ_EB_GPIO1, NO_IRQ } | ||
158 | #define GPIO1_DMA { 0, 0 } | ||
159 | #define RTC_IRQ { IRQ_EB_RTC, NO_IRQ } | ||
160 | #define RTC_DMA { 0, 0 } | ||
161 | |||
162 | /* | ||
163 | * These devices are connected via the DMA APB bridge | ||
164 | */ | ||
165 | #define SCI_IRQ { IRQ_EB_SCI, NO_IRQ } | ||
166 | #define SCI_DMA { 7, 6 } | ||
167 | #define UART0_IRQ { IRQ_EB_UART0, NO_IRQ } | ||
168 | #define UART0_DMA { 15, 14 } | ||
169 | #define UART1_IRQ { IRQ_EB_UART1, NO_IRQ } | ||
170 | #define UART1_DMA { 13, 12 } | ||
171 | #define UART2_IRQ { IRQ_EB_UART2, NO_IRQ } | ||
172 | #define UART2_DMA { 11, 10 } | ||
173 | #define UART3_IRQ { IRQ_EB_UART3, NO_IRQ } | ||
174 | #define UART3_DMA { 0x86, 0x87 } | ||
175 | #define SSP_IRQ { IRQ_EB_SSP, NO_IRQ } | ||
176 | #define SSP_DMA { 9, 8 } | ||
177 | |||
111 | /* FPGA Primecells */ | 178 | /* FPGA Primecells */ |
112 | AMBA_DEVICE(aaci, "fpga:04", AACI, NULL); | 179 | AMBA_DEVICE(aaci, "fpga:04", AACI, NULL); |
113 | AMBA_DEVICE(mmc0, "fpga:05", MMCI0, &realview_mmc0_plat_data); | 180 | AMBA_DEVICE(mmc0, "fpga:05", MMCI0, &realview_mmc0_plat_data); |
@@ -153,38 +220,127 @@ static struct amba_device *amba_devs[] __initdata = { | |||
153 | &kmi1_device, | 220 | &kmi1_device, |
154 | }; | 221 | }; |
155 | 222 | ||
223 | /* | ||
224 | * RealView EB platform devices | ||
225 | */ | ||
226 | |||
227 | static struct resource realview_eb_smc91x_resources[] = { | ||
228 | [0] = { | ||
229 | .start = REALVIEW_ETH_BASE, | ||
230 | .end = REALVIEW_ETH_BASE + SZ_64K - 1, | ||
231 | .flags = IORESOURCE_MEM, | ||
232 | }, | ||
233 | [1] = { | ||
234 | .start = IRQ_EB_ETH, | ||
235 | .end = IRQ_EB_ETH, | ||
236 | .flags = IORESOURCE_IRQ, | ||
237 | }, | ||
238 | }; | ||
239 | |||
240 | static struct platform_device realview_eb_smc91x_device = { | ||
241 | .name = "smc91x", | ||
242 | .id = 0, | ||
243 | .num_resources = ARRAY_SIZE(realview_eb_smc91x_resources), | ||
244 | .resource = realview_eb_smc91x_resources, | ||
245 | }; | ||
246 | |||
156 | static void __init gic_init_irq(void) | 247 | static void __init gic_init_irq(void) |
157 | { | 248 | { |
158 | #ifdef CONFIG_REALVIEW_MPCORE | 249 | if (core_tile_eb11mp()) { |
159 | unsigned int pldctrl; | 250 | unsigned int pldctrl; |
160 | writel(0x0000a05f, __io_address(REALVIEW_SYS_LOCK)); | 251 | |
161 | pldctrl = readl(__io_address(REALVIEW_SYS_BASE) + REALVIEW_MPCORE_SYS_PLD_CTRL1); | 252 | /* new irq mode */ |
162 | pldctrl |= 0x00800000; /* New irq mode */ | 253 | writel(0x0000a05f, __io_address(REALVIEW_SYS_LOCK)); |
163 | writel(pldctrl, __io_address(REALVIEW_SYS_BASE) + REALVIEW_MPCORE_SYS_PLD_CTRL1); | 254 | pldctrl = readl(__io_address(REALVIEW_SYS_BASE) + REALVIEW_EB11MP_SYS_PLD_CTRL1); |
164 | writel(0x00000000, __io_address(REALVIEW_SYS_LOCK)); | 255 | pldctrl |= 0x00800000; |
256 | writel(pldctrl, __io_address(REALVIEW_SYS_BASE) + REALVIEW_EB11MP_SYS_PLD_CTRL1); | ||
257 | writel(0x00000000, __io_address(REALVIEW_SYS_LOCK)); | ||
258 | |||
259 | /* core tile GIC, primary */ | ||
260 | gic_cpu_base_addr = __io_address(REALVIEW_EB11MP_GIC_CPU_BASE); | ||
261 | gic_dist_init(0, __io_address(REALVIEW_EB11MP_GIC_DIST_BASE), 29); | ||
262 | gic_cpu_init(0, gic_cpu_base_addr); | ||
263 | |||
264 | #ifndef CONFIG_REALVIEW_EB_ARM11MP_REVB | ||
265 | /* board GIC, secondary */ | ||
266 | gic_dist_init(1, __io_address(REALVIEW_GIC_DIST_BASE), 64); | ||
267 | gic_cpu_init(1, __io_address(REALVIEW_GIC_CPU_BASE)); | ||
268 | gic_cascade_irq(1, IRQ_EB11MP_EB_IRQ1); | ||
165 | #endif | 269 | #endif |
166 | gic_dist_init(0, __io_address(REALVIEW_GIC_DIST_BASE), 29); | 270 | } else { |
167 | gic_cpu_init(0, __io_address(REALVIEW_GIC_CPU_BASE)); | 271 | /* board GIC, primary */ |
168 | #if defined(CONFIG_REALVIEW_MPCORE) && !defined(CONFIG_REALVIEW_MPCORE_REVB) | 272 | gic_cpu_base_addr = __io_address(REALVIEW_GIC_CPU_BASE); |
169 | gic_dist_init(1, __io_address(REALVIEW_GIC1_DIST_BASE), 64); | 273 | gic_dist_init(0, __io_address(REALVIEW_GIC_DIST_BASE), 29); |
170 | gic_cpu_init(1, __io_address(REALVIEW_GIC1_CPU_BASE)); | 274 | gic_cpu_init(0, gic_cpu_base_addr); |
171 | gic_cascade_irq(1, IRQ_EB_IRQ1); | 275 | } |
276 | } | ||
277 | |||
278 | /* | ||
279 | * Fix up the IRQ numbers for the RealView EB/ARM11MPCore tile | ||
280 | */ | ||
281 | static void realview_eb11mp_fixup(void) | ||
282 | { | ||
283 | /* AMBA devices */ | ||
284 | dmac_device.irq[0] = IRQ_EB11MP_DMA; | ||
285 | uart0_device.irq[0] = IRQ_EB11MP_UART0; | ||
286 | uart1_device.irq[0] = IRQ_EB11MP_UART1; | ||
287 | uart2_device.irq[0] = IRQ_EB11MP_UART2; | ||
288 | uart3_device.irq[0] = IRQ_EB11MP_UART3; | ||
289 | clcd_device.irq[0] = IRQ_EB11MP_CLCD; | ||
290 | wdog_device.irq[0] = IRQ_EB11MP_WDOG; | ||
291 | gpio0_device.irq[0] = IRQ_EB11MP_GPIO0; | ||
292 | gpio1_device.irq[0] = IRQ_EB11MP_GPIO1; | ||
293 | gpio2_device.irq[0] = IRQ_EB11MP_GPIO2; | ||
294 | rtc_device.irq[0] = IRQ_EB11MP_RTC; | ||
295 | sci0_device.irq[0] = IRQ_EB11MP_SCI; | ||
296 | ssp0_device.irq[0] = IRQ_EB11MP_SSP; | ||
297 | aaci_device.irq[0] = IRQ_EB11MP_AACI; | ||
298 | mmc0_device.irq[0] = IRQ_EB11MP_MMCI0A; | ||
299 | mmc0_device.irq[1] = IRQ_EB11MP_MMCI0B; | ||
300 | kmi0_device.irq[0] = IRQ_EB11MP_KMI0; | ||
301 | kmi1_device.irq[0] = IRQ_EB11MP_KMI1; | ||
302 | |||
303 | /* platform devices */ | ||
304 | realview_eb_smc91x_resources[1].start = IRQ_EB11MP_ETH; | ||
305 | realview_eb_smc91x_resources[1].end = IRQ_EB11MP_ETH; | ||
306 | } | ||
307 | |||
308 | static void __init realview_eb_timer_init(void) | ||
309 | { | ||
310 | unsigned int timer_irq; | ||
311 | |||
312 | if (core_tile_eb11mp()) { | ||
313 | #ifdef CONFIG_LOCAL_TIMERS | ||
314 | twd_base_addr = __io_address(REALVIEW_EB11MP_TWD_BASE); | ||
315 | twd_size = REALVIEW_EB11MP_TWD_SIZE; | ||
172 | #endif | 316 | #endif |
317 | timer_irq = IRQ_EB11MP_TIMER0_1; | ||
318 | } else | ||
319 | timer_irq = IRQ_EB_TIMER0_1; | ||
320 | |||
321 | realview_timer_init(timer_irq); | ||
173 | } | 322 | } |
174 | 323 | ||
324 | static struct sys_timer realview_eb_timer = { | ||
325 | .init = realview_eb_timer_init, | ||
326 | }; | ||
327 | |||
175 | static void __init realview_eb_init(void) | 328 | static void __init realview_eb_init(void) |
176 | { | 329 | { |
177 | int i; | 330 | int i; |
178 | 331 | ||
179 | #ifdef CONFIG_REALVIEW_MPCORE | 332 | if (core_tile_eb11mp()) { |
180 | /* 1MB (128KB/way), 8-way associativity, evmon/parity/share enabled | 333 | realview_eb11mp_fixup(); |
181 | * Bits: .... ...0 0111 1001 0000 .... .... .... */ | 334 | |
182 | l2x0_init(__io_address(REALVIEW_MPCORE_L220_BASE), 0x00790000, 0xfe000fff); | 335 | /* 1MB (128KB/way), 8-way associativity, evmon/parity/share enabled |
183 | #endif | 336 | * Bits: .... ...0 0111 1001 0000 .... .... .... */ |
337 | l2x0_init(__io_address(REALVIEW_EB11MP_L220_BASE), 0x00790000, 0xfe000fff); | ||
338 | } | ||
339 | |||
184 | clk_register(&realview_clcd_clk); | 340 | clk_register(&realview_clcd_clk); |
185 | 341 | ||
186 | platform_device_register(&realview_flash_device); | 342 | platform_device_register(&realview_flash_device); |
187 | platform_device_register(&realview_smc91x_device); | 343 | platform_device_register(&realview_eb_smc91x_device); |
188 | platform_device_register(&realview_i2c_device); | 344 | platform_device_register(&realview_i2c_device); |
189 | 345 | ||
190 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { | 346 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { |
@@ -204,6 +360,6 @@ MACHINE_START(REALVIEW_EB, "ARM-RealView EB") | |||
204 | .boot_params = 0x00000100, | 360 | .boot_params = 0x00000100, |
205 | .map_io = realview_eb_map_io, | 361 | .map_io = realview_eb_map_io, |
206 | .init_irq = gic_init_irq, | 362 | .init_irq = gic_init_irq, |
207 | .timer = &realview_timer, | 363 | .timer = &realview_eb_timer, |
208 | .init_machine = realview_eb_init, | 364 | .init_machine = realview_eb_init, |
209 | MACHINE_END | 365 | MACHINE_END |