summaryrefslogtreecommitdiffstats
path: root/target/linux/coldfire/patches/037-m5445x_edma_callback.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/coldfire/patches/037-m5445x_edma_callback.patch')
-rw-r--r--target/linux/coldfire/patches/037-m5445x_edma_callback.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/target/linux/coldfire/patches/037-m5445x_edma_callback.patch b/target/linux/coldfire/patches/037-m5445x_edma_callback.patch
new file mode 100644
index 0000000000..af2705c63b
--- /dev/null
+++ b/target/linux/coldfire/patches/037-m5445x_edma_callback.patch
@@ -0,0 +1,90 @@
+From acd937ac924aefd22ea9a66ea621ab80a4f9b594 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Mon, 10 Dec 2007 03:37:19 -0700
+Subject: [PATCH] Update EDMA driver to allow callback/arg changes.
+
+LTIBName: m5445x-edma-callback
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/spi/coldfire_edma.c | 27 +++++++++++++++++++++++++++
+ include/asm-m68k/coldfire_edma.h | 20 ++++++++++++++++++++
+ 2 files changed, 47 insertions(+), 0 deletions(-)
+
+--- a/drivers/spi/coldfire_edma.c
++++ b/drivers/spi/coldfire_edma.c
+@@ -206,6 +206,31 @@ int request_edma_channel(int channel,
+ EXPORT_SYMBOL(request_edma_channel);
+
+ /**
++ * set_edma_callback - Update the channel callback/arg
++ * @channel: channel number
++ * @handler: dma handler
++ * @error_handler: dma error handler
++ * @arg: argument to pass back
++ *
++ * Returns 0 if success or a negative value if failure
++ */
++int set_edma_callback(int channel,
++ edma_irq_handler handler,
++ edma_error_handler error_handler,
++ void *arg )
++{
++ if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS &&
++ devp->dma_interrupt_handlers[channel].allocated) {
++ devp->dma_interrupt_handlers[channel].irq_handler = handler;
++ devp->dma_interrupt_handlers[channel].error_handler = error_handler;
++ devp->dma_interrupt_handlers[channel].arg = arg;
++ return 0;
++ }
++ return -EINVAL;
++}
++EXPORT_SYMBOL(set_edma_callback);
++
++/**
+ * free_edma_channel - Free the edma channel
+ * @channel: channel number
+ * @arg: argument created with
+@@ -216,8 +241,10 @@ int free_edma_channel(int channel, void
+ {
+ if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) {
+ if (devp->dma_interrupt_handlers[channel].allocated) {
++#if 0
+ if (devp->dma_interrupt_handlers[channel].arg != arg)
+ return -EBUSY;
++#endif
+
+ devp->dma_interrupt_handlers[channel].allocated = 0;
+ devp->dma_interrupt_handlers[channel].arg = NULL;
+--- a/include/asm-m68k/coldfire_edma.h
++++ b/include/asm-m68k/coldfire_edma.h
+@@ -96,10 +96,30 @@ int request_edma_channel(int channel,
+ void *dev,
+ spinlock_t *lock,
+ const char *device_id);
++
++/**
++ * set_edma_callback - Update the channel callback/arg
++ * @channel: channel number
++ * @handler: dma handler
++ * @error_handler: dma error handler
++ * @arg: argument to pass back
++ *
++ * Returns 0 if success or a negative value if failure
++ */
++int set_edma_callback(int channel,
++ edma_irq_handler handler,
++ edma_error_handler error_handler,
++ void *arg);
+
+ /* Free eDMA channel
+ * channel - eDMA TCD number
+ * dev - device
+ */
+ int free_edma_channel(int channel, void *dev);
++
++/*
++ * DMA Modes
++ */
++#define DMA_MODE_READ 0
++#define DMA_MODE_WRITE 1
+ #endif