aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-omap
diff options
context:
space:
mode:
authorKishon Vijay Abraham I <kishon@ti.com>2011-02-24 04:46:54 -0500
committerTony Lindgren <tony@atomide.com>2011-02-24 16:03:33 -0500
commite95496d4acadd0b72c4947be61e8d44700fdaae7 (patch)
tree61d9a72d7a1e20ad373858f725f8aaf5472ce6e6 /arch/arm/plat-omap
parentf36d01d64f1caf0545214a5dc14096477f68cfbe (diff)
OMAP: McBSP: Add pm runtime support
Add pm runtime support for McBSP driver. Reference to fclk is not removed because it is required when the functional clock is switched from one source to another. Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> Cc: Paul Walmsley <paul@pwsan.com> Acked-by: Peter Ujfalusi <peter.ujfalusi@nokia.com> Acked-by: Jarkko Nikula <jhnikula@gmail.com> Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/plat-omap')
-rw-r--r--arch/arm/plat-omap/include/plat/mcbsp.h1
-rw-r--r--arch/arm/plat-omap/mcbsp.c23
2 files changed, 6 insertions, 18 deletions
diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h
index c6cabfc77a12..964a940c475d 100644
--- a/arch/arm/plat-omap/include/plat/mcbsp.h
+++ b/arch/arm/plat-omap/include/plat/mcbsp.h
@@ -465,7 +465,6 @@ struct omap_mcbsp {
465 /* Protect the field .free, while checking if the mcbsp is in use */ 465 /* Protect the field .free, while checking if the mcbsp is in use */
466 spinlock_t lock; 466 spinlock_t lock;
467 struct omap_mcbsp_platform_data *pdata; 467 struct omap_mcbsp_platform_data *pdata;
468 struct clk *iclk;
469 struct clk *fclk; 468 struct clk *fclk;
470#ifdef CONFIG_ARCH_OMAP3 469#ifdef CONFIG_ARCH_OMAP3
471 struct omap_mcbsp_st_data *st_data; 470 struct omap_mcbsp_st_data *st_data;
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index 67ec74ea2532..6d230164b4f9 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -28,6 +28,7 @@
28#include <plat/dma.h> 28#include <plat/dma.h>
29#include <plat/mcbsp.h> 29#include <plat/mcbsp.h>
30#include <plat/omap_device.h> 30#include <plat/omap_device.h>
31#include <linux/pm_runtime.h>
31 32
32/* XXX These "sideways" includes are a sign that something is wrong */ 33/* XXX These "sideways" includes are a sign that something is wrong */
33#include "../mach-omap2/cm2xxx_3xxx.h" 34#include "../mach-omap2/cm2xxx_3xxx.h"
@@ -757,8 +758,7 @@ int omap_mcbsp_request(unsigned int id)
757 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request) 758 if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
758 mcbsp->pdata->ops->request(id); 759 mcbsp->pdata->ops->request(id);
759 760
760 clk_enable(mcbsp->iclk); 761 pm_runtime_get_sync(mcbsp->dev);
761 clk_enable(mcbsp->fclk);
762 762
763 /* Do procedure specific to omap34xx arch, if applicable */ 763 /* Do procedure specific to omap34xx arch, if applicable */
764 omap34xx_mcbsp_request(mcbsp); 764 omap34xx_mcbsp_request(mcbsp);
@@ -806,8 +806,7 @@ err_clk_disable:
806 /* Do procedure specific to omap34xx arch, if applicable */ 806 /* Do procedure specific to omap34xx arch, if applicable */
807 omap34xx_mcbsp_free(mcbsp); 807 omap34xx_mcbsp_free(mcbsp);
808 808
809 clk_disable(mcbsp->fclk); 809 pm_runtime_put_sync(mcbsp->dev);
810 clk_disable(mcbsp->iclk);
811 810
812 spin_lock(&mcbsp->lock); 811 spin_lock(&mcbsp->lock);
813 mcbsp->free = true; 812 mcbsp->free = true;
@@ -837,8 +836,7 @@ void omap_mcbsp_free(unsigned int id)
837 /* Do procedure specific to omap34xx arch, if applicable */ 836 /* Do procedure specific to omap34xx arch, if applicable */
838 omap34xx_mcbsp_free(mcbsp); 837 omap34xx_mcbsp_free(mcbsp);
839 838
840 clk_disable(mcbsp->fclk); 839 pm_runtime_put_sync(mcbsp->dev);
841 clk_disable(mcbsp->iclk);
842 840
843 if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) { 841 if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) {
844 /* Free IRQs */ 842 /* Free IRQs */
@@ -1827,32 +1825,24 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
1827 } 1825 }
1828 mcbsp->dma_tx_sync = res->start; 1826 mcbsp->dma_tx_sync = res->start;
1829 1827
1830 mcbsp->iclk = clk_get(&pdev->dev, "ick");
1831 if (IS_ERR(mcbsp->iclk)) {
1832 ret = PTR_ERR(mcbsp->iclk);
1833 dev_err(&pdev->dev, "unable to get ick: %d\n", ret);
1834 goto err_res;
1835 }
1836
1837 mcbsp->fclk = clk_get(&pdev->dev, "fck"); 1828 mcbsp->fclk = clk_get(&pdev->dev, "fck");
1838 if (IS_ERR(mcbsp->fclk)) { 1829 if (IS_ERR(mcbsp->fclk)) {
1839 ret = PTR_ERR(mcbsp->fclk); 1830 ret = PTR_ERR(mcbsp->fclk);
1840 dev_err(&pdev->dev, "unable to get fck: %d\n", ret); 1831 dev_err(&pdev->dev, "unable to get fck: %d\n", ret);
1841 goto err_fclk; 1832 goto err_res;
1842 } 1833 }
1843 1834
1844 mcbsp->pdata = pdata; 1835 mcbsp->pdata = pdata;
1845 mcbsp->dev = &pdev->dev; 1836 mcbsp->dev = &pdev->dev;
1846 mcbsp_ptr[id] = mcbsp; 1837 mcbsp_ptr[id] = mcbsp;
1847 platform_set_drvdata(pdev, mcbsp); 1838 platform_set_drvdata(pdev, mcbsp);
1839 pm_runtime_enable(mcbsp->dev);
1848 1840
1849 /* Initialize mcbsp properties for OMAP34XX if needed / applicable */ 1841 /* Initialize mcbsp properties for OMAP34XX if needed / applicable */
1850 omap34xx_device_init(mcbsp); 1842 omap34xx_device_init(mcbsp);
1851 1843
1852 return 0; 1844 return 0;
1853 1845
1854err_fclk:
1855 clk_put(mcbsp->iclk);
1856err_res: 1846err_res:
1857 iounmap(mcbsp->io_base); 1847 iounmap(mcbsp->io_base);
1858err_ioremap: 1848err_ioremap:
@@ -1875,7 +1865,6 @@ static int __devexit omap_mcbsp_remove(struct platform_device *pdev)
1875 omap34xx_device_exit(mcbsp); 1865 omap34xx_device_exit(mcbsp);
1876 1866
1877 clk_put(mcbsp->fclk); 1867 clk_put(mcbsp->fclk);
1878 clk_put(mcbsp->iclk);
1879 1868
1880 iounmap(mcbsp->io_base); 1869 iounmap(mcbsp->io_base);
1881 kfree(mcbsp); 1870 kfree(mcbsp);