Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
realview_eb.c
Go to the documentation of this file.
1 /*
2  * linux/arch/arm/mach-realview/realview_eb.c
3  *
4  * Copyright (C) 2004 ARM Limited
5  * Copyright (C) 2000 Deep Blue Solutions Ltd
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21 
22 #include <linux/init.h>
23 #include <linux/platform_device.h>
24 #include <linux/device.h>
25 #include <linux/amba/bus.h>
26 #include <linux/amba/pl061.h>
27 #include <linux/amba/mmci.h>
28 #include <linux/amba/pl022.h>
29 #include <linux/io.h>
31 
32 #include <mach/hardware.h>
33 #include <asm/irq.h>
34 #include <asm/mach-types.h>
35 #include <asm/pgtable.h>
36 #include <asm/hardware/gic.h>
38 #include <asm/smp_twd.h>
39 
40 #include <asm/mach/arch.h>
41 #include <asm/mach/map.h>
42 #include <asm/mach/time.h>
43 
44 #include <mach/board-eb.h>
45 #include <mach/irqs.h>
46 
47 #include "core.h"
48 
49 static struct map_desc realview_eb_io_desc[] __initdata = {
50  {
51  .virtual = IO_ADDRESS(REALVIEW_SYS_BASE),
53  .length = SZ_4K,
54  .type = MT_DEVICE,
55  }, {
58  .length = SZ_4K,
59  .type = MT_DEVICE,
60  }, {
63  .length = SZ_4K,
64  .type = MT_DEVICE,
65  }, {
66  .virtual = IO_ADDRESS(REALVIEW_SCTL_BASE),
68  .length = SZ_4K,
69  .type = MT_DEVICE,
70  }, {
73  .length = SZ_4K,
74  .type = MT_DEVICE,
75  }, {
78  .length = SZ_4K,
79  .type = MT_DEVICE,
80  },
81 #ifdef CONFIG_DEBUG_LL
82  {
85  .length = SZ_4K,
86  .type = MT_DEVICE,
87  }
88 #endif
89 };
90 
91 static struct map_desc realview_eb11mp_io_desc[] __initdata = {
92  {
96  .type = MT_DEVICE,
97  }, {
100  .length = SZ_8K,
101  .type = MT_DEVICE,
102  }
103 };
104 
105 static void __init realview_eb_map_io(void)
106 {
107  iotable_init(realview_eb_io_desc, ARRAY_SIZE(realview_eb_io_desc));
108  if (core_tile_eb11mp() || core_tile_a9mp())
109  iotable_init(realview_eb11mp_io_desc, ARRAY_SIZE(realview_eb11mp_io_desc));
110 }
111 
112 static struct pl061_platform_data gpio0_plat_data = {
113  .gpio_base = 0,
114 };
115 
116 static struct pl061_platform_data gpio1_plat_data = {
117  .gpio_base = 8,
118 };
119 
120 static struct pl061_platform_data gpio2_plat_data = {
121  .gpio_base = 16,
122 };
123 
124 static struct pl022_ssp_controller ssp0_plat_data = {
125  .bus_id = 0,
126  .enable_dma = 0,
127  .num_chipselect = 1,
128 };
129 
130 /*
131  * RealView EB AMBA devices
132  */
133 
134 /*
135  * These devices are connected via the core APB bridge
136  */
137 #define GPIO2_IRQ { IRQ_EB_GPIO2 }
138 #define GPIO3_IRQ { IRQ_EB_GPIO3 }
139 
140 #define AACI_IRQ { IRQ_EB_AACI }
141 #define MMCI0_IRQ { IRQ_EB_MMCI0A, IRQ_EB_MMCI0B }
142 #define KMI0_IRQ { IRQ_EB_KMI0 }
143 #define KMI1_IRQ { IRQ_EB_KMI1 }
144 
145 /*
146  * These devices are connected directly to the multi-layer AHB switch
147  */
148 #define EB_SMC_IRQ { }
149 #define MPMC_IRQ { }
150 #define EB_CLCD_IRQ { IRQ_EB_CLCD }
151 #define DMAC_IRQ { IRQ_EB_DMA }
152 
153 /*
154  * These devices are connected via the core APB bridge
155  */
156 #define SCTL_IRQ { }
157 #define EB_WATCHDOG_IRQ { IRQ_EB_WDOG }
158 #define EB_GPIO0_IRQ { IRQ_EB_GPIO0 }
159 #define GPIO1_IRQ { IRQ_EB_GPIO1 }
160 #define EB_RTC_IRQ { IRQ_EB_RTC }
161 
162 /*
163  * These devices are connected via the DMA APB bridge
164  */
165 #define SCI_IRQ { IRQ_EB_SCI }
166 #define EB_UART0_IRQ { IRQ_EB_UART0 }
167 #define EB_UART1_IRQ { IRQ_EB_UART1 }
168 #define EB_UART2_IRQ { IRQ_EB_UART2 }
169 #define EB_UART3_IRQ { IRQ_EB_UART3 }
170 #define EB_SSP_IRQ { IRQ_EB_SSP }
171 
172 /* FPGA Primecells */
173 APB_DEVICE(aaci, "fpga:aaci", AACI, NULL);
174 APB_DEVICE(mmc0, "fpga:mmc0", MMCI0, &realview_mmc0_plat_data);
175 APB_DEVICE(kmi0, "fpga:kmi0", KMI0, NULL);
176 APB_DEVICE(kmi1, "fpga:kmi1", KMI1, NULL);
177 APB_DEVICE(uart3, "fpga:uart3", EB_UART3, NULL);
178 
179 /* DevChip Primecells */
180 AHB_DEVICE(smc, "dev:smc", EB_SMC, NULL);
181 AHB_DEVICE(clcd, "dev:clcd", EB_CLCD, &clcd_plat_data);
182 AHB_DEVICE(dmac, "dev:dmac", DMAC, NULL);
183 AHB_DEVICE(sctl, "dev:sctl", SCTL, NULL);
184 APB_DEVICE(wdog, "dev:wdog", EB_WATCHDOG, NULL);
185 APB_DEVICE(gpio0, "dev:gpio0", EB_GPIO0, &gpio0_plat_data);
186 APB_DEVICE(gpio1, "dev:gpio1", GPIO1, &gpio1_plat_data);
187 APB_DEVICE(gpio2, "dev:gpio2", GPIO2, &gpio2_plat_data);
188 APB_DEVICE(rtc, "dev:rtc", EB_RTC, NULL);
189 APB_DEVICE(sci0, "dev:sci0", SCI, NULL);
190 APB_DEVICE(uart0, "dev:uart0", EB_UART0, NULL);
191 APB_DEVICE(uart1, "dev:uart1", EB_UART1, NULL);
192 APB_DEVICE(uart2, "dev:uart2", EB_UART2, NULL);
193 APB_DEVICE(ssp0, "dev:ssp0", EB_SSP, &ssp0_plat_data);
194 
195 static struct amba_device *amba_devs[] __initdata = {
196  &dmac_device,
197  &uart0_device,
198  &uart1_device,
199  &uart2_device,
200  &uart3_device,
201  &smc_device,
202  &clcd_device,
203  &sctl_device,
204  &wdog_device,
205  &gpio0_device,
206  &gpio1_device,
207  &gpio2_device,
208  &rtc_device,
209  &sci0_device,
210  &ssp0_device,
211  &aaci_device,
212  &mmc0_device,
213  &kmi0_device,
214  &kmi1_device,
215 };
216 
217 /*
218  * RealView EB platform devices
219  */
220 static struct resource realview_eb_flash_resource = {
221  .start = REALVIEW_EB_FLASH_BASE,
223  .flags = IORESOURCE_MEM,
224 };
225 
226 static struct resource realview_eb_eth_resources[] = {
227  [0] = {
228  .start = REALVIEW_EB_ETH_BASE,
229  .end = REALVIEW_EB_ETH_BASE + SZ_64K - 1,
230  .flags = IORESOURCE_MEM,
231  },
232  [1] = {
233  .start = IRQ_EB_ETH,
234  .end = IRQ_EB_ETH,
235  .flags = IORESOURCE_IRQ,
236  },
237 };
238 
239 /*
240  * Detect and register the correct Ethernet device. RealView/EB rev D
241  * platforms use the newer SMSC LAN9118 Ethernet chip
242  */
243 static int eth_device_register(void)
244 {
246  const char *name = NULL;
247  u32 idrev;
248 
249  if (!eth_addr)
250  return -ENOMEM;
251 
252  idrev = readl(eth_addr + 0x50);
253  if ((idrev & 0xFFFF0000) != 0x01180000)
254  /* SMSC LAN9118 not present, use LAN91C111 instead */
255  name = "smc91x";
256 
257  iounmap(eth_addr);
258  return realview_eth_register(name, realview_eb_eth_resources);
259 }
260 
261 static struct resource realview_eb_isp1761_resources[] = {
262  [0] = {
263  .start = REALVIEW_EB_USB_BASE,
264  .end = REALVIEW_EB_USB_BASE + SZ_128K - 1,
265  .flags = IORESOURCE_MEM,
266  },
267  [1] = {
268  .start = IRQ_EB_USB,
269  .end = IRQ_EB_USB,
270  .flags = IORESOURCE_IRQ,
271  },
272 };
273 
274 static struct resource pmu_resources[] = {
275  [0] = {
276  .start = IRQ_EB11MP_PMU_CPU0,
277  .end = IRQ_EB11MP_PMU_CPU0,
278  .flags = IORESOURCE_IRQ,
279  },
280  [1] = {
281  .start = IRQ_EB11MP_PMU_CPU1,
282  .end = IRQ_EB11MP_PMU_CPU1,
283  .flags = IORESOURCE_IRQ,
284  },
285  [2] = {
286  .start = IRQ_EB11MP_PMU_CPU2,
287  .end = IRQ_EB11MP_PMU_CPU2,
288  .flags = IORESOURCE_IRQ,
289  },
290  [3] = {
291  .start = IRQ_EB11MP_PMU_CPU3,
292  .end = IRQ_EB11MP_PMU_CPU3,
293  .flags = IORESOURCE_IRQ,
294  },
295 };
296 
297 static struct platform_device pmu_device = {
298  .name = "arm-pmu",
299  .id = -1,
300  .num_resources = ARRAY_SIZE(pmu_resources),
301  .resource = pmu_resources,
302 };
303 
304 static struct resource char_lcd_resources[] = {
305  {
306  .start = REALVIEW_CHAR_LCD_BASE,
307  .end = (REALVIEW_CHAR_LCD_BASE + SZ_4K - 1),
309  },
310  {
311  .start = IRQ_EB_CHARLCD,
312  .end = IRQ_EB_CHARLCD,
313  .flags = IORESOURCE_IRQ,
314  },
315 };
316 
317 static struct platform_device char_lcd_device = {
318  .name = "arm-charlcd",
319  .id = -1,
320  .num_resources = ARRAY_SIZE(char_lcd_resources),
321  .resource = char_lcd_resources,
322 };
323 
324 static void __init gic_init_irq(void)
325 {
326  if (core_tile_eb11mp() || core_tile_a9mp()) {
327  unsigned int pldctrl;
328 
329  /* new irq mode */
330  writel(0x0000a05f, __io_address(REALVIEW_SYS_LOCK));
332  pldctrl |= 0x00800000;
334  writel(0x00000000, __io_address(REALVIEW_SYS_LOCK));
335 
336  /* core tile GIC, primary */
339 
340 #ifndef CONFIG_REALVIEW_EB_ARM11MP_REVB
341  /* board GIC, secondary */
345 #endif
346  } else {
347  /* board GIC, primary */
350  }
351 }
352 
353 /*
354  * Fix up the IRQ numbers for the RealView EB/ARM11MPCore tile
355  */
356 static void realview_eb11mp_fixup(void)
357 {
358  /* AMBA devices */
359  dmac_device.irq[0] = IRQ_EB11MP_DMA;
360  uart0_device.irq[0] = IRQ_EB11MP_UART0;
361  uart1_device.irq[0] = IRQ_EB11MP_UART1;
362  uart2_device.irq[0] = IRQ_EB11MP_UART2;
363  uart3_device.irq[0] = IRQ_EB11MP_UART3;
364  clcd_device.irq[0] = IRQ_EB11MP_CLCD;
365  wdog_device.irq[0] = IRQ_EB11MP_WDOG;
366  gpio0_device.irq[0] = IRQ_EB11MP_GPIO0;
367  gpio1_device.irq[0] = IRQ_EB11MP_GPIO1;
368  gpio2_device.irq[0] = IRQ_EB11MP_GPIO2;
369  rtc_device.irq[0] = IRQ_EB11MP_RTC;
370  sci0_device.irq[0] = IRQ_EB11MP_SCI;
371  ssp0_device.irq[0] = IRQ_EB11MP_SSP;
372  aaci_device.irq[0] = IRQ_EB11MP_AACI;
373  mmc0_device.irq[0] = IRQ_EB11MP_MMCI0A;
374  mmc0_device.irq[1] = IRQ_EB11MP_MMCI0B;
375  kmi0_device.irq[0] = IRQ_EB11MP_KMI0;
376  kmi1_device.irq[0] = IRQ_EB11MP_KMI1;
377 
378  /* platform devices */
379  realview_eb_eth_resources[1].start = IRQ_EB11MP_ETH;
380  realview_eb_eth_resources[1].end = IRQ_EB11MP_ETH;
381  realview_eb_isp1761_resources[1].start = IRQ_EB11MP_USB;
382  realview_eb_isp1761_resources[1].end = IRQ_EB11MP_USB;
383 }
384 
385 #ifdef CONFIG_HAVE_ARM_TWD
389 
390 static void __init realview_eb_twd_init(void)
391 {
392  if (core_tile_eb11mp() || core_tile_a9mp()) {
394  if (err)
395  pr_err("twd_local_timer_register failed %d\n", err);
396  }
397 }
398 #else
399 #define realview_eb_twd_init() do { } while(0)
400 #endif
401 
402 static void __init realview_eb_timer_init(void)
403 {
404  unsigned int timer_irq;
405 
410 
411  if (core_tile_eb11mp() || core_tile_a9mp())
412  timer_irq = IRQ_EB11MP_TIMER0_1;
413  else
414  timer_irq = IRQ_EB_TIMER0_1;
415 
417  realview_timer_init(timer_irq);
419 }
420 
421 static struct sys_timer realview_eb_timer = {
422  .init = realview_eb_timer_init,
423 };
424 
425 static void realview_eb_restart(char mode, const char *cmd)
426 {
427  void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL);
428  void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK);
429 
430  /*
431  * To reset, we hit the on-board reset register
432  * in the system FPGA
433  */
435  if (core_tile_eb11mp())
436  __raw_writel(0x0008, reset_ctrl);
437  dsb();
438 }
439 
440 static void __init realview_eb_init(void)
441 {
442  int i;
443 
444  if (core_tile_eb11mp() || core_tile_a9mp()) {
445  realview_eb11mp_fixup();
446 
447 #ifdef CONFIG_CACHE_L2X0
448  /* 1MB (128KB/way), 8-way associativity, evmon/parity/share enabled
449  * Bits: .... ...0 0111 1001 0000 .... .... .... */
450  l2x0_init(__io_address(REALVIEW_EB11MP_L220_BASE), 0x00790000, 0xfe000fff);
451 #endif
452  platform_device_register(&pmu_device);
453  }
454 
455  realview_flash_register(&realview_eb_flash_resource, 1);
457  platform_device_register(&char_lcd_device);
458  eth_device_register();
459  realview_usb_register(realview_eb_isp1761_resources);
460 
461  for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
462  struct amba_device *d = amba_devs[i];
464  }
465 }
466 
467 MACHINE_START(REALVIEW_EB, "ARM-RealView EB")
468  /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
469  .atag_offset = 0x100,
470  .fixup = realview_fixup,
471  .map_io = realview_eb_map_io,
472  .init_early = realview_init_early,
473  .init_irq = gic_init_irq,
474  .timer = &realview_eb_timer,
475  .handle_irq = gic_handle_irq,
476  .init_machine = realview_eb_init,
477 #ifdef CONFIG_ZONE_DMA
478  .dma_zone_size = SZ_256M,
479 #endif
480  .restart = realview_eb_restart,