ASoC: davinci-mcasp: Deprecate the use of davinci-pcm in favor of edma-pcm

The edma-pcm performs as good as the old davinci-pcm and it's use does not
require the 'ping-pong' mode of davinci-pcm, which was introduced to
overcome under/over flow issues when using davinci-pcm.

Keep the SND_DAVINCI_SOC config option to select the SND_EDMA_SOC to avoid
regression in audio support.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Peter Ujfalusi 2015-03-03 16:45:20 +02:00 committed by Mark Brown
parent 62731d33c4
commit 9759e7ef53
2 changed files with 27 additions and 75 deletions

View file

@ -1,15 +1,16 @@
config SND_DAVINCI_SOC config SND_DAVINCI_SOC
tristate "SoC Audio for TI DAVINCI" tristate
depends on ARCH_DAVINCI depends on ARCH_DAVINCI
select SND_EDMA_SOC select SND_EDMA_SOC
config SND_EDMA_SOC config SND_EDMA_SOC
tristate "SoC Audio for Texas Instruments chips using eDMA (AM33XX/43XX)" tristate "SoC Audio for Texas Instruments chips using eDMA"
depends on SOC_AM33XX || SOC_AM43XX || ARCH_DAVINCI depends on SOC_AM33XX || SOC_AM43XX || ARCH_DAVINCI
select SND_SOC_GENERIC_DMAENGINE_PCM select SND_SOC_GENERIC_DMAENGINE_PCM
help help
Say Y or M here if you want audio support for TI SoC which uses eDMA. Say Y or M here if you want audio support for TI SoC which uses eDMA.
The following line of SoCs are supported by this platform driver: The following line of SoCs are supported by this platform driver:
- daVinci devices
- AM335x - AM335x
- AM437x/AM438x - AM437x/AM438x
@ -18,7 +19,7 @@ config SND_DAVINCI_SOC_I2S
config SND_DAVINCI_SOC_MCASP config SND_DAVINCI_SOC_MCASP
tristate "Multichannel Audio Serial Port (McASP) support" tristate "Multichannel Audio Serial Port (McASP) support"
depends on SND_DAVINCI_SOC || SND_OMAP_SOC || SND_EDMA_SOC depends on SND_OMAP_SOC || SND_EDMA_SOC
help help
Say Y or M here if you want to have support for McASP IP found in Say Y or M here if you want to have support for McASP IP found in
various Texas Instruments SoCs like: various Texas Instruments SoCs like:
@ -46,7 +47,7 @@ config SND_AM33XX_SOC_EVM
config SND_DAVINCI_SOC_EVM config SND_DAVINCI_SOC_EVM
tristate "SoC Audio support for DaVinci DM6446, DM355 or DM365 EVM" tristate "SoC Audio support for DaVinci DM6446, DM355 or DM365 EVM"
depends on SND_DAVINCI_SOC && I2C depends on SND_EDMA_SOC && I2C
depends on MACH_DAVINCI_EVM || MACH_DAVINCI_DM355_EVM || MACH_DAVINCI_DM365_EVM depends on MACH_DAVINCI_EVM || MACH_DAVINCI_DM355_EVM || MACH_DAVINCI_DM365_EVM
select SND_DAVINCI_SOC_GENERIC_EVM select SND_DAVINCI_SOC_GENERIC_EVM
help help
@ -74,7 +75,7 @@ endchoice
config SND_DM6467_SOC_EVM config SND_DM6467_SOC_EVM
tristate "SoC Audio support for DaVinci DM6467 EVM" tristate "SoC Audio support for DaVinci DM6467 EVM"
depends on SND_DAVINCI_SOC && MACH_DAVINCI_DM6467_EVM && I2C depends on SND_EDMA_SOC && MACH_DAVINCI_DM6467_EVM && I2C
select SND_DAVINCI_SOC_GENERIC_EVM select SND_DAVINCI_SOC_GENERIC_EVM
select SND_SOC_SPDIF select SND_SOC_SPDIF
@ -83,7 +84,7 @@ config SND_DM6467_SOC_EVM
config SND_DA830_SOC_EVM config SND_DA830_SOC_EVM
tristate "SoC Audio support for DA830/OMAP-L137 EVM" tristate "SoC Audio support for DA830/OMAP-L137 EVM"
depends on SND_DAVINCI_SOC && MACH_DAVINCI_DA830_EVM && I2C depends on SND_EDMA_SOC && MACH_DAVINCI_DA830_EVM && I2C
select SND_DAVINCI_SOC_GENERIC_EVM select SND_DAVINCI_SOC_GENERIC_EVM
help help
@ -92,7 +93,7 @@ config SND_DA830_SOC_EVM
config SND_DA850_SOC_EVM config SND_DA850_SOC_EVM
tristate "SoC Audio support for DA850/OMAP-L138 EVM" tristate "SoC Audio support for DA850/OMAP-L138 EVM"
depends on SND_DAVINCI_SOC && MACH_DAVINCI_DA850_EVM && I2C depends on SND_EDMA_SOC && MACH_DAVINCI_DA850_EVM && I2C
select SND_DAVINCI_SOC_GENERIC_EVM select SND_DAVINCI_SOC_GENERIC_EVM
help help
Say Y if you want to add support for SoC audio on TI Say Y if you want to add support for SoC audio on TI

