Commit 4023fe6f authored by Jyri Sarha's avatar Jyri Sarha Committed by Mark Brown

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: default avatarJyri Sarha <jsarha@ti.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 256ba181
...@@ -18,6 +18,11 @@ Required properties: ...@@ -18,6 +18,11 @@ Required properties:
- serial-dir : A list of serializer pin mode. The list number should be equal - serial-dir : A list of serializer pin mode. The list number should be equal
to "num-serializer" parameter. Each entry is a number indication to "num-serializer" parameter. Each entry is a number indication
serializer pin direction. (0 - INACTIVE, 1 - TX, 2 - RX) 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: Optional properties:
......
...@@ -84,6 +84,8 @@ struct snd_platform_data { ...@@ -84,6 +84,8 @@ struct snd_platform_data {
u8 version; u8 version;
u8 txnumevt; u8 txnumevt;
u8 rxnumevt; u8 rxnumevt;
int tx_dma_channel;
int rx_dma_channel;
}; };
enum { enum {
......
...@@ -1047,6 +1047,7 @@ static struct snd_platform_data *davinci_mcasp_set_pdata_from_of( ...@@ -1047,6 +1047,7 @@ static struct snd_platform_data *davinci_mcasp_set_pdata_from_of(
struct snd_platform_data *pdata = NULL; struct snd_platform_data *pdata = NULL;
const struct of_device_id *match = const struct of_device_id *match =
of_match_device(mcasp_dt_ids, &pdev->dev); of_match_device(mcasp_dt_ids, &pdev->dev);
struct of_phandle_args dma_spec;
const u32 *of_serial_dir32; const u32 *of_serial_dir32;
u8 *of_serial_dir; u8 *of_serial_dir;
...@@ -1109,6 +1110,28 @@ static struct snd_platform_data *davinci_mcasp_set_pdata_from_of( ...@@ -1109,6 +1110,28 @@ static struct snd_platform_data *davinci_mcasp_set_pdata_from_of(
pdata->serial_dir = of_serial_dir; 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); ret = of_property_read_u32(np, "tx-num-evt", &val);
if (ret >= 0) if (ret >= 0)
pdata->txnumevt = val; pdata->txnumevt = val;
...@@ -1213,15 +1236,11 @@ static int davinci_mcasp_probe(struct platform_device *pdev) ...@@ -1213,15 +1236,11 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
dma_data->sram_size = pdata->sram_size_playback; dma_data->sram_size = pdata->sram_size_playback;
dma_data->dma_addr = dat->start + pdata->tx_dma_offset; dma_data->dma_addr = dat->start + pdata->tx_dma_offset;
/* first TX, then RX */
res = platform_get_resource(pdev, IORESOURCE_DMA, 0); res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
if (!res) { if (res)
dev_err(&pdev->dev, "no DMA resource\n"); dma_data->channel = res->start;
ret = -ENODEV; else
goto err_release_clk; dma_data->channel = pdata->tx_dma_channel;
}
dma_data->channel = res->start;
dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]; dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE];
dma_data->asp_chan_q = pdata->asp_chan_q; dma_data->asp_chan_q = pdata->asp_chan_q;
...@@ -1231,13 +1250,11 @@ static int davinci_mcasp_probe(struct platform_device *pdev) ...@@ -1231,13 +1250,11 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
dma_data->dma_addr = dat->start + pdata->rx_dma_offset; dma_data->dma_addr = dat->start + pdata->rx_dma_offset;
res = platform_get_resource(pdev, IORESOURCE_DMA, 1); res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
if (!res) { if (res)
dev_err(&pdev->dev, "no DMA resource\n"); dma_data->channel = res->start;
ret = -ENODEV; else
goto err_release_clk; dma_data->channel = pdata->rx_dma_channel;
}
dma_data->channel = res->start;
dev_set_drvdata(&pdev->dev, dev); dev_set_drvdata(&pdev->dev, dev);
ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component, ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
&davinci_mcasp_dai[pdata->op_mode], 1); &davinci_mcasp_dai[pdata->op_mode], 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment