91 lines
2.6 KiB
Diff
91 lines
2.6 KiB
Diff
|
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
|