summaryrefslogtreecommitdiff
path: root/target/linux/omap/patches-3.12/403-ASoC-davinci-mcasp-Extract-DMA-channels-directly-fro.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/omap/patches-3.12/403-ASoC-davinci-mcasp-Extract-DMA-channels-directly-fro.patch')
-rw-r--r--target/linux/omap/patches-3.12/403-ASoC-davinci-mcasp-Extract-DMA-channels-directly-fro.patch137
1 files changed, 137 insertions, 0 deletions
diff --git a/target/linux/omap/patches-3.12/403-ASoC-davinci-mcasp-Extract-DMA-channels-directly-fro.patch b/target/linux/omap/patches-3.12/403-ASoC-davinci-mcasp-Extract-DMA-channels-directly-fro.patch
new file mode 100644
index 0000000000..5fc2f1368f
--- /dev/null
+++ b/target/linux/omap/patches-3.12/403-ASoC-davinci-mcasp-Extract-DMA-channels-directly-fro.patch
@@ -0,0 +1,137 @@
+From ad5d3e5a1218a599ec02c81a3bd599acedeea00f Mon Sep 17 00:00:00 2001
+From: Jyri Sarha <jsarha@ti.com>
+Date: Tue, 17 Sep 2013 12:09:30 +0300
+Subject: [PATCH 214/752] ASoC: davinci-mcasp: Extract DMA channels directly
+ from DT
+
+Extract DMA channels directly from DT as they can not be found from
+platform resources anymore. This is a work-around until davinci audio
+driver is updated to use dmaengine.
+
+Signed-off-by: Jyri Sarha <jsarha@ti.com>
+---
+ .../bindings/sound/davinci-mcasp-audio.txt | 5 +++
+ include/linux/platform_data/davinci_asp.h | 2 +
+ sound/soc/davinci/davinci-mcasp.c | 47 +++++++++++++-------
+ 3 files changed, 39 insertions(+), 15 deletions(-)
+
+diff --git a/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt b/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt
+index 63b67ae..68e0f47 100644
+--- a/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt
++++ b/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt
+@@ -18,6 +18,11 @@ Required properties:
+ - serial-dir : A list of serializer pin mode. The list number should be equal
+ to "num-serializer" parameter. Each entry is a number indication
+ serializer pin direction. (0 - INACTIVE, 1 - TX, 2 - RX)
++- dmas: two element list of DMA controller phandles and DMA request line
++ ordered pairs.
++- dma-names: identifier string for each DMA request line in the dmas property.
++ These strings correspond 1:1 with the ordered pairs in dmas. The dma
++ identifiers must be "rx" and "tx".
+
+ Optional properties:
+
+diff --git a/include/linux/platform_data/davinci_asp.h b/include/linux/platform_data/davinci_asp.h
+index 8db5ae0..689a856 100644
+--- a/include/linux/platform_data/davinci_asp.h
++++ b/include/linux/platform_data/davinci_asp.h
+@@ -84,6 +84,8 @@ struct snd_platform_data {
+ u8 version;
+ u8 txnumevt;
+ u8 rxnumevt;
++ int tx_dma_channel;
++ int rx_dma_channel;
+ };
+
+ enum {
+diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
+index a056fc5..acbf5f8 100644
+--- a/sound/soc/davinci/davinci-mcasp.c
++++ b/sound/soc/davinci/davinci-mcasp.c
+@@ -1047,6 +1047,7 @@ static struct snd_platform_data *davinci_mcasp_set_pdata_from_of(
+ struct snd_platform_data *pdata = NULL;
+ const struct of_device_id *match =
+ of_match_device(mcasp_dt_ids, &pdev->dev);
++ struct of_phandle_args dma_spec;
+
+ const u32 *of_serial_dir32;
+ u8 *of_serial_dir;
+@@ -1109,6 +1110,28 @@ static struct snd_platform_data *davinci_mcasp_set_pdata_from_of(
+ pdata->serial_dir = of_serial_dir;
+ }
+
++ ret = of_property_match_string(np, "dma-names", "tx");
++ if (ret < 0)
++ goto nodata;
++
++ ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
++ &dma_spec);
++ if (ret < 0)
++ goto nodata;
++
++ pdata->tx_dma_channel = dma_spec.args[0];
++
++ ret = of_property_match_string(np, "dma-names", "rx");
++ if (ret < 0)
++ goto nodata;
++
++ ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
++ &dma_spec);
++ if (ret < 0)
++ goto nodata;
++
++ pdata->rx_dma_channel = dma_spec.args[0];
++
+ ret = of_property_read_u32(np, "tx-num-evt", &val);
+ if (ret >= 0)
+ pdata->txnumevt = val;
+@@ -1139,7 +1162,7 @@ nodata:
+ static int davinci_mcasp_probe(struct platform_device *pdev)
+ {
+ struct davinci_pcm_dma_params *dma_data;
+- struct resource *mem, *ioarea, *res;
++ struct resource *mem, *ioarea, *res, *dma;
+ struct snd_platform_data *pdata;
+ struct davinci_audio_dev *dev;
+ int ret;
+@@ -1213,15 +1236,11 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
+ dma_data->sram_size = pdata->sram_size_playback;
+ dma_data->dma_addr = dma->start + pdata->tx_dma_offset;
+
+- /* first TX, then RX */
+ res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+- if (!res) {
+- dev_err(&pdev->dev, "no DMA resource\n");
+- ret = -ENODEV;
+- goto err_release_clk;
+- }
+-
+- dma_data->channel = res->start;
++ if (res)
++ dma_data->channel = res->start;
++ else
++ dma_data->channel = pdata->tx_dma_channel;
+
+ dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE];
+ dma_data->asp_chan_q = pdata->asp_chan_q;
+@@ -1231,13 +1250,11 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
+ dma_data->dma_addr = dma->start + pdata->rx_dma_offset;
+
+ res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
+- if (!res) {
+- dev_err(&pdev->dev, "no DMA resource\n");
+- ret = -ENODEV;
+- goto err_release_clk;
+- }
++ if (res)
++ dma_data->channel = res->start;
++ else
++ dma_data->channel = pdata->rx_dma_channel;
+
+- dma_data->channel = res->start;
+ dev_set_drvdata(&pdev->dev, dev);
+ ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
+ &davinci_mcasp_dai[pdata->op_mode], 1);
+--
+1.7.10.4
+