dmaengine: mmp-pdma support
authorZhangfei Gao <zhangfei.gao@marvell.com>
Mon, 3 Sep 2012 03:03:45 +0000 (11:03 +0800)
committerVinod Koul <vinod.koul@linux.intel.com>
Fri, 14 Sep 2012 02:44:07 +0000 (08:14 +0530)
commitc8acd6aa6bed3c0fd7898202f4ebc534db9085f2
treeb7d7b7b763717844832bf03678d71bf948617778
parentb5f14330590118e6a0659255476c0f24ab681e05
dmaengine: mmp-pdma support

1. virtual channel vs. physical channel
Virtual channel is managed by dmaengine
Physical channel handling resource, such as irq
Physical channel is alloced dynamically as descending priority,
freed immediately when irq done.
The availble highest priority physically channel will alwayes be alloced

Issue pending list -> alloc highest dma physically channel available -> dma done -> free physically channel

2. list: running list & pending list
submit: desc list -> pending list
issue_pending_list: if (IDLE) pending list -> running list; free pending list (RUN)
irq: free running list (IDLE)
     check pendlist -> pending list -> running list; free pending list (RUN)

3. irq:
Each list generate one irq, calling callback
One list may contain several desc chain, in such case, make sure only the last desc list generate irq.

4. async
Submit will add desc chain to pending list, which can be multi-called
If multi desc chain is submitted, only the last desc would generate irq -> call back
If IDLE, issue_pending_list start pending_list, transforming pendlist to running list
If RUN, irq will start pending list

5. test
5.1 pxa3xx_nand on pxa910
5.2 insmod dmatest.ko (threads_per_chan=y)
By default drivers/dma/dmatest.c test every channel and test memcpy with 1 threads per channel

Signed-off-by: Zhangfei Gao <zhangfei.gao@marvell.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
drivers/dma/Kconfig
drivers/dma/Makefile
drivers/dma/mmp_pdma.c [new file with mode: 0644]
include/linux/platform_data/mmp_dma.h [new file with mode: 0644]