diff options
author | Manuel Lauss <manuel.lauss@googlemail.com> | 2011-07-25 07:45:02 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-07-27 14:16:23 -0400 |
commit | 5b0912be7a8ff1dbfe56358c5f933d65445bb8af (patch) | |
tree | 6b0681c2a5e783be00d4f404ad902596b3235b9f /sound/soc/au1x/dbdma2.c | |
parent | 7137c6bcb7ff5d0e6f63f8a4175d5b77dc79abc0 (diff) |
ASoC: au1x: remove automatic DMA device registration from PSC drivers
The PSC audio drivers (psc-ac97/psc-i2s) register the DMA platform_device
on their own. This is frowned upon, from now on board code must
register a simple pcm dma platform device for each PSC with sound duties.
Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Acked-by: Liam Girdwood <lrg@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/au1x/dbdma2.c')
-rw-r--r-- | sound/soc/au1x/dbdma2.c | 83 |
1 files changed, 12 insertions, 71 deletions
diff --git a/sound/soc/au1x/dbdma2.c b/sound/soc/au1x/dbdma2.c index 20bb53a837b1..fd5378f7dece 100644 --- a/sound/soc/au1x/dbdma2.c +++ b/sound/soc/au1x/dbdma2.c | |||
@@ -293,6 +293,16 @@ au1xpsc_pcm_pointer(struct snd_pcm_substream *substream) | |||
293 | 293 | ||
294 | static int au1xpsc_pcm_open(struct snd_pcm_substream *substream) | 294 | static int au1xpsc_pcm_open(struct snd_pcm_substream *substream) |
295 | { | 295 | { |
296 | struct au1xpsc_audio_dmadata *pcd = to_dmadata(substream); | ||
297 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | ||
298 | int stype = SUBSTREAM_TYPE(substream), *dmaids; | ||
299 | |||
300 | dmaids = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); | ||
301 | if (!dmaids) | ||
302 | return -ENODEV; /* whoa, has ordering changed? */ | ||
303 | |||
304 | pcd->ddma_id = dmaids[stype]; | ||
305 | |||
296 | snd_soc_set_runtime_hwparams(substream, &au1xpsc_pcm_hardware); | 306 | snd_soc_set_runtime_hwparams(substream, &au1xpsc_pcm_hardware); |
297 | return 0; | 307 | return 0; |
298 | } | 308 | } |
@@ -340,36 +350,18 @@ struct snd_soc_platform_driver au1xpsc_soc_platform = { | |||
340 | static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev) | 350 | static int __devinit au1xpsc_pcm_drvprobe(struct platform_device *pdev) |
341 | { | 351 | { |
342 | struct au1xpsc_audio_dmadata *dmadata; | 352 | struct au1xpsc_audio_dmadata *dmadata; |
343 | struct resource *r; | ||
344 | int ret; | 353 | int ret; |
345 | 354 | ||
346 | dmadata = kzalloc(2 * sizeof(struct au1xpsc_audio_dmadata), GFP_KERNEL); | 355 | dmadata = kzalloc(2 * sizeof(struct au1xpsc_audio_dmadata), GFP_KERNEL); |
347 | if (!dmadata) | 356 | if (!dmadata) |
348 | return -ENOMEM; | 357 | return -ENOMEM; |
349 | 358 | ||
350 | r = platform_get_resource(pdev, IORESOURCE_DMA, 0); | ||
351 | if (!r) { | ||
352 | ret = -ENODEV; | ||
353 | goto out1; | ||
354 | } | ||
355 | dmadata[PCM_TX].ddma_id = r->start; | ||
356 | |||
357 | /* RX DMA */ | ||
358 | r = platform_get_resource(pdev, IORESOURCE_DMA, 1); | ||
359 | if (!r) { | ||
360 | ret = -ENODEV; | ||
361 | goto out1; | ||
362 | } | ||
363 | dmadata[PCM_RX].ddma_id = r->start; | ||
364 | |||
365 | platform_set_drvdata(pdev, dmadata); | 359 | platform_set_drvdata(pdev, dmadata); |
366 | 360 | ||
367 | ret = snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform); | 361 | ret = snd_soc_register_platform(&pdev->dev, &au1xpsc_soc_platform); |
368 | if (!ret) | 362 | if (ret) |
369 | return ret; | 363 | kfree(dmadata); |
370 | 364 | ||
371 | out1: | ||
372 | kfree(dmadata); | ||
373 | return ret; | 365 | return ret; |
374 | } | 366 | } |
375 | 367 | ||
@@ -405,57 +397,6 @@ static void __exit au1xpsc_audio_dbdma_unload(void) | |||
405 | module_init(au1xpsc_audio_dbdma_load); | 397 | module_init(au1xpsc_audio_dbdma_load); |
406 | module_exit(au1xpsc_audio_dbdma_unload); | 398 | module_exit(au1xpsc_audio_dbdma_unload); |
407 | 399 | ||
408 | |||
409 | struct platform_device *au1xpsc_pcm_add(struct platform_device *pdev) | ||
410 | { | ||
411 | struct resource *res, *r; | ||
412 | struct platform_device *pd; | ||
413 | int id[2]; | ||
414 | int ret; | ||
415 | |||
416 | r = platform_get_resource(pdev, IORESOURCE_DMA, 0); | ||
417 | if (!r) | ||
418 | return NULL; | ||
419 | id[0] = r->start; | ||
420 | |||
421 | r = platform_get_resource(pdev, IORESOURCE_DMA, 1); | ||
422 | if (!r) | ||
423 | return NULL; | ||
424 | id[1] = r->start; | ||
425 | |||
426 | res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL); | ||
427 | if (!res) | ||
428 | return NULL; | ||
429 | |||
430 | res[0].start = res[0].end = id[0]; | ||
431 | res[1].start = res[1].end = id[1]; | ||
432 | res[0].flags = res[1].flags = IORESOURCE_DMA; | ||
433 | |||
434 | pd = platform_device_alloc("au1xpsc-pcm", pdev->id); | ||
435 | if (!pd) | ||
436 | goto out; | ||
437 | |||
438 | pd->resource = res; | ||
439 | pd->num_resources = 2; | ||
440 | |||
441 | ret = platform_device_add(pd); | ||
442 | if (!ret) | ||
443 | return pd; | ||
444 | |||
445 | platform_device_put(pd); | ||
446 | out: | ||
447 | kfree(res); | ||
448 | return NULL; | ||
449 | } | ||
450 | EXPORT_SYMBOL_GPL(au1xpsc_pcm_add); | ||
451 | |||
452 | void au1xpsc_pcm_destroy(struct platform_device *dmapd) | ||
453 | { | ||
454 | if (dmapd) | ||
455 | platform_device_unregister(dmapd); | ||
456 | } | ||
457 | EXPORT_SYMBOL_GPL(au1xpsc_pcm_destroy); | ||
458 | |||
459 | MODULE_LICENSE("GPL"); | 400 | MODULE_LICENSE("GPL"); |
460 | MODULE_DESCRIPTION("Au12x0/Au1550 PSC Audio DMA driver"); | 401 | MODULE_DESCRIPTION("Au12x0/Au1550 PSC Audio DMA driver"); |
461 | MODULE_AUTHOR("Manuel Lauss"); | 402 | MODULE_AUTHOR("Manuel Lauss"); |