mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-19 07:39:54 +02:00
ASoC: davinci-i2s: Convert to use edma-pcm
The edma-pcm can replace the old davinci-pcm as platform driver. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
4c03a5ebc7
commit
257ade78b6
|
@ -23,8 +23,9 @@
|
||||||
#include <sound/pcm_params.h>
|
#include <sound/pcm_params.h>
|
||||||
#include <sound/initval.h>
|
#include <sound/initval.h>
|
||||||
#include <sound/soc.h>
|
#include <sound/soc.h>
|
||||||
|
#include <sound/dmaengine_pcm.h>
|
||||||
|
|
||||||
#include "davinci-pcm.h"
|
#include "edma-pcm.h"
|
||||||
#include "davinci-i2s.h"
|
#include "davinci-i2s.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -122,7 +123,8 @@ static const unsigned char double_fmt[SNDRV_PCM_FORMAT_S32_LE + 1] = {
|
||||||
|
|
||||||
struct davinci_mcbsp_dev {
|
struct davinci_mcbsp_dev {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct davinci_pcm_dma_params dma_params[2];
|
struct snd_dmaengine_dai_dma_data dma_data[2];
|
||||||
|
int dma_request[2];
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
#define MOD_DSP_A 0
|
#define MOD_DSP_A 0
|
||||||
#define MOD_DSP_B 1
|
#define MOD_DSP_B 1
|
||||||
|
@ -419,8 +421,6 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_soc_dai *dai)
|
struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai);
|
struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai);
|
||||||
struct davinci_pcm_dma_params *dma_params =
|
|
||||||
&dev->dma_params[substream->stream];
|
|
||||||
struct snd_interval *i = NULL;
|
struct snd_interval *i = NULL;
|
||||||
int mcbsp_word_length, master;
|
int mcbsp_word_length, master;
|
||||||
unsigned int rcr, xcr, srgr, clk_div, freq, framesize;
|
unsigned int rcr, xcr, srgr, clk_div, freq, framesize;
|
||||||
|
@ -532,8 +532,6 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dma_params->acnt = dma_params->data_type = data_type[fmt];
|
|
||||||
dma_params->fifo_level = 0;
|
|
||||||
mcbsp_word_length = asp_word_length[fmt];
|
mcbsp_word_length = asp_word_length[fmt];
|
||||||
|
|
||||||
switch (master) {
|
switch (master) {
|
||||||
|
@ -600,15 +598,6 @@ static int davinci_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int davinci_i2s_startup(struct snd_pcm_substream *substream,
|
|
||||||
struct snd_soc_dai *dai)
|
|
||||||
{
|
|
||||||
struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai);
|
|
||||||
|
|
||||||
snd_soc_dai_set_dma_data(dai, substream, dev->dma_params);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void davinci_i2s_shutdown(struct snd_pcm_substream *substream,
|
static void davinci_i2s_shutdown(struct snd_pcm_substream *substream,
|
||||||
struct snd_soc_dai *dai)
|
struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
|
@ -620,7 +609,6 @@ static void davinci_i2s_shutdown(struct snd_pcm_substream *substream,
|
||||||
#define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000
|
#define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000
|
||||||
|
|
||||||
static const struct snd_soc_dai_ops davinci_i2s_dai_ops = {
|
static const struct snd_soc_dai_ops davinci_i2s_dai_ops = {
|
||||||
.startup = davinci_i2s_startup,
|
|
||||||
.shutdown = davinci_i2s_shutdown,
|
.shutdown = davinci_i2s_shutdown,
|
||||||
.prepare = davinci_i2s_prepare,
|
.prepare = davinci_i2s_prepare,
|
||||||
.trigger = davinci_i2s_trigger,
|
.trigger = davinci_i2s_trigger,
|
||||||
|
@ -630,7 +618,18 @@ static const struct snd_soc_dai_ops davinci_i2s_dai_ops = {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int davinci_i2s_dai_probe(struct snd_soc_dai *dai)
|
||||||
|
{
|
||||||
|
struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(dai);
|
||||||
|
|
||||||
|
dai->playback_dma_data = &dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
|
||||||
|
dai->capture_dma_data = &dev->dma_data[SNDRV_PCM_STREAM_CAPTURE];
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct snd_soc_dai_driver davinci_i2s_dai = {
|
static struct snd_soc_dai_driver davinci_i2s_dai = {
|
||||||
|
.probe = davinci_i2s_dai_probe,
|
||||||
.playback = {
|
.playback = {
|
||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
|
@ -651,11 +650,9 @@ static const struct snd_soc_component_driver davinci_i2s_component = {
|
||||||
|
|
||||||
static int davinci_i2s_probe(struct platform_device *pdev)
|
static int davinci_i2s_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct snd_platform_data *pdata = pdev->dev.platform_data;
|
|
||||||
struct davinci_mcbsp_dev *dev;
|
struct davinci_mcbsp_dev *dev;
|
||||||
struct resource *mem, *ioarea, *res;
|
struct resource *mem, *ioarea, *res;
|
||||||
enum dma_event_q asp_chan_q = EVENTQ_0;
|
int *dma;
|
||||||
enum dma_event_q ram_chan_q = EVENTQ_1;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
@ -676,22 +673,6 @@ static int davinci_i2s_probe(struct platform_device *pdev)
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
if (pdata) {
|
|
||||||
dev->enable_channel_combine = pdata->enable_channel_combine;
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].sram_size =
|
|
||||||
pdata->sram_size_playback;
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].sram_size =
|
|
||||||
pdata->sram_size_capture;
|
|
||||||
dev->clk_input_pin = pdata->clk_input_pin;
|
|
||||||
dev->i2s_accurate_sck = pdata->i2s_accurate_sck;
|
|
||||||
asp_chan_q = pdata->asp_chan_q;
|
|
||||||
ram_chan_q = pdata->ram_chan_q;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].asp_chan_q = asp_chan_q;
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].ram_chan_q = ram_chan_q;
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].asp_chan_q = asp_chan_q;
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].ram_chan_q = ram_chan_q;
|
|
||||||
|
|
||||||
dev->clk = clk_get(&pdev->dev, NULL);
|
dev->clk = clk_get(&pdev->dev, NULL);
|
||||||
if (IS_ERR(dev->clk))
|
if (IS_ERR(dev->clk))
|
||||||
|
@ -705,10 +686,10 @@ static int davinci_i2s_probe(struct platform_device *pdev)
|
||||||
goto err_release_clk;
|
goto err_release_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].dma_addr =
|
dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr =
|
||||||
(dma_addr_t)(mem->start + DAVINCI_MCBSP_DXR_REG);
|
(dma_addr_t)(mem->start + DAVINCI_MCBSP_DXR_REG);
|
||||||
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr =
|
dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr =
|
||||||
(dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_REG);
|
(dma_addr_t)(mem->start + DAVINCI_MCBSP_DRR_REG);
|
||||||
|
|
||||||
/* first TX, then RX */
|
/* first TX, then RX */
|
||||||
|
@ -718,7 +699,9 @@ static int davinci_i2s_probe(struct platform_device *pdev)
|
||||||
ret = -ENXIO;
|
ret = -ENXIO;
|
||||||
goto err_release_clk;
|
goto err_release_clk;
|
||||||
}
|
}
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].channel = res->start;
|
dma = &dev->dma_request[SNDRV_PCM_STREAM_PLAYBACK];
|
||||||
|
*dma = res->start;
|
||||||
|
dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = dma;
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
@ -726,9 +709,11 @@ static int davinci_i2s_probe(struct platform_device *pdev)
|
||||||
ret = -ENXIO;
|
ret = -ENXIO;
|
||||||
goto err_release_clk;
|
goto err_release_clk;
|
||||||
}
|
}
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start;
|
dma = &dev->dma_request[SNDRV_PCM_STREAM_CAPTURE];
|
||||||
dev->dev = &pdev->dev;
|
*dma = res->start;
|
||||||
|
dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = dma;
|
||||||
|
|
||||||
|
dev->dev = &pdev->dev;
|
||||||
dev_set_drvdata(&pdev->dev, dev);
|
dev_set_drvdata(&pdev->dev, dev);
|
||||||
|
|
||||||
ret = snd_soc_register_component(&pdev->dev, &davinci_i2s_component,
|
ret = snd_soc_register_component(&pdev->dev, &davinci_i2s_component,
|
||||||
|
@ -736,7 +721,7 @@ static int davinci_i2s_probe(struct platform_device *pdev)
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto err_release_clk;
|
goto err_release_clk;
|
||||||
|
|
||||||
ret = davinci_soc_platform_register(&pdev->dev);
|
ret = edma_pcm_platform_register(&pdev->dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
|
dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
|
||||||
goto err_unregister_component;
|
goto err_unregister_component;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user