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
