blob: d245a87dc014d4c6cf3d1c9a3285add47a56ecb5 [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 Lunne91cac02012-07-20 13:51:55 +020050 orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", tclk);
Andrew Lunn4574b882012-04-06 17:17:26 +020051}
52
Andrew Lunn28a2b452011-05-15 13:32:41 +020053/* 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.*/
56static 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 ****************************************************************************/
Andrew Lunn74c33572011-12-24 03:06:34 +010079static unsigned long __init uart_get_clk_rate(struct clk *clk)
80{
81 clk_prepare_enable(clk);
82 return clk_get_rate(clk);
83}
84
Andrew Lunn28a2b452011-05-15 13:32:41 +020085static void __init uart_complete(
86 struct platform_device *orion_uart,
87 struct plat_serial8250_port *data,
88 struct resource *resources,
89 unsigned int membase,
90 resource_size_t mapbase,
91 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +010092 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +020093{
94 data->mapbase = mapbase;
95 data->membase = (void __iomem *)membase;
96 data->irq = irq;
Andrew Lunn74c33572011-12-24 03:06:34 +010097 data->uartclk = uart_get_clk_rate(clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +020098 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 ****************************************************************************/
107static 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
116static struct resource orion_uart0_resources[2];
117
118static struct platform_device orion_uart0 = {
119 .name = "serial8250",
120 .id = PLAT8250_DEV_PLATFORM,
121};
122
123void __init orion_uart0_init(unsigned int membase,
124 resource_size_t mapbase,
125 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +0100126 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +0200127{
128 uart_complete(&orion_uart0, orion_uart0_data, orion_uart0_resources,
Andrew Lunn74c33572011-12-24 03:06:34 +0100129 membase, mapbase, irq, clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +0200130}
131
132/*****************************************************************************
133 * UART1
134 ****************************************************************************/
135static 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
144static struct resource orion_uart1_resources[2];
145
146static struct platform_device orion_uart1 = {
147 .name = "serial8250",
148 .id = PLAT8250_DEV_PLATFORM1,
149};
150
151void __init orion_uart1_init(unsigned int membase,
152 resource_size_t mapbase,
153 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +0100154 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +0200155{
156 uart_complete(&orion_uart1, orion_uart1_data, orion_uart1_resources,
Andrew Lunn74c33572011-12-24 03:06:34 +0100157 membase, mapbase, irq, clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +0200158}
159
160/*****************************************************************************
161 * UART2
162 ****************************************************************************/
163static 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
172static struct resource orion_uart2_resources[2];
173
174static struct platform_device orion_uart2 = {
175 .name = "serial8250",
176 .id = PLAT8250_DEV_PLATFORM2,
177};
178
179void __init orion_uart2_init(unsigned int membase,
180 resource_size_t mapbase,
181 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +0100182 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +0200183{
184 uart_complete(&orion_uart2, orion_uart2_data, orion_uart2_resources,
Andrew Lunn74c33572011-12-24 03:06:34 +0100185 membase, mapbase, irq, clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +0200186}
187
188/*****************************************************************************
189 * UART3
190 ****************************************************************************/
191static 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
200static struct resource orion_uart3_resources[2];
201
202static struct platform_device orion_uart3 = {
203 .name = "serial8250",
204 .id = 3,
205};
206
207void __init orion_uart3_init(unsigned int membase,
208 resource_size_t mapbase,
209 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +0100210 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +0200211{
212 uart_complete(&orion_uart3, orion_uart3_data, orion_uart3_resources,
Andrew Lunn74c33572011-12-24 03:06:34 +0100213 membase, mapbase, irq, clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +0200214}
Andrew Lunnf6eaccb2011-05-15 13:32:42 +0200215
216/*****************************************************************************
217 * SoC RTC
218 ****************************************************************************/
219static struct resource orion_rtc_resource[2];
220
221void __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}
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200233
234/*****************************************************************************
235 * GE
236 ****************************************************************************/
237static __init void ge_complete(
238 struct mv643xx_eth_shared_platform_data *orion_ge_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200239 struct resource *orion_ge_resource, unsigned long irq,
240 struct platform_device *orion_ge_shared,
241 struct mv643xx_eth_platform_data *eth_data,
242 struct platform_device *orion_ge)
243{
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200244 orion_ge_resource->start = irq;
245 orion_ge_resource->end = irq;
246 eth_data->shared = orion_ge_shared;
247 orion_ge->dev.platform_data = eth_data;
248
249 platform_device_register(orion_ge_shared);
250 platform_device_register(orion_ge);
251}
252
253/*****************************************************************************
254 * GE00
255 ****************************************************************************/
256struct mv643xx_eth_shared_platform_data orion_ge00_shared_data;
257
258static struct resource orion_ge00_shared_resources[] = {
259 {
260 .name = "ge00 base",
261 }, {
262 .name = "ge00 err irq",
263 },
264};
265
266static struct platform_device orion_ge00_shared = {
267 .name = MV643XX_ETH_SHARED_NAME,
268 .id = 0,
269 .dev = {
270 .platform_data = &orion_ge00_shared_data,
271 },
272};
273
274static struct resource orion_ge00_resources[] = {
275 {
276 .name = "ge00 irq",
277 .flags = IORESOURCE_IRQ,
278 },
279};
280
281static struct platform_device orion_ge00 = {
282 .name = MV643XX_ETH_NAME,
283 .id = 0,
284 .num_resources = 1,
285 .resource = orion_ge00_resources,
286 .dev = {
287 .coherent_dma_mask = DMA_BIT_MASK(32),
288 },
289};
290
291void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200292 unsigned long mapbase,
293 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100294 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200295{
296 fill_resources(&orion_ge00_shared, orion_ge00_shared_resources,
297 mapbase + 0x2000, SZ_16K - 1, irq_err);
Andrew Lunn452503e2011-12-24 01:24:24 +0100298 ge_complete(&orion_ge00_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200299 orion_ge00_resources, irq, &orion_ge00_shared,
300 eth_data, &orion_ge00);
301}
302
303/*****************************************************************************
304 * GE01
305 ****************************************************************************/
306struct mv643xx_eth_shared_platform_data orion_ge01_shared_data = {
307 .shared_smi = &orion_ge00_shared,
308};
309
310static struct resource orion_ge01_shared_resources[] = {
311 {
312 .name = "ge01 base",
313 }, {
314 .name = "ge01 err irq",
315 },
316};
317
318static struct platform_device orion_ge01_shared = {
319 .name = MV643XX_ETH_SHARED_NAME,
320 .id = 1,
321 .dev = {
322 .platform_data = &orion_ge01_shared_data,
323 },
324};
325
326static struct resource orion_ge01_resources[] = {
327 {
328 .name = "ge01 irq",
329 .flags = IORESOURCE_IRQ,
330 },
331};
332
333static struct platform_device orion_ge01 = {
334 .name = MV643XX_ETH_NAME,
335 .id = 1,
336 .num_resources = 1,
337 .resource = orion_ge01_resources,
338 .dev = {
339 .coherent_dma_mask = DMA_BIT_MASK(32),
340 },
341};
342
343void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200344 unsigned long mapbase,
345 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100346 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200347{
348 fill_resources(&orion_ge01_shared, orion_ge01_shared_resources,
349 mapbase + 0x2000, SZ_16K - 1, irq_err);
Andrew Lunn452503e2011-12-24 01:24:24 +0100350 ge_complete(&orion_ge01_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200351 orion_ge01_resources, irq, &orion_ge01_shared,
352 eth_data, &orion_ge01);
353}
354
355/*****************************************************************************
356 * GE10
357 ****************************************************************************/
358struct mv643xx_eth_shared_platform_data orion_ge10_shared_data = {
359 .shared_smi = &orion_ge00_shared,
360};
361
362static struct resource orion_ge10_shared_resources[] = {
363 {
364 .name = "ge10 base",
365 }, {
366 .name = "ge10 err irq",
367 },
368};
369
370static struct platform_device orion_ge10_shared = {
371 .name = MV643XX_ETH_SHARED_NAME,
372 .id = 1,
373 .dev = {
374 .platform_data = &orion_ge10_shared_data,
375 },
376};
377
378static struct resource orion_ge10_resources[] = {
379 {
380 .name = "ge10 irq",
381 .flags = IORESOURCE_IRQ,
382 },
383};
384
385static struct platform_device orion_ge10 = {
386 .name = MV643XX_ETH_NAME,
387 .id = 1,
388 .num_resources = 2,
389 .resource = orion_ge10_resources,
390 .dev = {
391 .coherent_dma_mask = DMA_BIT_MASK(32),
392 },
393};
394
395void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200396 unsigned long mapbase,
397 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100398 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200399{
400 fill_resources(&orion_ge10_shared, orion_ge10_shared_resources,
401 mapbase + 0x2000, SZ_16K - 1, irq_err);
Andrew Lunn452503e2011-12-24 01:24:24 +0100402 ge_complete(&orion_ge10_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200403 orion_ge10_resources, irq, &orion_ge10_shared,
404 eth_data, &orion_ge10);
405}
406
407/*****************************************************************************
408 * GE11
409 ****************************************************************************/
410struct mv643xx_eth_shared_platform_data orion_ge11_shared_data = {
411 .shared_smi = &orion_ge00_shared,
412};
413
414static struct resource orion_ge11_shared_resources[] = {
415 {
416 .name = "ge11 base",
417 }, {
418 .name = "ge11 err irq",
419 },
420};
421
422static struct platform_device orion_ge11_shared = {
423 .name = MV643XX_ETH_SHARED_NAME,
424 .id = 1,
425 .dev = {
426 .platform_data = &orion_ge11_shared_data,
427 },
428};
429
430static struct resource orion_ge11_resources[] = {
431 {
432 .name = "ge11 irq",
433 .flags = IORESOURCE_IRQ,
434 },
435};
436
437static struct platform_device orion_ge11 = {
438 .name = MV643XX_ETH_NAME,
439 .id = 1,
440 .num_resources = 2,
441 .resource = orion_ge11_resources,
442 .dev = {
443 .coherent_dma_mask = DMA_BIT_MASK(32),
444 },
445};
446
447void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200448 unsigned long mapbase,
449 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100450 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200451{
452 fill_resources(&orion_ge11_shared, orion_ge11_shared_resources,
453 mapbase + 0x2000, SZ_16K - 1, irq_err);
Andrew Lunn452503e2011-12-24 01:24:24 +0100454 ge_complete(&orion_ge11_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200455 orion_ge11_resources, irq, &orion_ge11_shared,
456 eth_data, &orion_ge11);
457}
458
459/*****************************************************************************
460 * Ethernet switch
461 ****************************************************************************/
462static struct resource orion_switch_resources[] = {
463 {
464 .start = 0,
465 .end = 0,
466 .flags = IORESOURCE_IRQ,
467 },
468};
469
470static struct platform_device orion_switch_device = {
471 .name = "dsa",
472 .id = 0,
473 .num_resources = 0,
474 .resource = orion_switch_resources,
475};
476
477void __init orion_ge00_switch_init(struct dsa_platform_data *d, int irq)
478{
479 int i;
480
481 if (irq != NO_IRQ) {
482 orion_switch_resources[0].start = irq;
483 orion_switch_resources[0].end = irq;
484 orion_switch_device.num_resources = 1;
485 }
486
487 d->netdev = &orion_ge00.dev;
488 for (i = 0; i < d->nr_chips; i++)
489 d->chip[i].mii_bus = &orion_ge00_shared.dev;
490 orion_switch_device.dev.platform_data = d;
491
492 platform_device_register(&orion_switch_device);
493}
Andrew Lunnaac7ffa2011-05-15 13:32:45 +0200494
495/*****************************************************************************
496 * I2C
497 ****************************************************************************/
498static struct mv64xxx_i2c_pdata orion_i2c_pdata = {
499 .freq_n = 3,
500 .timeout = 1000, /* Default timeout of 1 second */
501};
502
503static struct resource orion_i2c_resources[2];
504
505static struct platform_device orion_i2c = {
506 .name = MV64XXX_I2C_CTLR_NAME,
507 .id = 0,
508 .dev = {
509 .platform_data = &orion_i2c_pdata,
510 },
511};
512
513static struct mv64xxx_i2c_pdata orion_i2c_1_pdata = {
514 .freq_n = 3,
515 .timeout = 1000, /* Default timeout of 1 second */
516};
517
518static struct resource orion_i2c_1_resources[2];
519
520static struct platform_device orion_i2c_1 = {
521 .name = MV64XXX_I2C_CTLR_NAME,
522 .id = 1,
523 .dev = {
524 .platform_data = &orion_i2c_1_pdata,
525 },
526};
527
528void __init orion_i2c_init(unsigned long mapbase,
529 unsigned long irq,
530 unsigned long freq_m)
531{
532 orion_i2c_pdata.freq_m = freq_m;
533 fill_resources(&orion_i2c, orion_i2c_resources, mapbase,
534 SZ_32 - 1, irq);
535 platform_device_register(&orion_i2c);
536}
537
538void __init orion_i2c_1_init(unsigned long mapbase,
539 unsigned long irq,
540 unsigned long freq_m)
541{
542 orion_i2c_1_pdata.freq_m = freq_m;
543 fill_resources(&orion_i2c_1, orion_i2c_1_resources, mapbase,
544 SZ_32 - 1, irq);
545 platform_device_register(&orion_i2c_1);
546}
Andrew Lunn980f9f62011-05-15 13:32:46 +0200547
548/*****************************************************************************
549 * SPI
550 ****************************************************************************/
Andrew Lunn980f9f62011-05-15 13:32:46 +0200551static struct resource orion_spi_resources;
552
553static struct platform_device orion_spi = {
554 .name = "orion_spi",
555 .id = 0,
Andrew Lunn980f9f62011-05-15 13:32:46 +0200556};
557
Andrew Lunn980f9f62011-05-15 13:32:46 +0200558static struct resource orion_spi_1_resources;
559
560static struct platform_device orion_spi_1 = {
561 .name = "orion_spi",
562 .id = 1,
Andrew Lunn980f9f62011-05-15 13:32:46 +0200563};
564
565/* Note: The SPI silicon core does have interrupts. However the
566 * current Linux software driver does not use interrupts. */
567
Andrew Lunn4574b882012-04-06 17:17:26 +0200568void __init orion_spi_init(unsigned long mapbase)
Andrew Lunn980f9f62011-05-15 13:32:46 +0200569{
Andrew Lunn980f9f62011-05-15 13:32:46 +0200570 fill_resources(&orion_spi, &orion_spi_resources,
571 mapbase, SZ_512 - 1, NO_IRQ);
572 platform_device_register(&orion_spi);
573}
574
Andrew Lunn4574b882012-04-06 17:17:26 +0200575void __init orion_spi_1_init(unsigned long mapbase)
Andrew Lunn980f9f62011-05-15 13:32:46 +0200576{
Andrew Lunn980f9f62011-05-15 13:32:46 +0200577 fill_resources(&orion_spi_1, &orion_spi_1_resources,
578 mapbase, SZ_512 - 1, NO_IRQ);
579 platform_device_register(&orion_spi_1);
580}
Andrew Lunn5e00d372011-05-15 13:32:47 +0200581
582/*****************************************************************************
583 * Watchdog
584 ****************************************************************************/
Jason Coopera855a7c2012-03-15 00:33:26 +0000585static struct resource orion_wdt_resource =
Andrew Lunn0fa1f062012-06-22 08:54:02 +0200586 DEFINE_RES_MEM(TIMER_PHYS_BASE, 0x28);
Jason Coopera855a7c2012-03-15 00:33:26 +0000587
Andrew Lunn5e00d372011-05-15 13:32:47 +0200588static struct platform_device orion_wdt_device = {
589 .name = "orion_wdt",
590 .id = -1,
Jason Coopera855a7c2012-03-15 00:33:26 +0000591 .num_resources = 1,
Andrew Lunn4f04be62012-03-04 16:57:31 +0100592 .resource = &orion_wdt_resource,
Andrew Lunn5e00d372011-05-15 13:32:47 +0200593};
594
Andrew Lunn4f04be62012-03-04 16:57:31 +0100595void __init orion_wdt_init(void)
Andrew Lunn5e00d372011-05-15 13:32:47 +0200596{
Andrew Lunn5e00d372011-05-15 13:32:47 +0200597 platform_device_register(&orion_wdt_device);
598}
Andrew Lunnee962722011-05-15 13:32:48 +0200599
600/*****************************************************************************
601 * XOR
602 ****************************************************************************/
Andrew Lunnee962722011-05-15 13:32:48 +0200603static u64 orion_xor_dmamask = DMA_BIT_MASK(32);
604
605void __init orion_xor_init_channels(
606 struct mv_xor_platform_data *orion_xor0_data,
607 struct platform_device *orion_xor0_channel,
608 struct mv_xor_platform_data *orion_xor1_data,
609 struct platform_device *orion_xor1_channel)
610{
611 /*
612 * two engines can't do memset simultaneously, this limitation
613 * satisfied by removing memset support from one of the engines.
614 */
615 dma_cap_set(DMA_MEMCPY, orion_xor0_data->cap_mask);
616 dma_cap_set(DMA_XOR, orion_xor0_data->cap_mask);
617 platform_device_register(orion_xor0_channel);
618
619 dma_cap_set(DMA_MEMCPY, orion_xor1_data->cap_mask);
620 dma_cap_set(DMA_MEMSET, orion_xor1_data->cap_mask);
621 dma_cap_set(DMA_XOR, orion_xor1_data->cap_mask);
622 platform_device_register(orion_xor1_channel);
623}
624
625/*****************************************************************************
626 * XOR0
627 ****************************************************************************/
628static struct resource orion_xor0_shared_resources[] = {
629 {
630 .name = "xor 0 low",
631 .flags = IORESOURCE_MEM,
632 }, {
633 .name = "xor 0 high",
634 .flags = IORESOURCE_MEM,
635 },
636};
637
638static struct platform_device orion_xor0_shared = {
639 .name = MV_XOR_SHARED_NAME,
640 .id = 0,
Andrew Lunnee962722011-05-15 13:32:48 +0200641 .num_resources = ARRAY_SIZE(orion_xor0_shared_resources),
642 .resource = orion_xor0_shared_resources,
643};
644
645static struct resource orion_xor00_resources[] = {
646 [0] = {
647 .flags = IORESOURCE_IRQ,
648 },
649};
650
651static struct mv_xor_platform_data orion_xor00_data = {
652 .shared = &orion_xor0_shared,
653 .hw_id = 0,
654 .pool_size = PAGE_SIZE,
655};
656
657static struct platform_device orion_xor00_channel = {
658 .name = MV_XOR_NAME,
659 .id = 0,
660 .num_resources = ARRAY_SIZE(orion_xor00_resources),
661 .resource = orion_xor00_resources,
662 .dev = {
663 .dma_mask = &orion_xor_dmamask,
664 .coherent_dma_mask = DMA_BIT_MASK(64),
665 .platform_data = &orion_xor00_data,
666 },
667};
668
669static struct resource orion_xor01_resources[] = {
670 [0] = {
671 .flags = IORESOURCE_IRQ,
672 },
673};
674
675static struct mv_xor_platform_data orion_xor01_data = {
676 .shared = &orion_xor0_shared,
677 .hw_id = 1,
678 .pool_size = PAGE_SIZE,
679};
680
681static struct platform_device orion_xor01_channel = {
682 .name = MV_XOR_NAME,
683 .id = 1,
684 .num_resources = ARRAY_SIZE(orion_xor01_resources),
685 .resource = orion_xor01_resources,
686 .dev = {
687 .dma_mask = &orion_xor_dmamask,
688 .coherent_dma_mask = DMA_BIT_MASK(64),
689 .platform_data = &orion_xor01_data,
690 },
691};
692
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100693void __init orion_xor0_init(unsigned long mapbase_low,
Andrew Lunnee962722011-05-15 13:32:48 +0200694 unsigned long mapbase_high,
695 unsigned long irq_0,
696 unsigned long irq_1)
697{
Andrew Lunnee962722011-05-15 13:32:48 +0200698 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 ****************************************************************************/
717static 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
727static struct platform_device orion_xor1_shared = {
728 .name = MV_XOR_SHARED_NAME,
729 .id = 1,
Andrew Lunnee962722011-05-15 13:32:48 +0200730 .num_resources = ARRAY_SIZE(orion_xor1_shared_resources),
731 .resource = orion_xor1_shared_resources,
732};
733
734static struct resource orion_xor10_resources[] = {
735 [0] = {
736 .flags = IORESOURCE_IRQ,
737 },
738};
739
740static struct mv_xor_platform_data orion_xor10_data = {
741 .shared = &orion_xor1_shared,
742 .hw_id = 0,
743 .pool_size = PAGE_SIZE,
744};
745
746static struct platform_device orion_xor10_channel = {
747 .name = MV_XOR_NAME,
748 .id = 2,
749 .num_resources = ARRAY_SIZE(orion_xor10_resources),
750 .resource = orion_xor10_resources,
751 .dev = {
752 .dma_mask = &orion_xor_dmamask,
753 .coherent_dma_mask = DMA_BIT_MASK(64),
754 .platform_data = &orion_xor10_data,
755 },
756};
757
758static struct resource orion_xor11_resources[] = {
759 [0] = {
760 .flags = IORESOURCE_IRQ,
761 },
762};
763
764static struct mv_xor_platform_data orion_xor11_data = {
765 .shared = &orion_xor1_shared,
766 .hw_id = 1,
767 .pool_size = PAGE_SIZE,
768};
769
770static struct platform_device orion_xor11_channel = {
771 .name = MV_XOR_NAME,
772 .id = 3,
773 .num_resources = ARRAY_SIZE(orion_xor11_resources),
774 .resource = orion_xor11_resources,
775 .dev = {
776 .dma_mask = &orion_xor_dmamask,
777 .coherent_dma_mask = DMA_BIT_MASK(64),
778 .platform_data = &orion_xor11_data,
779 },
780};
781
782void __init orion_xor1_init(unsigned long mapbase_low,
783 unsigned long mapbase_high,
784 unsigned long irq_0,
785 unsigned long irq_1)
786{
787 orion_xor1_shared_resources[0].start = mapbase_low;
788 orion_xor1_shared_resources[0].end = mapbase_low + 0xff;
789 orion_xor1_shared_resources[1].start = mapbase_high;
790 orion_xor1_shared_resources[1].end = mapbase_high + 0xff;
791
792 orion_xor10_resources[0].start = irq_0;
793 orion_xor10_resources[0].end = irq_0;
794 orion_xor11_resources[0].start = irq_1;
795 orion_xor11_resources[0].end = irq_1;
796
797 platform_device_register(&orion_xor1_shared);
798
799 orion_xor_init_channels(&orion_xor10_data, &orion_xor10_channel,
800 &orion_xor11_data, &orion_xor11_channel);
801}
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200802
803/*****************************************************************************
804 * EHCI
805 ****************************************************************************/
Andrew Lunn72053352012-02-08 15:52:47 +0100806static struct orion_ehci_data orion_ehci_data;
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200807static u64 ehci_dmamask = DMA_BIT_MASK(32);
808
809
810/*****************************************************************************
811 * EHCI0
812 ****************************************************************************/
813static struct resource orion_ehci_resources[2];
814
815static struct platform_device orion_ehci = {
816 .name = "orion-ehci",
817 .id = 0,
818 .dev = {
819 .dma_mask = &ehci_dmamask,
820 .coherent_dma_mask = DMA_BIT_MASK(32),
821 .platform_data = &orion_ehci_data,
822 },
823};
824
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100825void __init orion_ehci_init(unsigned long mapbase,
Andrew Lunn72053352012-02-08 15:52:47 +0100826 unsigned long irq,
827 enum orion_ehci_phy_ver phy_version)
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200828{
Andrew Lunn72053352012-02-08 15:52:47 +0100829 orion_ehci_data.phy_version = phy_version;
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200830 fill_resources(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1,
831 irq);
832
833 platform_device_register(&orion_ehci);
834}
835
836/*****************************************************************************
837 * EHCI1
838 ****************************************************************************/
839static struct resource orion_ehci_1_resources[2];
840
841static struct platform_device orion_ehci_1 = {
842 .name = "orion-ehci",
843 .id = 1,
844 .dev = {
845 .dma_mask = &ehci_dmamask,
846 .coherent_dma_mask = DMA_BIT_MASK(32),
847 .platform_data = &orion_ehci_data,
848 },
849};
850
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100851void __init orion_ehci_1_init(unsigned long mapbase,
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200852 unsigned long irq)
853{
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200854 fill_resources(&orion_ehci_1, orion_ehci_1_resources,
855 mapbase, SZ_4K - 1, irq);
856
857 platform_device_register(&orion_ehci_1);
858}
859
860/*****************************************************************************
861 * EHCI2
862 ****************************************************************************/
863static struct resource orion_ehci_2_resources[2];
864
865static struct platform_device orion_ehci_2 = {
866 .name = "orion-ehci",
867 .id = 2,
868 .dev = {
869 .dma_mask = &ehci_dmamask,
870 .coherent_dma_mask = DMA_BIT_MASK(32),
871 .platform_data = &orion_ehci_data,
872 },
873};
874
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100875void __init orion_ehci_2_init(unsigned long mapbase,
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200876 unsigned long irq)
877{
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200878 fill_resources(&orion_ehci_2, orion_ehci_2_resources,
879 mapbase, SZ_4K - 1, irq);
880
881 platform_device_register(&orion_ehci_2);
882}
Andrew Lunn9e613f82011-05-15 13:32:50 +0200883
884/*****************************************************************************
885 * SATA
886 ****************************************************************************/
887static struct resource orion_sata_resources[2] = {
888 {
889 .name = "sata base",
890 }, {
891 .name = "sata irq",
892 },
893};
894
895static struct platform_device orion_sata = {
896 .name = "sata_mv",
897 .id = 0,
898 .dev = {
899 .coherent_dma_mask = DMA_BIT_MASK(32),
900 },
901};
902
903void __init orion_sata_init(struct mv_sata_platform_data *sata_data,
Andrew Lunn9e613f82011-05-15 13:32:50 +0200904 unsigned long mapbase,
905 unsigned long irq)
906{
Andrew Lunn9e613f82011-05-15 13:32:50 +0200907 orion_sata.dev.platform_data = sata_data;
908 fill_resources(&orion_sata, orion_sata_resources,
909 mapbase, 0x5000 - 1, irq);
910
911 platform_device_register(&orion_sata);
912}
913
Andrew Lunn44350062011-05-15 13:32:51 +0200914/*****************************************************************************
915 * Cryptographic Engines and Security Accelerator (CESA)
916 ****************************************************************************/
917static struct resource orion_crypto_resources[] = {
918 {
919 .name = "regs",
920 }, {
921 .name = "crypto interrupt",
922 }, {
923 .name = "sram",
924 .flags = IORESOURCE_MEM,
925 },
926};
Andrew Lunn9e613f82011-05-15 13:32:50 +0200927
Andrew Lunn44350062011-05-15 13:32:51 +0200928static struct platform_device orion_crypto = {
929 .name = "mv_crypto",
930 .id = -1,
931};
932
933void __init orion_crypto_init(unsigned long mapbase,
934 unsigned long srambase,
935 unsigned long sram_size,
936 unsigned long irq)
937{
938 fill_resources(&orion_crypto, orion_crypto_resources,
939 mapbase, 0xffff, irq);
940 orion_crypto.num_resources = 3;
941 orion_crypto_resources[2].start = srambase;
942 orion_crypto_resources[2].end = srambase + sram_size - 1;
943
944 platform_device_register(&orion_crypto);
945}