linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 4/6] ARM: OMAP4: PMU: Add runtime PM support
@ 2012-05-09 21:35 Jon Hunter
  2012-05-10  6:21 ` Shilimkar, Santosh
                   ` (2 more replies)
  0 siblings, 3 replies; 27+ messages in thread
From: Jon Hunter @ 2012-05-09 21:35 UTC (permalink / raw)
  To: linux-omap
  Cc: Jon Hunter, Ming Lei, Will Deacon, Benoit Cousson, Paul Walmsley,
	Kevin Hilman

From: Jon Hunter <jon-hunter@ti.com>

This patch is based upon Ming Lei's patch to add runtime PM support for OMAP4
[1]. In Ming's original patch the CTI interrupts were being enabled during
runtime when the PMU was used but they were only configured once during init.
Therefore move the configuration of the CTI interrupts to the runtime PM
functions.

[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2011-November/074153.html

Cc: Ming Lei <ming.lei@canonical.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Kevin Hilman <khilman@ti.com>

Signed-off-by: Jon Hunter <jon-hunter@ti.com>
---
 arch/arm/mach-omap2/devices.c |   50 ++++++++++++++++++++++------------------
 1 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 636533d..b02aa81 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -18,6 +18,7 @@
 #include <linux/slab.h>
 #include <linux/of.h>
 #include <linux/platform_data/omap4-keypad.h>
+#include <linux/pm_runtime.h>
 
 #include <mach/hardware.h>
 #include <mach/irqs.h>
@@ -434,13 +435,22 @@ static struct omap_device_pm_latency omap_pmu_latency[] = {
 };
 
 static struct cti omap4_cti[2];
+static struct platform_device *pmu_dev;
 
 static void omap4_enable_cti(int irq)
 {
-	if (irq == OMAP44XX_IRQ_CTI0)
+	pm_runtime_get_sync(&pmu_dev->dev);
+	if (irq == OMAP44XX_IRQ_CTI0) {
+		/* configure CTI0 for pmu irq routing */
+		cti_unlock(&omap4_cti[0]);
+		cti_map_trigger(&omap4_cti[0], 1, 6, 2);
 		cti_enable(&omap4_cti[0]);
-	else if (irq == OMAP44XX_IRQ_CTI1)
+	} else if (irq == OMAP44XX_IRQ_CTI1) {
+		/* configure CTI1 for pmu irq routing */
+		cti_unlock(&omap4_cti[1]);
+		cti_map_trigger(&omap4_cti[1], 1, 6, 2);
 		cti_enable(&omap4_cti[1]);
+	}
 }
 
 static void omap4_disable_cti(int irq)
@@ -449,6 +459,7 @@ static void omap4_disable_cti(int irq)
 		cti_disable(&omap4_cti[0]);
 	else if (irq == OMAP44XX_IRQ_CTI1)
 		cti_disable(&omap4_cti[1]);
+	pm_runtime_put(&pmu_dev->dev);
 }
 
 static irqreturn_t omap4_pmu_handler(int irq, void *dev, irq_handler_t handler)
@@ -461,27 +472,20 @@ static irqreturn_t omap4_pmu_handler(int irq, void *dev, irq_handler_t handler)
 	return handler(irq, dev);
 }
 
