blob: 78c8bf4043c06d1f3c8ad0d6e198224cfb777c57 [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>
Arnd Bergmannc02cecb2012-08-24 15:21:54 +020022#include <linux/platform_data/dma-mv_xor.h>
23#include <linux/platform_data/usb-ehci-orion.h>
Andrew Lunn48fce882013-10-23 16:12:50 +020024#include <plat/common.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{
Russell King4dbc0232015-03-02 15:35:22 +000030 clkdev_create(clk, con_id, "%s", dev_id);
Andrew Lunn4574b882012-04-06 17:17:26 +020031}
32
33/* Create clkdev entries for all orion platforms except kirkwood.
34 Kirkwood has gated clocks for some of its peripherals, so creates
35 its own clkdev entries. For all the other orion devices, create
36 clkdev entries to the tclk. */
37void __init orion_clkdev_init(struct clk *tclk)
38{
39 orion_clkdev_add(NULL, "orion_spi.0", tclk);
40 orion_clkdev_add(NULL, "orion_spi.1", tclk);
Andrew Lunn452503e2011-12-24 01:24:24 +010041 orion_clkdev_add(NULL, MV643XX_ETH_NAME ".0", tclk);
42 orion_clkdev_add(NULL, MV643XX_ETH_NAME ".1", tclk);
43 orion_clkdev_add(NULL, MV643XX_ETH_NAME ".2", tclk);
44 orion_clkdev_add(NULL, MV643XX_ETH_NAME ".3", tclk);
Andrew Lunn4f04be62012-03-04 16:57:31 +010045 orion_clkdev_add(NULL, "orion_wdt", tclk);
Andrew Lunne91cac02012-07-20 13:51:55 +020046 orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", tclk);
Andrew Lunn4574b882012-04-06 17:17:26 +020047}
48
Andrew Lunn28a2b452011-05-15 13:32:41 +020049/* Fill in the resources structure and link it into the platform
50 device structure. There is always a memory region, and nearly
51 always an interrupt.*/
52static void fill_resources(struct platform_device *device,
53 struct resource *resources,
54 resource_size_t mapbase,
55 resource_size_t size,
56 unsigned int irq)
57{
58 device->resource = resources;
59 device->num_resources = 1;
60 resources[0].flags = IORESOURCE_MEM;
61 resources[0].start = mapbase;
62 resources[0].end = mapbase + size;
63
64 if (irq != NO_IRQ) {
65 device->num_resources++;
66 resources[1].flags = IORESOURCE_IRQ;
67 resources[1].start = irq;
68 resources[1].end = irq;
69 }
70}
71
72/*****************************************************************************
73 * UART
74 ****************************************************************************/
Andrew Lunn74c33572011-12-24 03:06:34 +010075static unsigned long __init uart_get_clk_rate(struct clk *clk)
76{
77 clk_prepare_enable(clk);
78 return clk_get_rate(clk);
79}
80
Andrew Lunn28a2b452011-05-15 13:32:41 +020081static void __init uart_complete(
82 struct platform_device *orion_uart,
83 struct plat_serial8250_port *data,
84 struct resource *resources,
Thomas Petazzonid19beac2012-09-11 14:27:23 +020085 void __iomem *membase,
Andrew Lunn28a2b452011-05-15 13:32:41 +020086 resource_size_t mapbase,
87 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +010088 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +020089{
90 data->mapbase = mapbase;
Thomas Petazzonid19beac2012-09-11 14:27:23 +020091 data->membase = membase;
Andrew Lunn28a2b452011-05-15 13:32:41 +020092 data->irq = irq;
Andrew Lunn74c33572011-12-24 03:06:34 +010093 data->uartclk = uart_get_clk_rate(clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +020094 orion_uart->dev.platform_data = data;
95
96 fill_resources(orion_uart, resources, mapbase, 0xff, irq);
97 platform_device_register(orion_uart);
98}
99
100/*****************************************************************************
101 * UART0
102 ****************************************************************************/
103static struct plat_serial8250_port orion_uart0_data[] = {
104 {
105 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
106 .iotype = UPIO_MEM,
107 .regshift = 2,
108 }, {
109 },
110};
111
112static struct resource orion_uart0_resources[2];
113
114static struct platform_device orion_uart0 = {
115 .name = "serial8250",
116 .id = PLAT8250_DEV_PLATFORM,
117};
118
Thomas Petazzonid19beac2012-09-11 14:27:23 +0200119void __init orion_uart0_init(void __iomem *membase,
Andrew Lunn28a2b452011-05-15 13:32:41 +0200120 resource_size_t mapbase,
121 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +0100122 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +0200123{
124 uart_complete(&orion_uart0, orion_uart0_data, orion_uart0_resources,
Andrew Lunn74c33572011-12-24 03:06:34 +0100125 membase, mapbase, irq, clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +0200126}
127
128/*****************************************************************************
129 * UART1
130 ****************************************************************************/
131static struct plat_serial8250_port orion_uart1_data[] = {
132 {
133 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
134 .iotype = UPIO_MEM,
135 .regshift = 2,
136 }, {
137 },
138};
139
140static struct resource orion_uart1_resources[2];
141
142static struct platform_device orion_uart1 = {
143 .name = "serial8250",
144 .id = PLAT8250_DEV_PLATFORM1,
145};
146
Thomas Petazzonid19beac2012-09-11 14:27:23 +0200147void __init orion_uart1_init(void __iomem *membase,
Andrew Lunn28a2b452011-05-15 13:32:41 +0200148 resource_size_t mapbase,
149 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +0100150 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +0200151{
152 uart_complete(&orion_uart1, orion_uart1_data, orion_uart1_resources,
Andrew Lunn74c33572011-12-24 03:06:34 +0100153 membase, mapbase, irq, clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +0200154}
155
156/*****************************************************************************
157 * UART2
158 ****************************************************************************/
159static struct plat_serial8250_port orion_uart2_data[] = {
160 {
161 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
162 .iotype = UPIO_MEM,
163 .regshift = 2,
164 }, {
165 },
166};
167
168static struct resource orion_uart2_resources[2];
169
170static struct platform_device orion_uart2 = {
171 .name = "serial8250",
172 .id = PLAT8250_DEV_PLATFORM2,
173};
174
Thomas Petazzonid19beac2012-09-11 14:27:23 +0200175void __init orion_uart2_init(void __iomem *membase,
Andrew Lunn28a2b452011-05-15 13:32:41 +0200176 resource_size_t mapbase,
177 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +0100178 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +0200179{
180 uart_complete(&orion_uart2, orion_uart2_data, orion_uart2_resources,
Andrew Lunn74c33572011-12-24 03:06:34 +0100181 membase, mapbase, irq, clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +0200182}
183
184/*****************************************************************************
185 * UART3
186 ****************************************************************************/
187static struct plat_serial8250_port orion_uart3_data[] = {
188 {
189 .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
190 .iotype = UPIO_MEM,
191 .regshift = 2,
192 }, {
193 },
194};
195
196static struct resource orion_uart3_resources[2];
197
198static struct platform_device orion_uart3 = {
199 .name = "serial8250",
200 .id = 3,
201};
202
Thomas Petazzonid19beac2012-09-11 14:27:23 +0200203void __init orion_uart3_init(void __iomem *membase,
Andrew Lunn28a2b452011-05-15 13:32:41 +0200204 resource_size_t mapbase,
205 unsigned int irq,
Andrew Lunn74c33572011-12-24 03:06:34 +0100206 struct clk *clk)
Andrew Lunn28a2b452011-05-15 13:32:41 +0200207{
208 uart_complete(&orion_uart3, orion_uart3_data, orion_uart3_resources,
Andrew Lunn74c33572011-12-24 03:06:34 +0100209 membase, mapbase, irq, clk);
Andrew Lunn28a2b452011-05-15 13:32:41 +0200210}
Andrew Lunnf6eaccb2011-05-15 13:32:42 +0200211
212/*****************************************************************************
213 * SoC RTC
214 ****************************************************************************/
215static struct resource orion_rtc_resource[2];
216
217void __init orion_rtc_init(unsigned long mapbase,
218 unsigned long irq)
219{
220 orion_rtc_resource[0].start = mapbase;
221 orion_rtc_resource[0].end = mapbase + SZ_32 - 1;
222 orion_rtc_resource[0].flags = IORESOURCE_MEM;
223 orion_rtc_resource[1].start = irq;
224 orion_rtc_resource[1].end = irq;
225 orion_rtc_resource[1].flags = IORESOURCE_IRQ;
226
227 platform_device_register_simple("rtc-mv", -1, orion_rtc_resource, 2);
228}
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200229
230/*****************************************************************************
231 * GE
232 ****************************************************************************/
233static __init void ge_complete(
234 struct mv643xx_eth_shared_platform_data *orion_ge_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200235 struct resource *orion_ge_resource, unsigned long irq,
236 struct platform_device *orion_ge_shared,
Florian Fainellic3a07132013-03-22 03:39:28 +0000237 struct platform_device *orion_ge_mvmdio,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200238 struct mv643xx_eth_platform_data *eth_data,
239 struct platform_device *orion_ge)
240{
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200241 orion_ge_resource->start = irq;
242 orion_ge_resource->end = irq;
243 eth_data->shared = orion_ge_shared;
244 orion_ge->dev.platform_data = eth_data;
245
246 platform_device_register(orion_ge_shared);
Florian Fainellic3a07132013-03-22 03:39:28 +0000247 if (orion_ge_mvmdio)
248 platform_device_register(orion_ge_mvmdio);
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200249 platform_device_register(orion_ge);
250}
251
252/*****************************************************************************
253 * GE00
254 ****************************************************************************/
Andrew Lunn48fce882013-10-23 16:12:50 +0200255static struct mv643xx_eth_shared_platform_data orion_ge00_shared_data;
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200256
257static struct resource orion_ge00_shared_resources[] = {
258 {
259 .name = "ge00 base",
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200260 },
261};
262
263static struct platform_device orion_ge00_shared = {
264 .name = MV643XX_ETH_SHARED_NAME,
265 .id = 0,
266 .dev = {
267 .platform_data = &orion_ge00_shared_data,
268 },
269};
270
Florian Fainellic3a07132013-03-22 03:39:28 +0000271static struct resource orion_ge_mvmdio_resources[] = {
272 {
273 .name = "ge00 mvmdio base",
274 }, {
275 .name = "ge00 mvmdio err irq",
276 },
277};
278
279static struct platform_device orion_ge_mvmdio = {
280 .name = "orion-mdio",
281 .id = -1,
282};
283
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200284static struct resource orion_ge00_resources[] = {
285 {
286 .name = "ge00 irq",
287 .flags = IORESOURCE_IRQ,
288 },
289};
290
291static struct platform_device orion_ge00 = {
292 .name = MV643XX_ETH_NAME,
293 .id = 0,
294 .num_resources = 1,
295 .resource = orion_ge00_resources,
296 .dev = {
297 .coherent_dma_mask = DMA_BIT_MASK(32),
298 },
299};
300
301void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200302 unsigned long mapbase,
303 unsigned long irq,
Arnaud Patard (Rtp)58569ae2012-07-26 12:15:46 +0200304 unsigned long irq_err,
305 unsigned int tx_csum_limit)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200306{
307 fill_resources(&orion_ge00_shared, orion_ge00_shared_resources,
Florian Fainellic3a07132013-03-22 03:39:28 +0000308 mapbase + 0x2000, SZ_16K - 1, NO_IRQ);
309 fill_resources(&orion_ge_mvmdio, orion_ge_mvmdio_resources,
310 mapbase + 0x2004, 0x84 - 1, irq_err);
Arnaud Patard (Rtp)58569ae2012-07-26 12:15:46 +0200311 orion_ge00_shared_data.tx_csum_limit = tx_csum_limit;
Andrew Lunn452503e2011-12-24 01:24:24 +0100312 ge_complete(&orion_ge00_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200313 orion_ge00_resources, irq, &orion_ge00_shared,
Florian Fainellic3a07132013-03-22 03:39:28 +0000314 &orion_ge_mvmdio,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200315 eth_data, &orion_ge00);
316}
317
318/*****************************************************************************
319 * GE01
320 ****************************************************************************/
Andrew Lunn48fce882013-10-23 16:12:50 +0200321static struct mv643xx_eth_shared_platform_data orion_ge01_shared_data;
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200322
323static struct resource orion_ge01_shared_resources[] = {
324 {
325 .name = "ge01 base",
Florian Fainellic3a07132013-03-22 03:39:28 +0000326 }
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200327};
328
329static struct platform_device orion_ge01_shared = {
330 .name = MV643XX_ETH_SHARED_NAME,
331 .id = 1,
332 .dev = {
333 .platform_data = &orion_ge01_shared_data,
334 },
335};
336
337static struct resource orion_ge01_resources[] = {
338 {
339 .name = "ge01 irq",
340 .flags = IORESOURCE_IRQ,
341 },
342};
343
344static struct platform_device orion_ge01 = {
345 .name = MV643XX_ETH_NAME,
346 .id = 1,
347 .num_resources = 1,
348 .resource = orion_ge01_resources,
349 .dev = {
350 .coherent_dma_mask = DMA_BIT_MASK(32),
351 },
352};
353
354void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200355 unsigned long mapbase,
356 unsigned long irq,
Arnaud Patard (Rtp)58569ae2012-07-26 12:15:46 +0200357 unsigned long irq_err,
358 unsigned int tx_csum_limit)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200359{
360 fill_resources(&orion_ge01_shared, orion_ge01_shared_resources,
Florian Fainellic3a07132013-03-22 03:39:28 +0000361 mapbase + 0x2000, SZ_16K - 1, NO_IRQ);
Arnaud Patard (Rtp)58569ae2012-07-26 12:15:46 +0200362 orion_ge01_shared_data.tx_csum_limit = tx_csum_limit;
Andrew Lunn452503e2011-12-24 01:24:24 +0100363 ge_complete(&orion_ge01_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200364 orion_ge01_resources, irq, &orion_ge01_shared,
Florian Fainellic3a07132013-03-22 03:39:28 +0000365 NULL,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200366 eth_data, &orion_ge01);
367}
368
369/*****************************************************************************
370 * GE10
371 ****************************************************************************/
Andrew Lunn48fce882013-10-23 16:12:50 +0200372static struct mv643xx_eth_shared_platform_data orion_ge10_shared_data;
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200373
374static struct resource orion_ge10_shared_resources[] = {
375 {
376 .name = "ge10 base",
Florian Fainellic3a07132013-03-22 03:39:28 +0000377 }
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200378};
379
380static struct platform_device orion_ge10_shared = {
381 .name = MV643XX_ETH_SHARED_NAME,
Gregory CLEMENT2b8b2792013-05-19 22:12:43 +0200382 .id = 2,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200383 .dev = {
384 .platform_data = &orion_ge10_shared_data,
385 },
386};
387
388static struct resource orion_ge10_resources[] = {
389 {
390 .name = "ge10 irq",
391 .flags = IORESOURCE_IRQ,
392 },
393};
394
395static struct platform_device orion_ge10 = {
396 .name = MV643XX_ETH_NAME,
Gregory CLEMENT2b8b2792013-05-19 22:12:43 +0200397 .id = 2,
398 .num_resources = 1,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200399 .resource = orion_ge10_resources,
400 .dev = {
401 .coherent_dma_mask = DMA_BIT_MASK(32),
402 },
403};
404
405void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200406 unsigned long mapbase,
407 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100408 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200409{
410 fill_resources(&orion_ge10_shared, orion_ge10_shared_resources,
Florian Fainellic3a07132013-03-22 03:39:28 +0000411 mapbase + 0x2000, SZ_16K - 1, NO_IRQ);
Andrew Lunn452503e2011-12-24 01:24:24 +0100412 ge_complete(&orion_ge10_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200413 orion_ge10_resources, irq, &orion_ge10_shared,
Florian Fainellic3a07132013-03-22 03:39:28 +0000414 NULL,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200415 eth_data, &orion_ge10);
416}
417
418/*****************************************************************************
419 * GE11
420 ****************************************************************************/
Andrew Lunn48fce882013-10-23 16:12:50 +0200421static struct mv643xx_eth_shared_platform_data orion_ge11_shared_data;
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200422
423static struct resource orion_ge11_shared_resources[] = {
424 {
425 .name = "ge11 base",
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200426 },
427};
428
429static struct platform_device orion_ge11_shared = {
430 .name = MV643XX_ETH_SHARED_NAME,
Gregory CLEMENT2b8b2792013-05-19 22:12:43 +0200431 .id = 3,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200432 .dev = {
433 .platform_data = &orion_ge11_shared_data,
434 },
435};
436
437static struct resource orion_ge11_resources[] = {
438 {
439 .name = "ge11 irq",
440 .flags = IORESOURCE_IRQ,
441 },
442};
443
444static struct platform_device orion_ge11 = {
445 .name = MV643XX_ETH_NAME,
Gregory CLEMENT2b8b2792013-05-19 22:12:43 +0200446 .id = 3,
447 .num_resources = 1,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200448 .resource = orion_ge11_resources,
449 .dev = {
450 .coherent_dma_mask = DMA_BIT_MASK(32),
451 },
452};
453
454void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200455 unsigned long mapbase,
456 unsigned long irq,
Andrew Lunn452503e2011-12-24 01:24:24 +0100457 unsigned long irq_err)
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200458{
459 fill_resources(&orion_ge11_shared, orion_ge11_shared_resources,
Florian Fainellic3a07132013-03-22 03:39:28 +0000460 mapbase + 0x2000, SZ_16K - 1, NO_IRQ);
Andrew Lunn452503e2011-12-24 01:24:24 +0100461 ge_complete(&orion_ge11_shared_data,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200462 orion_ge11_resources, irq, &orion_ge11_shared,
Florian Fainellic3a07132013-03-22 03:39:28 +0000463 NULL,
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200464 eth_data, &orion_ge11);
465}
466
467/*****************************************************************************
468 * Ethernet switch
469 ****************************************************************************/
470static struct resource orion_switch_resources[] = {
471 {
472 .start = 0,
473 .end = 0,
474 .flags = IORESOURCE_IRQ,
475 },
476};
477
478static struct platform_device orion_switch_device = {
479 .name = "dsa",
480 .id = 0,
481 .num_resources = 0,
482 .resource = orion_switch_resources,
483};
484
485void __init orion_ge00_switch_init(struct dsa_platform_data *d, int irq)
486{
487 int i;
488
489 if (irq != NO_IRQ) {
490 orion_switch_resources[0].start = irq;
491 orion_switch_resources[0].end = irq;
492 orion_switch_device.num_resources = 1;
493 }
494
495 d->netdev = &orion_ge00.dev;
496 for (i = 0; i < d->nr_chips; i++)
Florian Fainellid836ace62015-10-03 13:03:47 -0700497 d->chip[i].host_dev = &orion_ge_mvmdio.dev;
Andrew Lunn7e3819d2011-05-15 13:32:44 +0200498 orion_switch_device.dev.platform_data = d;
499
500 platform_device_register(&orion_switch_device);
501}
Andrew Lunnaac7ffa2011-05-15 13:32:45 +0200502
503/*****************************************************************************
504 * I2C
505 ****************************************************************************/
506static struct mv64xxx_i2c_pdata orion_i2c_pdata = {
507 .freq_n = 3,
508 .timeout = 1000, /* Default timeout of 1 second */
509};
510
511static struct resource orion_i2c_resources[2];
512
513static struct platform_device orion_i2c = {
514 .name = MV64XXX_I2C_CTLR_NAME,
515 .id = 0,
516 .dev = {
517 .platform_data = &orion_i2c_pdata,
518 },
519};
520
521static struct mv64xxx_i2c_pdata orion_i2c_1_pdata = {
522 .freq_n = 3,
523 .timeout = 1000, /* Default timeout of 1 second */
524};
525
526static struct resource orion_i2c_1_resources[2];
527
528static struct platform_device orion_i2c_1 = {
529 .name = MV64XXX_I2C_CTLR_NAME,
530 .id = 1,
531 .dev = {
532 .platform_data = &orion_i2c_1_pdata,
533 },
534};
535
536void __init orion_i2c_init(unsigned long mapbase,
537 unsigned long irq,
538 unsigned long freq_m)
539{
540 orion_i2c_pdata.freq_m = freq_m;
541 fill_resources(&orion_i2c, orion_i2c_resources, mapbase,
542 SZ_32 - 1, irq);
543 platform_device_register(&orion_i2c);
544}
545
546void __init orion_i2c_1_init(unsigned long mapbase,
547 unsigned long irq,
548 unsigned long freq_m)
549{
550 orion_i2c_1_pdata.freq_m = freq_m;
551 fill_resources(&orion_i2c_1, orion_i2c_1_resources, mapbase,
552 SZ_32 - 1, irq);
553 platform_device_register(&orion_i2c_1);
554}
Andrew Lunn980f9f62011-05-15 13:32:46 +0200555
556/*****************************************************************************
557 * SPI
558 ****************************************************************************/
Andrew Lunn980f9f62011-05-15 13:32:46 +0200559static struct resource orion_spi_resources;
560
561static struct platform_device orion_spi = {
562 .name = "orion_spi",
563 .id = 0,
Andrew Lunn980f9f62011-05-15 13:32:46 +0200564};
565
Andrew Lunn980f9f62011-05-15 13:32:46 +0200566static struct resource orion_spi_1_resources;
567
568static struct platform_device orion_spi_1 = {
569 .name = "orion_spi",
570 .id = 1,
Andrew Lunn980f9f62011-05-15 13:32:46 +0200571};
572
573/* Note: The SPI silicon core does have interrupts. However the
574 * current Linux software driver does not use interrupts. */
575
Andrew Lunn4574b882012-04-06 17:17:26 +0200576void __init orion_spi_init(unsigned long mapbase)
Andrew Lunn980f9f62011-05-15 13:32:46 +0200577{
Andrew Lunn980f9f62011-05-15 13:32:46 +0200578 fill_resources(&orion_spi, &orion_spi_resources,
579 mapbase, SZ_512 - 1, NO_IRQ);
580 platform_device_register(&orion_spi);
581}
582
Andrew Lunn4574b882012-04-06 17:17:26 +0200583void __init orion_spi_1_init(unsigned long mapbase)
Andrew Lunn980f9f62011-05-15 13:32:46 +0200584{
Andrew Lunn980f9f62011-05-15 13:32:46 +0200585 fill_resources(&orion_spi_1, &orion_spi_1_resources,
586 mapbase, SZ_512 - 1, NO_IRQ);
587 platform_device_register(&orion_spi_1);
588}
Andrew Lunn5e00d372011-05-15 13:32:47 +0200589
590/*****************************************************************************
Andrew Lunnee962722011-05-15 13:32:48 +0200591 * XOR
592 ****************************************************************************/
Andrew Lunnee962722011-05-15 13:32:48 +0200593static u64 orion_xor_dmamask = DMA_BIT_MASK(32);
594
Andrew Lunnee962722011-05-15 13:32:48 +0200595/*****************************************************************************
596 * XOR0
597 ****************************************************************************/
598static struct resource orion_xor0_shared_resources[] = {
599 {
600 .name = "xor 0 low",
601 .flags = IORESOURCE_MEM,
602 }, {
603 .name = "xor 0 high",
604 .flags = IORESOURCE_MEM,
Thomas Petazzoniaf19e142012-10-29 17:45:21 +0100605 }, {
606 .name = "irq channel 0",
607 .flags = IORESOURCE_IRQ,
608 }, {
609 .name = "irq channel 1",
610 .flags = IORESOURCE_IRQ,
Andrew Lunnee962722011-05-15 13:32:48 +0200611 },
612};
613
Thomas Petazzonib503fa02012-11-15 15:55:30 +0100614static struct mv_xor_channel_data orion_xor0_channels_data[2];
Thomas Petazzoniaf19e142012-10-29 17:45:21 +0100615
Thomas Petazzoni7dde4532012-10-30 11:58:14 +0100616static struct mv_xor_platform_data orion_xor0_pdata = {
Thomas Petazzonie39f6ec2012-10-30 11:56:26 +0100617 .channels = orion_xor0_channels_data,
Thomas Petazzoniaf19e142012-10-29 17:45:21 +0100618};
619
Andrew Lunnee962722011-05-15 13:32:48 +0200620static struct platform_device orion_xor0_shared = {
Thomas Petazzoni0dddee72012-10-30 11:59:42 +0100621 .name = MV_XOR_NAME,
Andrew Lunnee962722011-05-15 13:32:48 +0200622 .id = 0,
Andrew Lunnee962722011-05-15 13:32:48 +0200623 .num_resources = ARRAY_SIZE(orion_xor0_shared_resources),
624 .resource = orion_xor0_shared_resources,
Thomas Petazzoniaf19e142012-10-29 17:45:21 +0100625 .dev = {
626 .dma_mask = &orion_xor_dmamask,
627 .coherent_dma_mask = DMA_BIT_MASK(64),
628 .platform_data = &orion_xor0_pdata,
Andrew Lunnee962722011-05-15 13:32:48 +0200629 },
630};
631
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100632void __init orion_xor0_init(unsigned long mapbase_low,
Andrew Lunnee962722011-05-15 13:32:48 +0200633 unsigned long mapbase_high,
634 unsigned long irq_0,
635 unsigned long irq_1)
636{
Andrew Lunnee962722011-05-15 13:32:48 +0200637 orion_xor0_shared_resources[0].start = mapbase_low;
638 orion_xor0_shared_resources[0].end = mapbase_low + 0xff;
639 orion_xor0_shared_resources[1].start = mapbase_high;
640 orion_xor0_shared_resources[1].end = mapbase_high + 0xff;
641
Thomas Petazzoniaf19e142012-10-29 17:45:21 +0100642 orion_xor0_shared_resources[2].start = irq_0;
643 orion_xor0_shared_resources[2].end = irq_0;
644 orion_xor0_shared_resources[3].start = irq_1;
645 orion_xor0_shared_resources[3].end = irq_1;
646
Thomas Petazzonie39f6ec2012-10-30 11:56:26 +0100647 dma_cap_set(DMA_MEMCPY, orion_xor0_channels_data[0].cap_mask);
648 dma_cap_set(DMA_XOR, orion_xor0_channels_data[0].cap_mask);
Thomas Petazzoniaf19e142012-10-29 17:45:21 +0100649
Thomas Petazzonie39f6ec2012-10-30 11:56:26 +0100650 dma_cap_set(DMA_MEMCPY, orion_xor0_channels_data[1].cap_mask);
651 dma_cap_set(DMA_XOR, orion_xor0_channels_data[1].cap_mask);
Andrew Lunnee962722011-05-15 13:32:48 +0200652
653 platform_device_register(&orion_xor0_shared);
Andrew Lunnee962722011-05-15 13:32:48 +0200654}
655
656/*****************************************************************************
657 * XOR1
658 ****************************************************************************/
659static struct resource orion_xor1_shared_resources[] = {
660 {
661 .name = "xor 1 low",
662 .flags = IORESOURCE_MEM,
663 }, {
664 .name = "xor 1 high",
665 .flags = IORESOURCE_MEM,
Thomas Petazzonidd2c57b2012-10-30 11:11:36 +0100666 }, {
667 .name = "irq channel 0",
668 .flags = IORESOURCE_IRQ,
669 }, {
670 .name = "irq channel 1",
671 .flags = IORESOURCE_IRQ,
Andrew Lunnee962722011-05-15 13:32:48 +0200672 },
673};
674
Thomas Petazzonib503fa02012-11-15 15:55:30 +0100675static struct mv_xor_channel_data orion_xor1_channels_data[2];
Thomas Petazzonidd2c57b2012-10-30 11:11:36 +0100676
Thomas Petazzoni7dde4532012-10-30 11:58:14 +0100677static struct mv_xor_platform_data orion_xor1_pdata = {
Thomas Petazzonie39f6ec2012-10-30 11:56:26 +0100678 .channels = orion_xor1_channels_data,
Thomas Petazzonidd2c57b2012-10-30 11:11:36 +0100679};
680
Andrew Lunnee962722011-05-15 13:32:48 +0200681static struct platform_device orion_xor1_shared = {
Thomas Petazzoni0dddee72012-10-30 11:59:42 +0100682 .name = MV_XOR_NAME,
Andrew Lunnee962722011-05-15 13:32:48 +0200683 .id = 1,
Andrew Lunnee962722011-05-15 13:32:48 +0200684 .num_resources = ARRAY_SIZE(orion_xor1_shared_resources),
685 .resource = orion_xor1_shared_resources,
Thomas Petazzonidd2c57b2012-10-30 11:11:36 +0100686 .dev = {
687 .dma_mask = &orion_xor_dmamask,
688 .coherent_dma_mask = DMA_BIT_MASK(64),
689 .platform_data = &orion_xor1_pdata,
Andrew Lunnee962722011-05-15 13:32:48 +0200690 },
691};
692
693void __init orion_xor1_init(unsigned long mapbase_low,
694 unsigned long mapbase_high,
695 unsigned long irq_0,
696 unsigned long irq_1)
697{
698 orion_xor1_shared_resources[0].start = mapbase_low;
699 orion_xor1_shared_resources[0].end = mapbase_low + 0xff;
700 orion_xor1_shared_resources[1].start = mapbase_high;
701 orion_xor1_shared_resources[1].end = mapbase_high + 0xff;
702
Thomas Petazzonidd2c57b2012-10-30 11:11:36 +0100703 orion_xor1_shared_resources[2].start = irq_0;
704 orion_xor1_shared_resources[2].end = irq_0;
705 orion_xor1_shared_resources[3].start = irq_1;
706 orion_xor1_shared_resources[3].end = irq_1;
707
Thomas Petazzonie39f6ec2012-10-30 11:56:26 +0100708 dma_cap_set(DMA_MEMCPY, orion_xor1_channels_data[0].cap_mask);
709 dma_cap_set(DMA_XOR, orion_xor1_channels_data[0].cap_mask);
Thomas Petazzonidd2c57b2012-10-30 11:11:36 +0100710
Thomas Petazzonie39f6ec2012-10-30 11:56:26 +0100711 dma_cap_set(DMA_MEMCPY, orion_xor1_channels_data[1].cap_mask);
712 dma_cap_set(DMA_XOR, orion_xor1_channels_data[1].cap_mask);
Andrew Lunnee962722011-05-15 13:32:48 +0200713
714 platform_device_register(&orion_xor1_shared);
Andrew Lunnee962722011-05-15 13:32:48 +0200715}
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200716
717/*****************************************************************************
718 * EHCI
719 ****************************************************************************/
Andrew Lunn72053352012-02-08 15:52:47 +0100720static struct orion_ehci_data orion_ehci_data;
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200721static u64 ehci_dmamask = DMA_BIT_MASK(32);
722
723
724/*****************************************************************************
725 * EHCI0
726 ****************************************************************************/
727static struct resource orion_ehci_resources[2];
728
729static struct platform_device orion_ehci = {
730 .name = "orion-ehci",
731 .id = 0,
732 .dev = {
733 .dma_mask = &ehci_dmamask,
734 .coherent_dma_mask = DMA_BIT_MASK(32),
735 .platform_data = &orion_ehci_data,
736 },
737};
738
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100739void __init orion_ehci_init(unsigned long mapbase,
Andrew Lunn72053352012-02-08 15:52:47 +0100740 unsigned long irq,
741 enum orion_ehci_phy_ver phy_version)
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200742{
Andrew Lunn72053352012-02-08 15:52:47 +0100743 orion_ehci_data.phy_version = phy_version;
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200744 fill_resources(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1,
745 irq);
746
747 platform_device_register(&orion_ehci);
748}
749
750/*****************************************************************************
751 * EHCI1
752 ****************************************************************************/
753static struct resource orion_ehci_1_resources[2];
754
755static struct platform_device orion_ehci_1 = {
756 .name = "orion-ehci",
757 .id = 1,
758 .dev = {
759 .dma_mask = &ehci_dmamask,
760 .coherent_dma_mask = DMA_BIT_MASK(32),
761 .platform_data = &orion_ehci_data,
762 },
763};
764
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100765void __init orion_ehci_1_init(unsigned long mapbase,
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200766 unsigned long irq)
767{
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200768 fill_resources(&orion_ehci_1, orion_ehci_1_resources,
769 mapbase, SZ_4K - 1, irq);
770
771 platform_device_register(&orion_ehci_1);
772}
773
774/*****************************************************************************
775 * EHCI2
776 ****************************************************************************/
777static struct resource orion_ehci_2_resources[2];
778
779static struct platform_device orion_ehci_2 = {
780 .name = "orion-ehci",
781 .id = 2,
782 .dev = {
783 .dma_mask = &ehci_dmamask,
784 .coherent_dma_mask = DMA_BIT_MASK(32),
785 .platform_data = &orion_ehci_data,
786 },
787};
788
Andrew Lunndb33f4d2011-12-07 21:48:08 +0100789void __init orion_ehci_2_init(unsigned long mapbase,
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200790 unsigned long irq)
791{
Andrew Lunn4fcd3f32011-05-15 13:32:49 +0200792 fill_resources(&orion_ehci_2, orion_ehci_2_resources,
793 mapbase, SZ_4K - 1, irq);
794
795 platform_device_register(&orion_ehci_2);
796}
Andrew Lunn9e613f82011-05-15 13:32:50 +0200797
798/*****************************************************************************
799 * SATA
800 ****************************************************************************/
801static struct resource orion_sata_resources[2] = {
802 {
803 .name = "sata base",
804 }, {
805 .name = "sata irq",
806 },
807};
808
809static struct platform_device orion_sata = {
810 .name = "sata_mv",
811 .id = 0,
812 .dev = {
813 .coherent_dma_mask = DMA_BIT_MASK(32),
814 },
815};
816
817void __init orion_sata_init(struct mv_sata_platform_data *sata_data,
Andrew Lunn9e613f82011-05-15 13:32:50 +0200818 unsigned long mapbase,
819 unsigned long irq)
820{
Andrew Lunn9e613f82011-05-15 13:32:50 +0200821 orion_sata.dev.platform_data = sata_data;
822 fill_resources(&orion_sata, orion_sata_resources,
823 mapbase, 0x5000 - 1, irq);
824
825 platform_device_register(&orion_sata);
826}
827
Andrew Lunn44350062011-05-15 13:32:51 +0200828/*****************************************************************************
829 * Cryptographic Engines and Security Accelerator (CESA)
830 ****************************************************************************/
831static struct resource orion_crypto_resources[] = {
832 {
833 .name = "regs",
834 }, {
835 .name = "crypto interrupt",
836 }, {
837 .name = "sram",
838 .flags = IORESOURCE_MEM,
839 },
840};
Andrew Lunn9e613f82011-05-15 13:32:50 +0200841
Andrew Lunn44350062011-05-15 13:32:51 +0200842static struct platform_device orion_crypto = {
843 .name = "mv_crypto",
844 .id = -1,
845};
846
847void __init orion_crypto_init(unsigned long mapbase,
848 unsigned long srambase,
849 unsigned long sram_size,
850 unsigned long irq)
851{
852 fill_resources(&orion_crypto, orion_crypto_resources,
853 mapbase, 0xffff, irq);
854 orion_crypto.num_resources = 3;
855 orion_crypto_resources[2].start = srambase;
856 orion_crypto_resources[2].end = srambase + sram_size - 1;
857
858 platform_device_register(&orion_crypto);
859}