ARM: orion: Consolidate ethernet platform data
[linux-2.6-block.git] / arch / arm / mach-dove / common.c
CommitLineData
edabd38e
SB
1/*
2 * arch/arm/mach-dove/common.c
3 *
4 * Core functions for Marvell Dove 88AP510 System On Chip
5 *
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.
9 */
10
11#include <linux/kernel.h>
12#include <linux/delay.h>
13#include <linux/init.h>
14#include <linux/platform_device.h>
15#include <linux/pci.h>
16#include <linux/serial_8250.h>
17#include <linux/clk.h>
18#include <linux/mbus.h>
edabd38e
SB
19#include <linux/mv643xx_i2c.h>
20#include <linux/ata_platform.h>
5c602551 21#include <linux/serial_8250.h>
edabd38e
SB
22#include <linux/spi/orion_spi.h>
23#include <linux/gpio.h>
24#include <asm/page.h>
25#include <asm/setup.h>
26#include <asm/timex.h>
573a652f 27#include <asm/hardware/cache-tauros2.h>
edabd38e
SB
28#include <asm/mach/map.h>
29#include <asm/mach/time.h>
30#include <asm/mach/pci.h>
31#include <mach/dove.h>
32#include <mach/bridge-regs.h>
33#include <asm/mach/arch.h>
34#include <linux/irq.h>
35#include <plat/mv_xor.h>
36#include <plat/ehci-orion.h>
37#include <plat/time.h>
28a2b450 38#include <plat/common.h>
edabd38e
SB
39#include "common.h"
40
28a2b450
AL
41static int get_tclk(void);
42
edabd38e
SB
43/*****************************************************************************
44 * I/O Address Mapping
45 ****************************************************************************/
46static struct map_desc dove_io_desc[] __initdata = {
47 {
48 .virtual = DOVE_SB_REGS_VIRT_BASE,
49 .pfn = __phys_to_pfn(DOVE_SB_REGS_PHYS_BASE),
50 .length = DOVE_SB_REGS_SIZE,
51 .type = MT_DEVICE,
52 }, {
53 .virtual = DOVE_NB_REGS_VIRT_BASE,
54 .pfn = __phys_to_pfn(DOVE_NB_REGS_PHYS_BASE),
55 .length = DOVE_NB_REGS_SIZE,
56 .type = MT_DEVICE,
57 }, {
58 .virtual = DOVE_PCIE0_IO_VIRT_BASE,
59 .pfn = __phys_to_pfn(DOVE_PCIE0_IO_PHYS_BASE),
60 .length = DOVE_PCIE0_IO_SIZE,
61 .type = MT_DEVICE,
62 }, {
63 .virtual = DOVE_PCIE1_IO_VIRT_BASE,
64 .pfn = __phys_to_pfn(DOVE_PCIE1_IO_PHYS_BASE),
65 .length = DOVE_PCIE1_IO_SIZE,
66 .type = MT_DEVICE,
67 },
68};
69
70void __init dove_map_io(void)
71{
72 iotable_init(dove_io_desc, ARRAY_SIZE(dove_io_desc));
73}
74
75/*****************************************************************************
76 * EHCI
77 ****************************************************************************/
78static struct orion_ehci_data dove_ehci_data = {
79 .dram = &dove_mbus_dram_info,
80 .phy_version = EHCI_PHY_NA,
81};
82
83static u64 ehci_dmamask = DMA_BIT_MASK(32);
84
85/*****************************************************************************
86 * EHCI0
87 ****************************************************************************/
88static struct resource dove_ehci0_resources[] = {
89 {
90 .start = DOVE_USB0_PHYS_BASE,
91 .end = DOVE_USB0_PHYS_BASE + SZ_4K - 1,
92 .flags = IORESOURCE_MEM,
93 }, {
94 .start = IRQ_DOVE_USB0,
95 .end = IRQ_DOVE_USB0,
96 .flags = IORESOURCE_IRQ,
97 },
98};
99
100static struct platform_device dove_ehci0 = {
101 .name = "orion-ehci",
102 .id = 0,
103 .dev = {
104 .dma_mask = &ehci_dmamask,
105 .coherent_dma_mask = DMA_BIT_MASK(32),
106 .platform_data = &dove_ehci_data,
107 },
108 .resource = dove_ehci0_resources,
109 .num_resources = ARRAY_SIZE(dove_ehci0_resources),
110};
111
112void __init dove_ehci0_init(void)
113{
114 platform_device_register(&dove_ehci0);
115}
116
117/*****************************************************************************
118 * EHCI1
119 ****************************************************************************/
120static struct resource dove_ehci1_resources[] = {
121 {
122 .start = DOVE_USB1_PHYS_BASE,
123 .end = DOVE_USB1_PHYS_BASE + SZ_4K - 1,
124 .flags = IORESOURCE_MEM,
125 }, {
126 .start = IRQ_DOVE_USB1,
127 .end = IRQ_DOVE_USB1,
128 .flags = IORESOURCE_IRQ,
129 },
130};
131
132static struct platform_device dove_ehci1 = {
133 .name = "orion-ehci",
134 .id = 1,
135 .dev = {
136 .dma_mask = &ehci_dmamask,
137 .coherent_dma_mask = DMA_BIT_MASK(32),
138 .platform_data = &dove_ehci_data,
139 },
140 .resource = dove_ehci1_resources,
141 .num_resources = ARRAY_SIZE(dove_ehci1_resources),
142};
143
144void __init dove_ehci1_init(void)
145{
146 platform_device_register(&dove_ehci1);
147}
148
149/*****************************************************************************
150 * GE00
151 ****************************************************************************/
edabd38e
SB
152void __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data)
153{
7e3819d8
AL
154 orion_ge00_init(eth_data, &dove_mbus_dram_info,
155 DOVE_GE00_PHYS_BASE, IRQ_DOVE_GE00_SUM,
156 0, get_tclk());
edabd38e
SB
157}
158
159/*****************************************************************************
160 * SoC RTC
161 ****************************************************************************/
edabd38e
SB
162void __init dove_rtc_init(void)
163{
f6eaccb3 164 orion_rtc_init(DOVE_RTC_PHYS_BASE, IRQ_DOVE_RTC);
edabd38e
SB
165}
166
167/*****************************************************************************
168 * SATA
169 ****************************************************************************/
170static struct resource dove_sata_resources[] = {
171 {
172 .name = "sata base",
173 .start = DOVE_SATA_PHYS_BASE,
174 .end = DOVE_SATA_PHYS_BASE + 0x5000 - 1,
175 .flags = IORESOURCE_MEM,
176 }, {
177 .name = "sata irq",
178 .start = IRQ_DOVE_SATA,
179 .end = IRQ_DOVE_SATA,
180 .flags = IORESOURCE_IRQ,
181 },
182};
183
184static struct platform_device dove_sata = {
185 .name = "sata_mv",
186 .id = 0,
187 .dev = {
188 .coherent_dma_mask = DMA_BIT_MASK(32),
189 },
190 .num_resources = ARRAY_SIZE(dove_sata_resources),
191 .resource = dove_sata_resources,
192};
193
194void __init dove_sata_init(struct mv_sata_platform_data *sata_data)
195{
196 sata_data->dram = &dove_mbus_dram_info;
197 dove_sata.dev.platform_data = sata_data;
198 platform_device_register(&dove_sata);
199}
200
201/*****************************************************************************
202 * UART0
203 ****************************************************************************/
edabd38e
SB
204void __init dove_uart0_init(void)
205{
28a2b450
AL
206 orion_uart0_init(DOVE_UART0_VIRT_BASE, DOVE_UART0_PHYS_BASE,
207 IRQ_DOVE_UART_0, get_tclk());
edabd38e
SB
208}
209
210/*****************************************************************************
211 * UART1
212 ****************************************************************************/
edabd38e
SB
213void __init dove_uart1_init(void)
214{
28a2b450
AL
215 orion_uart1_init(DOVE_UART1_VIRT_BASE, DOVE_UART1_PHYS_BASE,
216 IRQ_DOVE_UART_1, get_tclk());
edabd38e
SB
217}
218
219/*****************************************************************************
220 * UART2
221 ****************************************************************************/
edabd38e
SB
222void __init dove_uart2_init(void)
223{
28a2b450
AL
224 orion_uart2_init(DOVE_UART2_VIRT_BASE, DOVE_UART2_PHYS_BASE,
225 IRQ_DOVE_UART_2, get_tclk());
edabd38e
SB
226}
227
228/*****************************************************************************
229 * UART3
230 ****************************************************************************/
edabd38e
SB
231void __init dove_uart3_init(void)
232{
28a2b450
AL
233 orion_uart3_init(DOVE_UART3_VIRT_BASE, DOVE_UART3_PHYS_BASE,
234 IRQ_DOVE_UART_3, get_tclk());
edabd38e
SB
235}
236
237/*****************************************************************************
238 * SPI0
239 ****************************************************************************/
240static struct orion_spi_info dove_spi0_data = {
241 .tclk = 0,
242};
243
244static struct resource dove_spi0_resources[] = {
245 {
246 .start = DOVE_SPI0_PHYS_BASE,
247 .end = DOVE_SPI0_PHYS_BASE + SZ_512 - 1,
248 .flags = IORESOURCE_MEM,
249 }, {
250 .start = IRQ_DOVE_SPI0,
251 .end = IRQ_DOVE_SPI0,
252 .flags = IORESOURCE_IRQ,
253 },
254};
255
256static struct platform_device dove_spi0 = {
257 .name = "orion_spi",
258 .id = 0,
259 .resource = dove_spi0_resources,
260 .dev = {
261 .platform_data = &dove_spi0_data,
262 },
263 .num_resources = ARRAY_SIZE(dove_spi0_resources),
264};
265
266void __init dove_spi0_init(void)
267{
268 platform_device_register(&dove_spi0);
269}
270
271/*****************************************************************************
272 * SPI1
273 ****************************************************************************/
274static struct orion_spi_info dove_spi1_data = {
275 .tclk = 0,
276};
277
278static struct resource dove_spi1_resources[] = {
279 {
280 .start = DOVE_SPI1_PHYS_BASE,
281 .end = DOVE_SPI1_PHYS_BASE + SZ_512 - 1,
282 .flags = IORESOURCE_MEM,
283 }, {
284 .start = IRQ_DOVE_SPI1,
285 .end = IRQ_DOVE_SPI1,
286 .flags = IORESOURCE_IRQ,
287 },
288};
289
290static struct platform_device dove_spi1 = {
291 .name = "orion_spi",
292 .id = 1,
293 .resource = dove_spi1_resources,
294 .dev = {
295 .platform_data = &dove_spi1_data,
296 },
297 .num_resources = ARRAY_SIZE(dove_spi1_resources),
298};
299
300void __init dove_spi1_init(void)
301{
302 platform_device_register(&dove_spi1);
303}
304
305/*****************************************************************************
306 * I2C
307 ****************************************************************************/
308static struct mv64xxx_i2c_pdata dove_i2c_data = {
309 .freq_m = 10, /* assumes 166 MHz TCLK gets 94.3kHz */
310 .freq_n = 3,
311 .timeout = 1000, /* Default timeout of 1 second */
312};
313
314static struct resource dove_i2c_resources[] = {
315 {
316 .name = "i2c base",
317 .start = DOVE_I2C_PHYS_BASE,
318 .end = DOVE_I2C_PHYS_BASE + 0x20 - 1,
319 .flags = IORESOURCE_MEM,
320 }, {
321 .name = "i2c irq",
322 .start = IRQ_DOVE_I2C,
323 .end = IRQ_DOVE_I2C,
324 .flags = IORESOURCE_IRQ,
325 },
326};
327
328static struct platform_device dove_i2c = {
329 .name = MV64XXX_I2C_CTLR_NAME,
330 .id = 0,
331 .num_resources = ARRAY_SIZE(dove_i2c_resources),
332 .resource = dove_i2c_resources,
333 .dev = {
334 .platform_data = &dove_i2c_data,
335 },
336};
337
338void __init dove_i2c_init(void)
339{
340 platform_device_register(&dove_i2c);
341}
342
343/*****************************************************************************
344 * Time handling
345 ****************************************************************************/
4ee1f6b5
LB
346void __init dove_init_early(void)
347{
348 orion_time_set_base(TIMER_VIRT_BASE);
349}
350
edabd38e
SB
351static int get_tclk(void)
352{
353 /* use DOVE_RESET_SAMPLE_HI/LO to detect tclk */
354 return 166666667;
355}
356
357static void dove_timer_init(void)
358{
4ee1f6b5
LB
359 orion_time_init(BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR,
360 IRQ_DOVE_BRIDGE, get_tclk());
edabd38e
SB
361}
362
363struct sys_timer dove_timer = {
364 .init = dove_timer_init,
365};
366
367/*****************************************************************************
368 * XOR
369 ****************************************************************************/
370static struct mv_xor_platform_shared_data dove_xor_shared_data = {
371 .dram = &dove_mbus_dram_info,
372};
373
374/*****************************************************************************
375 * XOR 0
376 ****************************************************************************/
377static u64 dove_xor0_dmamask = DMA_BIT_MASK(32);
378
379static struct resource dove_xor0_shared_resources[] = {
380 {
381 .name = "xor 0 low",
382 .start = DOVE_XOR0_PHYS_BASE,
383 .end = DOVE_XOR0_PHYS_BASE + 0xff,
384 .flags = IORESOURCE_MEM,
385 }, {
386 .name = "xor 0 high",
387 .start = DOVE_XOR0_HIGH_PHYS_BASE,
388 .end = DOVE_XOR0_HIGH_PHYS_BASE + 0xff,
389 .flags = IORESOURCE_MEM,
390 },
391};
392
393static struct platform_device dove_xor0_shared = {
394 .name = MV_XOR_SHARED_NAME,
395 .id = 0,
396 .dev = {
397 .platform_data = &dove_xor_shared_data,
398 },
399 .num_resources = ARRAY_SIZE(dove_xor0_shared_resources),
400 .resource = dove_xor0_shared_resources,
401};
402
403static struct resource dove_xor00_resources[] = {
404 [0] = {
405 .start = IRQ_DOVE_XOR_00,
406 .end = IRQ_DOVE_XOR_00,
407 .flags = IORESOURCE_IRQ,
408 },
409};
410
411static struct mv_xor_platform_data dove_xor00_data = {
412 .shared = &dove_xor0_shared,
413 .hw_id = 0,
414 .pool_size = PAGE_SIZE,
415};
416
417static struct platform_device dove_xor00_channel = {
418 .name = MV_XOR_NAME,
419 .id = 0,
420 .num_resources = ARRAY_SIZE(dove_xor00_resources),
421 .resource = dove_xor00_resources,
422 .dev = {
423 .dma_mask = &dove_xor0_dmamask,
424 .coherent_dma_mask = DMA_BIT_MASK(64),
639b9be6 425 .platform_data = &dove_xor00_data,
edabd38e
SB
426 },
427};
428
429static struct resource dove_xor01_resources[] = {
430 [0] = {
431 .start = IRQ_DOVE_XOR_01,
432 .end = IRQ_DOVE_XOR_01,
433 .flags = IORESOURCE_IRQ,
434 },
435};
436
437static struct mv_xor_platform_data dove_xor01_data = {
438 .shared = &dove_xor0_shared,
439 .hw_id = 1,
440 .pool_size = PAGE_SIZE,
441};
442
443static struct platform_device dove_xor01_channel = {
444 .name = MV_XOR_NAME,
445 .id = 1,
446 .num_resources = ARRAY_SIZE(dove_xor01_resources),
447 .resource = dove_xor01_resources,
448 .dev = {
449 .dma_mask = &dove_xor0_dmamask,
450 .coherent_dma_mask = DMA_BIT_MASK(64),
639b9be6 451 .platform_data = &dove_xor01_data,
edabd38e
SB
452 },
453};
454
455void __init dove_xor0_init(void)
456{
457 platform_device_register(&dove_xor0_shared);
458
459 /*
460 * two engines can't do memset simultaneously, this limitation
461 * satisfied by removing memset support from one of the engines.
462 */
463 dma_cap_set(DMA_MEMCPY, dove_xor00_data.cap_mask);
464 dma_cap_set(DMA_XOR, dove_xor00_data.cap_mask);
465 platform_device_register(&dove_xor00_channel);
466
467 dma_cap_set(DMA_MEMCPY, dove_xor01_data.cap_mask);
468 dma_cap_set(DMA_MEMSET, dove_xor01_data.cap_mask);
469 dma_cap_set(DMA_XOR, dove_xor01_data.cap_mask);
470 platform_device_register(&dove_xor01_channel);
471}
472
473/*****************************************************************************
474 * XOR 1
475 ****************************************************************************/
476static u64 dove_xor1_dmamask = DMA_BIT_MASK(32);
477
478static struct resource dove_xor1_shared_resources[] = {
479 {
480 .name = "xor 0 low",
481 .start = DOVE_XOR1_PHYS_BASE,
482 .end = DOVE_XOR1_PHYS_BASE + 0xff,
483 .flags = IORESOURCE_MEM,
484 }, {
485 .name = "xor 0 high",
486 .start = DOVE_XOR1_HIGH_PHYS_BASE,
487 .end = DOVE_XOR1_HIGH_PHYS_BASE + 0xff,
488 .flags = IORESOURCE_MEM,
489 },
490};
491
492static struct platform_device dove_xor1_shared = {
493 .name = MV_XOR_SHARED_NAME,
494 .id = 1,
495 .dev = {
496 .platform_data = &dove_xor_shared_data,
497 },
498 .num_resources = ARRAY_SIZE(dove_xor1_shared_resources),
499 .resource = dove_xor1_shared_resources,
500};
501
502static struct resource dove_xor10_resources[] = {
503 [0] = {
504 .start = IRQ_DOVE_XOR_10,
505 .end = IRQ_DOVE_XOR_10,
506 .flags = IORESOURCE_IRQ,
507 },
508};
509
510static struct mv_xor_platform_data dove_xor10_data = {
511 .shared = &dove_xor1_shared,
512 .hw_id = 0,
513 .pool_size = PAGE_SIZE,
514};
515
516static struct platform_device dove_xor10_channel = {
517 .name = MV_XOR_NAME,
518 .id = 2,
519 .num_resources = ARRAY_SIZE(dove_xor10_resources),
520 .resource = dove_xor10_resources,
521 .dev = {
522 .dma_mask = &dove_xor1_dmamask,
523 .coherent_dma_mask = DMA_BIT_MASK(64),
639b9be6 524 .platform_data = &dove_xor10_data,
edabd38e
SB
525 },
526};
527
528static struct resource dove_xor11_resources[] = {
529 [0] = {
530 .start = IRQ_DOVE_XOR_11,
531 .end = IRQ_DOVE_XOR_11,
532 .flags = IORESOURCE_IRQ,
533 },
534};
535
536static struct mv_xor_platform_data dove_xor11_data = {
537 .shared = &dove_xor1_shared,
538 .hw_id = 1,
539 .pool_size = PAGE_SIZE,
540};
541
542static struct platform_device dove_xor11_channel = {
543 .name = MV_XOR_NAME,
544 .id = 3,
545 .num_resources = ARRAY_SIZE(dove_xor11_resources),
546 .resource = dove_xor11_resources,
547 .dev = {
548 .dma_mask = &dove_xor1_dmamask,
549 .coherent_dma_mask = DMA_BIT_MASK(64),
639b9be6 550 .platform_data = &dove_xor11_data,
edabd38e
SB
551 },
552};
553
554void __init dove_xor1_init(void)
555{
556 platform_device_register(&dove_xor1_shared);
557
558 /*
559 * two engines can't do memset simultaneously, this limitation
560 * satisfied by removing memset support from one of the engines.
561 */
562 dma_cap_set(DMA_MEMCPY, dove_xor10_data.cap_mask);
563 dma_cap_set(DMA_XOR, dove_xor10_data.cap_mask);
564 platform_device_register(&dove_xor10_channel);
565
566 dma_cap_set(DMA_MEMCPY, dove_xor11_data.cap_mask);
567 dma_cap_set(DMA_MEMSET, dove_xor11_data.cap_mask);
568 dma_cap_set(DMA_XOR, dove_xor11_data.cap_mask);
569 platform_device_register(&dove_xor11_channel);
570}
571
16bc90af
SB
572/*****************************************************************************
573 * SDIO
574 ****************************************************************************/
575static u64 sdio_dmamask = DMA_BIT_MASK(32);
576
577static struct resource dove_sdio0_resources[] = {
578 {
579 .start = DOVE_SDIO0_PHYS_BASE,
580 .end = DOVE_SDIO0_PHYS_BASE + 0xff,
581 .flags = IORESOURCE_MEM,
582 }, {
583 .start = IRQ_DOVE_SDIO0,
584 .end = IRQ_DOVE_SDIO0,
585 .flags = IORESOURCE_IRQ,
586 },
587};
588
589static struct platform_device dove_sdio0 = {
930e2fe7 590 .name = "sdhci-dove",
16bc90af
SB
591 .id = 0,
592 .dev = {
593 .dma_mask = &sdio_dmamask,
594 .coherent_dma_mask = DMA_BIT_MASK(32),
595 },
596 .resource = dove_sdio0_resources,
597 .num_resources = ARRAY_SIZE(dove_sdio0_resources),
598};
599
600void __init dove_sdio0_init(void)
601{
602 platform_device_register(&dove_sdio0);
603}
604
605static struct resource dove_sdio1_resources[] = {
606 {
607 .start = DOVE_SDIO1_PHYS_BASE,
608 .end = DOVE_SDIO1_PHYS_BASE + 0xff,
609 .flags = IORESOURCE_MEM,
610 }, {
611 .start = IRQ_DOVE_SDIO1,
612 .end = IRQ_DOVE_SDIO1,
613 .flags = IORESOURCE_IRQ,
614 },
615};
616
617static struct platform_device dove_sdio1 = {
930e2fe7 618 .name = "sdhci-dove",
16bc90af
SB
619 .id = 1,
620 .dev = {
621 .dma_mask = &sdio_dmamask,
622 .coherent_dma_mask = DMA_BIT_MASK(32),
623 },
624 .resource = dove_sdio1_resources,
625 .num_resources = ARRAY_SIZE(dove_sdio1_resources),
626};
627
628void __init dove_sdio1_init(void)
629{
630 platform_device_register(&dove_sdio1);
631}
632
edabd38e
SB
633void __init dove_init(void)
634{
635 int tclk;
636
637 tclk = get_tclk();
638
639 printk(KERN_INFO "Dove 88AP510 SoC, ");
640 printk(KERN_INFO "TCLK = %dMHz\n", (tclk + 499999) / 1000000);
641
573a652f
LB
642#ifdef CONFIG_CACHE_TAUROS2
643 tauros2_init();
644#endif
edabd38e
SB
645 dove_setup_cpu_mbus();
646
edabd38e
SB
647 dove_spi0_data.tclk = tclk;
648 dove_spi1_data.tclk = tclk;
649
650 /* internal devices that every board has */
651 dove_rtc_init();
652 dove_xor0_init();
653 dove_xor1_init();
654}