ASoC: omap-pcm: Request the DMA channel differently when DT is involved
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Thu, 11 Jul 2013 12:35:43 +0000 (14:35 +0200)
committerMark Brown <broonie@linaro.org>
Thu, 11 Jul 2013 16:37:44 +0000 (17:37 +0100)
When booting with DT the platform_get_resource_byname() is not available to
get the DMA resource. In this case the DAI drivers will set the filter_data to
the name of the DMA and omap-pcm can use this to request the DMA channel.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Reviewed-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/omap/omap-pcm.c

index c28e042..a11405d 100644 (file)
@@ -113,14 +113,25 @@ static int omap_pcm_open(struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_dmaengine_dai_dma_data *dma_data;
+       int ret;
 
        snd_soc_set_runtime_hwparams(substream, &omap_pcm_hardware);
 
        dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
 
-       return snd_dmaengine_pcm_open_request_chan(substream,
-                                                  omap_dma_filter_fn,
-                                                  dma_data->filter_data);
+       /* DT boot: filter_data is the DMA name */
+       if (rtd->cpu_dai->dev->of_node) {
+               struct dma_chan *chan;
+
+               chan = dma_request_slave_channel(rtd->cpu_dai->dev,
+                                                dma_data->filter_data);
+               ret = snd_dmaengine_pcm_open(substream, chan);
+       } else {
+               ret = snd_dmaengine_pcm_open_request_chan(substream,
+                                                         omap_dma_filter_fn,
+                                                         dma_data->filter_data);
+       }
+       return ret;
 }
 
 static int omap_pcm_mmap(struct snd_pcm_substream *substream,