-static void __init omap4_configure_pmu_irq(void)
+static int __init omap4_configure_pmu(void)
 {
-	void __iomem *base0;
-	void __iomem *base1;
+	omap4_cti[0].base = ioremap(OMAP44XX_CTI0_BASE, SZ_4K);
+	omap4_cti[1].base = ioremap(OMAP44XX_CTI1_BASE, SZ_4K);
 
-	base0 = ioremap(OMAP44XX_CTI0_BASE, SZ_4K);
-	base1 = ioremap(OMAP44XX_CTI1_BASE, SZ_4K);
-	if (!base0 && !base1) {
+	if (!omap4_cti[0].base || !omap4_cti[1].base) {
 		pr_err("ioremap for OMAP4 CTI failed\n");
-		return;
+		return -ENOMEM;
 	}
 
-	/*configure CTI0 for pmu irq routing*/
-	cti_init(&omap4_cti[0], base0, OMAP44XX_IRQ_CTI0, 6);
-	cti_unlock(&omap4_cti[0]);
-	cti_map_trigger(&omap4_cti[0], 1, 6, 2);
+	cti_init(&omap4_cti[0], omap4_cti[0].base, OMAP44XX_IRQ_CTI0, 6);
+	cti_init(&omap4_cti[1], omap4_cti[1].base, OMAP44XX_IRQ_CTI1, 6);
 
-	/*configure CTI1 for pmu irq routing*/
-	cti_init(&omap4_cti[1], base1, OMAP44XX_IRQ_CTI1, 6);
-	cti_unlock(&omap4_cti[1]);
-	cti_map_trigger(&omap4_cti[1], 1, 6, 2);
+	return 0;
 }
 
 static struct platform_device* __init omap4_init_pmu(void)
@@ -492,6 +496,9 @@ static struct platform_device* __init omap4_init_pmu(void)
 	struct omap_hwmod* oh[3];
 	char *dev_name = "arm-pmu";
 
+	if (omap4_configure_pmu())
+		return NULL;
+
 	hw = "l3_main_3";
 	oh[0] = omap_hwmod_lookup(hw);
 	if (!oh[0]) {
@@ -530,14 +537,11 @@ static void __init omap_init_pmu(void)
 	} else if (cpu_is_omap34xx()) {
 		omap_pmu_device.resource = &omap3_pmu_resource;
 	} else if (cpu_is_omap44xx()) {
-		struct platform_device *pd;
-
-		pd = omap4_init_pmu();
-		if (!pd)
+		pmu_dev = omap4_init_pmu();
+		if (!pmu_dev)
 			return;
 
-		omap_device_enable(&od->pdev);
-		omap4_configure_pmu_irq();
+		pm_runtime_enable(&pmu_dev->dev);
 		return;
 	} else {
 		return;
-- 
1.7.5.4


^ permalink raw reply related	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2012-06-07  1:24 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-09 21:35 [PATCH 4/6] ARM: OMAP4: PMU: Add runtime PM support Jon Hunter
2012-05-10  6:21 ` Shilimkar, Santosh
2012-05-15  4:53 ` Ming Lei
2012-05-15 14:39   ` Jon Hunter
     [not found]     ` <CACVXFVNqWM7G8dK2AA90JPvE6e_L0_Zwk-BJTjThY+nZ6ONnQA@mail.gmail.com>
2012-05-16  8:17       ` Ming Lei
2012-05-17  5:28         ` Ming Lei
2012-05-29 21:17 ` Kevin Hilman
2012-05-29 22:07   ` Jon Hunter
2012-05-29 22:27     ` Jon Hunter
2012-05-30 21:50       ` Kevin Hilman
2012-05-31  1:29         ` Will Deacon
2012-05-31 15:05           ` Jon Hunter
2012-05-31 18:49             ` Jon Hunter
2012-05-31 18:11           ` Jon Hunter
2012-05-31 20:42             ` Kevin Hilman
2012-05-31 21:23               ` Jon Hunter
2012-05-31 22:36                 ` Kevin Hilman
2012-05-31 23:02                   ` Jon Hunter
2012-06-01  0:27                     ` Kevin Hilman
2012-06-01 14:42                       ` Jon Hunter
2012-06-02 16:42                         ` Will Deacon
2012-06-04 21:44                           ` Jon Hunter
2012-06-05 13:19                             ` Jon Hunter
2012-06-06 17:33                               ` Will Deacon
2012-06-07  1:24                                 ` Jon Hunter
2012-05-31 15:04         ` Jon Hunter
2012-05-31 16:22           ` Kevin Hilman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).