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

Shine Liu shinel at foxmail.com
Mon Aug 24 11:24:13 CEST 2009


Part 4: S3C ASoC 24XX-I2S drivers. Add the callback functions for the
DMA drivers. These callback functions are determined in the compile time
(no need to be registered in the probe phase).  



--- a/sound/soc/s3c24xx/s3c24xx-i2s.c	2009-08-24 13:28:58.000000000 +0800
+++ b/sound/soc/s3c24xx/s3c24xx-i2s.c	2009-08-24 15:20:53.000000000 +0800
@@ -41,12 +41,21 @@
 #include "s3c24xx-pcm.h"
 #include "s3c24xx-i2s.h"
 
+static int s3c24xx_snd_txctrl(int);
+static int s3c24xx_snd_rxctrl(int);
+
 static struct s3c2410_dma_client s3c24xx_dma_client_out = {
-	.name = "I2S PCM Stereo out"
+	.name = "I2S PCM Stereo out",
+	.channel	= DMACH_I2S_OUT,
+	.gen_request	= (void *)s3c24xx_snd_txctrl,
+	.end_request	= (void *)s3c24xx_snd_txctrl,
 };
 
 static struct s3c2410_dma_client s3c24xx_dma_client_in = {
-	.name = "I2S PCM Stereo in"
+	.name = "I2S PCM Stereo in",
+	.channel	= DMACH_I2S_IN,
+	.gen_request	= (void *)s3c24xx_snd_rxctrl,
+	.end_request	= (void *)s3c24xx_snd_rxctrl,
 };
 
 static struct s3c24xx_pcm_dma_params s3c24xx_i2s_pcm_stereo_out = {
@@ -73,7 +82,7 @@
 };
 static struct s3c24xx_i2s_info s3c24xx_i2s;
 
-static void s3c24xx_snd_txctrl(int on)
+static int s3c24xx_snd_txctrl(int on)
 {
 	u32 iisfcon;
 	u32 iiscon;
@@ -116,9 +125,10 @@
 	}
 
 	pr_debug("w: IISCON: %x IISMOD: %x IISFCON: %x\n", iiscon, iismod, iisfcon);
+	return 0;
 }
 
-static void s3c24xx_snd_rxctrl(int on)
+static int s3c24xx_snd_rxctrl(int on)
 {
 	u32 iisfcon;
 	u32 iiscon;
@@ -161,6 +171,7 @@
 	}
 
 	pr_debug("w: IISCON: %x IISMOD: %x IISFCON: %x\n", iiscon, iismod, iisfcon);
+	return 0;
 }
 
 /*
@@ -279,6 +290,9 @@
 			       struct snd_soc_dai *dai)
 {
 	int ret = 0;
+	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+	struct s3c24xx_pcm_dma_params *dma_params = rtd->dai->cpu_dai->dma_data;
+	struct s3c2410_dma_client *client = dma_params->client;
 
 	pr_debug("Entered %s\n", __func__);
 
@@ -292,24 +306,23 @@
 				goto exit_err;
 		}
 
-		if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
-			s3c24xx_snd_rxctrl(1);
-		else
-			s3c24xx_snd_txctrl(1);
+		client->event= S3C2410_DMA_TRIGGER_START;
+		client->private_data = (void *)1;
 		break;
 	case SNDRV_PCM_TRIGGER_STOP:
 	case SNDRV_PCM_TRIGGER_SUSPEND:
 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-		if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
-			s3c24xx_snd_rxctrl(0);
-		else
-			s3c24xx_snd_txctrl(0);
+		client->event= S3C2410_DMA_TRIGGER_STOP;
+		client->private_data = (void *)0;
 		break;
+
 	default:
 		ret = -EINVAL;
-		break;
+		goto exit_err;
 	}
 
+	ret = s3c2410_dma_trigger(client);
+
 exit_err:
 	return ret;
 }





More information about the Alsa-devel mailing list