aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/davinci/davinci-i2s.c
diff options
context:
space:
mode:
authorTroy Kisky <troy.kisky@boundarydevices.com>2009-09-11 17:29:03 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2009-09-23 13:08:57 -0400
commit92e2a6f68219f8d4c862b1f29c653b05639e4c06 (patch)
tree2a6dedf5568554f1555478e2d6d43eefb692990e /sound/soc/davinci/davinci-i2s.c
parent81ac55aa14c863821248d9e82694c79bb556694d (diff)
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>
Diffstat (limited to 'sound/soc/davinci/davinci-i2s.c')
-rw-r--r--sound/soc/davinci/davinci-i2s.c36
1 files changed, 11 insertions, 25 deletions
diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c
index d32e1974fdf2..4ae707048021 100644
--- a/sound/soc/davinci/davinci-i2s.c
+++ b/sound/soc/davinci/davinci-i2s.c
@@ -97,22 +97,19 @@ enum {
97 DAVINCI_MCBSP_WORD_32, 97 DAVINCI_MCBSP_WORD_32,
98}; 98};
99 99
100static struct davinci_pcm_dma_params davinci_i2s_pcm_out = {
101 .name = "I2S PCM Stereo out",
102};
103
104static struct davinci_pcm_dma_params davinci_i2s_pcm_in = {
105 .name = "I2S PCM Stereo in",
106};
107
108struct davinci_mcbsp_dev { 100struct davinci_mcbsp_dev {
101 /*
102 * dma_params must be first because rtd->dai->cpu_dai->private_data
103 * is cast to a pointer of an array of struct davinci_pcm_dma_params in
104 * davinci_pcm_open.
105 */
106 struct davinci_pcm_dma_params dma_params[2];
109 void __iomem *base; 107 void __iomem *base;
110#define MOD_DSP_A 0 108#define MOD_DSP_A 0
111#define MOD_DSP_B 1 109#define MOD_DSP_B 1
112 int mode; 110 int mode;
113 u32 pcr; 111 u32 pcr;
114 struct clk *clk; 112 struct clk *clk;
115 struct davinci_pcm_dma_params *dma_params[2];
116}; 113};
117 114
118static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, 115static 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)
215 toggle_clock(dev, playback); 212 toggle_clock(dev, playback);
216} 213}
217 214
218static int davinci_i2s_startup(struct snd_pcm_substream *substream,
219 struct snd_soc_dai *cpu_dai)
220{
221 struct davinci_mcbsp_dev *dev = cpu_dai->private_data;
222 cpu_dai->dma_data = dev->dma_params[substream->stream];
223 return 0;
224}
225
226#define DEFAULT_BITPERSAMPLE 16 215#define DEFAULT_BITPERSAMPLE 16
227 216
228static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, 217static 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,
355{ 344{
356 struct davinci_mcbsp_dev *dev = dai->private_data; 345 struct davinci_mcbsp_dev *dev = dai->private_data;
357 struct davinci_pcm_dma_params *dma_params = 346 struct davinci_pcm_dma_params *dma_params =
358 dev->dma_params[substream->stream]; 347 &dev->dma_params[substream->stream];
359 struct snd_interval *i = NULL; 348 struct snd_interval *i = NULL;
360 int mcbsp_word_length; 349 int mcbsp_word_length;
361 unsigned int rcr, xcr, srgr; 350 unsigned int rcr, xcr, srgr;
@@ -473,7 +462,6 @@ static void davinci_i2s_shutdown(struct snd_pcm_substream *substream,
473#define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000 462#define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000
474 463
475static struct snd_soc_dai_ops davinci_i2s_dai_ops = { 464static struct snd_soc_dai_ops davinci_i2s_dai_ops = {
476 .startup = davinci_i2s_startup,
477 .shutdown = davinci_i2s_shutdown, 465 .shutdown = davinci_i2s_shutdown,
478 .prepare = davinci_i2s_prepare, 466 .prepare = davinci_i2s_prepare,
479 .trigger = davinci_i2s_trigger, 467 .trigger = davinci_i2s_trigger,
@@ -535,12 +523,10 @@ static int davinci_i2s_probe(struct platform_device *pdev)
535 523
536 dev->base = (void __iomem *)IO_ADDRESS(mem->start); 524 dev->base = (void __iomem *)IO_ADDRESS(mem->start);
537 525
538 dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &davinci_i2s_pcm_out; 526 dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].dma_addr =
539 dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->dma_addr =
540 (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG); 527 (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG);
541 528
542 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &davinci_i2s_pcm_in; 529 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr =
543 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->dma_addr =
544 (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG); 530 (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG);
545 531
546 /* first TX, then RX */ 532 /* first TX, then RX */
@@ -550,7 +536,7 @@ static int davinci_i2s_probe(struct platform_device *pdev)
550 ret = -ENXIO; 536 ret = -ENXIO;
551 goto err_free_mem; 537 goto err_free_mem;
552 } 538 }
553 dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->channel = res->start; 539 dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].channel = res->start;
554 540
555 res = platform_get_resource(pdev, IORESOURCE_DMA, 1); 541 res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
556 if (!res) { 542 if (!res) {
@@ -558,7 +544,7 @@ static int davinci_i2s_probe(struct platform_device *pdev)
558 ret = -ENXIO; 544 ret = -ENXIO;
559 goto err_free_mem; 545 goto err_free_mem;
560 } 546 }
561 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->channel = res->start; 547 dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start;
562 548
563 davinci_i2s_dai.private_data = dev; 549 davinci_i2s_dai.private_data = dev;
564 ret = snd_soc_register_dai(&davinci_i2s_dai); 550 ret = snd_soc_register_dai(&davinci_i2s_dai);