mirror of
https://github.com/adulau/aha.git
synced 2024-12-30 20:56:23 +00:00
ASoC: Davinci: Fix race with cpu_dai->dma_data
This patch removes references to cpu_dai->dma_data. It makes struct davinci_pcm_dma_params part of struct davinci_mcbsp_dev or struct davinci_audio_dev. It removes the unused name variable from davinci_pcm_dma_params. Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
81ac55aa14
commit
92e2a6f682
5 changed files with 29 additions and 62 deletions
|
@ -97,22 +97,19 @@ enum {
|
||||||
DAVINCI_MCBSP_WORD_32,
|
DAVINCI_MCBSP_WORD_32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct davinci_pcm_dma_params davinci_i2s_pcm_out = {
|
|
||||||
.name = "I2S PCM Stereo out",
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct davinci_pcm_dma_params davinci_i2s_pcm_in = {
|
|
||||||
.name = "I2S PCM Stereo in",
|
|
||||||
};
|
|
||||||
|
|
||||||
struct davinci_mcbsp_dev {
|
struct davinci_mcbsp_dev {
|
||||||
|
/*
|
||||||
|
* dma_params must be first because rtd->dai->cpu_dai->private_data
|
||||||
|
* is cast to a pointer of an array of struct davinci_pcm_dma_params in
|
||||||
|
* davinci_pcm_open.
|
||||||
|
*/
|
||||||
|
struct davinci_pcm_dma_params dma_params[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
|
||||||
int mode;
|
int mode;
|
||||||
u32 pcr;
|
u32 pcr;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
struct davinci_pcm_dma_params *dma_params[2];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev,
|
static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev,
|
||||||
|
@ -215,14 +212,6 @@ static void davinci_mcbsp_stop(struct davinci_mcbsp_dev *dev, int playback)
|
||||||
toggle_clock(dev, playback);
|
toggle_clock(dev, playback);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int davinci_i2s_startup(struct snd_pcm_substream *substream,
|
|
||||||
struct snd_soc_dai *cpu_dai)
|
|
||||||
{
|
|
||||||
struct davinci_mcbsp_dev *dev = cpu_dai->private_data;
|
|
||||||
cpu_dai->dma_data = dev->dma_params[substream->stream];
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DEFAULT_BITPERSAMPLE 16
|
#define DEFAULT_BITPERSAMPLE 16
|
||||||
|
|
||||||
static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
||||||
|
@ -355,7 +344,7 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||||
{
|
{
|
||||||
struct davinci_mcbsp_dev *dev = dai->private_data;
|
struct davinci_mcbsp_dev *dev = dai->private_data;
|
||||||
struct davinci_pcm_dma_params *dma_params =
|
struct davinci_pcm_dma_params *dma_params =
|
||||||
dev->dma_params[substream->stream];
|
&dev->dma_params[substream->stream];
|
||||||
struct snd_interval *i = NULL;
|
struct snd_interval *i = NULL;
|
||||||
int mcbsp_word_length;
|
int mcbsp_word_length;
|
||||||
unsigned int rcr, xcr, srgr;
|
unsigned int rcr, xcr, srgr;
|
||||||
|
@ -473,7 +462,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 struct snd_soc_dai_ops davinci_i2s_dai_ops = {
|
static 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,
|
||||||
|
@ -535,12 +523,10 @@ static int davinci_i2s_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
dev->base = (void __iomem *)IO_ADDRESS(mem->start);
|
dev->base = (void __iomem *)IO_ADDRESS(mem->start);
|
||||||
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &davinci_i2s_pcm_out;
|
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].dma_addr =
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->dma_addr =
|
|
||||||
(dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG);
|
(dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG);
|
||||||
|
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &davinci_i2s_pcm_in;
|
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr =
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->dma_addr =
|
|
||||||
(dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG);
|
(dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG);
|
||||||
|
|
||||||
/* first TX, then RX */
|
/* first TX, then RX */
|
||||||
|
@ -550,7 +536,7 @@ static int davinci_i2s_probe(struct platform_device *pdev)
|
||||||
ret = -ENXIO;
|
ret = -ENXIO;
|
||||||
goto err_free_mem;
|
goto err_free_mem;
|
||||||
}
|
}
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->channel = res->start;
|
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].channel = res->start;
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
@ -558,7 +544,7 @@ static int davinci_i2s_probe(struct platform_device *pdev)
|
||||||
ret = -ENXIO;
|
ret = -ENXIO;
|
||||||
goto err_free_mem;
|
goto err_free_mem;
|
||||||
}
|
}
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->channel = res->start;
|
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start;
|
||||||
|
|
||||||
davinci_i2s_dai.private_data = dev;
|
davinci_i2s_dai.private_data = dev;
|
||||||
ret = snd_soc_register_dai(&davinci_i2s_dai);
|
ret = snd_soc_register_dai(&davinci_i2s_dai);
|
||||||
|
|
|
@ -332,14 +332,6 @@ static inline void mcasp_set_ctl_reg(void __iomem *regs, u32 val)
|
||||||
printk(KERN_ERR "GBLCTL write error\n");
|
printk(KERN_ERR "GBLCTL write error\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
|
|
||||||
struct snd_soc_dai *cpu_dai)
|
|
||||||
{
|
|
||||||
struct davinci_audio_dev *dev = cpu_dai->private_data;
|
|
||||||
cpu_dai->dma_data = dev->dma_params[substream->stream];
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mcasp_start_rx(struct davinci_audio_dev *dev)
|
static void mcasp_start_rx(struct davinci_audio_dev *dev)
|
||||||
{
|
{
|
||||||
mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
|
mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
|
||||||
|
@ -720,7 +712,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
|
||||||
{
|
{
|
||||||
struct davinci_audio_dev *dev = cpu_dai->private_data;
|
struct davinci_audio_dev *dev = cpu_dai->private_data;
|
||||||
struct davinci_pcm_dma_params *dma_params =
|
struct davinci_pcm_dma_params *dma_params =
|
||||||
dev->dma_params[substream->stream];
|
&dev->dma_params[substream->stream];
|
||||||
int word_length;
|
int word_length;
|
||||||
u8 numevt;
|
u8 numevt;
|
||||||
|
|
||||||
|
@ -798,7 +790,6 @@ static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
|
static struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
|
||||||
.startup = davinci_mcasp_startup,
|
|
||||||
.trigger = davinci_mcasp_trigger,
|
.trigger = davinci_mcasp_trigger,
|
||||||
.hw_params = davinci_mcasp_hw_params,
|
.hw_params = davinci_mcasp_hw_params,
|
||||||
.set_fmt = davinci_mcasp_set_dai_fmt,
|
.set_fmt = davinci_mcasp_set_dai_fmt,
|
||||||
|
@ -849,20 +840,12 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
||||||
struct resource *mem, *ioarea, *res;
|
struct resource *mem, *ioarea, *res;
|
||||||
struct snd_platform_data *pdata;
|
struct snd_platform_data *pdata;
|
||||||
struct davinci_audio_dev *dev;
|
struct davinci_audio_dev *dev;
|
||||||
int count = 0;
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
dev = kzalloc(sizeof(struct davinci_audio_dev), GFP_KERNEL);
|
dev = kzalloc(sizeof(struct davinci_audio_dev), GFP_KERNEL);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
dma_data = kzalloc(sizeof(struct davinci_pcm_dma_params) * 2,
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (!dma_data) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto err_release_dev;
|
|
||||||
}
|
|
||||||
|
|
||||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
if (!mem) {
|
if (!mem) {
|
||||||
dev_err(&pdev->dev, "no mem resource?\n");
|
dev_err(&pdev->dev, "no mem resource?\n");
|
||||||
|
@ -897,11 +880,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
||||||
dev->txnumevt = pdata->txnumevt;
|
dev->txnumevt = pdata->txnumevt;
|
||||||
dev->rxnumevt = pdata->rxnumevt;
|
dev->rxnumevt = pdata->rxnumevt;
|
||||||
|
|
||||||
dma_data[count].name = "I2S PCM Stereo out";
|
dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
|
||||||
dma_data[count].eventq_no = pdata->eventq_no;
|
dma_data->eventq_no = pdata->eventq_no;
|
||||||
dma_data[count].dma_addr = (dma_addr_t) (pdata->tx_dma_offset +
|
dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset +
|
||||||
io_v2p(dev->base));
|
io_v2p(dev->base));
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &dma_data[count];
|
|
||||||
|
|
||||||
/* first TX, then RX */
|
/* first TX, then RX */
|
||||||
res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
||||||
|
@ -910,13 +892,12 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
||||||
goto err_release_region;
|
goto err_release_region;
|
||||||
}
|
}
|
||||||
|
|
||||||
dma_data[count].channel = res->start;
|
dma_data->channel = res->start;
|
||||||
count++;
|
|
||||||
dma_data[count].name = "I2S PCM Stereo in";
|
dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE];
|
||||||
dma_data[count].eventq_no = pdata->eventq_no;
|
dma_data->eventq_no = pdata->eventq_no;
|
||||||
dma_data[count].dma_addr = (dma_addr_t)(pdata->rx_dma_offset +
|
dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset +
|
||||||
io_v2p(dev->base));
|
io_v2p(dev->base));
|
||||||
dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &dma_data[count];
|
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
@ -924,7 +905,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
||||||
goto err_release_region;
|
goto err_release_region;
|
||||||
}
|
}
|
||||||
|
|
||||||
dma_data[count].channel = res->start;
|
dma_data->channel = res->start;
|
||||||
davinci_mcasp_dai[pdata->op_mode].private_data = dev;
|
davinci_mcasp_dai[pdata->op_mode].private_data = dev;
|
||||||
davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev;
|
davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev;
|
||||||
ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]);
|
ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]);
|
||||||
|
@ -936,8 +917,6 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
||||||
err_release_region:
|
err_release_region:
|
||||||
release_mem_region(mem->start, (mem->end - mem->start) + 1);
|
release_mem_region(mem->start, (mem->end - mem->start) + 1);
|
||||||
err_release_data:
|
err_release_data:
|
||||||
kfree(dma_data);
|
|
||||||
err_release_dev:
|
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -946,7 +925,6 @@ err_release_dev:
|
||||||
static int davinci_mcasp_remove(struct platform_device *pdev)
|
static int davinci_mcasp_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct snd_platform_data *pdata = pdev->dev.platform_data;
|
struct snd_platform_data *pdata = pdev->dev.platform_data;
|
||||||
struct davinci_pcm_dma_params *dma_data;
|
|
||||||
struct davinci_audio_dev *dev;
|
struct davinci_audio_dev *dev;
|
||||||
struct resource *mem;
|
struct resource *mem;
|
||||||
|
|
||||||
|
@ -959,8 +937,6 @@ static int davinci_mcasp_remove(struct platform_device *pdev)
|
||||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
release_mem_region(mem->start, (mem->end - mem->start) + 1);
|
release_mem_region(mem->start, (mem->end - mem->start) + 1);
|
||||||
|
|
||||||
dma_data = dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
|
|
||||||
kfree(dma_data);
|
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -39,10 +39,15 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct davinci_audio_dev {
|
struct davinci_audio_dev {
|
||||||
|
/*
|
||||||
|
* dma_params must be first because rtd->dai->cpu_dai->private_data
|
||||||
|
* is cast to a pointer of an array of struct davinci_pcm_dma_params in
|
||||||
|
* davinci_pcm_open.
|
||||||
|
*/
|
||||||
|
struct davinci_pcm_dma_params dma_params[2];
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
int sample_rate;
|
int sample_rate;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
struct davinci_pcm_dma_params *dma_params[2];
|
|
||||||
unsigned int codec_fmt;
|
unsigned int codec_fmt;
|
||||||
|
|
||||||
/* McASP specific data */
|
/* McASP specific data */
|
||||||
|
|
|
@ -238,7 +238,8 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream)
|
||||||
struct davinci_runtime_data *prtd;
|
struct davinci_runtime_data *prtd;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
struct davinci_pcm_dma_params *params = rtd->dai->cpu_dai->dma_data;
|
struct davinci_pcm_dma_params *pa = rtd->dai->cpu_dai->private_data;
|
||||||
|
struct davinci_pcm_dma_params *params = &pa[substream->stream];
|
||||||
if (!params)
|
if (!params)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
|
|
||||||
struct davinci_pcm_dma_params {
|
struct davinci_pcm_dma_params {
|
||||||
char *name; /* stream identifier */
|
|
||||||
int channel; /* sync dma channel ID */
|
int channel; /* sync dma channel ID */
|
||||||
unsigned short acnt;
|
unsigned short acnt;
|
||||||
dma_addr_t dma_addr; /* device physical address for DMA */
|
dma_addr_t dma_addr; /* device physical address for DMA */
|
||||||
|
|
Loading…
Reference in a new issue