[alsa-devel] [PATCH 1/5 v2] ASoC: S3C platform: Fix s3c2410_dma_started called at wrong time

Shine Liu shinel at foxmail.com
Mon Aug 24 10:56:30 CEST 2009


DMA part: No old API dropped. Add the s3c2410_dma_trigger() API used for
to start or to stop a DMA transfer. This API will reduce the miss use of
s3c2410_dma_started() function. User should provide the callback
functions, trigger event and the DMA channel number before calling this
API. These private data is packed in struct s3c2410_dma_client. No new
struct added.


--- a/arch/arm/plat-s3c/include/plat/dma.h	2009-08-24 13:29:03.000000000 +0800
+++ b/arch/arm/plat-s3c/include/plat/dma.h	2009-08-24 15:30:23.000000000 +0800
@@ -37,8 +37,23 @@
 	S3C2410_DMAOP_STARTED,		/* indicate channel started */
 };
 
+enum s3c2410_dma_trigger_event {
+	S3C2410_DMA_TRIGGER_START,		/* start a channel */
+	S3C2410_DMA_TRIGGER_STOP,		/* stop a channel */
+	S3C2410_DMA_TRIGGER_MAX,
+};
+
 struct s3c2410_dma_client {
-	char                *name;
+	char		*name;
+	unsigned int 	channel;		/* channel number */
+	/* trigger event */
+	enum s3c2410_dma_trigger_event event;
+	/* callback funtion from client to generate the DMA REQ signal */
+	int (*gen_request)(void *);
+	/* callback funtion from client to end the DMA request */
+	int (*end_request)(void *);
+	/* pravate data to the callback function */
+	void 		*private_data;
 };
 
 struct s3c2410_dma_chan;
@@ -73,6 +88,13 @@
 
 extern int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op);
 
+/* s3c2410_dma_trigger
+ *
+ * trigger the DMA engine to start or stop
+*/
+
+extern int s3c2410_dma_trigger(struct s3c2410_dma_client *client);
+
 /* s3c2410_dma_setflags
  *
  * set the channel's flags to a given state
--- a/arch/arm/plat-s3c/dma.c	2009-08-24 15:26:07.000000000 +0800
+++ b/arch/arm/plat-s3c/dma.c	2009-08-24 15:27:09.000000000 +0800
@@ -84,3 +84,32 @@
 	return 0;
 }
 EXPORT_SYMBOL(s3c2410_dma_setflags);
+
+int s3c2410_dma_trigger(struct s3c2410_dma_client *client)
+{
+	int ret = 0;
+	if(!client || !(client->channel < DMACH_MAX)) {
+ 		pr_debug("%s: Invalid parameter\n", __func__);
+		return -EINVAL;
+	}
+
+	switch(client->event) {
+	case S3C2410_DMA_TRIGGER_START:
+		s3c2410_dma_ctrl(client->channel, S3C2410_DMAOP_START);
+		if(client->gen_request)
+			ret = client->gen_request(client->private_data);
+		s3c2410_dma_ctrl(client->channel, S3C2410_DMAOP_STARTED);
+		return ret;
+	case S3C2410_DMA_TRIGGER_STOP:
+		s3c2410_dma_ctrl(client->channel, S3C2410_DMAOP_STOP);
+		if(client->end_request)
+			ret = client->end_request(client->private_data);
+		return ret;
+	default:
+		pr_debug("%s: Invalid event\n", __func__);
+	}
+	return -EINVAL;
+}
+
+EXPORT_SYMBOL(s3c2410_dma_trigger);
+





More information about the Alsa-devel mailing list