diff options
Diffstat (limited to 'sound/soc/s6000/s6000-i2s.c')
-rw-r--r-- | sound/soc/s6000/s6000-i2s.c | 56 |
1 files changed, 25 insertions, 31 deletions
diff --git a/sound/soc/s6000/s6000-i2s.c b/sound/soc/s6000/s6000-i2s.c index 59e3fa7bcb05..8778faa174a6 100644 --- a/sound/soc/s6000/s6000-i2s.c +++ b/sound/soc/s6000/s6000-i2s.c | |||
@@ -140,7 +140,7 @@ static void s6000_i2s_stop_channel(struct s6000_i2s_dev *dev, int channel) | |||
140 | static void s6000_i2s_start(struct snd_pcm_substream *substream) | 140 | static void s6000_i2s_start(struct snd_pcm_substream *substream) |
141 | { | 141 | { |
142 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 142 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
143 | struct s6000_i2s_dev *dev = rtd->dai->cpu_dai->private_data; | 143 | struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(rtd->cpu_dai); |
144 | int channel; | 144 | int channel; |
145 | 145 | ||
146 | channel = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? | 146 | channel = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? |
@@ -152,7 +152,7 @@ static void s6000_i2s_start(struct snd_pcm_substream *substream) | |||
152 | static void s6000_i2s_stop(struct snd_pcm_substream *substream) | 152 | static void s6000_i2s_stop(struct snd_pcm_substream *substream) |
153 | { | 153 | { |
154 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 154 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
155 | struct s6000_i2s_dev *dev = rtd->dai->cpu_dai->private_data; | 155 | struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(rtd->cpu_dai); |
156 | int channel; | 156 | int channel; |
157 | 157 | ||
158 | channel = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? | 158 | channel = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? |
@@ -194,7 +194,7 @@ static unsigned int s6000_i2s_int_sources(struct s6000_i2s_dev *dev) | |||
194 | 194 | ||
195 | static unsigned int s6000_i2s_check_xrun(struct snd_soc_dai *cpu_dai) | 195 | static unsigned int s6000_i2s_check_xrun(struct snd_soc_dai *cpu_dai) |
196 | { | 196 | { |
197 | struct s6000_i2s_dev *dev = cpu_dai->private_data; | 197 | struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); |
198 | unsigned int errors; | 198 | unsigned int errors; |
199 | unsigned int ret; | 199 | unsigned int ret; |
200 | 200 | ||
@@ -232,7 +232,7 @@ static void s6000_i2s_wait_disabled(struct s6000_i2s_dev *dev) | |||
232 | static int s6000_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, | 232 | static int s6000_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, |
233 | unsigned int fmt) | 233 | unsigned int fmt) |
234 | { | 234 | { |
235 | struct s6000_i2s_dev *dev = cpu_dai->private_data; | 235 | struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); |
236 | u32 w; | 236 | u32 w; |
237 | 237 | ||
238 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | 238 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
@@ -273,7 +273,7 @@ static int s6000_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
273 | 273 | ||
274 | static int s6000_i2s_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) | 274 | static int s6000_i2s_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) |
275 | { | 275 | { |
276 | struct s6000_i2s_dev *dev = dai->private_data; | 276 | struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); |
277 | 277 | ||
278 | if (!div || (div & 1) || div > (S6_I2S_DIV_MASK + 1) * 2) | 278 | if (!div || (div & 1) || div > (S6_I2S_DIV_MASK + 1) * 2) |
279 | return -EINVAL; | 279 | return -EINVAL; |
@@ -287,7 +287,7 @@ static int s6000_i2s_hw_params(struct snd_pcm_substream *substream, | |||
287 | struct snd_pcm_hw_params *params, | 287 | struct snd_pcm_hw_params *params, |
288 | struct snd_soc_dai *dai) | 288 | struct snd_soc_dai *dai) |
289 | { | 289 | { |
290 | struct s6000_i2s_dev *dev = dai->private_data; | 290 | struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); |
291 | int interf; | 291 | int interf; |
292 | u32 w = 0; | 292 | u32 w = 0; |
293 | 293 | ||
@@ -326,15 +326,17 @@ static int s6000_i2s_hw_params(struct snd_pcm_substream *substream, | |||
326 | return 0; | 326 | return 0; |
327 | } | 327 | } |
328 | 328 | ||
329 | static int s6000_i2s_dai_probe(struct platform_device *pdev, | 329 | static int s6000_i2s_dai_probe(struct snd_soc_dai *dai) |
330 | struct snd_soc_dai *dai) | ||
331 | { | 330 | { |
332 | struct s6000_i2s_dev *dev = dai->private_data; | 331 | struct s6000_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); |
333 | struct s6000_snd_platform_data *pdata = pdev->dev.platform_data; | 332 | struct s6000_snd_platform_data *pdata = dai->dev->platform_data; |
334 | 333 | ||
335 | if (!pdata) | 334 | if (!pdata) |
336 | return -EINVAL; | 335 | return -EINVAL; |
337 | 336 | ||
337 | dai->capture_dma_data = &dev->dma_params; | ||
338 | dai->playback_dma_data = &dev->dma_params; | ||
339 | |||
338 | dev->wide = pdata->wide; | 340 | dev->wide = pdata->wide; |
339 | dev->channel_in = pdata->channel_in; | 341 | dev->channel_in = pdata->channel_in; |
340 | dev->channel_out = pdata->channel_out; | 342 | dev->channel_out = pdata->channel_out; |
@@ -352,10 +354,10 @@ static int s6000_i2s_dai_probe(struct platform_device *pdev, | |||
352 | 354 | ||
353 | dev->channel_in = 0; | 355 | dev->channel_in = 0; |
354 | dev->channel_out = 1; | 356 | dev->channel_out = 1; |
355 | dai->capture.channels_min = 2 * dev->lines_in; | 357 | dai->driver->capture.channels_min = 2 * dev->lines_in; |
356 | dai->capture.channels_max = dai->capture.channels_min; | 358 | dai->driver->capture.channels_max = dai->driver->capture.channels_min; |
357 | dai->playback.channels_min = 2 * dev->lines_out; | 359 | dai->driver->playback.channels_min = 2 * dev->lines_out; |
358 | dai->playback.channels_max = dai->playback.channels_min; | 360 | dai->driver->playback.channels_max = dai->driver->playback.channels_min; |
359 | 361 | ||
360 | for (i = 0; i < dev->lines_out; i++) | 362 | for (i = 0; i < dev->lines_out; i++) |
361 | s6_i2s_write_reg(dev, S6_I2S_DATA_CFG(i), S6_I2S_OUT); | 363 | s6_i2s_write_reg(dev, S6_I2S_DATA_CFG(i), S6_I2S_OUT); |
@@ -372,10 +374,10 @@ static int s6000_i2s_dai_probe(struct platform_device *pdev, | |||
372 | if (dev->lines_in > 1 || dev->lines_out > 1) | 374 | if (dev->lines_in > 1 || dev->lines_out > 1) |
373 | return -EINVAL; | 375 | return -EINVAL; |
374 | 376 | ||
375 | dai->capture.channels_min = 2 * dev->lines_in; | 377 | dai->driver->capture.channels_min = 2 * dev->lines_in; |
376 | dai->capture.channels_max = 8 * dev->lines_in; | 378 | dai->driver->capture.channels_max = 8 * dev->lines_in; |
377 | dai->playback.channels_min = 2 * dev->lines_out; | 379 | dai->driver->playback.channels_min = 2 * dev->lines_out; |
378 | dai->playback.channels_max = 8 * dev->lines_out; | 380 | dai->driver->playback.channels_max = 8 * dev->lines_out; |
379 | 381 | ||
380 | if (dev->lines_in) | 382 | if (dev->lines_in) |
381 | cfg[dev->channel_in] = S6_I2S_IN; | 383 | cfg[dev->channel_in] = S6_I2S_IN; |
@@ -413,9 +415,7 @@ static struct snd_soc_dai_ops s6000_i2s_dai_ops = { | |||
413 | .hw_params = s6000_i2s_hw_params, | 415 | .hw_params = s6000_i2s_hw_params, |
414 | }; | 416 | }; |
415 | 417 | ||
416 | struct snd_soc_dai s6000_i2s_dai = { | 418 | static struct snd_soc_dai_driver s6000_i2s_dai = { |
417 | .name = "s6000-i2s", | ||
418 | .id = 0, | ||
419 | .probe = s6000_i2s_dai_probe, | 419 | .probe = s6000_i2s_dai_probe, |
420 | .playback = { | 420 | .playback = { |
421 | .channels_min = 2, | 421 | .channels_min = 2, |
@@ -435,7 +435,6 @@ struct snd_soc_dai s6000_i2s_dai = { | |||
435 | }, | 435 | }, |
436 | .ops = &s6000_i2s_dai_ops, | 436 | .ops = &s6000_i2s_dai_ops, |
437 | } | 437 | } |
438 | EXPORT_SYMBOL_GPL(s6000_i2s_dai); | ||
439 | 438 | ||
440 | static int __devinit s6000_i2s_probe(struct platform_device *pdev) | 439 | static int __devinit s6000_i2s_probe(struct platform_device *pdev) |
441 | { | 440 | { |
@@ -513,11 +512,7 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev) | |||
513 | ret = -ENOMEM; | 512 | ret = -ENOMEM; |
514 | goto err_release_dma2; | 513 | goto err_release_dma2; |
515 | } | 514 | } |
516 | 515 | dev_set_drvdata(&pdev->dev, dev); | |
517 | s6000_i2s_dai.dev = &pdev->dev; | ||
518 | s6000_i2s_dai.private_data = dev; | ||
519 | s6000_i2s_dai.capture.dma_data = &dev->dma_params; | ||
520 | s6000_i2s_dai.playback.dma_data = &dev->dma_params; | ||
521 | 516 | ||
522 | dev->sifbase = sifmem->start; | 517 | dev->sifbase = sifmem->start; |
523 | dev->scbbase = mmio; | 518 | dev->scbbase = mmio; |
@@ -548,7 +543,7 @@ static int __devinit s6000_i2s_probe(struct platform_device *pdev) | |||
548 | S6_I2S_INT_UNDERRUN | | 543 | S6_I2S_INT_UNDERRUN | |
549 | S6_I2S_INT_OVERRUN); | 544 | S6_I2S_INT_OVERRUN); |
550 | 545 | ||
551 | ret = snd_soc_register_dai(&s6000_i2s_dai); | 546 | ret = snd_soc_register_dai(&pdev->dev, &s6000_i2s_dai); |
552 | if (ret) | 547 | if (ret) |
553 | goto err_release_dev; | 548 | goto err_release_dev; |
554 | 549 | ||
@@ -573,17 +568,16 @@ err_release_none: | |||
573 | 568 | ||
574 | static void __devexit s6000_i2s_remove(struct platform_device *pdev) | 569 | static void __devexit s6000_i2s_remove(struct platform_device *pdev) |
575 | { | 570 | { |
576 | struct s6000_i2s_dev *dev = s6000_i2s_dai.private_data; | 571 | struct s6000_i2s_dev *dev = dev_get_drvdata(&pdev->dev); |
577 | struct resource *region; | 572 | struct resource *region; |
578 | void __iomem *mmio = dev->scbbase; | 573 | void __iomem *mmio = dev->scbbase; |
579 | 574 | ||
580 | snd_soc_unregister_dai(&s6000_i2s_dai); | 575 | snd_soc_unregister_dai(&pdev->dev); |
581 | 576 | ||
582 | s6000_i2s_stop_channel(dev, 0); | 577 | s6000_i2s_stop_channel(dev, 0); |
583 | s6000_i2s_stop_channel(dev, 1); | 578 | s6000_i2s_stop_channel(dev, 1); |
584 | 579 | ||
585 | s6_i2s_write_reg(dev, S6_I2S_INTERRUPT_ENABLE, 0); | 580 | s6_i2s_write_reg(dev, S6_I2S_INTERRUPT_ENABLE, 0); |
586 | s6000_i2s_dai.private_data = 0; | ||
587 | kfree(dev); | 581 | kfree(dev); |
588 | 582 | ||
589 | region = platform_get_resource(pdev, IORESOURCE_DMA, 0); | 583 | region = platform_get_resource(pdev, IORESOURCE_DMA, 0); |