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