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