View file

@ -26,6 +26,7 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/platform_data/davinci_asp.h>
#include <sound/asoundef.h> #include <sound/asoundef.h>
#include <sound/core.h> #include <sound/core.h>
@ -36,7 +37,6 @@
#include <sound/dmaengine_pcm.h> #include <sound/dmaengine_pcm.h>
#include <sound/omap-pcm.h> #include <sound/omap-pcm.h>
#include "davinci-pcm.h"
#include "edma-pcm.h" #include "edma-pcm.h"
#include "davinci-mcasp.h" #include "davinci-mcasp.h"
@ -65,7 +65,6 @@ struct davinci_mcasp_context {
}; };
struct davinci_mcasp { struct davinci_mcasp {
struct davinci_pcm_dma_params dma_params[2];
struct snd_dmaengine_dai_dma_data dma_data[2]; struct snd_dmaengine_dai_dma_data dma_data[2];
void __iomem *base; void __iomem *base;
u32 fifo_base; u32 fifo_base;
@ -82,6 +81,7 @@ struct davinci_mcasp {
u16 bclk_lrclk_ratio; u16 bclk_lrclk_ratio;
int streams; int streams;
u32 irq_request[2]; u32 irq_request[2];
int dma_request[2];
int sysclk_freq; int sysclk_freq;
bool bclk_master; bool bclk_master;
@ -643,7 +643,6 @@ static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream, static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
int period_words, int channels) int period_words, int channels)
{ {
struct davinci_pcm_dma_params *dma_params = &mcasp->dma_params[stream];
struct snd_dmaengine_dai_dma_data *dma_data = &mcasp->dma_data[stream]; struct snd_dmaengine_dai_dma_data *dma_data = &mcasp->dma_data[stream];
int i; int i;
u8 tx_ser = 0; u8 tx_ser = 0;
@ -711,10 +710,8 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
* For example if three serializers are enabled the DMA * For example if three serializers are enabled the DMA
* need to transfer three words per DMA request. * need to transfer three words per DMA request.
*/ */
dma_params->fifo_level = active_serializers;
dma_data->maxburst = active_serializers; dma_data->maxburst = active_serializers;
} else { } else {
dma_params->fifo_level = 0;
dma_data->maxburst = 0; dma_data->maxburst = 0;
} }
return 0; return 0;
@ -746,7 +743,6 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
/* Configure the burst size for platform drivers */ /* Configure the burst size for platform drivers */
if (numevt == 1) if (numevt == 1)
numevt = 0; numevt = 0;
dma_params->fifo_level = numevt;
dma_data->maxburst = numevt; dma_data->maxburst = numevt;
return 0; return 0;
@ -872,8 +868,6 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *cpu_dai) struct snd_soc_dai *cpu_dai)
{ {
struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
struct davinci_pcm_dma_params *dma_params =
&mcasp->dma_params[substream->stream];
int word_length; int word_length;
int channels = params_channels(params); int channels = params_channels(params);
int period_size = params_period_size(params); int period_size = params_period_size(params);
@ -914,31 +908,26 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
switch (params_format(params)) { switch (params_format(params)) {
case SNDRV_PCM_FORMAT_U8: case SNDRV_PCM_FORMAT_U8:
case SNDRV_PCM_FORMAT_S8: case SNDRV_PCM_FORMAT_S8:
dma_params->data_type = 1;
word_length = 8; word_length = 8;
break; break;
case SNDRV_PCM_FORMAT_U16_LE: case SNDRV_PCM_FORMAT_U16_LE:
case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S16_LE:
dma_params->data_type = 2;
word_length = 16; word_length = 16;
break; break;
case SNDRV_PCM_FORMAT_U24_3LE: case SNDRV_PCM_FORMAT_U24_3LE:
case SNDRV_PCM_FORMAT_S24_3LE: case SNDRV_PCM_FORMAT_S24_3LE:
dma_params->data_type = 3;
word_length = 24; word_length = 24;
break; break;
case SNDRV_PCM_FORMAT_U24_LE: case SNDRV_PCM_FORMAT_U24_LE:
case SNDRV_PCM_FORMAT_S24_LE: case SNDRV_PCM_FORMAT_S24_LE:
dma_params->data_type = 4;
word_length = 24; word_length = 24;
break; break;
case SNDRV_PCM_FORMAT_U32_LE: case SNDRV_PCM_FORMAT_U32_LE:
case SNDRV_PCM_FORMAT_S32_LE: case SNDRV_PCM_FORMAT_S32_LE:
dma_params->data_type = 4;
word_length = 32; word_length = 32;
break; break;
@ -947,11 +936,6 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
return -EINVAL; return -EINVAL;
} }
if (mcasp->version == MCASP_VERSION_2 && !dma_params->fifo_level)
dma_params->acnt = 4;
else
dma_params->acnt = dma_params->data_type;
davinci_config_channel_size(mcasp, word_length); davinci_config_channel_size(mcasp, word_length);
if (mcasp->op_mode == DAVINCI_MCASP_IIS_MODE) if (mcasp->op_mode == DAVINCI_MCASP_IIS_MODE)
@ -1055,17 +1039,8 @@ static int davinci_mcasp_dai_probe(struct snd_soc_dai *dai)
{ {
struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai); struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
if (mcasp->version >= MCASP_VERSION_3) { dai->playback_dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
/* Using dmaengine PCM */ dai->capture_dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
dai->playback_dma_data =
&mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
dai->capture_dma_data =
&mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
} else {
/* Using davinci-pcm */
dai->playback_dma_data = mcasp->dma_params;
dai->capture_dma_data = mcasp->dma_params;
}
return 0; return 0;
} }
@ -1184,28 +1159,24 @@ static const struct snd_soc_component_driver davinci_mcasp_component = {
static struct davinci_mcasp_pdata dm646x_mcasp_pdata = { static struct davinci_mcasp_pdata dm646x_mcasp_pdata = {
.tx_dma_offset = 0x400, .tx_dma_offset = 0x400,
.rx_dma_offset = 0x400, .rx_dma_offset = 0x400,
.asp_chan_q = EVENTQ_0,
.version = MCASP_VERSION_1, .version = MCASP_VERSION_1,
}; };
static struct davinci_mcasp_pdata da830_mcasp_pdata = { static struct davinci_mcasp_pdata da830_mcasp_pdata = {
.tx_dma_offset = 0x2000, .tx_dma_offset = 0x2000,
.rx_dma_offset = 0x2000, .rx_dma_offset = 0x2000,
.asp_chan_q = EVENTQ_0,
.version = MCASP_VERSION_2, .version = MCASP_VERSION_2,
}; };
static struct davinci_mcasp_pdata am33xx_mcasp_pdata = { static struct davinci_mcasp_pdata am33xx_mcasp_pdata = {
.tx_dma_offset = 0, .tx_dma_offset = 0,
.rx_dma_offset = 0, .rx_dma_offset = 0,
.asp_chan_q = EVENTQ_0,
.version = MCASP_VERSION_3, .version = MCASP_VERSION_3,
}; };
static struct davinci_mcasp_pdata dra7_mcasp_pdata = { static struct davinci_mcasp_pdata dra7_mcasp_pdata = {
.tx_dma_offset = 0x200, .tx_dma_offset = 0x200,
.rx_dma_offset = 0x284, .rx_dma_offset = 0x284,
.asp_chan_q = EVENTQ_0,
.version = MCASP_VERSION_4, .version = MCASP_VERSION_4,
}; };
@ -1382,12 +1353,12 @@ static struct davinci_mcasp_pdata *davinci_mcasp_set_pdata_from_of(
static int davinci_mcasp_probe(struct platform_device *pdev) static int davinci_mcasp_probe(struct platform_device *pdev)
{ {
struct davinci_pcm_dma_params *dma_params;
struct snd_dmaengine_dai_dma_data *dma_data; struct snd_dmaengine_dai_dma_data *dma_data;
struct resource *mem, *ioarea, *res, *dat; struct resource *mem, *ioarea, *res, *dat;
struct davinci_mcasp_pdata *pdata; struct davinci_mcasp_pdata *pdata;
struct davinci_mcasp *mcasp; struct davinci_mcasp *mcasp;
char *irq_name; char *irq_name;
int *dma;
int irq; int irq;
int ret; int ret;
@ -1521,59 +1492,45 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
if (dat) if (dat)
mcasp->dat_port = true; mcasp->dat_port = true;
dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK]; dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
dma_params->asp_chan_q = pdata->asp_chan_q;
dma_params->ram_chan_q = pdata->ram_chan_q;
dma_params->sram_pool = pdata->sram_pool;
dma_params->sram_size = pdata->sram_size_playback;
if (dat) if (dat)
dma_params->dma_addr = dat->start; dma_data->addr = dat->start;
else else
dma_params->dma_addr = mem->start + pdata->tx_dma_offset; dma_data->addr = mem->start + pdata->tx_dma_offset;
/* Unconditional dmaengine stuff */
dma_data->addr = dma_params->dma_addr;
dma = &mcasp->dma_request[SNDRV_PCM_STREAM_PLAYBACK];
res = platform_get_resource(pdev, IORESOURCE_DMA, 0); res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
if (res) if (res)
dma_params->channel = res->start; *dma = res->start;
else else
dma_params->channel = pdata->tx_dma_channel; *dma = pdata->tx_dma_channel;
/* dmaengine filter data for DT and non-DT boot */ /* dmaengine filter data for DT and non-DT boot */
if (pdev->dev.of_node) if (pdev->dev.of_node)
dma_data->filter_data = "tx"; dma_data->filter_data = "tx";
else else
dma_data->filter_data = &dma_params->channel; dma_data->filter_data = dma;
/* RX is not valid in DIT mode */ /* RX is not valid in DIT mode */
if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) { if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) {
dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE]; dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
dma_params->asp_chan_q = pdata->asp_chan_q;
dma_params->ram_chan_q = pdata->ram_chan_q;
dma_params->sram_pool = pdata->sram_pool;
dma_params->sram_size = pdata->sram_size_capture;
if (dat) if (dat)
dma_params->dma_addr = dat->start; dma_data->addr = dat->start;
else else
dma_params->dma_addr = mem->start + pdata->rx_dma_offset; dma_data->addr = mem->start + pdata->rx_dma_offset;
/* Unconditional dmaengine stuff */
dma_data->addr = dma_params->dma_addr;
dma = &mcasp->dma_request[SNDRV_PCM_STREAM_CAPTURE];
res = platform_get_resource(pdev, IORESOURCE_DMA, 1); res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
if (res) if (res)
dma_params->channel = res->start; *dma = res->start;
else else
dma_params->channel = pdata->rx_dma_channel; *dma = pdata->rx_dma_channel;
/* dmaengine filter data for DT and non-DT boot */ /* dmaengine filter data for DT and non-DT boot */
if (pdev->dev.of_node) if (pdev->dev.of_node)
dma_data->filter_data = "rx"; dma_data->filter_data = "rx";
else else
dma_data->filter_data = &dma_params->channel; dma_data->filter_data = dma;
} }
if (mcasp->version < MCASP_VERSION_3) { if (mcasp->version < MCASP_VERSION_3) {
@ -1596,17 +1553,11 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
goto err; goto err;
switch (mcasp->version) { switch (mcasp->version) {
#if IS_BUILTIN(CONFIG_SND_DAVINCI_SOC) || \
(IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
IS_MODULE(CONFIG_SND_DAVINCI_SOC))
case MCASP_VERSION_1:
case MCASP_VERSION_2:
ret = davinci_soc_platform_register(&pdev->dev);
break;
#endif
#if IS_BUILTIN(CONFIG_SND_EDMA_SOC) || \ #if IS_BUILTIN(CONFIG_SND_EDMA_SOC) || \
(IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \ (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
IS_MODULE(CONFIG_SND_EDMA_SOC)) IS_MODULE(CONFIG_SND_EDMA_SOC))
case MCASP_VERSION_1:
case MCASP_VERSION_2:
case MCASP_VERSION_3: case MCASP_VERSION_3:
ret = edma_pcm_platform_register(&pdev->dev); ret = edma_pcm_platform_register(&pdev->dev);
break; break;