diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-09-23 13:54:06 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-09-23 13:54:06 -0400 |
commit | 2c9ee33d37a6f3808c4319f0849671fafa8a6f4c (patch) | |
tree | 2047f0a8460d7df8d9c96e6924be0bc97ae5d403 /sound | |
parent | 766df6d98f9c28dfc6f72c23a010819719e4c3e0 (diff) | |
parent | 539d3d8cbe5cf7597d4c4c4428aec242f9ea5185 (diff) |
Merge branch 'for-2.6.32' into for-2.6.33
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/blackfin/bf5xx-i2s.c | 8 | ||||
-rw-r--r-- | sound/soc/blackfin/bf5xx-tdm.c | 8 | ||||
-rw-r--r-- | sound/soc/codecs/ad1836.c | 3 | ||||
-rw-r--r-- | sound/soc/codecs/ad1938.c | 2 | ||||
-rw-r--r-- | sound/soc/codecs/wm8753.c | 1 | ||||
-rw-r--r-- | sound/soc/davinci/davinci-i2s.c | 37 | ||||
-rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 80 | ||||
-rw-r--r-- | sound/soc/davinci/davinci-mcasp.h | 7 | ||||
-rw-r--r-- | sound/soc/davinci/davinci-pcm.c | 13 | ||||
-rw-r--r-- | sound/soc/davinci/davinci-pcm.h | 1 |
10 files changed, 63 insertions, 97 deletions
diff --git a/sound/soc/blackfin/bf5xx-i2s.c b/sound/soc/blackfin/bf5xx-i2s.c index fe2c35ddcbf4..3e6ada0dd1c4 100644 --- a/sound/soc/blackfin/bf5xx-i2s.c +++ b/sound/soc/blackfin/bf5xx-i2s.c | |||
@@ -76,12 +76,12 @@ static struct sport_param sport_params[2] = { | |||
76 | * TFS. When Port G is selected and EMAC then there is a conflict between | 76 | * TFS. When Port G is selected and EMAC then there is a conflict between |
77 | * the PHY interrupt line and TFS. Current settings prevent the conflict | 77 | * the PHY interrupt line and TFS. Current settings prevent the conflict |
78 | * by ignoring the TFS pin when Port G is selected. This allows both | 78 | * by ignoring the TFS pin when Port G is selected. This allows both |
79 | * ssm2602 using Port G and EMAC concurrently. | 79 | * codecs and EMAC using Port G concurrently. |
80 | */ | 80 | */ |
81 | #ifdef CONFIG_BF527_SPORT0_PORTF | 81 | #ifdef CONFIG_BF527_SPORT0_PORTG |
82 | #define LOCAL_SPORT0_TFS (P_SPORT0_TFS) | ||
83 | #else | ||
84 | #define LOCAL_SPORT0_TFS (0) | 82 | #define LOCAL_SPORT0_TFS (0) |
83 | #else | ||
84 | #define LOCAL_SPORT0_TFS (P_SPORT0_TFS) | ||
85 | #endif | 85 | #endif |
86 | 86 | ||
87 | static u16 sport_req[][7] = { {P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS, | 87 | static u16 sport_req[][7] = { {P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS, |
diff --git a/sound/soc/blackfin/bf5xx-tdm.c b/sound/soc/blackfin/bf5xx-tdm.c index 600987d8a871..4b360124083e 100644 --- a/sound/soc/blackfin/bf5xx-tdm.c +++ b/sound/soc/blackfin/bf5xx-tdm.c | |||
@@ -70,12 +70,12 @@ static struct sport_param sport_params[2] = { | |||
70 | * TFS. When Port G is selected and EMAC then there is a conflict between | 70 | * TFS. When Port G is selected and EMAC then there is a conflict between |
71 | * the PHY interrupt line and TFS. Current settings prevent the conflict | 71 | * the PHY interrupt line and TFS. Current settings prevent the conflict |
72 | * by ignoring the TFS pin when Port G is selected. This allows both | 72 | * by ignoring the TFS pin when Port G is selected. This allows both |
73 | * ssm2602 using Port G and EMAC concurrently. | 73 | * codecs and EMAC using Port G concurrently. |
74 | */ | 74 | */ |
75 | #ifdef CONFIG_BF527_SPORT0_PORTF | 75 | #ifdef CONFIG_BF527_SPORT0_PORTG |
76 | #define LOCAL_SPORT0_TFS (P_SPORT0_TFS) | ||
77 | #else | ||
78 | #define LOCAL_SPORT0_TFS (0) | 76 | #define LOCAL_SPORT0_TFS (0) |
77 | #else | ||
78 | #define LOCAL_SPORT0_TFS (P_SPORT0_TFS) | ||
79 | #endif | 79 | #endif |
80 | 80 | ||
81 | static u16 sport_req[][7] = { {P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS, | 81 | static u16 sport_req[][7] = { {P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS, |
diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c index 01343dc984fd..c48485f2c55d 100644 --- a/sound/soc/codecs/ad1836.c +++ b/sound/soc/codecs/ad1836.c | |||
@@ -251,8 +251,7 @@ static int __devexit ad1836_spi_remove(struct spi_device *spi) | |||
251 | 251 | ||
252 | static struct spi_driver ad1836_spi_driver = { | 252 | static struct spi_driver ad1836_spi_driver = { |
253 | .driver = { | 253 | .driver = { |
254 | .name = "ad1836-spi", | 254 | .name = "ad1836", |
255 | .bus = &spi_bus_type, | ||
256 | .owner = THIS_MODULE, | 255 | .owner = THIS_MODULE, |
257 | }, | 256 | }, |
258 | .probe = ad1836_spi_probe, | 257 | .probe = ad1836_spi_probe, |
diff --git a/sound/soc/codecs/ad1938.c b/sound/soc/codecs/ad1938.c index 9a049a1995a3..34b30efc3cb0 100644 --- a/sound/soc/codecs/ad1938.c +++ b/sound/soc/codecs/ad1938.c | |||
@@ -456,7 +456,6 @@ static int __devexit ad1938_spi_remove(struct spi_device *spi) | |||
456 | static struct spi_driver ad1938_spi_driver = { | 456 | static struct spi_driver ad1938_spi_driver = { |
457 | .driver = { | 457 | .driver = { |
458 | .name = "ad1938", | 458 | .name = "ad1938", |
459 | .bus = &spi_bus_type, | ||
460 | .owner = THIS_MODULE, | 459 | .owner = THIS_MODULE, |
461 | }, | 460 | }, |
462 | .probe = ad1938_spi_probe, | 461 | .probe = ad1938_spi_probe, |
@@ -515,6 +514,7 @@ static int ad1938_register(struct ad1938_priv *ad1938) | |||
515 | codec->num_dai = 1; | 514 | codec->num_dai = 1; |
516 | codec->write = ad1938_write_reg; | 515 | codec->write = ad1938_write_reg; |
517 | codec->read = ad1938_read_reg_cache; | 516 | codec->read = ad1938_read_reg_cache; |
517 | codec->set_bias_level = ad1938_set_bias_level; | ||
518 | INIT_LIST_HEAD(&codec->dapm_widgets); | 518 | INIT_LIST_HEAD(&codec->dapm_widgets); |
519 | INIT_LIST_HEAD(&codec->dapm_paths); | 519 | INIT_LIST_HEAD(&codec->dapm_paths); |
520 | 520 | ||
diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c index f60f3a02d1f8..9b27efb052fe 100644 --- a/sound/soc/codecs/wm8753.c +++ b/sound/soc/codecs/wm8753.c | |||
@@ -595,6 +595,7 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
595 | 595 | ||
596 | /* Mono Capture mixer-mux */ | 596 | /* Mono Capture mixer-mux */ |
597 | {"Capture Right Mixer", "Stereo", "Capture Right Mux"}, | 597 | {"Capture Right Mixer", "Stereo", "Capture Right Mux"}, |
598 | {"Capture Left Mixer", "Stereo", "Capture Left Mux"}, | ||
598 | {"Capture Left Mixer", "Analogue Mix Left", "Capture Left Mux"}, | 599 | {"Capture Left Mixer", "Analogue Mix Left", "Capture Left Mux"}, |
599 | {"Capture Left Mixer", "Analogue Mix Left", "Capture Right Mux"}, | 600 | {"Capture Left Mixer", "Analogue Mix Left", "Capture Right Mux"}, |
600 | {"Capture Right Mixer", "Analogue Mix Right", "Capture Left Mux"}, | 601 | {"Capture Right Mixer", "Analogue Mix Right", "Capture Left Mux"}, |
diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index 12a6c549ee6e..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 | ||
100 | static struct davinci_pcm_dma_params davinci_i2s_pcm_out = { | ||
101 | .name = "I2S PCM Stereo out", | ||
102 | }; | ||
103 | |||
104 | static struct davinci_pcm_dma_params davinci_i2s_pcm_in = { | ||
105 | .name = "I2S PCM Stereo in", | ||
106 | }; | ||
107 | |||
108 | struct davinci_mcbsp_dev { | 100 | struct 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 | ||
118 | static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, | 115 | 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) | |||
215 | toggle_clock(dev, playback); | 212 | toggle_clock(dev, playback); |
216 | } | 213 | } |
217 | 214 | ||
218 | static 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 | ||
228 | static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, | 217 | static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, |
@@ -353,8 +342,9 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream, | |||
353 | struct snd_pcm_hw_params *params, | 342 | struct snd_pcm_hw_params *params, |
354 | struct snd_soc_dai *dai) | 343 | struct snd_soc_dai *dai) |
355 | { | 344 | { |
356 | struct davinci_pcm_dma_params *dma_params = dai->dma_data; | ||
357 | struct davinci_mcbsp_dev *dev = dai->private_data; | 345 | struct davinci_mcbsp_dev *dev = dai->private_data; |
346 | struct davinci_pcm_dma_params *dma_params = | ||
347 | &dev->dma_params[substream->stream]; | ||
358 | struct snd_interval *i = NULL; | 348 | struct snd_interval *i = NULL; |
359 | int mcbsp_word_length; | 349 | int mcbsp_word_length; |
360 | unsigned int rcr, xcr, srgr; | 350 | unsigned int rcr, xcr, srgr; |
@@ -472,7 +462,6 @@ static void davinci_i2s_shutdown(struct snd_pcm_substream *substream, | |||
472 | #define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000 | 462 | #define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000 |
473 | 463 | ||
474 | static struct snd_soc_dai_ops davinci_i2s_dai_ops = { | 464 | static struct snd_soc_dai_ops davinci_i2s_dai_ops = { |
475 | .startup = davinci_i2s_startup, | ||
476 | .shutdown = davinci_i2s_shutdown, | 465 | .shutdown = davinci_i2s_shutdown, |
477 | .prepare = davinci_i2s_prepare, | 466 | .prepare = davinci_i2s_prepare, |
478 | .trigger = davinci_i2s_trigger, | 467 | .trigger = davinci_i2s_trigger, |
@@ -534,12 +523,10 @@ static int davinci_i2s_probe(struct platform_device *pdev) | |||
534 | 523 | ||
535 | dev->base = (void __iomem *)IO_ADDRESS(mem->start); | 524 | dev->base = (void __iomem *)IO_ADDRESS(mem->start); |
536 | 525 | ||
537 | dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &davinci_i2s_pcm_out; | 526 | dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].dma_addr = |
538 | dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->dma_addr = | ||
539 | (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG); | 527 | (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG); |
540 | 528 | ||
541 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &davinci_i2s_pcm_in; | 529 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].dma_addr = |
542 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->dma_addr = | ||
543 | (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG); | 530 | (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG); |
544 | 531 | ||
545 | /* first TX, then RX */ | 532 | /* first TX, then RX */ |
@@ -549,7 +536,7 @@ static int davinci_i2s_probe(struct platform_device *pdev) | |||
549 | ret = -ENXIO; | 536 | ret = -ENXIO; |
550 | goto err_free_mem; | 537 | goto err_free_mem; |
551 | } | 538 | } |
552 | dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->channel = res->start; | 539 | dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].channel = res->start; |
553 | 540 | ||
554 | res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | 541 | res = platform_get_resource(pdev, IORESOURCE_DMA, 1); |
555 | if (!res) { | 542 | if (!res) { |
@@ -557,7 +544,7 @@ static int davinci_i2s_probe(struct platform_device *pdev) | |||
557 | ret = -ENXIO; | 544 | ret = -ENXIO; |
558 | goto err_free_mem; | 545 | goto err_free_mem; |
559 | } | 546 | } |
560 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->channel = res->start; | 547 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; |
561 | 548 | ||
562 | davinci_i2s_dai.private_data = dev; | 549 | davinci_i2s_dai.private_data = dev; |
563 | ret = snd_soc_register_dai(&davinci_i2s_dai); | 550 | ret = snd_soc_register_dai(&davinci_i2s_dai); |
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 7a06c0a86665..5d1f98a4c978 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
@@ -332,14 +332,6 @@ static inline void mcasp_set_ctl_reg(void __iomem *regs, u32 val) | |||
332 | printk(KERN_ERR "GBLCTL write error\n"); | 332 | printk(KERN_ERR "GBLCTL write error\n"); |
333 | } | 333 | } |
334 | 334 | ||
335 | static int davinci_mcasp_startup(struct snd_pcm_substream *substream, | ||
336 | struct snd_soc_dai *cpu_dai) | ||
337 | { | ||
338 | struct davinci_audio_dev *dev = cpu_dai->private_data; | ||
339 | cpu_dai->dma_data = dev->dma_params[substream->stream]; | ||
340 | return 0; | ||
341 | } | ||
342 | |||
343 | static void mcasp_start_rx(struct davinci_audio_dev *dev) | 335 | static void mcasp_start_rx(struct davinci_audio_dev *dev) |
344 | { | 336 | { |
345 | mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST); | 337 | mcasp_set_ctl_reg(dev->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST); |
@@ -386,17 +378,17 @@ static void mcasp_start_tx(struct davinci_audio_dev *dev) | |||
386 | 378 | ||
387 | static void davinci_mcasp_start(struct davinci_audio_dev *dev, int stream) | 379 | static void davinci_mcasp_start(struct davinci_audio_dev *dev, int stream) |
388 | { | 380 | { |
389 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) | 381 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { |
382 | if (dev->txnumevt) /* enable FIFO */ | ||
383 | mcasp_set_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, | ||
384 | FIFO_ENABLE); | ||
390 | mcasp_start_tx(dev); | 385 | mcasp_start_tx(dev); |
391 | else | 386 | } else { |
387 | if (dev->rxnumevt) /* enable FIFO */ | ||
388 | mcasp_set_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, | ||
389 | FIFO_ENABLE); | ||
392 | mcasp_start_rx(dev); | 390 | mcasp_start_rx(dev); |
393 | 391 | } | |
394 | /* enable FIFO */ | ||
395 | if (dev->txnumevt) | ||
396 | mcasp_set_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE); | ||
397 | |||
398 | if (dev->rxnumevt) | ||
399 | mcasp_set_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE); | ||
400 | } | 392 | } |
401 | 393 | ||
402 | static void mcasp_stop_rx(struct davinci_audio_dev *dev) | 394 | static void mcasp_stop_rx(struct davinci_audio_dev *dev) |
@@ -413,17 +405,17 @@ static void mcasp_stop_tx(struct davinci_audio_dev *dev) | |||
413 | 405 | ||
414 | static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream) | 406 | static void davinci_mcasp_stop(struct davinci_audio_dev *dev, int stream) |
415 | { | 407 | { |
416 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) | 408 | if (stream == SNDRV_PCM_STREAM_PLAYBACK) { |
409 | if (dev->txnumevt) /* disable FIFO */ | ||
410 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, | ||
411 | FIFO_ENABLE); | ||
417 | mcasp_stop_tx(dev); | 412 | mcasp_stop_tx(dev); |
418 | else | 413 | } else { |
414 | if (dev->rxnumevt) /* disable FIFO */ | ||
415 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, | ||
416 | FIFO_ENABLE); | ||
419 | mcasp_stop_rx(dev); | 417 | mcasp_stop_rx(dev); |
420 | 418 | } | |
421 | /* disable FIFO */ | ||
422 | if (dev->txnumevt) | ||
423 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE); | ||
424 | |||
425 | if (dev->rxnumevt) | ||
426 | mcasp_clr_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE); | ||
427 | } | 419 | } |
428 | 420 | ||
429 | static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | 421 | static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, |
@@ -720,7 +712,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, | |||
720 | { | 712 | { |
721 | struct davinci_audio_dev *dev = cpu_dai->private_data; | 713 | struct davinci_audio_dev *dev = cpu_dai->private_data; |
722 | struct davinci_pcm_dma_params *dma_params = | 714 | struct davinci_pcm_dma_params *dma_params = |
723 | dev->dma_params[substream->stream]; | 715 | &dev->dma_params[substream->stream]; |
724 | int word_length; | 716 | int word_length; |
725 | u8 numevt; | 717 | u8 numevt; |
726 | 718 | ||
@@ -798,7 +790,6 @@ static int davinci_mcasp_trigger(struct snd_pcm_substream *substream, | |||
798 | } | 790 | } |
799 | 791 | ||
800 | static struct snd_soc_dai_ops davinci_mcasp_dai_ops = { | 792 | static struct snd_soc_dai_ops davinci_mcasp_dai_ops = { |
801 | .startup = davinci_mcasp_startup, | ||
802 | .trigger = davinci_mcasp_trigger, | 793 | .trigger = davinci_mcasp_trigger, |
803 | .hw_params = davinci_mcasp_hw_params, | 794 | .hw_params = davinci_mcasp_hw_params, |
804 | .set_fmt = davinci_mcasp_set_dai_fmt, | 795 | .set_fmt = davinci_mcasp_set_dai_fmt, |
@@ -849,20 +840,12 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
849 | struct resource *mem, *ioarea, *res; | 840 | struct resource *mem, *ioarea, *res; |
850 | struct snd_platform_data *pdata; | 841 | struct snd_platform_data *pdata; |
851 | struct davinci_audio_dev *dev; | 842 | struct davinci_audio_dev *dev; |
852 | int count = 0; | ||
853 | int ret = 0; | 843 | int ret = 0; |
854 | 844 | ||
855 | dev = kzalloc(sizeof(struct davinci_audio_dev), GFP_KERNEL); | 845 | dev = kzalloc(sizeof(struct davinci_audio_dev), GFP_KERNEL); |
856 | if (!dev) | 846 | if (!dev) |
857 | return -ENOMEM; | 847 | return -ENOMEM; |
858 | 848 | ||
859 | dma_data = kzalloc(sizeof(struct davinci_pcm_dma_params) * 2, | ||
860 | GFP_KERNEL); | ||
861 | if (!dma_data) { | ||
862 | ret = -ENOMEM; | ||
863 | goto err_release_dev; | ||
864 | } | ||
865 | |||
866 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 849 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
867 | if (!mem) { | 850 | if (!mem) { |
868 | dev_err(&pdev->dev, "no mem resource?\n"); | 851 | dev_err(&pdev->dev, "no mem resource?\n"); |
@@ -897,11 +880,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
897 | dev->txnumevt = pdata->txnumevt; | 880 | dev->txnumevt = pdata->txnumevt; |
898 | dev->rxnumevt = pdata->rxnumevt; | 881 | dev->rxnumevt = pdata->rxnumevt; |
899 | 882 | ||
900 | dma_data[count].name = "I2S PCM Stereo out"; | 883 | dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]; |
901 | dma_data[count].eventq_no = pdata->eventq_no; | 884 | dma_data->eventq_no = pdata->eventq_no; |
902 | dma_data[count].dma_addr = (dma_addr_t) (pdata->tx_dma_offset + | 885 | dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset + |
903 | io_v2p(dev->base)); | 886 | io_v2p(dev->base)); |
904 | dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &dma_data[count]; | ||
905 | 887 | ||
906 | /* first TX, then RX */ | 888 | /* first TX, then RX */ |
907 | res = platform_get_resource(pdev, IORESOURCE_DMA, 0); | 889 | res = platform_get_resource(pdev, IORESOURCE_DMA, 0); |
@@ -910,13 +892,12 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
910 | goto err_release_region; | 892 | goto err_release_region; |
911 | } | 893 | } |
912 | 894 | ||
913 | dma_data[count].channel = res->start; | 895 | dma_data->channel = res->start; |
914 | count++; | 896 | |
915 | dma_data[count].name = "I2S PCM Stereo in"; | 897 | dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]; |
916 | dma_data[count].eventq_no = pdata->eventq_no; | 898 | dma_data->eventq_no = pdata->eventq_no; |
917 | dma_data[count].dma_addr = (dma_addr_t)(pdata->rx_dma_offset + | 899 | dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset + |
918 | io_v2p(dev->base)); | 900 | io_v2p(dev->base)); |
919 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &dma_data[count]; | ||
920 | 901 | ||
921 | res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | 902 | res = platform_get_resource(pdev, IORESOURCE_DMA, 1); |
922 | if (!res) { | 903 | if (!res) { |
@@ -924,7 +905,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
924 | goto err_release_region; | 905 | goto err_release_region; |
925 | } | 906 | } |
926 | 907 | ||
927 | dma_data[count].channel = res->start; | 908 | dma_data->channel = res->start; |
928 | davinci_mcasp_dai[pdata->op_mode].private_data = dev; | 909 | davinci_mcasp_dai[pdata->op_mode].private_data = dev; |
929 | davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev; | 910 | davinci_mcasp_dai[pdata->op_mode].dev = &pdev->dev; |
930 | ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]); | 911 | ret = snd_soc_register_dai(&davinci_mcasp_dai[pdata->op_mode]); |
@@ -936,8 +917,6 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
936 | err_release_region: | 917 | err_release_region: |
937 | release_mem_region(mem->start, (mem->end - mem->start) + 1); | 918 | release_mem_region(mem->start, (mem->end - mem->start) + 1); |
938 | err_release_data: | 919 | err_release_data: |
939 | kfree(dma_data); | ||
940 | err_release_dev: | ||
941 | kfree(dev); | 920 | kfree(dev); |
942 | 921 | ||
943 | return ret; | 922 | return ret; |
@@ -946,7 +925,6 @@ err_release_dev: | |||
946 | static int davinci_mcasp_remove(struct platform_device *pdev) | 925 | static int davinci_mcasp_remove(struct platform_device *pdev) |
947 | { | 926 | { |
948 | struct snd_platform_data *pdata = pdev->dev.platform_data; | 927 | struct snd_platform_data *pdata = pdev->dev.platform_data; |
949 | struct davinci_pcm_dma_params *dma_data; | ||
950 | struct davinci_audio_dev *dev; | 928 | struct davinci_audio_dev *dev; |
951 | struct resource *mem; | 929 | struct resource *mem; |
952 | 930 | ||
@@ -959,8 +937,6 @@ static int davinci_mcasp_remove(struct platform_device *pdev) | |||
959 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 937 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
960 | release_mem_region(mem->start, (mem->end - mem->start) + 1); | 938 | release_mem_region(mem->start, (mem->end - mem->start) + 1); |
961 | 939 | ||
962 | dma_data = dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]; | ||
963 | kfree(dma_data); | ||
964 | kfree(dev); | 940 | kfree(dev); |
965 | 941 | ||
966 | return 0; | 942 | return 0; |
diff --git a/sound/soc/davinci/davinci-mcasp.h b/sound/soc/davinci/davinci-mcasp.h index 554354c1cc2f..9d179cc88f7b 100644 --- a/sound/soc/davinci/davinci-mcasp.h +++ b/sound/soc/davinci/davinci-mcasp.h | |||
@@ -39,10 +39,15 @@ enum { | |||
39 | }; | 39 | }; |
40 | 40 | ||
41 | struct davinci_audio_dev { | 41 | struct davinci_audio_dev { |
42 | /* | ||
43 | * dma_params must be first because rtd->dai->cpu_dai->private_data | ||
44 | * is cast to a pointer of an array of struct davinci_pcm_dma_params in | ||
45 | * davinci_pcm_open. | ||
46 | */ | ||
47 | struct davinci_pcm_dma_params dma_params[2]; | ||
42 | void __iomem *base; | 48 | void __iomem *base; |
43 | int sample_rate; | 49 | int sample_rate; |
44 | struct clk *clk; | 50 | struct clk *clk; |
45 | struct davinci_pcm_dma_params *dma_params[2]; | ||
46 | unsigned int codec_fmt; | 51 | unsigned int codec_fmt; |
47 | 52 | ||
48 | /* McASP specific data */ | 53 | /* McASP specific data */ |
diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c index 091dacb78b4d..359e99ec7244 100644 --- a/sound/soc/davinci/davinci-pcm.c +++ b/sound/soc/davinci/davinci-pcm.c | |||
@@ -126,16 +126,9 @@ static void davinci_pcm_dma_irq(unsigned lch, u16 ch_status, void *data) | |||
126 | static int davinci_pcm_dma_request(struct snd_pcm_substream *substream) | 126 | static int davinci_pcm_dma_request(struct snd_pcm_substream *substream) |
127 | { | 127 | { |
128 | struct davinci_runtime_data *prtd = substream->runtime->private_data; | 128 | struct davinci_runtime_data *prtd = substream->runtime->private_data; |
129 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | ||
130 | struct davinci_pcm_dma_params *dma_data = rtd->dai->cpu_dai->dma_data; | ||
131 | struct edmacc_param p_ram; | 129 | struct edmacc_param p_ram; |
132 | int ret; | 130 | int ret; |
133 | 131 | ||
134 | if (!dma_data) | ||
135 | return -ENODEV; | ||
136 | |||
137 | prtd->params = dma_data; | ||
138 | |||
139 | /* Request master DMA channel */ | 132 | /* Request master DMA channel */ |
140 | ret = edma_alloc_channel(prtd->params->channel, | 133 | ret = edma_alloc_channel(prtd->params->channel, |
141 | davinci_pcm_dma_irq, substream, | 134 | davinci_pcm_dma_irq, substream, |
@@ -244,6 +237,11 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream) | |||
244 | struct snd_pcm_runtime *runtime = substream->runtime; | 237 | struct snd_pcm_runtime *runtime = substream->runtime; |
245 | struct davinci_runtime_data *prtd; | 238 | struct davinci_runtime_data *prtd; |
246 | int ret = 0; | 239 | int ret = 0; |
240 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | ||
241 | struct davinci_pcm_dma_params *pa = rtd->dai->cpu_dai->private_data; | ||
242 | struct davinci_pcm_dma_params *params = &pa[substream->stream]; | ||
243 | if (!params) | ||
244 | return -ENODEV; | ||
247 | 245 | ||
248 | snd_soc_set_runtime_hwparams(substream, &davinci_pcm_hardware); | 246 | snd_soc_set_runtime_hwparams(substream, &davinci_pcm_hardware); |
249 | /* ensure that buffer size is a multiple of period size */ | 247 | /* ensure that buffer size is a multiple of period size */ |
@@ -257,6 +255,7 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream) | |||
257 | return -ENOMEM; | 255 | return -ENOMEM; |
258 | 256 | ||
259 | spin_lock_init(&prtd->lock); | 257 | spin_lock_init(&prtd->lock); |
258 | prtd->params = params; | ||
260 | 259 | ||
261 | runtime->private_data = prtd; | 260 | runtime->private_data = prtd; |
262 | 261 | ||
diff --git a/sound/soc/davinci/davinci-pcm.h b/sound/soc/davinci/davinci-pcm.h index 63d96253c73a..8746606efc89 100644 --- a/sound/soc/davinci/davinci-pcm.h +++ b/sound/soc/davinci/davinci-pcm.h | |||
@@ -17,7 +17,6 @@ | |||
17 | 17 | ||
18 | 18 | ||
19 | struct davinci_pcm_dma_params { | 19 | struct davinci_pcm_dma_params { |
20 | char *name; /* stream identifier */ | ||
21 | int channel; /* sync dma channel ID */ | 20 | int channel; /* sync dma channel ID */ |
22 | unsigned short acnt; | 21 | unsigned short acnt; |
23 | dma_addr_t dma_addr; /* device physical address for DMA */ | 22 | dma_addr_t dma_addr; /* device physical address for DMA */ |