[alsa-devel] [PATCH 10/17] ASoC: mxs: Use generic dmaengine PCM

Lars-Peter Clausen lars at metafoo.de
Wed Apr 17 11:28:11 CEST 2013


On 04/17/2013 10:43 AM, Shawn Guo wrote:
> On Mon, Apr 15, 2013 at 07:19:57PM +0200, Lars-Peter Clausen wrote:
>> Use the generic dmaengine PCM driver instead of a custom implementation.
>>
>> Signed-off-by: Lars-Peter Clausen <lars at metafoo.de>
>> ---
>>  sound/soc/mxs/Kconfig   |   2 +-
>>  sound/soc/mxs/mxs-pcm.c | 135 ++++--------------------------------------------
>>  2 files changed, 11 insertions(+), 126 deletions(-)
> 
> After applying the patch, mxs audio is broken as below.
> 
> [    2.003200] mxs-saif 80042000.saif: Missing dma channel for stream: 1
> [    2.010220] mmc0: new high speed SDHC card at address e624
> [    2.016453] mxs-saif 80042000.saif: ASoC: pcm constructor failed: -22
> [    2.022964] mxs-sgtl5000 sound.12: ASoC: can't create pcm HiFi Playback :-22
> [    2.030310] mxs-sgtl5000 sound.12: ASoC: failed to instantiate card -22
> 
> It's caused by that dmaengine_pcm_new() will call
> dmaengine_pcm_compat_request_channel() twice to request the same mxs-dma
> channel, and the second call will fail.
> 
> Shawn
> 

Can you see whether the patch below fixes it?

diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c
index b563141..675c348 100644
--- a/sound/soc/mxs/mxs-saif.c
+++ b/sound/soc/mxs/mxs-saif.c
@@ -611,21 +611,28 @@ static int mxs_saif_dai_probe(struct snd_soc_dai *dai)
 }

 static struct snd_soc_dai_driver mxs_saif_dai = {
-	.name = "mxs-saif",
-	.probe = mxs_saif_dai_probe,
-	.playback = {
-		.channels_min = 2,
-		.channels_max = 2,
-		.rates = MXS_SAIF_RATES,
-		.formats = MXS_SAIF_FORMATS,
+	{
+		.name = "mxs-saif",
+		.probe = mxs_saif_dai_probe,
+		.playback = {
+			.channels_min = 2,
+			.channels_max = 2,
+			.rates = MXS_SAIF_RATES,
+			.formats = MXS_SAIF_FORMATS,
+		},
+		.ops = &mxs_saif_dai_ops,
 	},
-	.capture = {
-		.channels_min = 2,
-		.channels_max = 2,
-		.rates = MXS_SAIF_RATES,
-		.formats = MXS_SAIF_FORMATS,
+	{
+		.name = "mxs-saif",
+		.probe = mxs_saif_dai_probe,
+		.capture = {
+			.channels_min = 2,
+			.channels_max = 2,
+			.rates = MXS_SAIF_RATES,
+			.formats = MXS_SAIF_FORMATS,
+		},
+		.ops = &mxs_saif_dai_ops,
 	},
-	.ops = &mxs_saif_dai_ops,
 };

 static const struct snd_soc_component_driver mxs_saif_component = {
@@ -769,7 +776,7 @@ static int mxs_saif_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, saif);

 	ret = snd_soc_register_component(&pdev->dev, &mxs_saif_component,
-					 &mxs_saif_dai, 1);
+					 &mxs_saif_dai[saif->id], 1);
 	if (ret) {
 		dev_err(&pdev->dev, "register DAI failed\n");
 		return ret;


More information about the Alsa-devel mailing list