blob: d349998f72e5955f4e0a9dd96aee49ac9da9ae47 [file] [log] [blame]
Andrew Lunn28a2b452011-05-15 13:32:41 +02001/*
2 * arch/arm/plat-orion/common.c
3 *
4 * Marvell Orion SoC common setup code used by multiple mach-/common.c
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/init.h>
13#include <linux/platform_device.h>
Andrew Lunn7e3819d2011-05-15 13:32:44 +020014#include <linux/dma-mapping.h>
Andrew Lunn28a2b452011-05-15 13:32:41 +020015#include <linux/serial_8250.h>
Andrew Lunn9e613f82011-05-15 13:32:50 +020016#include <linux/ata_platform.h>
Andrew Lunn2f129bf2011-12-15 08:15:07 +010017#include <linux/clk.h>
18#include <linux/clkdev.h>
Andrew Lunn7e3819d2011-05-15 13:32:44 +020019#include <linux/mv643xx_eth.h>
Andrew Lunnaac7ffa2011-05-15 13:32:45 +020020#include <linux/mv643xx_i2c.h>
Andrew Lunn7e3819d2011-05-15 13:32:44 +020021#include <net/dsa.h>
Andrew Lunnee962722011-05-15 13:32:48 +020022#include <plat/mv_xor.h>
Andrew Lunn4fcd3f32011-05-15 13:32:49 +020023#include <plat/ehci-orion.h>
Jason Coopera855a7c2012-03-15 00:33:26 +000024#include <mach/bridge-regs.h>
Andrew Lunn28a2b452011-05-15 13:32:41 +020025
Andrew Lunn4574b882012-04-06 17:17:26 +020026/* Create a clkdev entry for a given device/clk */
27void __init orion_clkdev_add(const char *con_id, const char *dev_id,
28 struct clk *clk)
29{
30 struct clk_lookup *cl;
31
32 cl = clkdev_alloc(clk, con_id, dev_id);
33 if (cl)
34 clkdev_add(cl);
35}
36
37/* Create clkdev entries for all orion platforms except kirkwood.
38 Kirkwood has gated clocks for some of its peripherals, so creates
39 its own clkdev entries. For all the other orion devices, create
40 clkdev entries to the tclk. */
41void __init orion_clkdev_init(struct clk *tclk)
42{
43 orion_clkdev_add(NULL, "orion_spi.0", tclk);
44 orion_clkdev_add(NULL, "orion_spi.1", tclk);
Andrew Lunn452503e2011-12-24 01:24:24 +010045 orion_clkdev_add(NULL, MV643XX_ETH_NAME ".0", tclk);
46 orion_clkdev_add(NULL, MV643XX_ETH_NAME ".1", tclk);
47 orion_clkdev_add(NULL, MV643XX_ETH_NAME ".2", tclk);
48 orion_clkdev_add(NULL, MV643XX_ETH_NAME ".3", tclk);
Andrew Lunn4f04be62012-03-04 16:57:31 +010049 orion_clkdev_add(NULL, "orion_wdt", tclk);
Andrew Lunn4574b882012-04-06 17:17:26 +020050}
51
Andrew Lunn28a2b452011-05-15 13:32:41 +020052/* Fill in the resources structure and link it into the platform
53 device structure. There is always a memory region, and nearly
54 always an interrupt.*/
55static void fill_resources(struct platform_device *device,
56 struct resource *resources,
57 resource_size_t mapbase,
58 resource_size_t size,
59 unsigned int irq)
60{
61 device->resource = resources;
62 device->num_resources = 1;
63 resources[0].flags = IORESOURCE_MEM;
64 resources[0].start = mapbase;
65 resources[0].end = mapbase + size;
66
67 if (irq != NO_IRQ) {
68 device->num_resources++;
69 resources[1].flags = IORESOURCE_IRQ;
70 resources[1].start = irq;
71 resources[1].end = irq;
72 }
73}
74
75/*****************************************************************************
76 * UART
77 ****************************************************************************/
78static void __init uart_complete(
79 struct platform_device *orion_uart,
80 struct plat_serial8250_port *data,
81 struct resource *resources,
82 unsigned int membase,
83 resource_size_t mapbase,
84 unsigned int irq,
85 unsigned int uartclk)
86{
87 data->mapbase = mapbase;
88 data->membase = (void __iomem *)membase;
89 data->irq = irq;
90 data->uartclk = uartclk;
91 orion_uart->dev.platform_data = data;
92
93 fill_resources(orion_uart, resources, mapbase, 0xff, irq);
94 platform_device_register(orion_uart);
95}
96
97/*****************************************************************************
98 * UART0
99 ****************************************************************************/
100static struct plat_serial8250_port orion_uart0_data[] = {
101 {
102 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
103 .iotype = UPIO_MEM,
104 .regshift = 2,
105 }, {
106 },
107};
108
109static struct resource orion_uart0_resources[2];
110
111static struct platform_device orion_uart0 = {
112 .name = "serial8250",
113 .id = PLAT8250_DEV_PLATFORM,
114};
115
116void __init orion_uart0_init(unsigned int membase,
117 resource_size_t mapbase,
118 unsigned int irq,
119 unsigned int uartclk)
120{
121 uart_complete(&orion_uart0, orion_uart0_data, orion_uart0_resources,
122 membase, mapbase, irq, uartclk);
123}
124
125/*****************************************************************************
126 * UART1
127 ****************************************************************************/
128static struct plat_serial8250_port orion_uart1_data[] = {
129 {
130 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
131 .iotype = UPIO_MEM,
132 .regshift = 2,
133 }, {
134 },
135};
136
137static struct resource orion_uart1_resources[2];
138
139static struct platform_device orion_uart1 = {
140 .name = "serial8250",
141 .id = PLAT8250_DEV_PLATFORM1,
142};
143
144void __init orion_uart1_init(unsigned int membase,
145 resource_size_t mapbase,
146 unsigned int irq,
147 unsigned int uartclk)
148{
149 uart_complete(&orion_uart1, orion_uart1_data, orion_uart1_resources,
150 membase, mapbase, irq, uartclk);
151}
152
153/*****************************************************************************
154 * UART2
155 ****************************************************************************/
156static struct plat_serial8250_port orion_uart2_data[] = {
157 {
158 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
159 .iotype = UPIO_MEM,
160 .regshift = 2,
161 }, {
162 },
163};
164
165static struct resource orion_uart2_resources[2];
166
167static struct platform_device orion_uart2 = {
168 .name = "serial8250",
169 .id = PLAT8250_DEV_PLATFORM2,
170};
171
172void __init orion_uart2_init(unsigned int membase,
173 resource_size_t mapbase,
174 unsigned int irq,
175 unsigned int uartclk)
176{
177 uart_complete(&orion_uart2, orion_uart2_data, orion_uart2_resources,
178 membase, mapbase, irq, uartclk);
179}
180
181/*****************************************************************************
182 * UART3
183 ****************************************************************************/
184static struct plat_serial8250_port orion_uart3_data[] = {
185 {
186 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
187 .iotype = UPIO_MEM,
188 .regshift = 2,
189 }, {
190 },
191};
192
193static struct resource orion_uart3_resources[2];
194
195static struct platform_device orion_uart3 = {
196 .name = "serial8250",
197 .id = 3,
198};
199
200void __init orion_uart3_init(unsigned int membase,
201 resource_size_t mapbase,
202 unsigned int irq,
203 unsigned int uartclk)
204{
205 uart_complete(&orion_uart3, orion_uart3_data, orion_uart3_resources,
206 membase, mapbase, irq, uartclk);
207}
Andrew Lunnf6eaccb2011-05-15 13:32:42 +0200208
209/*****************************************************************************
210 * SoC RTC
211 ****************************************************************************/
212static struct resource orion_rtc_resource[2];
213
214void __init orion_rtc_init(unsigned long mapbase,
215 unsigned long irq)
216{
217 orion_rtc_resource[0].start = mapbase;
218 orion_rtc_resource[0].end = mapbase + SZ_32 - 1;
219 orion_rtc_resource[0].flags = IORESOURCE_MEM;
220 orion_rtc_resource[1].start = irq;
221 orion_rtc_resource[1].end = irq;
222 orion_rtc_resource[1].flags = IORESOURCE_IRQ;
223
224 platform_device_register_simple("rtc-mv", -1, orion_rtc_resource, 2);
225}
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200226
227/*****************************************************************************
228 * GE
229 ****************************************************************************/
230static __init void ge_complete(
231 struct mv643xx_eth_shared_platform_data *orion_ge_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200232 struct resource *orion_ge_resource, unsigned long irq,
233 struct platform_device *orion_ge_shared,
234 struct mv643xx_eth_platform_data *eth_data,
235 struct platform_device *orion_ge)
236{
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200237 orion_ge_resource->start = irq;
238 orion_ge_resource->end = irq;
239 eth_data->shared = orion_ge_shared;
240 orion_ge->dev.platform_data = eth_data;
241
242 platform_device_register(orion_ge_shared);
243 platform_device_register(orion_ge);
244}
245
246/*****************************************************************************
247 * GE00
248 ****************************************************************************/
249struct mv643xx_eth_shared_platform_data orion_ge00_shared_data;
250
251static struct resource orion_ge00_shared_resources[] = {
252 {
253 .name = "ge00 base",
254 }, {
255 .name = "ge00 err irq",
256 },
257};
258
259static struct platform_device orion_ge00_shared = {
260 .name = MV643XX_ETH_SHARED_NAME,
261 .id = 0,
262 .dev = {
263 .platform_data = &orion_ge00_shared_data,
264 },
265};
266
267static struct resource orion_ge00_resources[] = {
268 {
269 .name = "ge00 irq",
270 .flags = IORESOURCE_IRQ,
271 },
272};
273
274static struct platform_device orion_ge00 = {
275 .name = MV643XX_ETH_NAME,
276 .id = 0,
277 .num_resources = 1,
278 .resource = orion_ge00_resources,
279 .dev = {
280 .coherent_dma_mask = DMA_BIT_MASK(32),
281 },
282};
283
284void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200285 unsigned long mapbase,
286 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100287 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200288{
289 fill_resources(&orion_ge00_shared, orion_ge00_shared_resources,
290 mapbase + 0x2000, SZ_16K - 1, irq_err);
Andrew Lunn452503e2011-12-24 01:24:24 +0100291 ge_complete(&orion_ge00_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200292 orion_ge00_resources, irq, &orion_ge00_shared,
293 eth_data, &orion_ge00);
294}
295
296/*****************************************************************************
297 * GE01
298 ****************************************************************************/
299struct mv643xx_eth_shared_platform_data orion_ge01_shared_data = {
300 .shared_smi = &orion_ge00_shared,
301};
302
303static struct resource orion_ge01_shared_resources[] = {
304 {
305 .name = "ge01 base",
306 }, {
307 .name = "ge01 err irq",
308 },
309};
310
311static struct platform_device orion_ge01_shared = {
312 .name = MV643XX_ETH_SHARED_NAME,
313 .id = 1,
314 .dev = {
315 .platform_data = &orion_ge01_shared_data,
316 },
317};
318
319static struct resource orion_ge01_resources[] = {
320 {
321 .name = "ge01 irq",
322 .flags = IORESOURCE_IRQ,
323 },
324};
325
326static struct platform_device orion_ge01 = {
327 .name = MV643XX_ETH_NAME,
328 .id = 1,
329 .num_resources = 1,
330 .resource = orion_ge01_resources,
331 .dev = {
332 .coherent_dma_mask = DMA_BIT_MASK(32),
333 },
334};
335
336void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200337 unsigned long mapbase,
338 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100339 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200340{
341 fill_resources(&orion_ge01_shared, orion_ge01_shared_resources,
342 mapbase + 0x2000, SZ_16K - 1, irq_err);
Andrew Lunn452503e2011-12-24 01:24:24 +0100343 ge_complete(&orion_ge01_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200344 orion_ge01_resources, irq, &orion_ge01_shared,
345 eth_data, &orion_ge01);
346}
347
348/*****************************************************************************
349 * GE10
350 ****************************************************************************/
351struct mv643xx_eth_shared_platform_data orion_ge10_shared_data = {
352 .shared_smi = &orion_ge00_shared,
353};
354
355static struct resource orion_ge10_shared_resources[] = {
356 {
357 .name = "ge10 base",
358 }, {
359 .name = "ge10 err irq",
360 },
361};
362
363static struct platform_device orion_ge10_shared = {
364 .name = MV643XX_ETH_SHARED_NAME,
365 .id = 1,
366 .dev = {
367 .platform_data = &orion_ge10_shared_data,
368 },
369};
370
371static struct resource orion_ge10_resources[] = {
372 {
373 .name = "ge10 irq",
374 .flags = IORESOURCE_IRQ,
375 },
376};
377
378static struct platform_device orion_ge10 = {
379 .name = MV643XX_ETH_NAME,
380 .id = 1,
381 .num_resources = 2,
382 .resource = orion_ge10_resources,
383 .dev = {
384 .coherent_dma_mask = DMA_BIT_MASK(32),
385 },
386};
387
388void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200389 unsigned long mapbase,
390 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100391 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200392{
393 fill_resources(&orion_ge10_shared, orion_ge10_shared_resources,
394 mapbase + 0x2000, SZ_16K - 1, irq_err);
Andrew Lunn452503e2011-12-24 01:24:24 +0100395 ge_complete(&orion_ge10_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200396 orion_ge10_resources, irq, &orion_ge10_shared,
397 eth_data, &orion_ge10);
398}
399
400/*****************************************************************************
401 * GE11
402 ****************************************************************************/
403struct mv643xx_eth_shared_platform_data orion_ge11_shared_data = {
404 .shared_smi = &orion_ge00_shared,
405};
406
407static struct resource orion_ge11_shared_resources[] = {
408 {
409 .name = "ge11 base",
410 }, {
411 .name = "ge11 err irq",
412 },
413};
414
415static struct platform_device orion_ge11_shared = {
416 .name = MV643XX_ETH_SHARED_NAME,
417 .id = 1,
418 .dev = {
419 .platform_data = &orion_ge11_shared_data,
420 },
421};
422
423static struct resource orion_ge11_resources[] = {
424 {
425 .name = "ge11 irq",
426 .flags = IORESOURCE_IRQ,
427 },
428};
429
430static struct platform_device orion_ge11 = {
431 .name = MV643XX_ETH_NAME,
432 .id = 1,
433 .num_resources = 2,
434 .resource = orion_ge11_resources,
435 .dev = {
436 .coherent_dma_mask = DMA_BIT_MASK(32),
437 },
438};
439
440void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200441 unsigned long mapbase,
442 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100443 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200444{
445 fill_resources(&orion_ge11_shared, orion_ge11_shared_resources,
446 mapbase + 0x2000, SZ_16K - 1, irq_err);
Andrew Lunn452503e2011-12-24 01:24:24 +0100447 ge_complete(&orion_ge11_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200448 orion_ge11_resources, irq, &orion_ge11_shared,
449 eth_data, &orion_ge11);
450}
451
452/*****************************************************************************
453 * Ethernet switch
454 ****************************************************************************/
455static struct resource orion_switch_resources[] = {
456 {
457 .start = 0,
458 .end = 0,
459 .flags = IORESOURCE_IRQ,
460 },
461};
462
463static struct platform_device orion_switch_device = {
464 .name = "dsa",
465 .id = 0,
466 .num_resources = 0,
467 .resource = orion_switch_resources,
468};
469
470void __init orion_ge00_switch_init(struct dsa_platform_data *d, int irq)
471{
472 int i;
473
474 if (irq != NO_IRQ) {
475 orion_switch_resources[0].start = irq;
476 orion_switch_resources[0].end = irq;
477 orion_switch_device.num_resources = 1;
478 }
479
480 d->netdev = &orion_ge00.dev;
481 for (i = 0; i < d->nr_chips; i++)
482 d->chip[i].mii_bus = &orion_ge00_shared.dev;
483 orion_switch_device.dev.platform_data = d;
484
485 platform_device_register(&orion_switch_device);
486}
Andrew Lunnaac7ffa2011-05-15 13:32:45 +0200487
488/*****************************************************************************
489 * I2C
490 ****************************************************************************/
491static struct mv64xxx_i2c_pdata orion_i2c_pdata = {
492 .freq_n = 3,
493 .timeout = 1000, /* Default timeout of 1 second */
494};
495
496static struct resource orion_i2c_resources[2];
497
498static struct platform_device orion_i2c = {
499 .name = MV64XXX_I2C_CTLR_NAME,
500 .id = 0,
501 .dev = {
502 .platform_data = &orion_i2c_pdata,
503 },
504};
505
506static struct mv64xxx_i2c_pdata orion_i2c_1_pdata = {
507 .freq_n = 3,
508 .timeout = 1000, /* Default timeout of 1 second */
509};
510
511static struct resource orion_i2c_1_resources[2];
512
513static struct platform_device orion_i2c_1 = {
514 .name = MV64XXX_I2C_CTLR_NAME,
515 .id = 1,
516 .dev = {
517 .platform_data = &orion_i2c_1_pdata,
518 },
519};
520
521void __init orion_i2c_init(unsigned long mapbase,
522 unsigned long irq,
523 unsigned long freq_m)
524{
525 orion_i2c_pdata.freq_m = freq_m;
526 fill_resources(&orion_i2c, orion_i2c_resources, mapbase,
527 SZ_32 - 1, irq);
528 platform_device_register(&orion_i2c);
529}
530
531void __init orion_i2c_1_init(unsigned long mapbase,
532 unsigned long irq,
533 unsigned long freq_m)
534{
535 orion_i2c_1_pdata.freq_m = freq_m;
536 fill_resources(&orion_i2c_1, orion_i2c_1_resources, mapbase,
537 SZ_32 - 1, irq);
538 platform_device_register(&orion_i2c_1);
539}
Andrew Lunn980f9f62011-05-15 13:32:46 +0200540
541/*****************************************************************************
542 * SPI
543 ****************************************************************************/
Andrew Lunn980f9f62011-05-15 13:32:46 +0200544static struct resource orion_spi_resources;
545
546static struct platform_device orion_spi = {
547 .name = "orion_spi",
548 .id = 0,
Andrew Lunn980f9f62011-05-15 13:32:46 +0200549};
550
Andrew Lunn980f9f62011-05-15 13:32:46 +0200551static struct resource orion_spi_1_resources;
552
553static struct platform_device orion_spi_1 = {
554 .name = "orion_spi",
555 .id = 1,
Andrew Lunn980f9f62011-05-15 13:32:46 +0200556};
557
558/* Note: The SPI silicon core does have interrupts. However the
559 * current Linux software driver does not use interrupts. */
560
Andrew Lunn4574b882012-04-06 17:17:26 +0200561void __init orion_spi_init(unsigned long mapbase)
Andrew Lunn980f9f62011-05-15 13:32:46 +0200562{
Andrew Lunn980f9f62011-05-15 13:32:46 +0200563 fill_resources(&orion_spi, &orion_spi_resources,
564 mapbase, SZ_512 - 1, NO_IRQ);
565 platform_device_register(&orion_spi);
566}
567
Andrew Lunn4574b882012-04-06 17:17:26 +0200568void __init orion_spi_1_init(unsigned long mapbase)
Andrew Lunn980f9f62011-05-15 13:32:46 +0200569{
Andrew Lunn980f9f62011-05-15 13:32:46 +0200570 fill_resources(&orion_spi_1, &orion_spi_1_resources,
571 mapbase, SZ_512 - 1, NO_IRQ);
572 platform_device_register(&orion_spi_1);
573}
Andrew Lunn5e00d372011-05-15 13:32:47 +0200574
575/*****************************************************************************
576 * Watchdog
577 ****************************************************************************/
Jason Coopera855a7c2012-03-15 00:33:26 +0000578static struct resource orion_wdt_resource =
579 DEFINE_RES_MEM(TIMER_VIRT_BASE, 0x28);
580
Andrew Lunn5e00d372011-05-15 13:32:47 +0200581static struct platform_device orion_wdt_device = {
582 .name = "orion_wdt",
583 .id = -1,
Jason Coopera855a7c2012-03-15 00:33:26 +0000584 .num_resources = 1,
Andrew Lunn4f04be62012-03-04 16:57:31 +0100585 .resource = &orion_wdt_resource,
Andrew Lunn5e00d372011-05-15 13:32:47 +0200586};
587
Andrew Lunn4f04be62012-03-04 16:57:31 +0100588void __init orion_wdt_init(void)
Andrew Lunn5e00d372011-05-15 13:32:47 +0200589{
Andrew Lunn5e00d372011-05-15 13:32:47 +0200590 platform_device_register(&orion_wdt_device);
591}
Andrew Lunnee962722011-05-15 13:32:48 +0200592
593/*****************************************************************************
594 * XOR
595 ****************************************************************************/
Andrew Lunnee962722011-05-15 13:32:48 +0200596static u64 orion_xor_dmamask = DMA_BIT_MASK(32);
597
598void __init orion_xor_init_channels(
599 struct mv_xor_platform_data *orion_xor0_data,
600 struct platform_device *orion_xor0_channel,
601 struct mv_xor_platform_data *orion_xor1_data,
602 struct platform_device *orion_xor1_channel)
603{
604 /*
605 * two engines can't do memset simultaneously, this limitation
606 * satisfied by removing memset support from one of the engines.
607 */
608 dma_cap_set(DMA_MEMCPY, orion_xor0_data->cap_mask);
609 dma_cap_set(DMA_XOR, orion_xor0_data->cap_mask);
610 platform_device_register(orion_xor0_channel);
611
612 dma_cap_set(DMA_MEMCPY, orion_xor1_data->cap_mask);
613 dma_cap_set(DMA_MEMSET, orion_xor1_data->cap_mask);
614 dma_cap_set(DMA_XOR, orion_xor1_data->cap_mask);
615 platform_device_register(orion_xor1_channel);
616}
617
618/*****************************************************************************
619 * XOR0
620 ****************************************************************************/
621static struct resource orion_xor0_shared_resources[] = {
622 {
623 .name = "xor 0 low",
624 .flags = IORESOURCE_MEM,
625 }, {
626 .name = "xor 0 high",
627 .flags = IORESOURCE_MEM,
628 },
629};
630
631static struct platform_device orion_xor0_shared = {
632 .name = MV_XOR_SHARED_NAME,
633 .id = 0,
Andrew Lunnee962722011-05-15 13:32:48 +0200634 .num_resources = ARRAY_SIZE(orion_xor0_shared_resources),
635 .resource = orion_xor0_shared_resources,
636};
637
638static struct resource orion_xor00_resources[] = {
639 [0] = {
640 .flags = IORESOURCE_IRQ,
641 },
642};
643
644static struct mv_xor_platform_data orion_xor00_data = {
645 .shared = &orion_xor0_shared,
646 .hw_id = 0,
647 .pool_size = PAGE_SIZE,
648};
649
650static struct platform_device orion_xor00_channel = {
651 .name = MV_XOR_NAME,
652 .id = 0,
653 .num_resources = ARRAY_SIZE(orion_xor00_resources),
654 .resource = orion_xor00_resources,
655 .dev = {
656 .dma_mask = &orion_xor_dmamask,
657 .coherent_dma_mask = DMA_BIT_MASK(64),
658 .platform_data = &orion_xor00_data,
659 },
660};
661
662static struct resource orion_xor01_resources[] = {
663 [0] = {
664 .flags = IORESOURCE_IRQ,
665 },
666};
667
668static struct mv_xor_platform_data orion_xor01_data = {
669 .shared = &orion_xor0_shared,
670 .hw_id = 1,
671 .pool_size = PAGE_SIZE,
672};
673
674static struct platform_device orion_xor01_channel = {
675 .name = MV_XOR_NAME,
676 .id = 1,
677 .num_resources = ARRAY_SIZE(orion_xor01_resources),
678 .resource = orion_xor01_resources,
679 .dev = {
680 .dma_mask = &orion_xor_dmamask,
681 .coherent_dma_mask = DMA_BIT_MASK(64),
682 .platform_data = &orion_xor01_data,
683 },
684};
685
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100686void __init orion_xor0_init(unsigned long mapbase_low,
Andrew Lunnee962722011-05-15 13:32:48 +0200687 unsigned long mapbase_high,
688 unsigned long irq_0,
689 unsigned long irq_1)
690{
Andrew Lunnee962722011-05-15 13:32:48 +0200691 orion_xor0_shared_resources[0].start = mapbase_low;
692 orion_xor0_shared_resources[0].end = mapbase_low + 0xff;
693 orion_xor0_shared_resources[1].start = mapbase_high;
694 orion_xor0_shared_resources[1].end = mapbase_high + 0xff;
695
696 orion_xor00_resources[0].start = irq_0;
697 orion_xor00_resources[0].end = irq_0;
698 orion_xor01_resources[0].start = irq_1;
699 orion_xor01_resources[0].end = irq_1;
700
701 platform_device_register(&orion_xor0_shared);
702
703 orion_xor_init_channels(&orion_xor00_data, &orion_xor00_channel,
704 &orion_xor01_data, &orion_xor01_channel);
705}
706
707/*****************************************************************************
708 * XOR1
709 ****************************************************************************/
710static struct resource orion_xor1_shared_resources[] = {
711 {
712 .name = "xor 1 low",
713 .flags = IORESOURCE_MEM,
714 }, {
715 .name = "xor 1 high",
716 .flags = IORESOURCE_MEM,
717 },
718};
719
720static struct platform_device orion_xor1_shared = {
721 .name = MV_XOR_SHARED_NAME,
722 .id = 1,
Andrew Lunnee962722011-05-15 13:32:48 +0200723 .num_resources = ARRAY_SIZE(orion_xor1_shared_resources),
724 .resource = orion_xor1_shared_resources,
725};
726
727static struct resource orion_xor10_resources[] = {
728 [0] = {
729 .flags = IORESOURCE_IRQ,
730 },
731};
732
733static struct mv_xor_platform_data orion_xor10_data = {
734 .shared = &orion_xor1_shared,
735 .hw_id = 0,
736 .pool_size = PAGE_SIZE,
737};
738
739static struct platform_device orion_xor10_channel = {
740 .name = MV_XOR_NAME,
741 .id = 2,
742 .num_resources = ARRAY_SIZE(orion_xor10_resources),
743 .resource = orion_xor10_resources,
744 .dev = {
745 .dma_mask = &orion_xor_dmamask,
746 .coherent_dma_mask = DMA_BIT_MASK(64),
747 .platform_data = &orion_xor10_data,
748 },
749};
750
751static struct resource orion_xor11_resources[] = {
752 [0] = {
753 .flags = IORESOURCE_IRQ,
754 },
755};
756
757static struct mv_xor_platform_data orion_xor11_data = {
758 .shared = &orion_xor1_shared,
759 .hw_id = 1,
760 .pool_size = PAGE_SIZE,
761};
762
763static struct platform_device orion_xor11_channel = {
764 .name = MV_XOR_NAME,
765 .id = 3,
766 .num_resources = ARRAY_SIZE(orion_xor11_resources),
767 .resource = orion_xor11_resources,
768 .dev = {
769 .dma_mask = &orion_xor_dmamask,
770 .coherent_dma_mask = DMA_BIT_MASK(64),
771 .platform_data = &orion_xor11_data,
772 },
773};
774
775void __init orion_xor1_init(unsigned long mapbase_low,
776 unsigned long mapbase_high,
777 unsigned long irq_0,
778 unsigned long irq_1)
779{
780 orion_xor1_shared_resources[0].start = mapbase_low;
781 orion_xor1_shared_resources[0].end = mapbase_low + 0xff;
782 orion_xor1_shared_resources[1].start = mapbase_high;
783 orion_xor1_shared_resources[1].end = mapbase_high + 0xff;
784
785 orion_xor10_resources[0].start = irq_0;
786 orion_xor10_resources[0].end = irq_0;
787 orion_xor11_resources[0].start = irq_1;
788 orion_xor11_resources[0].end = irq_1;
789
790 platform_device_register(&orion_xor1_shared);
791
792 orion_xor_init_channels(&orion_xor10_data, &orion_xor10_channel,
793 &orion_xor11_data, &orion_xor11_channel);
794}
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200795
796/*****************************************************************************
797 * EHCI
798 ****************************************************************************/
Andrew Lunn72053352012-02-08 15:52:47 +0100799static struct orion_ehci_data orion_ehci_data;
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200800static u64 ehci_dmamask = DMA_BIT_MASK(32);
801
802
803/*****************************************************************************
804 * EHCI0
805 ****************************************************************************/
806static struct resource orion_ehci_resources[2];
807
808static struct platform_device orion_ehci = {
809 .name = "orion-ehci",
810 .id = 0,
811 .dev = {
812 .dma_mask = &ehci_dmamask,
813 .coherent_dma_mask = DMA_BIT_MASK(32),
814 .platform_data = &orion_ehci_data,
815 },
816};
817
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100818void __init orion_ehci_init(unsigned long mapbase,
Andrew Lunn72053352012-02-08 15:52:47 +0100819 unsigned long irq,
820 enum orion_ehci_phy_ver phy_version)
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200821{
Andrew Lunn72053352012-02-08 15:52:47 +0100822 orion_ehci_data.phy_version = phy_version;
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200823 fill_resources(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1,
824 irq);
825
826 platform_device_register(&orion_ehci);
827}
828
829/*****************************************************************************
830 * EHCI1
831 ****************************************************************************/
832static struct resource orion_ehci_1_resources[2];
833
834static struct platform_device orion_ehci_1 = {
835 .name = "orion-ehci",
836 .id = 1,
837 .dev = {
838 .dma_mask = &ehci_dmamask,
839 .coherent_dma_mask = DMA_BIT_MASK(32),
840 .platform_data = &orion_ehci_data,
841 },
842};
843
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100844void __init orion_ehci_1_init(unsigned long mapbase,
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200845 unsigned long irq)
846{
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200847 fill_resources(&orion_ehci_1, orion_ehci_1_resources,
848 mapbase, SZ_4K - 1, irq);
849
850 platform_device_register(&orion_ehci_1);
851}
852
853/*****************************************************************************
854 * EHCI2
855 ****************************************************************************/
856static struct resource orion_ehci_2_resources[2];
857
858static struct platform_device orion_ehci_2 = {
859 .name = "orion-ehci",
860 .id = 2,
861 .dev = {
862 .dma_mask = &ehci_dmamask,
863 .coherent_dma_mask = DMA_BIT_MASK(32),
864 .platform_data = &orion_ehci_data,
865 },
866};
867
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100868void __init orion_ehci_2_init(unsigned long mapbase,
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200869 unsigned long irq)
870{
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200871 fill_resources(&orion_ehci_2, orion_ehci_2_resources,
872 mapbase, SZ_4K - 1, irq);
873
874 platform_device_register(&orion_ehci_2);
875}
Andrew Lunn9e613f82011-05-15 13:32:50 +0200876
877/*****************************************************************************
878 * SATA
879 ****************************************************************************/
880static struct resource orion_sata_resources[2] = {
881 {
882 .name = "sata base",
883 }, {
884 .name = "sata irq",
885 },
886};
887
888static struct platform_device orion_sata = {
889 .name = "sata_mv",
890 .id = 0,
891 .dev = {
892 .coherent_dma_mask = DMA_BIT_MASK(32),
893 },
894};
895
896void __init orion_sata_init(struct mv_sata_platform_data *sata_data,
Andrew Lunn9e613f82011-05-15 13:32:50 +0200897 unsigned long mapbase,
898 unsigned long irq)
899{
Andrew Lunn9e613f82011-05-15 13:32:50 +0200900 orion_sata.dev.platform_data = sata_data;
901 fill_resources(&orion_sata, orion_sata_resources,
902 mapbase, 0x5000 - 1, irq);
903
904 platform_device_register(&orion_sata);
905}
906
Andrew Lunn44350062011-05-15 13:32:51 +0200907/*****************************************************************************
908 * Cryptographic Engines and Security Accelerator (CESA)
909 ****************************************************************************/
910static struct resource orion_crypto_resources[] = {
911 {
912 .name = "regs",
913 }, {
914 .name = "crypto interrupt",
915 }, {
916 .name = "sram",
917 .flags = IORESOURCE_MEM,
918 },
919};
Andrew Lunn9e613f82011-05-15 13:32:50 +0200920
Andrew Lunn44350062011-05-15 13:32:51 +0200921static struct platform_device orion_crypto = {
922 .name = "mv_crypto",
923 .id = -1,
924};
925
926void __init orion_crypto_init(unsigned long mapbase,
927 unsigned long srambase,
928 unsigned long sram_size,
929 unsigned long irq)
930{
931 fill_resources(&orion_crypto, orion_crypto_resources,
932 mapbase, 0xffff, irq);
933 orion_crypto.num_resources = 3;
934 orion_crypto_resources[2].start = srambase;
935 orion_crypto_resources[2].end = srambase + sram_size - 1;
936
937 platform_device_register(&orion_crypto);
938}