[RFC 7/7][PATCH] AMBA DMA: Patch to implement AMBA DMA for the Versatile AACI.
From: Peter Pearse
Date: Mon Oct 30 2006 - 07:06:45 EST
Provides an example of use.
This patches completes the implementation of the example -
Audio playback via DMA on the Versatile board, which has an AMBA bus,
with an AMBA PL080 DMA controller and an AMBA PL041 Advanced Audio
Codec Interface.
Signed-off-by: Peter M Pearse <peter.pearse@xxxxxxx>
---
diff -purN arm_amba_aaci/arch/arm/mach-versatile/Makefile
arm_amba_dma_versatile/arch/arm/mach-versatile/Makefile
--- arm_amba_aaci/arch/arm/mach-versatile/Makefile 2006-10-17
13:28:39.000000000 +0100
+++ arm_amba_dma_versatile/arch/arm/mach-versatile/Makefile 2006-10-18
08:41:54.000000000 +0100
@@ -6,3 +6,4 @@ obj-y := core.o clock.o
obj-$(CONFIG_ARCH_VERSATILE_PB) += versatile_pb.o
obj-$(CONFIG_MACH_VERSATILE_AB) += versatile_ab.o
obj-$(CONFIG_PCI) += pci.o
+obj-$(CONFIG_ARM_AMBA_DMA) += dma.o
diff -purN arm_amba_aaci/arch/arm/mach-versatile/core.c
arm_amba_dma_versatile/arch/arm/mach-versatile/core.c
--- arm_amba_aaci/arch/arm/mach-versatile/core.c 2006-10-17
13:28:39.000000000 +0100
+++ arm_amba_dma_versatile/arch/arm/mach-versatile/core.c 2006-10-18
08:41:54.000000000 +0100
@@ -47,13 +47,17 @@
#include "core.h"
#include "clock.h"
+#ifdef CONFIG_ARM_AMBA_DMA
+# include "dma.h"
+#endif
+
+
/*
* All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx
* is the (PA >> 12).
*
* Setup a VA for the Versatile Vectored Interrupt Controller.
*/
-#define __io_address(n) __io(IO_ADDRESS(n))
#define VA_VIC_BASE __io_address(VERSATILE_VIC_BASE)
#define VA_SIC_BASE __io_address(VERSATILE_SIC_BASE)
@@ -704,7 +708,21 @@ AMBA_DEVICE(uart1, "dev:f2", UART1,
AMBA_DEVICE(uart2, "dev:f3", UART2, NULL);
AMBA_DEVICE(ssp0, "dev:f4", SSP, NULL);
-static struct amba_device *amba_devs[] __initdata = {
+
+
+/*
+ * These devices are common to Versatile AB && PB
+ */
+static struct amba_device *amba_devs[]
+
+#ifdef CONFIG_ARM_AMBA_DMA
+/*
+ * Do not discard - used by AMBA DMA code
+ */
+__initdata =
+#endif
+
+{
&dmac_device,
&uart0_device,
&uart1_device,
@@ -771,6 +789,16 @@ void __init versatile_init(void)
platform_device_register(&versatile_flash_device);
platform_device_register(&smc91x_device);
+#ifdef CONFIG_ARM_AMBA_DMA
+ /*
+ * Register structure with device
+ * for later use by DMAC controller
+ */
+ dmac_device.dmac_ops = &dmac_ops;
+#endif
+
+
+
for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
struct amba_device *d = amba_devs[i];
amba_device_register(d, &iomem_resource);
diff -purN arm_amba_aaci/arch/arm/mach-versatile/core.h
arm_amba_dma_versatile/arch/arm/mach-versatile/core.h
--- arm_amba_aaci/arch/arm/mach-versatile/core.h 2006-10-17
13:28:39.000000000 +0100
+++ arm_amba_dma_versatile/arch/arm/mach-versatile/core.h 2006-10-18
08:41:54.000000000 +0100
@@ -30,6 +30,12 @@ extern void __init versatile_map_io(void
extern struct sys_timer versatile_timer;
extern unsigned int mmc_status(struct device *dev);
+/*
+ * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx
+ * is the (PA >> 12).
+ */
+#define __io_address(n) __io(IO_ADDRESS(n))
+
#define AMBA_DEVICE(name,busid,base,plat) \
static struct amba_device name##_device = { \
.dev = { \
@@ -44,7 +50,6 @@ static struct amba_device name##_device
}, \
.dma_mask = ~0, \
.irq = base##_IRQ, \
- /* .dma = base##_DMA,*/ \
}
#endif
diff -purN arm_amba_aaci/arch/arm/mach-versatile/versatile_ab.c
arm_amba_dma_versatile/arch/arm/mach-versatile/versatile_ab.c
--- arm_amba_aaci/arch/arm/mach-versatile/versatile_ab.c 2006-10-17
13:28:39.000000000 +0100
+++ arm_amba_dma_versatile/arch/arm/mach-versatile/versatile_ab.c
2006-10-18 08:41:54.000000000 +0100
@@ -43,3 +43,138 @@ MACHINE_START(VERSATILE_AB, "ARM-Versati
.timer = &versatile_timer,
.init_machine = versatile_init,
MACHINE_END
+
+#ifdef CONFIG_ARM_AMBA_DMA
+
+# include "dma.h"
+# include <sound/driver.h>
+# include <sound/core.h>
+# include <sound/initval.h>
+# include <sound/ac97_codec.h>
+# include <sound/pcm.h>
+# include <sound/pcm_params.h>
+# include <linux/amba/pl080.h>
+
+extern setting settings[];
+
+/*
+ * Configure the board && the dma controller channel for the requesting
peripheral
+ * as far as possible when the actual transfer
+ * (source address, size, dest address, etc.) is not known
+ *
+ * Versatile AB :
+ *
+ * DMA Peripheral
+ *
+ * 15 UART0 Tx
+ * 14 UART0 Rx
+ * 13 UART1 Tx
+ * 12 UART1 Rx
+ * 11 UART2 Tx
+ * 10 UART2 Rx
+ * 9 SSP Tx
+ * 8 SSP Rx
+ * 7 SCI Tx
+ * 6 SCI Rx
+ *
+ * 5-3 Unused
+ *
+ * FPGA peripherals using DMA channels 0,1,2
+ *
+ * 2 MMCI
+ * 1 AACI Tx
+ * 0 AACI Rx
+ *
+ * Return 1 for success
+ *
+ */
+int versatileab_dma_configure(dmach_t chan_num, dma_t * chan_data, struct
amba_device * client){
+ int retval = 0;
+
+ /* Switch by client AMBA device part number*/
+ switch(amba_part(client)) {
+ case AMBA_PERIPHID_AACI_97:
+ /*
+ * Only DMA channel 1 can be used for AACI DMA TX
+ */
+ switch(chan_num){
+ case 1:
+
((pl080_extra_ops*)dmac_ops.extra_ops)->configure_chan(chan_num,
&client->dma_data);
+ retval = 1;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ printk(KERN_ERR
"mach-versatile/dma.c::versatile_dma_configure() Unexpected device %p,
periphid part number 0x%03x\n", client, amba_part(client));
+ }
+ return retval;
+}
+
+/*
+ * Complete the setup of the transfer now all the data are known
+ */
+int versatileab_dma_transfer_setup(dmach_t chan_num, dma_t * chan_data,
struct amba_device * client){
+ pl080_lli setting;
+
+ unsigned int ccfg = 0;
+ dma_addr_t cllis = 0;
+ int retval = 0;
+ unsigned int periph_index = 0;
+
+ switch(amba_part(client)) {
+ case AMBA_PERIPHID_AACI_97:
+ {
+ // TODO:: RX DMA
+ while(amba_part(client) != settings[periph_index].periphid){
+ periph_index++;
+ }
+ ccfg = settings[periph_index].cfg;
+ /* Destination is the FIFO read/write register */
+ setting.dest = VERSATILE_AACI_BASE + (unsigned
int)client->dma_data.dmac_data;
+ setting.cword = settings[periph_index].ctl;
+
+ /*
+ * Construct the LLIs
+ */
+ // TODO:: determine whether the bus address needs the bus
distinguishing bit set
+ // - hard code the 1 for now
+ setting.next = 1;
+ cllis =
((pl080_extra_ops*)dmac_ops.extra_ops)->make_llis(chan_num,
chan_data->buf.dma_address, chan_data->count ,client->dma_data.packet_size,
&setting);
+
+ if(cllis) {
+ retval = 1;
+ } else {
+ printk(KERN_ERR
"mach-versatile/dma.c::versatile_dma_transfer_setup() No memory for
LLIs\n");
+ }
+ }
+ break;
+
+ default:
+ printk(KERN_ERR
"mach-versatile/dma.c::versatile_dma_transfer_setup() - Unexpected device
%p, periphid part number 0x%03x\n", client, amba_part(client));
+ return 0;
+ break;
+ }
+
+ if(retval)
+
((pl080_extra_ops*)dmac_ops.extra_ops)->transfer_configure(chan_num,
&setting, ccfg);
+
+ return retval;
+}
+
+static int __init versatile_ab_init(void)
+{
+ if (machine_is_versatile_ab()) {
+ vops.versatile_dma_configure = versatileab_dma_configure ;
+ vops.versatile_dma_transfer_setup =
versatileab_dma_transfer_setup;
+ }
+ return 0;
+}
+
+arch_initcall(versatile_ab_init);
+
+#endif /* CONFIG_ARM_AMBA_DMA */
+
+
diff -purN arm_amba_aaci/arch/arm/mach-versatile/versatile_pb.c
arm_amba_dma_versatile/arch/arm/mach-versatile/versatile_pb.c
--- arm_amba_aaci/arch/arm/mach-versatile/versatile_pb.c 2006-10-17
13:28:39.000000000 +0100
+++ arm_amba_dma_versatile/arch/arm/mach-versatile/versatile_pb.c
2006-10-18 08:41:54.000000000 +0100
@@ -81,6 +81,159 @@ static struct amba_device *amba_devs[] _
&mmc1_device,
};
+#ifdef CONFIG_ARM_AMBA_DMA
+# include "dma.h"
+# include <sound/driver.h>
+# include <sound/core.h>
+# include <sound/initval.h>
+# include <sound/ac97_codec.h>
+# include <sound/pcm.h>
+# include <sound/pcm_params.h>
+# include <linux/amba/pl080.h>
+
+extern setting settings[];
+
+/*
+ * Configure the board && the dma controller channel for the requesting
peripheral
+ * as far as possible when the actual transfer
+ * (source address, size, dest address, etc.) is not known
+ *
+ * Versatile PB :
+ *
+ * Other possible assignments:
+ * DMA Peripheral
+ *
+ * 15 UART0 Tx
+ * 14 UART0 Rx
+ * 13 UART1 Tx
+ * 12 UART1 Rx
+ * 11 UART2 Tx
+ * 10 UART2 Rx
+ * 9 SSP Tx
+ * 8 SSP Rx
+ * 7 SCI Tx
+ * 6 SCI Rx
+ *
+ * 5-3 I/O device in RealView Logic Tile
+ *
+ * 2-0 I/O device in RealView Logic Tile or FPGA
+ *
+ * FPGA peripherals using DMA channels 0,1,2
+ *
+ * AACI Tx
+ * AACI Rx
+ * USB A
+ * USB B
+ * MCI 0
+ * MCI 1
+ * UART3 Tx
+ * UART3 Rx
+ * SCI0 int A
+ * SCI0 int B
+ *
+ * Return 1 for success
+ *
+ */
+int versatilepb_dma_configure(dmach_t chan_num, dma_t * chan_data, struct
amba_device * client){
+ int retval = 0;
+
+ /*
+ * Versatile DMA mapping register for assigned DMA channel
+ */
+ void __iomem **map_base = __io_address(VERSATILE_SYS_BASE) +
VERSATILE_SYS_DMAPSR0_OFFSET + (chan_num * 4);
+
+ struct amba_dma_data * data = &client->dma_data;
+
+ /* Switch by client AMBA device part number*/
+ switch(amba_part(client)) {
+ case AMBA_PERIPHID_AACI_97:
+ /*
+ * Only DMA channels 0,1,2 can be used for AACI DMA
+ */
+ switch(chan_num){
+ case 0:
+ case 1:
+ case 2:
+ /*
+ * Set V/PB DMA mapping register to connect
+ * AACI Tx DMAC request signals to DMAC peripheral
#0 request lines
+ *
+ * ASSUMES Tx
+ * TODO:: Distinguish Tx/Rx
+ */
+ writel(
+ // [31:8] Reserved
+ (1 << 7) | // 1 = Enable this mapping
+ // [6:5] Reserved
+ (0 << 0) // 0b00000 = AACI Tx
+ , &map_base[chan_num]);
+
+
((pl080_extra_ops*)dmac_ops.extra_ops)->configure_chan(chan_num, data);
+ retval = 1;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ printk(KERN_ERR
"mach-versatile/dma.c::versatile_dma_configure() Unexpected device %p,
periphid part number 0x%03x\n", client, amba_part(client));
+ }
+ return retval;
+}
+
+/*
+ * Complete the setup of the transfer now all the data are known
+ */
+int versatilepb_dma_transfer_setup(dmach_t chan_num, dma_t * chan_data,
struct amba_device * client){
+ pl080_lli setting;
+
+ unsigned int ccfg = 0;
+ dma_addr_t cllis = 0;
+ int retval = 0;
+ unsigned int periph_index = 0;
+
+ switch(amba_part(client)) {
+ case AMBA_PERIPHID_AACI_97:
+ {
+ while(amba_part(client) != settings[periph_index].periphid){
+ periph_index++;
+ }
+ ccfg = settings[periph_index].cfg;
+ /* Destination is the FIFO read/write register */
+ setting.dest = VERSATILE_AACI_BASE + (unsigned
int)client->dma_data.dmac_data;
+ setting.cword = settings[periph_index].ctl;
+
+ /*
+ * Construct the LLIs
+ */
+ // TODO:: determine whether the bus address needs the bus
distinguishing bit set
+ // - hard code the 1 for now
+ setting.next = 1;
+ cllis =
((pl080_extra_ops*)dmac_ops.extra_ops)->make_llis(chan_num,
chan_data->buf.dma_address, chan_data->count ,client->dma_data.packet_size,
&setting);
+
+ if(cllis) {
+ retval = 1;
+ } else {
+ printk(KERN_ERR
"mach-versatile/dma.c::versatile_dma_transfer_setup() No memory for
LLIs\n");
+ }
+ }
+ break;
+
+ default:
+ printk(KERN_ERR
"mach-versatile/dma.c::versatile_dma_transfer_setup() - Unexpected device
%p, periphid part number 0x%03x\n", client, amba_part(client));
+ return 0;
+ break;
+ }
+
+ if(retval)
+
((pl080_extra_ops*)dmac_ops.extra_ops)->transfer_configure(chan_num,
&setting, ccfg);
+
+ return retval;
+}
+
+#endif
+
static int __init versatile_pb_init(void)
{
int i;
@@ -90,6 +243,29 @@ static int __init versatile_pb_init(void
struct amba_device *d = amba_devs[i];
amba_device_register(d, &iomem_resource);
}
+
+#ifdef CONFIG_ARM_AMBA_DMA
+ {
+ volatile unsigned int r;
+ /*
+ * Initial disposition of the DMA select signals
+ * - later a contention mechanism must be implemented to
allow
+ * apps/drivers of the 10 FPGA sources to contend for the
3 lines
+ */
+ /* AACI TX is line 0 */
+ r = readl(VA_SYS_BASE + VERSATILE_SYS_DMAPSR0_OFFSET);
+ mb();
+ r &= VSYSMASK_DMAPSR;
+ r |= VSYS_VAL_DMAPSR_AACI_TX;
+ r |= VSYS_VAL_DMAPSR_ENABLE;
+ writel(r, VA_SYS_BASE + VERSATILE_SYS_DMAPSR0_OFFSET);
+ mb();
+
+ vops.versatile_dma_configure =
versatilepb_dma_configure ;
+ vops.versatile_dma_transfer_setup =
versatilepb_dma_transfer_setup;
+ }
+#endif
+
}
return 0;
diff -purN arm_amba_aaci/drivers/amba/Kconfig
arm_amba_dma_versatile/drivers/amba/Kconfig
--- arm_amba_aaci/drivers/amba/Kconfig 2006-10-17 17:14:20.000000000 +0100
+++ arm_amba_dma_versatile/drivers/amba/Kconfig 2006-10-18
08:41:54.000000000 +0100
@@ -48,4 +48,6 @@ config ARM_AMBA_DMA
select ISA_DMA_API
---help---
Select to build ARM AMBA DMA support into the kernel.
+ A suitable AMBA DMA controller driver may need to be selected as
well
+ e.g. for Versatile the PL080 DMAC driver.
diff -purN arm_amba_aaci/drivers/amba/dma.c
arm_amba_dma_versatile/drivers/amba/dma.c
--- arm_amba_aaci/drivers/amba/dma.c 2006-10-18 08:33:41.000000000 +0100
+++ arm_amba_dma_versatile/drivers/amba/dma.c 2006-10-18
08:41:54.000000000 +0100
@@ -36,8 +36,11 @@ void amba_set_ops(struct dma_ops * ops){
}
/* Allow access to the DMA channel data held in arch/arm/kernel/dma.c */
+extern void board_dma_init(dma_t *dma);
void __init arch_dma_init(dma_t *dma){
chans = dma;
+
+ board_dma_init(dma);
}
dma_t * amba_get_chans(void){
diff -purN arm_amba_aaci/drivers/amba/pl080.c
arm_amba_dma_versatile/drivers/amba/pl080.c
--- arm_amba_aaci/drivers/amba/pl080.c 2006-10-18 08:33:41.000000000 +0100
+++ arm_amba_dma_versatile/drivers/amba/pl080.c 2006-10-18
08:41:54.000000000 +0100
@@ -337,6 +337,7 @@ int pl080_init_dma(dma_t * dma_chan, str
/* PL080 specific */
ops->extra_ops = &pl080_ops;
+ /* Store a pointer to the structure to allow ops to be
removed at exit */
pl080_driver.dmac_ops = ops;
retval = amba_init_dma(dma_chan);
@@ -360,7 +361,6 @@ static void pl080_close_dma(void){
static int __devexit pl080_remove(struct amba_device *dev)
{
int retval = -EINVAL;
- pl080_close_dma();
if(pl080.pool){
dma_pool_destroy(pl080.pool);
pl080.pool = NULL;
@@ -391,7 +391,8 @@ static int __init pl080_init(void)
*/
static void __exit pl080_exit(void)
{
- amba_driver_unregister(&pl080_driver);
+ pl080_close_dma();
+ amba_driver_unregister(&pl080_driver); /* Causes remove() to be
called */
}
/*
diff -purN arm_amba_aaci/include/asm-arm/arch-versatile/dma.h
arm_amba_dma_versatile/include/asm-arm/arch-versatile/dma.h
--- arm_amba_aaci/include/asm-arm/arch-versatile/dma.h 2006-10-17
17:14:06.000000000 +0100
+++ arm_amba_dma_versatile/include/asm-arm/arch-versatile/dma.h 2006-10-18
08:41:54.000000000 +0100
@@ -18,4 +18,14 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
*/
-#define MAX_DMA_CHANNELS 0
+#ifndef __ASM_ARCH_DMA_H
+#define __ASM_ARCH_DMA_H
+
+# define MAX_DMA_ADDRESS 0xffffffff
+# ifdef CONFIG_ARM_AMBA_DMA
+# define MAX_DMA_CHANNELS 8
+# else
+# define MAX_DMA_CHANNELS 0
+# endif
+
+#endif /* _ASM_ARCH_DMA_H */
diff -purN arm_amba_aaci/include/asm-arm/arch-versatile/hardware.h
arm_amba_dma_versatile/include/asm-arm/arch-versatile/hardware.h
--- arm_amba_aaci/include/asm-arm/arch-versatile/hardware.h 2006-10-17
13:29:29.000000000 +0100
+++ arm_amba_dma_versatile/include/asm-arm/arch-versatile/hardware.h
2006-10-18 08:41:54.000000000 +0100
@@ -49,4 +49,78 @@
/* macro to get at IO space when running virtually */
#define IO_ADDRESS(x) (((x) & 0x0fffffff) + (((x) >> 4) &
0x0f000000) + 0xf0000000)
+#ifdef CONFIG_ARM_AMBA_DMA
+
+/* DMA defines for AACI/DMAC transfers
+ * Packet is the data transferred during the run of one LLI
+ * Memory boundary size means the byte size of the data packet transferred
by one LLI
+ * Burst sizes are in bytes
+ * Transfer size is destination burst sizes in a source burst == run of one
LLI
+ */
+/*
+ * Register settings - see PrimeCell DMA Controller (PL080) TRM && AACI
PL041 TRM
+ */
+# define DMABlockSize 0x40 // 64 transfers @ 32 bit width ==
256(0x100) bytes
+# define DWidth 2 // 32 bits 0/1/2
+# define SWidth 2 // 32 bits 0/1/2
+# define DBSize 3 // 16 transfers @ 16 bit width ==
32(0x20) bytes AACI FIFO width /0 == 1/1 == 4/2 == 8/3 == 16/4 == 32/5 ==
64/6 == 128/7 == 256/
+# define SBSize 5 // Set to half of the AACI 512 byte
FIFO depth == 64 transfers @ 32 bit width == 256(0x100) bytes Memory
+ // - later check with FIFO status whether we
could use full depth
+/*
+ * TODO::
+ * - some from DMAC == same for all device DMA
+ * - some AACI device specific
+ */
+
+# define VDMA_AACI_CCTL
\
+ ((1 << 31) | /* ALL 'I' - Terminal count interrupt
enable */ \
+ (0 << 28) | /* ALL 'Prot' - AHB HPROT information to
destination slave. (Set to Not Cacheable, Not bufferable, User mode). */ \
+ (0 << 27) | /* AACI 'DI' - Destination address NOT
incremented after each transfer */ \
+ (1 << 26) | /* AACI 'SI' - Source address incremented
after each transfer */ \
+ (0 << 25) | /* AACI 'D' - Destination AHB master
select; 0=AHB1, 1=AHB2. (Transferring to AACI on V/PB M2 bus) */ \
+ (1 << 24) | /* AACI 'S' - Source AHB master select;
0=AHB1, 1=AHB2. (Transferring from memory on V/PB DMA1 bus) */ \
+ (DWidth << 21) | /* AACI 'DWidth' - Destination transfer
width. */ \
+ (SWidth << 18) | /* ALL 'SWidth' - Source transfer width.
*/ \
+ (DBSize << 15) | /* AACI 'DBSize' - Destination burst size.
*/ \
+ /* The number of bytes
transferred when the peripheral requests a burst of data. */ \
+ /* AACI requests a burst
when the FIFO has four or less words. */ \
+ (SBSize << 12) | /* AACI 'SBSize' - Source burst size.
(Memory boundary size when transferring from memory). (Set to 256 bytes)
*/ \
+ DMABlockSize) /* AACI Number of 'destination width'
transfers in one DMA 'packet'. (2^12)-1 is the maximum.
*/
+
+# define VDMA_AACI_CCFG
\
+ /* [31:19] ALL 'Reserved' - Write
as zero. */ \
+ ((0 << 18) | /* 'Halt' ALL - 0 = Allow DMA requests,
1 = Finish current request and ignore others */ \
+ (0 << 17) | /* [17] ALL 'Active' - Read
only bit. 0 = No data in FIFO. */ \
+ (0 << 16) | /* 'L' ALL - Lock. Generates locked
tranfers on the AHB. */ \
+ (1 << 15) | /* 'ITC' ALL - Terminal Count Interrupt
mask. Masks TC interrupt when cleared. */ \
+ (1 << 14) | /* 'IE' ALL - Interrupt error mask.
Masks error interrupt when cleared. */ \
+ (1 << 11) | /* 'FlowCntrl' AACI - Flow control method.
We're using Mem -> Peripheral, with the DMAC as the flow controller. */ \
+ (0 << 10) | /* 'Reserved' ALL - Write as zero
*/ \
+ (0 << 6) | /* 'DestPeripheral' AACI - Destination peripheral
number to associate with this channel. */ \
+ /* Set zero here, OR in the
correct value in the machine initialisation */ \
+ /* VPB uses #0, which is
shared with a logic tile DMA line on the V/PB. */ \
+ /* AACI Must be selected in
V/PB SYS_DMAPSR0 reg. */ \
+ /* VAB uses #1 AACI TX which
is fixed to DMA channel 1 */ \
+ (0 << 5) | /* 'Reserved' ALL - Write as zero
*/ \
+ (0 << 1) | /* 'SrcPeripheral' AACI - Source peripheral number
to associate with this channel. Ignored for 'from memory' transfers.*/ \
+ (0 << 0)) /* 'E' ALL - Enables this DMA channel.
(Channels automatically disabled when a transfer completes) */
+#endif /* CONFIG_ARM_AMBA_DMA */
+
+#define VDMA_CCFG_PERIPHAL_NUM_0 0x00000000
+#define VDMA_CCFG_PERIPHAL_NUM_1 0x00000040
+#define VDMA_CCFG_PERIPHAL_NUM_2 0x00000080
+#define VDMA_CCFG_PERIPHAL_NUM_3 0x000000C0
+#define VDMA_CCFG_PERIPHAL_NUM_4 0x00000100
+#define VDMA_CCFG_PERIPHAL_NUM_5 0x00000140
+#define VDMA_CCFG_PERIPHAL_NUM_6 0x00000180
+#define VDMA_CCFG_PERIPHAL_NUM_7 0x000001C0
+#define VDMA_CCFG_PERIPHAL_NUM_8 0x00000200
+#define VDMA_CCFG_PERIPHAL_NUM_9 0x00000240
+#define VDMA_CCFG_PERIPHAL_NUM_A 0x00000280
+#define VDMA_CCFG_PERIPHAL_NUM_B 0x000002C0
+#define VDMA_CCFG_PERIPHAL_NUM_C 0x00000300
+#define VDMA_CCFG_PERIPHAL_NUM_D 0x00000340
+#define VDMA_CCFG_PERIPHAL_NUM_E 0x00000380
+#define VDMA_CCFG_PERIPHAL_NUM_F 0x000003C0
+
#endif
diff -purN arm_amba_aaci/include/asm-arm/arch-versatile/platform.h
arm_amba_dma_versatile/include/asm-arm/arch-versatile/platform.h
--- arm_amba_aaci/include/asm-arm/arch-versatile/platform.h 2006-10-17
13:29:29.000000000 +0100
+++ arm_amba_dma_versatile/include/asm-arm/arch-versatile/platform.h
2006-10-18 08:41:54.000000000 +0100
@@ -86,6 +86,19 @@
#define VERSATILE_SYS_BOOTCS_OFFSET 0x58
#define VERSATILE_SYS_24MHz_OFFSET 0x5C
#define VERSATILE_SYS_MISC_OFFSET 0x60
+
+#if defined(CONFIG_ARCH_VERSATILE_PB)
+# define VERSATILE_SYS_DMAPSR0_OFFSET 0x64
+# define VERSATILE_SYS_DMAPSR1_OFFSET 0x68
+# define VERSATILE_SYS_DMAPSR2_OFFSET 0x6C
+# define VSYSMASK_DMAPSR 0xFFFFFF60
+# define VSYS_VAL_DMAPSR_ENABLE (1 << 7)
+# define VSYS_VAL_DMAPSR_AACI_TX 0x00000000
+# define VSYS_VAL_DMAPSR_AACI_RX 0x00000001
+# define VSYS_VAL_DMAPSR_USB_A 0x00000002
+# define VSYS_VAL_DMAPSR_USB_B 0x00000003
+#endif
+
#define VERSATILE_SYS_TEST_OSC0_OFFSET 0x80
#define VERSATILE_SYS_TEST_OSC1_OFFSET 0x84
#define VERSATILE_SYS_TEST_OSC2_OFFSET 0x88
diff -purN arm_amba_aaci/sound/arm/aaci.c
arm_amba_dma_versatile/sound/arm/aaci.c
--- arm_amba_aaci/sound/arm/aaci.c 2006-10-18 08:35:36.000000000 +0100
+++ arm_amba_dma_versatile/sound/arm/aaci.c 2006-10-18
08:41:54.000000000 +0100
@@ -173,7 +173,7 @@ static inline void aaci_chan_wait_ready(
* - called after each DMA packet (half a fifo depth)
* ASSUMES local interrupts disabled
*/
-static irqreturn_t aaci_dma_irq(int irq, void *devid, struct pt_regs *regs)
+static irqreturn_t aaci_dma_irq(int irq, void *devid)
{
struct amba_device * client = devid;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/