2 * arch/arm/mach-kirkwood/common.c
4 * Core functions for Marvell Kirkwood SoCs
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/platform_device.h>
14 #include <linux/serial_8250.h>
15 #include <linux/mbus.h>
16 #include <linux/mv643xx_eth.h>
17 #include <linux/ata_platform.h>
18 #include <linux/spi/orion_spi.h>
20 #include <asm/timex.h>
21 #include <asm/mach/map.h>
22 #include <asm/mach/time.h>
23 #include <mach/kirkwood.h>
24 #include <plat/cache-feroceon-l2.h>
25 #include <plat/ehci-orion.h>
26 #include <plat/mv_xor.h>
27 #include <plat/orion_nand.h>
28 #include <plat/time.h>
31 /*****************************************************************************
33 ****************************************************************************/
34 static struct map_desc kirkwood_io_desc[] __initdata = {
36 .virtual = KIRKWOOD_PCIE_IO_VIRT_BASE,
37 .pfn = __phys_to_pfn(KIRKWOOD_PCIE_IO_PHYS_BASE),
38 .length = KIRKWOOD_PCIE_IO_SIZE,
41 .virtual = KIRKWOOD_REGS_VIRT_BASE,
42 .pfn = __phys_to_pfn(KIRKWOOD_REGS_PHYS_BASE),
43 .length = KIRKWOOD_REGS_SIZE,
48 void __init kirkwood_map_io(void)
50 iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc));
54 /*****************************************************************************
56 ****************************************************************************/
57 static struct orion_ehci_data kirkwood_ehci_data = {
58 .dram = &kirkwood_mbus_dram_info,
61 static u64 ehci_dmamask = 0xffffffffUL;
64 /*****************************************************************************
66 ****************************************************************************/
67 static struct resource kirkwood_ehci_resources[] = {
69 .start = USB_PHYS_BASE,
70 .end = USB_PHYS_BASE + 0x0fff,
71 .flags = IORESOURCE_MEM,
73 .start = IRQ_KIRKWOOD_USB,
74 .end = IRQ_KIRKWOOD_USB,
75 .flags = IORESOURCE_IRQ,
79 static struct platform_device kirkwood_ehci = {
83 .dma_mask = &ehci_dmamask,
84 .coherent_dma_mask = 0xffffffff,
85 .platform_data = &kirkwood_ehci_data,
87 .resource = kirkwood_ehci_resources,
88 .num_resources = ARRAY_SIZE(kirkwood_ehci_resources),
91 void __init kirkwood_ehci_init(void)
93 platform_device_register(&kirkwood_ehci);
97 /*****************************************************************************
99 ****************************************************************************/
100 struct mv643xx_eth_shared_platform_data kirkwood_ge00_shared_data = {
101 .t_clk = KIRKWOOD_TCLK,
102 .dram = &kirkwood_mbus_dram_info,
105 static struct resource kirkwood_ge00_shared_resources[] = {
108 .start = GE00_PHYS_BASE + 0x2000,
109 .end = GE00_PHYS_BASE + 0x3fff,
110 .flags = IORESOURCE_MEM,
114 static struct platform_device kirkwood_ge00_shared = {
115 .name = MV643XX_ETH_SHARED_NAME,
118 .platform_data = &kirkwood_ge00_shared_data,
121 .resource = kirkwood_ge00_shared_resources,
124 static struct resource kirkwood_ge00_resources[] = {
127 .start = IRQ_KIRKWOOD_GE00_SUM,
128 .end = IRQ_KIRKWOOD_GE00_SUM,
129 .flags = IORESOURCE_IRQ,
133 static struct platform_device kirkwood_ge00 = {
134 .name = MV643XX_ETH_NAME,
137 .resource = kirkwood_ge00_resources,
140 void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data)
142 eth_data->shared = &kirkwood_ge00_shared;
143 kirkwood_ge00.dev.platform_data = eth_data;
145 platform_device_register(&kirkwood_ge00_shared);
146 platform_device_register(&kirkwood_ge00);
150 /*****************************************************************************
152 ****************************************************************************/
153 static struct resource kirkwood_rtc_resource = {
154 .start = RTC_PHYS_BASE,
155 .end = RTC_PHYS_BASE + SZ_16 - 1,
156 .flags = IORESOURCE_MEM,
159 void __init kirkwood_rtc_init(void)
161 platform_device_register_simple("rtc-mv", -1, &kirkwood_rtc_resource, 1);
165 /*****************************************************************************
167 ****************************************************************************/
168 static struct resource kirkwood_sata_resources[] = {
171 .start = SATA_PHYS_BASE,
172 .end = SATA_PHYS_BASE + 0x5000 - 1,
173 .flags = IORESOURCE_MEM,
176 .start = IRQ_KIRKWOOD_SATA,
177 .end = IRQ_KIRKWOOD_SATA,
178 .flags = IORESOURCE_IRQ,
182 static struct platform_device kirkwood_sata = {
186 .coherent_dma_mask = 0xffffffff,
188 .num_resources = ARRAY_SIZE(kirkwood_sata_resources),
189 .resource = kirkwood_sata_resources,
192 void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data)
194 sata_data->dram = &kirkwood_mbus_dram_info;
195 kirkwood_sata.dev.platform_data = sata_data;
196 platform_device_register(&kirkwood_sata);
200 /*****************************************************************************
202 ****************************************************************************/
203 static struct orion_spi_info kirkwood_spi_plat_data = {
204 .tclk = KIRKWOOD_TCLK,
207 static struct resource kirkwood_spi_resources[] = {
209 .start = SPI_PHYS_BASE,
210 .end = SPI_PHYS_BASE + SZ_512 - 1,
211 .flags = IORESOURCE_MEM,
215 static struct platform_device kirkwood_spi = {
218 .resource = kirkwood_spi_resources,
220 .platform_data = &kirkwood_spi_plat_data,
222 .num_resources = ARRAY_SIZE(kirkwood_spi_resources),
225 void __init kirkwood_spi_init()
227 platform_device_register(&kirkwood_spi);
231 /*****************************************************************************
233 ****************************************************************************/
234 static struct plat_serial8250_port kirkwood_uart0_data[] = {
236 .mapbase = UART0_PHYS_BASE,
237 .membase = (char *)UART0_VIRT_BASE,
238 .irq = IRQ_KIRKWOOD_UART_0,
239 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
242 .uartclk = KIRKWOOD_TCLK,
247 static struct resource kirkwood_uart0_resources[] = {
249 .start = UART0_PHYS_BASE,
250 .end = UART0_PHYS_BASE + 0xff,
251 .flags = IORESOURCE_MEM,
253 .start = IRQ_KIRKWOOD_UART_0,
254 .end = IRQ_KIRKWOOD_UART_0,
255 .flags = IORESOURCE_IRQ,
259 static struct platform_device kirkwood_uart0 = {
260 .name = "serial8250",
263 .platform_data = kirkwood_uart0_data,
265 .resource = kirkwood_uart0_resources,
266 .num_resources = ARRAY_SIZE(kirkwood_uart0_resources),
269 void __init kirkwood_uart0_init(void)
271 platform_device_register(&kirkwood_uart0);
275 /*****************************************************************************
277 ****************************************************************************/
278 static struct plat_serial8250_port kirkwood_uart1_data[] = {
280 .mapbase = UART1_PHYS_BASE,
281 .membase = (char *)UART1_VIRT_BASE,
282 .irq = IRQ_KIRKWOOD_UART_1,
283 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
286 .uartclk = KIRKWOOD_TCLK,
291 static struct resource kirkwood_uart1_resources[] = {
293 .start = UART1_PHYS_BASE,
294 .end = UART1_PHYS_BASE + 0xff,
295 .flags = IORESOURCE_MEM,
297 .start = IRQ_KIRKWOOD_UART_1,
298 .end = IRQ_KIRKWOOD_UART_1,
299 .flags = IORESOURCE_IRQ,
303 static struct platform_device kirkwood_uart1 = {
304 .name = "serial8250",
307 .platform_data = kirkwood_uart1_data,
309 .resource = kirkwood_uart1_resources,
310 .num_resources = ARRAY_SIZE(kirkwood_uart1_resources),
313 void __init kirkwood_uart1_init(void)
315 platform_device_register(&kirkwood_uart1);
319 /*****************************************************************************
321 ****************************************************************************/
322 static struct mv_xor_platform_shared_data kirkwood_xor_shared_data = {
323 .dram = &kirkwood_mbus_dram_info,
326 static u64 kirkwood_xor_dmamask = DMA_32BIT_MASK;
329 /*****************************************************************************
331 ****************************************************************************/
332 static struct resource kirkwood_xor0_shared_resources[] = {
335 .start = XOR0_PHYS_BASE,
336 .end = XOR0_PHYS_BASE + 0xff,
337 .flags = IORESOURCE_MEM,
339 .name = "xor 0 high",
340 .start = XOR0_HIGH_PHYS_BASE,
341 .end = XOR0_HIGH_PHYS_BASE + 0xff,
342 .flags = IORESOURCE_MEM,
346 static struct platform_device kirkwood_xor0_shared = {
347 .name = MV_XOR_SHARED_NAME,
350 .platform_data = &kirkwood_xor_shared_data,
352 .num_resources = ARRAY_SIZE(kirkwood_xor0_shared_resources),
353 .resource = kirkwood_xor0_shared_resources,
356 static struct resource kirkwood_xor00_resources[] = {
358 .start = IRQ_KIRKWOOD_XOR_00,
359 .end = IRQ_KIRKWOOD_XOR_00,
360 .flags = IORESOURCE_IRQ,
364 static struct mv_xor_platform_data kirkwood_xor00_data = {
365 .shared = &kirkwood_xor0_shared,
367 .pool_size = PAGE_SIZE,
370 static struct platform_device kirkwood_xor00_channel = {
373 .num_resources = ARRAY_SIZE(kirkwood_xor00_resources),
374 .resource = kirkwood_xor00_resources,
376 .dma_mask = &kirkwood_xor_dmamask,
377 .coherent_dma_mask = DMA_64BIT_MASK,
378 .platform_data = (void *)&kirkwood_xor00_data,
382 static struct resource kirkwood_xor01_resources[] = {
384 .start = IRQ_KIRKWOOD_XOR_01,
385 .end = IRQ_KIRKWOOD_XOR_01,
386 .flags = IORESOURCE_IRQ,
390 static struct mv_xor_platform_data kirkwood_xor01_data = {
391 .shared = &kirkwood_xor0_shared,
393 .pool_size = PAGE_SIZE,
396 static struct platform_device kirkwood_xor01_channel = {
399 .num_resources = ARRAY_SIZE(kirkwood_xor01_resources),
400 .resource = kirkwood_xor01_resources,
402 .dma_mask = &kirkwood_xor_dmamask,
403 .coherent_dma_mask = DMA_64BIT_MASK,
404 .platform_data = (void *)&kirkwood_xor01_data,
408 void __init kirkwood_xor0_init(void)
410 platform_device_register(&kirkwood_xor0_shared);
413 * two engines can't do memset simultaneously, this limitation
414 * satisfied by removing memset support from one of the engines.
416 dma_cap_set(DMA_MEMCPY, kirkwood_xor00_data.cap_mask);
417 dma_cap_set(DMA_XOR, kirkwood_xor00_data.cap_mask);
418 platform_device_register(&kirkwood_xor00_channel);
420 dma_cap_set(DMA_MEMCPY, kirkwood_xor01_data.cap_mask);
421 dma_cap_set(DMA_MEMSET, kirkwood_xor01_data.cap_mask);
422 dma_cap_set(DMA_XOR, kirkwood_xor01_data.cap_mask);
423 platform_device_register(&kirkwood_xor01_channel);
427 /*****************************************************************************
429 ****************************************************************************/
430 static struct resource kirkwood_xor1_shared_resources[] = {
433 .start = XOR1_PHYS_BASE,
434 .end = XOR1_PHYS_BASE + 0xff,
435 .flags = IORESOURCE_MEM,
437 .name = "xor 1 high",
438 .start = XOR1_HIGH_PHYS_BASE,
439 .end = XOR1_HIGH_PHYS_BASE + 0xff,
440 .flags = IORESOURCE_MEM,
444 static struct platform_device kirkwood_xor1_shared = {
445 .name = MV_XOR_SHARED_NAME,
448 .platform_data = &kirkwood_xor_shared_data,
450 .num_resources = ARRAY_SIZE(kirkwood_xor1_shared_resources),
451 .resource = kirkwood_xor1_shared_resources,
454 static struct resource kirkwood_xor10_resources[] = {
456 .start = IRQ_KIRKWOOD_XOR_10,
457 .end = IRQ_KIRKWOOD_XOR_10,
458 .flags = IORESOURCE_IRQ,
462 static struct mv_xor_platform_data kirkwood_xor10_data = {
463 .shared = &kirkwood_xor1_shared,
465 .pool_size = PAGE_SIZE,
468 static struct platform_device kirkwood_xor10_channel = {
471 .num_resources = ARRAY_SIZE(kirkwood_xor10_resources),
472 .resource = kirkwood_xor10_resources,
474 .dma_mask = &kirkwood_xor_dmamask,
475 .coherent_dma_mask = DMA_64BIT_MASK,
476 .platform_data = (void *)&kirkwood_xor10_data,
480 static struct resource kirkwood_xor11_resources[] = {
482 .start = IRQ_KIRKWOOD_XOR_11,
483 .end = IRQ_KIRKWOOD_XOR_11,
484 .flags = IORESOURCE_IRQ,
488 static struct mv_xor_platform_data kirkwood_xor11_data = {
489 .shared = &kirkwood_xor1_shared,
491 .pool_size = PAGE_SIZE,
494 static struct platform_device kirkwood_xor11_channel = {
497 .num_resources = ARRAY_SIZE(kirkwood_xor11_resources),
498 .resource = kirkwood_xor11_resources,
500 .dma_mask = &kirkwood_xor_dmamask,
501 .coherent_dma_mask = DMA_64BIT_MASK,
502 .platform_data = (void *)&kirkwood_xor11_data,
506 void __init kirkwood_xor1_init(void)
508 platform_device_register(&kirkwood_xor1_shared);
511 * two engines can't do memset simultaneously, this limitation
512 * satisfied by removing memset support from one of the engines.
514 dma_cap_set(DMA_MEMCPY, kirkwood_xor10_data.cap_mask);
515 dma_cap_set(DMA_XOR, kirkwood_xor10_data.cap_mask);
516 platform_device_register(&kirkwood_xor10_channel);
518 dma_cap_set(DMA_MEMCPY, kirkwood_xor11_data.cap_mask);
519 dma_cap_set(DMA_MEMSET, kirkwood_xor11_data.cap_mask);
520 dma_cap_set(DMA_XOR, kirkwood_xor11_data.cap_mask);
521 platform_device_register(&kirkwood_xor11_channel);
525 /*****************************************************************************
527 ****************************************************************************/
528 static void kirkwood_timer_init(void)
530 orion_time_init(IRQ_KIRKWOOD_BRIDGE, KIRKWOOD_TCLK);
533 struct sys_timer kirkwood_timer = {
534 .init = kirkwood_timer_init,
538 /*****************************************************************************
540 ****************************************************************************/
541 static char * __init kirkwood_id(void)
543 switch (readl(DEVICE_ID) & 0x3) {
552 return "unknown 88F6000 variant";
555 static int __init is_l2_writethrough(void)
557 return !!(readl(L2_CONFIG_REG) & L2_WRITETHROUGH);
560 void __init kirkwood_init(void)
562 printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n",
563 kirkwood_id(), KIRKWOOD_TCLK);
565 kirkwood_setup_cpu_mbus();
567 #ifdef CONFIG_CACHE_FEROCEON_L2
568 feroceon_l2_init(is_l2_writethrough());