diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-13 13:52:27 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-13 13:52:27 -0400 |
commit | e030dbf91a87da7e8be3be3ca781558695bea683 (patch) | |
tree | 4ff2e01621a888be4098ca48c404775e56a55a0d /arch/arm | |
parent | 12a22960549979c10a95cc97f8ec63b461c55692 (diff) | |
parent | 3039f0735a280b54c7364fbfe6a9287f7f0b510a (diff) |
Merge branch 'ioat-md-accel-for-linus' of git://lost.foo-projects.org/~dwillia2/git/iop
* 'ioat-md-accel-for-linus' of git://lost.foo-projects.org/~dwillia2/git/iop: (28 commits)
ioatdma: add the unisys "i/oat" pci vendor/device id
ARM: Add drivers/dma to arch/arm/Kconfig
iop3xx: surface the iop3xx DMA and AAU units to the iop-adma driver
iop13xx: surface the iop13xx adma units to the iop-adma driver
dmaengine: driver for the iop32x, iop33x, and iop13xx raid engines
md: remove raid5 compute_block and compute_parity5
md: handle_stripe5 - request io processing in raid5_run_ops
md: handle_stripe5 - add request/completion logic for async expand ops
md: handle_stripe5 - add request/completion logic for async read ops
md: handle_stripe5 - add request/completion logic for async check ops
md: handle_stripe5 - add request/completion logic for async compute ops
md: handle_stripe5 - add request/completion logic for async write ops
md: common infrastructure for running operations with raid5_run_ops
md: raid5_run_ops - run stripe operations outside sh->lock
raid5: replace custom debug PRINTKs with standard pr_debug
raid5: refactor handle_stripe5 and handle_stripe6 (v3)
async_tx: add the async_tx api
xor: make 'xor_blocks' a library routine for use with async_tx
dmaengine: make clients responsible for managing channels
dmaengine: refactor dmaengine around dma_async_tx_descriptor
...
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/Kconfig | 2 | ||||
-rw-r--r-- | arch/arm/mach-iop13xx/setup.c | 217 | ||||
-rw-r--r-- | arch/arm/mach-iop32x/glantank.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-iop32x/iq31244.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-iop32x/iq80321.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-iop32x/n2100.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-iop33x/iq80331.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-iop33x/iq80332.c | 3 | ||||
-rw-r--r-- | arch/arm/plat-iop/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/plat-iop/adma.c | 209 |
10 files changed, 445 insertions, 3 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index b53e1d4bc486..a44c6da9bf83 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1042,6 +1042,8 @@ source "drivers/mmc/Kconfig" | |||
1042 | 1042 | ||
1043 | source "drivers/rtc/Kconfig" | 1043 | source "drivers/rtc/Kconfig" |
1044 | 1044 | ||
1045 | source "drivers/dma/Kconfig" | ||
1046 | |||
1045 | endmenu | 1047 | endmenu |
1046 | 1048 | ||
1047 | source "fs/Kconfig" | 1049 | source "fs/Kconfig" |
diff --git a/arch/arm/mach-iop13xx/setup.c b/arch/arm/mach-iop13xx/setup.c index bc4871553f6a..bfe0c87e3397 100644 --- a/arch/arm/mach-iop13xx/setup.c +++ b/arch/arm/mach-iop13xx/setup.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <asm/hardware.h> | 25 | #include <asm/hardware.h> |
26 | #include <asm/irq.h> | 26 | #include <asm/irq.h> |
27 | #include <asm/io.h> | 27 | #include <asm/io.h> |
28 | #include <asm/hardware/iop_adma.h> | ||
28 | 29 | ||
29 | #define IOP13XX_UART_XTAL 33334000 | 30 | #define IOP13XX_UART_XTAL 33334000 |
30 | #define IOP13XX_SETUP_DEBUG 0 | 31 | #define IOP13XX_SETUP_DEBUG 0 |
@@ -236,19 +237,143 @@ static unsigned long iq8134x_probe_flash_size(void) | |||
236 | } | 237 | } |
237 | #endif | 238 | #endif |
238 | 239 | ||
240 | /* ADMA Channels */ | ||
241 | static struct resource iop13xx_adma_0_resources[] = { | ||
242 | [0] = { | ||
243 | .start = IOP13XX_ADMA_PHYS_BASE(0), | ||
244 | .end = IOP13XX_ADMA_UPPER_PA(0), | ||
245 | .flags = IORESOURCE_MEM, | ||
246 | }, | ||
247 | [1] = { | ||
248 | .start = IRQ_IOP13XX_ADMA0_EOT, | ||
249 | .end = IRQ_IOP13XX_ADMA0_EOT, | ||
250 | .flags = IORESOURCE_IRQ | ||
251 | }, | ||
252 | [2] = { | ||
253 | .start = IRQ_IOP13XX_ADMA0_EOC, | ||
254 | .end = IRQ_IOP13XX_ADMA0_EOC, | ||
255 | .flags = IORESOURCE_IRQ | ||
256 | }, | ||
257 | [3] = { | ||
258 | .start = IRQ_IOP13XX_ADMA0_ERR, | ||
259 | .end = IRQ_IOP13XX_ADMA0_ERR, | ||
260 | .flags = IORESOURCE_IRQ | ||
261 | } | ||
262 | }; | ||
263 | |||
264 | static struct resource iop13xx_adma_1_resources[] = { | ||
265 | [0] = { | ||
266 | .start = IOP13XX_ADMA_PHYS_BASE(1), | ||
267 | .end = IOP13XX_ADMA_UPPER_PA(1), | ||
268 | .flags = IORESOURCE_MEM, | ||
269 | }, | ||
270 | [1] = { | ||
271 | .start = IRQ_IOP13XX_ADMA1_EOT, | ||
272 | .end = IRQ_IOP13XX_ADMA1_EOT, | ||
273 | .flags = IORESOURCE_IRQ | ||
274 | }, | ||
275 | [2] = { | ||
276 | .start = IRQ_IOP13XX_ADMA1_EOC, | ||
277 | .end = IRQ_IOP13XX_ADMA1_EOC, | ||
278 | .flags = IORESOURCE_IRQ | ||
279 | }, | ||
280 | [3] = { | ||
281 | .start = IRQ_IOP13XX_ADMA1_ERR, | ||
282 | .end = IRQ_IOP13XX_ADMA1_ERR, | ||
283 | .flags = IORESOURCE_IRQ | ||
284 | } | ||
285 | }; | ||
286 | |||
287 | static struct resource iop13xx_adma_2_resources[] = { | ||
288 | [0] = { | ||
289 | .start = IOP13XX_ADMA_PHYS_BASE(2), | ||
290 | .end = IOP13XX_ADMA_UPPER_PA(2), | ||
291 | .flags = IORESOURCE_MEM, | ||
292 | }, | ||
293 | [1] = { | ||
294 | .start = IRQ_IOP13XX_ADMA2_EOT, | ||
295 | .end = IRQ_IOP13XX_ADMA2_EOT, | ||
296 | .flags = IORESOURCE_IRQ | ||
297 | }, | ||
298 | [2] = { | ||
299 | .start = IRQ_IOP13XX_ADMA2_EOC, | ||
300 | .end = IRQ_IOP13XX_ADMA2_EOC, | ||
301 | .flags = IORESOURCE_IRQ | ||
302 | }, | ||
303 | [3] = { | ||
304 | .start = IRQ_IOP13XX_ADMA2_ERR, | ||
305 | .end = IRQ_IOP13XX_ADMA2_ERR, | ||
306 | .flags = IORESOURCE_IRQ | ||
307 | } | ||
308 | }; | ||
309 | |||
310 | static u64 iop13xx_adma_dmamask = DMA_64BIT_MASK; | ||
311 | static struct iop_adma_platform_data iop13xx_adma_0_data = { | ||
312 | .hw_id = 0, | ||
313 | .pool_size = PAGE_SIZE, | ||
314 | }; | ||
315 | |||
316 | static struct iop_adma_platform_data iop13xx_adma_1_data = { | ||
317 | .hw_id = 1, | ||
318 | .pool_size = PAGE_SIZE, | ||
319 | }; | ||
320 | |||
321 | static struct iop_adma_platform_data iop13xx_adma_2_data = { | ||
322 | .hw_id = 2, | ||
323 | .pool_size = PAGE_SIZE, | ||
324 | }; | ||
325 | |||
326 | /* The ids are fixed up later in iop13xx_platform_init */ | ||
327 | static struct platform_device iop13xx_adma_0_channel = { | ||
328 | .name = "iop-adma", | ||
329 | .id = 0, | ||
330 | .num_resources = 4, | ||
331 | .resource = iop13xx_adma_0_resources, | ||
332 | .dev = { | ||
333 | .dma_mask = &iop13xx_adma_dmamask, | ||
334 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
335 | .platform_data = (void *) &iop13xx_adma_0_data, | ||
336 | }, | ||
337 | }; | ||
338 | |||
339 | static struct platform_device iop13xx_adma_1_channel = { | ||
340 | .name = "iop-adma", | ||
341 | .id = 0, | ||
342 | .num_resources = 4, | ||
343 | .resource = iop13xx_adma_1_resources, | ||
344 | .dev = { | ||
345 | .dma_mask = &iop13xx_adma_dmamask, | ||
346 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
347 | .platform_data = (void *) &iop13xx_adma_1_data, | ||
348 | }, | ||
349 | }; | ||
350 | |||
351 | static struct platform_device iop13xx_adma_2_channel = { | ||
352 | .name = "iop-adma", | ||
353 | .id = 0, | ||
354 | .num_resources = 4, | ||
355 | .resource = iop13xx_adma_2_resources, | ||
356 | .dev = { | ||
357 | .dma_mask = &iop13xx_adma_dmamask, | ||
358 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
359 | .platform_data = (void *) &iop13xx_adma_2_data, | ||
360 | }, | ||
361 | }; | ||
362 | |||
239 | void __init iop13xx_map_io(void) | 363 | void __init iop13xx_map_io(void) |
240 | { | 364 | { |
241 | /* Initialize the Static Page Table maps */ | 365 | /* Initialize the Static Page Table maps */ |
242 | iotable_init(iop13xx_std_desc, ARRAY_SIZE(iop13xx_std_desc)); | 366 | iotable_init(iop13xx_std_desc, ARRAY_SIZE(iop13xx_std_desc)); |
243 | } | 367 | } |
244 | 368 | ||
245 | static int init_uart = 0; | 369 | static int init_uart; |
246 | static int init_i2c = 0; | 370 | static int init_i2c; |
371 | static int init_adma; | ||
247 | 372 | ||
248 | void __init iop13xx_platform_init(void) | 373 | void __init iop13xx_platform_init(void) |
249 | { | 374 | { |
250 | int i; | 375 | int i; |
251 | u32 uart_idx, i2c_idx, plat_idx; | 376 | u32 uart_idx, i2c_idx, adma_idx, plat_idx; |
252 | struct platform_device *iop13xx_devices[IQ81340_MAX_PLAT_DEVICES]; | 377 | struct platform_device *iop13xx_devices[IQ81340_MAX_PLAT_DEVICES]; |
253 | 378 | ||
254 | /* set the bases so we can read the device id */ | 379 | /* set the bases so we can read the device id */ |
@@ -294,6 +419,12 @@ void __init iop13xx_platform_init(void) | |||
294 | } | 419 | } |
295 | } | 420 | } |
296 | 421 | ||
422 | if (init_adma == IOP13XX_INIT_ADMA_DEFAULT) { | ||
423 | init_adma |= IOP13XX_INIT_ADMA_0; | ||
424 | init_adma |= IOP13XX_INIT_ADMA_1; | ||
425 | init_adma |= IOP13XX_INIT_ADMA_2; | ||
426 | } | ||
427 | |||
297 | plat_idx = 0; | 428 | plat_idx = 0; |
298 | uart_idx = 0; | 429 | uart_idx = 0; |
299 | i2c_idx = 0; | 430 | i2c_idx = 0; |
@@ -332,6 +463,56 @@ void __init iop13xx_platform_init(void) | |||
332 | } | 463 | } |
333 | } | 464 | } |
334 | 465 | ||
466 | /* initialize adma channel ids and capabilities */ | ||
467 | adma_idx = 0; | ||
468 | for (i = 0; i < IQ81340_NUM_ADMA; i++) { | ||
469 | struct iop_adma_platform_data *plat_data; | ||
470 | if ((init_adma & (1 << i)) && IOP13XX_SETUP_DEBUG) | ||
471 | printk(KERN_INFO | ||
472 | "Adding adma%d to platform device list\n", i); | ||
473 | switch (init_adma & (1 << i)) { | ||
474 | case IOP13XX_INIT_ADMA_0: | ||
475 | iop13xx_adma_0_channel.id = adma_idx++; | ||
476 | iop13xx_devices[plat_idx++] = &iop13xx_adma_0_channel; | ||
477 | plat_data = &iop13xx_adma_0_data; | ||
478 | dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); | ||
479 | dma_cap_set(DMA_XOR, plat_data->cap_mask); | ||
480 | dma_cap_set(DMA_DUAL_XOR, plat_data->cap_mask); | ||
481 | dma_cap_set(DMA_ZERO_SUM, plat_data->cap_mask); | ||
482 | dma_cap_set(DMA_MEMSET, plat_data->cap_mask); | ||
483 | dma_cap_set(DMA_MEMCPY_CRC32C, plat_data->cap_mask); | ||
484 | dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); | ||
485 | break; | ||
486 | case IOP13XX_INIT_ADMA_1: | ||
487 | iop13xx_adma_1_channel.id = adma_idx++; | ||
488 | iop13xx_devices[plat_idx++] = &iop13xx_adma_1_channel; | ||
489 | plat_data = &iop13xx_adma_1_data; | ||
490 | dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); | ||
491 | dma_cap_set(DMA_XOR, plat_data->cap_mask); | ||
492 | dma_cap_set(DMA_DUAL_XOR, plat_data->cap_mask); | ||
493 | dma_cap_set(DMA_ZERO_SUM, plat_data->cap_mask); | ||
494 | dma_cap_set(DMA_MEMSET, plat_data->cap_mask); | ||
495 | dma_cap_set(DMA_MEMCPY_CRC32C, plat_data->cap_mask); | ||
496 | dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); | ||
497 | break; | ||
498 | case IOP13XX_INIT_ADMA_2: | ||
499 | iop13xx_adma_2_channel.id = adma_idx++; | ||
500 | iop13xx_devices[plat_idx++] = &iop13xx_adma_2_channel; | ||
501 | plat_data = &iop13xx_adma_2_data; | ||
502 | dma_cap_set(DMA_MEMCPY, plat_data->cap_mask); | ||
503 | dma_cap_set(DMA_XOR, plat_data->cap_mask); | ||
504 | dma_cap_set(DMA_DUAL_XOR, plat_data->cap_mask); | ||
505 | dma_cap_set(DMA_ZERO_SUM, plat_data->cap_mask); | ||
506 | dma_cap_set(DMA_MEMSET, plat_data->cap_mask); | ||
507 | dma_cap_set(DMA_MEMCPY_CRC32C, plat_data->cap_mask); | ||
508 | dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask); | ||
509 | dma_cap_set(DMA_PQ_XOR, plat_data->cap_mask); | ||
510 | dma_cap_set(DMA_PQ_UPDATE, plat_data->cap_mask); | ||
511 | dma_cap_set(DMA_PQ_ZERO_SUM, plat_data->cap_mask); | ||
512 | break; | ||
513 | } | ||
514 | } | ||
515 | |||
335 | #ifdef CONFIG_MTD_PHYSMAP | 516 | #ifdef CONFIG_MTD_PHYSMAP |
336 | iq8134x_flash_resource.end = iq8134x_flash_resource.start + | 517 | iq8134x_flash_resource.end = iq8134x_flash_resource.start + |
337 | iq8134x_probe_flash_size() - 1; | 518 | iq8134x_probe_flash_size() - 1; |
@@ -399,5 +580,35 @@ static int __init iop13xx_init_i2c_setup(char *str) | |||
399 | return 1; | 580 | return 1; |
400 | } | 581 | } |
401 | 582 | ||
583 | static int __init iop13xx_init_adma_setup(char *str) | ||
584 | { | ||
585 | if (str) { | ||
586 | while (*str != '\0') { | ||
587 | switch (*str) { | ||
588 | case '0': | ||
589 | init_adma |= IOP13XX_INIT_ADMA_0; | ||
590 | break; | ||
591 | case '1': | ||
592 | init_adma |= IOP13XX_INIT_ADMA_1; | ||
593 | break; | ||
594 | case '2': | ||
595 | init_adma |= IOP13XX_INIT_ADMA_2; | ||
596 | break; | ||
597 | case ',': | ||
598 | case '=': | ||
599 | break; | ||
600 | default: | ||
601 | PRINTK("\"iop13xx_init_adma\" malformed" | ||
602 | " at character: \'%c\'", *str); | ||
603 | *(str + 1) = '\0'; | ||
604 | init_adma = IOP13XX_INIT_ADMA_DEFAULT; | ||
605 | } | ||
606 | str++; | ||
607 | } | ||
608 | } | ||
609 | return 1; | ||
610 | } | ||
611 | |||
612 | __setup("iop13xx_init_adma", iop13xx_init_adma_setup); | ||
402 | __setup("iop13xx_init_uart", iop13xx_init_uart_setup); | 613 | __setup("iop13xx_init_uart", iop13xx_init_uart_setup); |
403 | __setup("iop13xx_init_i2c", iop13xx_init_i2c_setup); | 614 | __setup("iop13xx_init_i2c", iop13xx_init_i2c_setup); |
diff --git a/arch/arm/mach-iop32x/glantank.c b/arch/arm/mach-iop32x/glantank.c index 5776fd884115..2b086ab2668c 100644 --- a/arch/arm/mach-iop32x/glantank.c +++ b/arch/arm/mach-iop32x/glantank.c | |||
@@ -180,6 +180,8 @@ static void __init glantank_init_machine(void) | |||
180 | platform_device_register(&iop3xx_i2c1_device); | 180 | platform_device_register(&iop3xx_i2c1_device); |
181 | platform_device_register(&glantank_flash_device); | 181 | platform_device_register(&glantank_flash_device); |
182 | platform_device_register(&glantank_serial_device); | 182 | platform_device_register(&glantank_serial_device); |
183 | platform_device_register(&iop3xx_dma_0_channel); | ||
184 | platform_device_register(&iop3xx_dma_1_channel); | ||
183 | 185 | ||
184 | pm_power_off = glantank_power_off; | 186 | pm_power_off = glantank_power_off; |
185 | } | 187 | } |
diff --git a/arch/arm/mach-iop32x/iq31244.c b/arch/arm/mach-iop32x/iq31244.c index d4eefbea1fe6..98cfa1cd6bdb 100644 --- a/arch/arm/mach-iop32x/iq31244.c +++ b/arch/arm/mach-iop32x/iq31244.c | |||
@@ -298,9 +298,14 @@ static void __init iq31244_init_machine(void) | |||
298 | platform_device_register(&iop3xx_i2c1_device); | 298 | platform_device_register(&iop3xx_i2c1_device); |
299 | platform_device_register(&iq31244_flash_device); | 299 | platform_device_register(&iq31244_flash_device); |
300 | platform_device_register(&iq31244_serial_device); | 300 | platform_device_register(&iq31244_serial_device); |
301 | platform_device_register(&iop3xx_dma_0_channel); | ||
302 | platform_device_register(&iop3xx_dma_1_channel); | ||
301 | 303 | ||
302 | if (is_ep80219()) | 304 | if (is_ep80219()) |
303 | pm_power_off = ep80219_power_off; | 305 | pm_power_off = ep80219_power_off; |
306 | |||
307 | if (!is_80219()) | ||
308 | platform_device_register(&iop3xx_aau_channel); | ||
304 | } | 309 | } |
305 | 310 | ||
306 | static int __init force_ep80219_setup(char *str) | 311 | static int __init force_ep80219_setup(char *str) |
diff --git a/arch/arm/mach-iop32x/iq80321.c b/arch/arm/mach-iop32x/iq80321.c index 8d9f49164a84..18ad29f213b2 100644 --- a/arch/arm/mach-iop32x/iq80321.c +++ b/arch/arm/mach-iop32x/iq80321.c | |||
@@ -181,6 +181,9 @@ static void __init iq80321_init_machine(void) | |||
181 | platform_device_register(&iop3xx_i2c1_device); | 181 | platform_device_register(&iop3xx_i2c1_device); |
182 | platform_device_register(&iq80321_flash_device); | 182 | platform_device_register(&iq80321_flash_device); |
183 | platform_device_register(&iq80321_serial_device); | 183 | platform_device_register(&iq80321_serial_device); |
184 | platform_device_register(&iop3xx_dma_0_channel); | ||
185 | platform_device_register(&iop3xx_dma_1_channel); | ||
186 | platform_device_register(&iop3xx_aau_channel); | ||
184 | } | 187 | } |
185 | 188 | ||
186 | MACHINE_START(IQ80321, "Intel IQ80321") | 189 | MACHINE_START(IQ80321, "Intel IQ80321") |
diff --git a/arch/arm/mach-iop32x/n2100.c b/arch/arm/mach-iop32x/n2100.c index d55005d64781..390a97d39e5a 100644 --- a/arch/arm/mach-iop32x/n2100.c +++ b/arch/arm/mach-iop32x/n2100.c | |||
@@ -245,6 +245,8 @@ static void __init n2100_init_machine(void) | |||
245 | platform_device_register(&iop3xx_i2c0_device); | 245 | platform_device_register(&iop3xx_i2c0_device); |
246 | platform_device_register(&n2100_flash_device); | 246 | platform_device_register(&n2100_flash_device); |
247 | platform_device_register(&n2100_serial_device); | 247 | platform_device_register(&n2100_serial_device); |
248 | platform_device_register(&iop3xx_dma_0_channel); | ||
249 | platform_device_register(&iop3xx_dma_1_channel); | ||
248 | 250 | ||
249 | pm_power_off = n2100_power_off; | 251 | pm_power_off = n2100_power_off; |
250 | 252 | ||
diff --git a/arch/arm/mach-iop33x/iq80331.c b/arch/arm/mach-iop33x/iq80331.c index 2b063180687a..433188ebff2a 100644 --- a/arch/arm/mach-iop33x/iq80331.c +++ b/arch/arm/mach-iop33x/iq80331.c | |||
@@ -136,6 +136,9 @@ static void __init iq80331_init_machine(void) | |||
136 | platform_device_register(&iop33x_uart0_device); | 136 | platform_device_register(&iop33x_uart0_device); |
137 | platform_device_register(&iop33x_uart1_device); | 137 | platform_device_register(&iop33x_uart1_device); |
138 | platform_device_register(&iq80331_flash_device); | 138 | platform_device_register(&iq80331_flash_device); |
139 | platform_device_register(&iop3xx_dma_0_channel); | ||
140 | platform_device_register(&iop3xx_dma_1_channel); | ||
141 | platform_device_register(&iop3xx_aau_channel); | ||
139 | } | 142 | } |
140 | 143 | ||
141 | MACHINE_START(IQ80331, "Intel IQ80331") | 144 | MACHINE_START(IQ80331, "Intel IQ80331") |
diff --git a/arch/arm/mach-iop33x/iq80332.c b/arch/arm/mach-iop33x/iq80332.c index 7889ce3cb08e..416c09564cc6 100644 --- a/arch/arm/mach-iop33x/iq80332.c +++ b/arch/arm/mach-iop33x/iq80332.c | |||
@@ -136,6 +136,9 @@ static void __init iq80332_init_machine(void) | |||
136 | platform_device_register(&iop33x_uart0_device); | 136 | platform_device_register(&iop33x_uart0_device); |
137 | platform_device_register(&iop33x_uart1_device); | 137 | platform_device_register(&iop33x_uart1_device); |
138 | platform_device_register(&iq80332_flash_device); | 138 | platform_device_register(&iq80332_flash_device); |
139 | platform_device_register(&iop3xx_dma_0_channel); | ||
140 | platform_device_register(&iop3xx_dma_1_channel); | ||
141 | platform_device_register(&iop3xx_aau_channel); | ||
139 | } | 142 | } |
140 | 143 | ||
141 | MACHINE_START(IQ80332, "Intel IQ80332") | 144 | MACHINE_START(IQ80332, "Intel IQ80332") |
diff --git a/arch/arm/plat-iop/Makefile b/arch/arm/plat-iop/Makefile index 4d2b1da3cd82..36bff0325959 100644 --- a/arch/arm/plat-iop/Makefile +++ b/arch/arm/plat-iop/Makefile | |||
@@ -12,6 +12,7 @@ obj-$(CONFIG_ARCH_IOP32X) += setup.o | |||
12 | obj-$(CONFIG_ARCH_IOP32X) += time.o | 12 | obj-$(CONFIG_ARCH_IOP32X) += time.o |
13 | obj-$(CONFIG_ARCH_IOP32X) += io.o | 13 | obj-$(CONFIG_ARCH_IOP32X) += io.o |
14 | obj-$(CONFIG_ARCH_IOP32X) += cp6.o | 14 | obj-$(CONFIG_ARCH_IOP32X) += cp6.o |
15 | obj-$(CONFIG_ARCH_IOP32X) += adma.o | ||
15 | 16 | ||
16 | # IOP33X | 17 | # IOP33X |
17 | obj-$(CONFIG_ARCH_IOP33X) += gpio.o | 18 | obj-$(CONFIG_ARCH_IOP33X) += gpio.o |
@@ -21,6 +22,7 @@ obj-$(CONFIG_ARCH_IOP33X) += setup.o | |||
21 | obj-$(CONFIG_ARCH_IOP33X) += time.o | 22 | obj-$(CONFIG_ARCH_IOP33X) += time.o |
22 | obj-$(CONFIG_ARCH_IOP33X) += io.o | 23 | obj-$(CONFIG_ARCH_IOP33X) += io.o |
23 | obj-$(CONFIG_ARCH_IOP33X) += cp6.o | 24 | obj-$(CONFIG_ARCH_IOP33X) += cp6.o |
25 | obj-$(CONFIG_ARCH_IOP33X) += adma.o | ||
24 | 26 | ||
25 | # IOP13XX | 27 | # IOP13XX |
26 | obj-$(CONFIG_ARCH_IOP13XX) += cp6.o | 28 | obj-$(CONFIG_ARCH_IOP13XX) += cp6.o |
diff --git a/arch/arm/plat-iop/adma.c b/arch/arm/plat-iop/adma.c new file mode 100644 index 000000000000..53c5e9a52eb1 --- /dev/null +++ b/arch/arm/plat-iop/adma.c | |||
@@ -0,0 +1,209 @@ | |||
1 | /* | ||
2 | * platform device definitions for the iop3xx dma/xor engines | ||
3 | * Copyright © 2006, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
17 | * | ||
18 | */ | ||
19 | #include <linux/platform_device.h> | ||
20 | #include <asm/hardware/iop3xx.h> | ||
21 | #include <linux/dma-mapping.h> | ||
22 | #include <asm/arch/adma.h> | ||
23 | #include <asm/hardware/iop_adma.h> | ||
24 | |||
25 | #ifdef CONFIG_ARCH_IOP32X | ||
26 | #define IRQ_DMA0_EOT IRQ_IOP32X_DMA0_EOT | ||
27 | #define IRQ_DMA0_EOC IRQ_IOP32X_DMA0_EOC | ||
28 | #define IRQ_DMA0_ERR IRQ_IOP32X_DMA0_ERR | ||
29 | |||
30 | #define IRQ_DMA1_EOT IRQ_IOP32X_DMA1_EOT | ||
31 | #define IRQ_DMA1_EOC IRQ_IOP32X_DMA1_EOC | ||
32 | #define IRQ_DMA1_ERR IRQ_IOP32X_DMA1_ERR | ||
33 | |||
34 | #define IRQ_AA_EOT IRQ_IOP32X_AA_EOT | ||
35 | #define IRQ_AA_EOC IRQ_IOP32X_AA_EOC | ||
36 | #define IRQ_AA_ERR IRQ_IOP32X_AA_ERR | ||
37 | #endif | ||
38 | #ifdef CONFIG_ARCH_IOP33X | ||
39 | #define IRQ_DMA0_EOT IRQ_IOP33X_DMA0_EOT | ||
40 | #define IRQ_DMA0_EOC IRQ_IOP33X_DMA0_EOC | ||
41 | #define IRQ_DMA0_ERR IRQ_IOP33X_DMA0_ERR | ||
42 | |||
43 | #define IRQ_DMA1_EOT IRQ_IOP33X_DMA1_EOT | ||
44 | #define IRQ_DMA1_EOC IRQ_IOP33X_DMA1_EOC | ||
45 | #define IRQ_DMA1_ERR IRQ_IOP33X_DMA1_ERR | ||
46 | |||
47 | #define IRQ_AA_EOT IRQ_IOP33X_AA_EOT | ||
48 | #define IRQ_AA_EOC IRQ_IOP33X_AA_EOC | ||
49 | #define IRQ_AA_ERR IRQ_IOP33X_AA_ERR | ||
50 | #endif | ||
51 | /* AAU and DMA Channels */ | ||
52 | static struct resource iop3xx_dma_0_resources[] = { | ||
53 | [0] = { | ||
54 | .start = IOP3XX_DMA_PHYS_BASE(0), | ||
55 | .end = IOP3XX_DMA_UPPER_PA(0), | ||
56 | .flags = IORESOURCE_MEM, | ||
57 | }, | ||
58 | [1] = { | ||
59 | .start = IRQ_DMA0_EOT, | ||
60 | .end = IRQ_DMA0_EOT, | ||
61 | .flags = IORESOURCE_IRQ | ||
62 | }, | ||
63 | [2] = { | ||
64 | .start = IRQ_DMA0_EOC, | ||
65 | .end = IRQ_DMA0_EOC, | ||
66 | .flags = IORESOURCE_IRQ | ||
67 | }, | ||
68 | [3] = { | ||
69 | .start = IRQ_DMA0_ERR, | ||
70 | .end = IRQ_DMA0_ERR, | ||
71 | .flags = IORESOURCE_IRQ | ||
72 | } | ||
73 | }; | ||
74 | |||
75 | static struct resource iop3xx_dma_1_resources[] = { | ||
76 | [0] = { | ||
77 | .start = IOP3XX_DMA_PHYS_BASE(1), | ||
78 | .end = IOP3XX_DMA_UPPER_PA(1), | ||
79 | .flags = IORESOURCE_MEM, | ||
80 | }, | ||
81 | [1] = { | ||
82 | .start = IRQ_DMA1_EOT, | ||
83 | .end = IRQ_DMA1_EOT, | ||
84 | .flags = IORESOURCE_IRQ | ||
85 | }, | ||
86 | [2] = { | ||
87 | .start = IRQ_DMA1_EOC, | ||
88 | .end = IRQ_DMA1_EOC, | ||
89 | .flags = IORESOURCE_IRQ | ||
90 | }, | ||
91 | [3] = { | ||
92 | .start = IRQ_DMA1_ERR, | ||
93 | .end = IRQ_DMA1_ERR, | ||
94 | .flags = IORESOURCE_IRQ | ||
95 | } | ||
96 | }; | ||
97 | |||
98 | |||
99 | static struct resource iop3xx_aau_resources[] = { | ||
100 | [0] = { | ||
101 | .start = IOP3XX_AAU_PHYS_BASE, | ||
102 | .end = IOP3XX_AAU_UPPER_PA, | ||
103 | .flags = IORESOURCE_MEM, | ||
104 | }, | ||
105 | [1] = { | ||
106 | .start = IRQ_AA_EOT, | ||
107 | .end = IRQ_AA_EOT, | ||
108 | .flags = IORESOURCE_IRQ | ||
109 | }, | ||
110 | [2] = { | ||
111 | .start = IRQ_AA_EOC, | ||
112 | .end = IRQ_AA_EOC, | ||
113 | .flags = IORESOURCE_IRQ | ||
114 | }, | ||
115 | [3] = { | ||
116 | .start = IRQ_AA_ERR, | ||
117 | .end = IRQ_AA_ERR, | ||
118 | .flags = IORESOURCE_IRQ | ||
119 | } | ||
120 | }; | ||
121 | |||
122 | static u64 iop3xx_adma_dmamask = DMA_32BIT_MASK; | ||
123 | |||
124 | static struct iop_adma_platform_data iop3xx_dma_0_data = { | ||
125 | .hw_id = DMA0_ID, | ||
126 | .pool_size = PAGE_SIZE, | ||
127 | }; | ||
128 | |||
129 | static struct iop_adma_platform_data iop3xx_dma_1_data = { | ||
130 | .hw_id = DMA1_ID, | ||
131 | .pool_size = PAGE_SIZE, | ||
132 | }; | ||
133 | |||
134 | static struct iop_adma_platform_data iop3xx_aau_data = { | ||
135 | .hw_id = AAU_ID, | ||
136 | .pool_size = 3 * PAGE_SIZE, | ||
137 | }; | ||
138 | |||
139 | struct platform_device iop3xx_dma_0_channel = { | ||
140 | .name = "iop-adma", | ||
141 | .id = 0, | ||
142 | .num_resources = 4, | ||
143 | .resource = iop3xx_dma_0_resources, | ||
144 | .dev = { | ||
145 | .dma_mask = &iop3xx_adma_dmamask, | ||
146 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
147 | .platform_data = (void *) &iop3xx_dma_0_data, | ||
148 | }, | ||
149 | }; | ||
150 | |||
151 | struct platform_device iop3xx_dma_1_channel = { | ||
152 | .name = "iop-adma", | ||
153 | .id = 1, | ||
154 | .num_resources = 4, | ||
155 | .resource = iop3xx_dma_1_resources, | ||
156 | .dev = { | ||
157 | .dma_mask = &iop3xx_adma_dmamask, | ||
158 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
159 | .platform_data = (void *) &iop3xx_dma_1_data, | ||
160 | }, | ||
161 | }; | ||
162 | |||
163 | struct platform_device iop3xx_aau_channel = { | ||
164 | .name = "iop-adma", | ||
165 | .id = 2, | ||
166 | .num_resources = 4, | ||
167 | .resource = iop3xx_aau_resources, | ||
168 | .dev = { | ||
169 | .dma_mask = &iop3xx_adma_dmamask, | ||
170 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
171 | .platform_data = (void *) &iop3xx_aau_data, | ||
172 | }, | ||
173 | }; | ||
174 | |||
175 | static int __init iop3xx_adma_cap_init(void) | ||
176 | { | ||
177 | #ifdef CONFIG_ARCH_IOP32X /* the 32x DMA does not perform CRC32C */ | ||
178 | dma_cap_set(DMA_MEMCPY, iop3xx_dma_0_data.cap_mask); | ||
179 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask); | ||
180 | #else | ||
181 | dma_cap_set(DMA_MEMCPY, iop3xx_dma_0_data.cap_mask); | ||
182 | dma_cap_set(DMA_MEMCPY_CRC32C, iop3xx_dma_0_data.cap_mask); | ||
183 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask); | ||
184 | #endif | ||
185 | |||
186 | #ifdef CONFIG_ARCH_IOP32X /* the 32x DMA does not perform CRC32C */ | ||
187 | dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask); | ||
188 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask); | ||
189 | #else | ||
190 | dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask); | ||
191 | dma_cap_set(DMA_MEMCPY_CRC32C, iop3xx_dma_1_data.cap_mask); | ||
192 | dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask); | ||
193 | #endif | ||
194 | |||
195 | #ifdef CONFIG_ARCH_IOP32X /* the 32x AAU does not perform zero sum */ | ||
196 | dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask); | ||
197 | dma_cap_set(DMA_MEMSET, iop3xx_aau_data.cap_mask); | ||
198 | dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask); | ||
199 | #else | ||
200 | dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask); | ||
201 | dma_cap_set(DMA_ZERO_SUM, iop3xx_aau_data.cap_mask); | ||
202 | dma_cap_set(DMA_MEMSET, iop3xx_aau_data.cap_mask); | ||
203 | dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask); | ||
204 | #endif | ||
205 | |||
206 | return 0; | ||
207 | } | ||
208 | |||
209 | arch_initcall(iop3xx_adma_cap_init); | ||