aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/omap/mcpdm.c
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2011-08-02 07:04:26 -0400
committerPeter Ujfalusi <peter.ujfalusi@ti.com>2011-09-22 02:19:15 -0400
commit3a98cd6b2b0459de4ebf85356fbcc34b9848b58a (patch)
tree9c98c903165c37cb0a68cf958d46822c89362f5f /sound/soc/omap/mcpdm.c
parentb199adfdff98092b16f67860013fb5263579c476 (diff)
ASoC: OMAP4: McPDM: Convert to hwmod/omap_device
In order to probe, and operate correctly, the OMAP McPDM driver needs to be converted to use hwmod. The device name has been changed to probe the driver. Replace the clk_* with pm_runtime_* calls to manage the clocks correctly. Missing request_mem_region/release_mem_region added. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@ti.com>
Diffstat (limited to 'sound/soc/omap/mcpdm.c')
-rw-r--r--sound/soc/omap/mcpdm.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/sound/soc/omap/mcpdm.c b/sound/soc/omap/mcpdm.c
index 928f03707451..d29cc982b562 100644
--- a/sound/soc/omap/mcpdm.c
+++ b/sound/soc/omap/mcpdm.c
@@ -28,7 +28,7 @@
28#include <linux/slab.h> 28#include <linux/slab.h>
29#include <linux/interrupt.h> 29#include <linux/interrupt.h>
30#include <linux/err.h> 30#include <linux/err.h>
31#include <linux/clk.h> 31#include <linux/pm_runtime.h>
32#include <linux/delay.h> 32#include <linux/delay.h>
33#include <linux/io.h> 33#include <linux/io.h>
34#include <linux/irq.h> 34#include <linux/irq.h>
@@ -322,11 +322,11 @@ static irqreturn_t omap_mcpdm_irq_handler(int irq, void *dev_id)
322 return IRQ_HANDLED; 322 return IRQ_HANDLED;
323} 323}
324 324
325int omap_mcpdm_request(void) 325 int omap_mcpdm_request(void)
326{ 326{
327 int ret; 327 int ret;
328 328
329 clk_enable(mcpdm->clk); 329 pm_runtime_get_sync(mcpdm->dev);
330 330
331 spin_lock(&mcpdm->lock); 331 spin_lock(&mcpdm->lock);
332 332
@@ -353,7 +353,8 @@ int omap_mcpdm_request(void)
353 return 0; 353 return 0;
354 354
355err: 355err:
356 clk_disable(mcpdm->clk); 356 mcpdm->free = 1;
357 pm_runtime_put_sync(mcpdm->dev);
357 return ret; 358 return ret;
358} 359}
359 360
@@ -368,7 +369,7 @@ void omap_mcpdm_free(void)
368 mcpdm->free = 1; 369 mcpdm->free = 1;
369 spin_unlock(&mcpdm->lock); 370 spin_unlock(&mcpdm->lock);
370 371
371 clk_disable(mcpdm->clk); 372 pm_runtime_put_sync(mcpdm->dev);
372 373
373 free_irq(mcpdm->irq, (void *)mcpdm); 374 free_irq(mcpdm->irq, (void *)mcpdm);
374} 375}
@@ -421,28 +422,29 @@ int __devinit omap_mcpdm_probe(struct platform_device *pdev)
421 422
422 spin_lock_init(&mcpdm->lock); 423 spin_lock_init(&mcpdm->lock);
423 mcpdm->free = 1; 424 mcpdm->free = 1;
425
426 if (!request_mem_region(res->start, resource_size(res), "McPDM")) {
427 ret = -EBUSY;
428 goto err_resource;
429 }
430
424 mcpdm->io_base = ioremap(res->start, resource_size(res)); 431 mcpdm->io_base = ioremap(res->start, resource_size(res));
425 if (!mcpdm->io_base) { 432 if (!mcpdm->io_base) {
426 ret = -ENOMEM; 433 ret = -ENOMEM;
427 goto err_resource; 434 goto err_remap;
428 } 435 }
429 436
430 mcpdm->irq = platform_get_irq(pdev, 0); 437 mcpdm->irq = platform_get_irq(pdev, 0);
431 438
432 mcpdm->clk = clk_get(&pdev->dev, "pdm_ck");
433 if (IS_ERR(mcpdm->clk)) {
434 ret = PTR_ERR(mcpdm->clk);
435 dev_err(&pdev->dev, "unable to get pdm_ck: %d\n", ret);
436 goto err_clk;
437 }
438
439 mcpdm->dev = &pdev->dev; 439 mcpdm->dev = &pdev->dev;
440 platform_set_drvdata(pdev, mcpdm); 440 platform_set_drvdata(pdev, mcpdm);
441 441
442 pm_runtime_enable(mcpdm->dev);
443
442 return 0; 444 return 0;
443 445
444err_clk: 446err_remap:
445 iounmap(mcpdm->io_base); 447 release_mem_region(res->start, resource_size(res));
446err_resource: 448err_resource:
447 kfree(mcpdm); 449 kfree(mcpdm);
448exit: 450exit:
@@ -452,14 +454,16 @@ exit:
452int __devexit omap_mcpdm_remove(struct platform_device *pdev) 454int __devexit omap_mcpdm_remove(struct platform_device *pdev)
453{ 455{
454 struct omap_mcpdm *mcpdm_ptr = platform_get_drvdata(pdev); 456 struct omap_mcpdm *mcpdm_ptr = platform_get_drvdata(pdev);
457 struct resource *res;
455 458
456 platform_set_drvdata(pdev, NULL); 459 platform_set_drvdata(pdev, NULL);
457 460
458 clk_put(mcpdm_ptr->clk); 461 pm_runtime_disable(mcpdm_ptr->dev);
459 462
460 iounmap(mcpdm_ptr->io_base); 463 iounmap(mcpdm_ptr->io_base);
464 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
465 release_mem_region(res->start, resource_size(res));
461 466
462 mcpdm_ptr->clk = NULL;
463 mcpdm_ptr->free = 0; 467 mcpdm_ptr->free = 0;
464 mcpdm_ptr->dev = NULL; 468 mcpdm_ptr->dev = NULL;
465 469