ASoC: mmp-pcm: Allocate dma filter parameters on the stack
authorLars-Peter Clausen <lars@metafoo.de>
Fri, 22 Mar 2013 13:12:11 +0000 (14:12 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 26 Mar 2013 14:17:03 +0000 (14:17 +0000)
The dma filter parameters are only used within filter callback, so there is no
need to allocate them on the heap and keep them around until the PCM has been
closed.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Tested-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/pxa/mmp-pcm.c

index 190eb0b..6c39802 100644 (file)
@@ -118,9 +118,8 @@ static int mmp_pcm_open(struct snd_pcm_substream *substream)
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct platform_device *pdev = to_platform_device(rtd->platform->dev);
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-       struct mmp_dma_data *dma_data;
+       struct mmp_dma_data dma_data;
        struct resource *r;
-       int ret;
 
        r = platform_get_resource(pdev, IORESOURCE_DMA, substream->stream);
        if (!r)
@@ -128,33 +127,11 @@ static int mmp_pcm_open(struct snd_pcm_substream *substream)
 
        snd_soc_set_runtime_hwparams(substream,
                                &mmp_pcm_hardware[substream->stream]);
-       dma_data = devm_kzalloc(&pdev->dev,
-                       sizeof(struct mmp_dma_data), GFP_KERNEL);
-       if (dma_data == NULL)
-               return -ENOMEM;
 
-       dma_data->dma_res = r;
-       dma_data->ssp_id = cpu_dai->id;
+       dma_data.dma_res = r;
+       dma_data.ssp_id = cpu_dai->id;
 
-       ret = snd_dmaengine_pcm_open(substream, filter, dma_data);
-       if (ret) {
-               devm_kfree(&pdev->dev, dma_data);
-               return ret;
-       }
-
-       snd_dmaengine_pcm_set_data(substream, dma_data);
-       return 0;
-}
-
-static int mmp_pcm_close(struct snd_pcm_substream *substream)
-{
-       struct mmp_dma_data *dma_data = snd_dmaengine_pcm_get_data(substream);
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct platform_device *pdev = to_platform_device(rtd->platform->dev);
-
-       snd_dmaengine_pcm_close(substream);
-       devm_kfree(&pdev->dev, dma_data);
-       return 0;
+       return snd_dmaengine_pcm_open(substream, filter, &dma_data);
 }
 
 static int mmp_pcm_mmap(struct snd_pcm_substream *substream,
@@ -171,7 +148,7 @@ static int mmp_pcm_mmap(struct snd_pcm_substream *substream,
 
 struct snd_pcm_ops mmp_pcm_ops = {
        .open           = mmp_pcm_open,
-       .close          = mmp_pcm_close,
+       .close          = snd_dmaengine_pcm_close,
        .ioctl          = snd_pcm_lib_ioctl,
        .hw_params      = mmp_pcm_hw_params,
        .trigger        = snd_dmaengine_pcm_trigger,