* [PATCH 1/4] OMAP: PM: omap_device: conditionally use PM domain runtime helpers
2011-07-11 23:29 [PATCH 0/4] OMAP: PM: omap_device: update PM domain support for v3.1 Kevin Hilman
@ 2011-07-11 23:29 ` Kevin Hilman
2011-07-11 23:29 ` [PATCH 2/4] OMAP: PM: omap_device: add system PM methods for PM domain handling Kevin Hilman
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Kevin Hilman @ 2011-07-11 23:29 UTC (permalink / raw)
To: linux-arm-kernel
Only build and use the runtime PM helper functions only when runtime
PM is actually enabled.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/plat-omap/omap_device.c | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index d21579b..f7d2ff7 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -537,6 +537,7 @@ int omap_early_device_register(struct omap_device *od)
return 0;
}
+#ifdef CONFIG_PM_RUNTIME
static int _od_runtime_suspend(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
@@ -563,12 +564,12 @@ static int _od_runtime_resume(struct device *dev)
return pm_generic_runtime_resume(dev);
}
+#endif
static struct dev_pm_domain omap_device_pm_domain = {
.ops = {
- .runtime_suspend = _od_runtime_suspend,
- .runtime_idle = _od_runtime_idle,
- .runtime_resume = _od_runtime_resume,
+ SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume,
+ _od_runtime_idle)
USE_PLATFORM_PM_SLEEP_OPS
}
};
--
1.7.6
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/4] OMAP: PM: omap_device: add system PM methods for PM domain handling
2011-07-11 23:29 [PATCH 0/4] OMAP: PM: omap_device: update PM domain support for v3.1 Kevin Hilman
2011-07-11 23:29 ` [PATCH 1/4] OMAP: PM: omap_device: conditionally use PM domain runtime helpers Kevin Hilman
@ 2011-07-11 23:29 ` Kevin Hilman
2011-07-11 23:29 ` [PATCH 3/4] OMAP: PM: omap_device: add API to disable idle on suspend Kevin Hilman
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Kevin Hilman @ 2011-07-11 23:29 UTC (permalink / raw)
To: linux-arm-kernel
In the omap_device PM domain callbacks, use omap_device idle/enable to
automatically manage device idle states during system suspend/resume.
If an omap_device has not already been runtime suspended, the
->suspend_noirq() method of the PM domain will use omap_device_idle()
to idle the HW after calling the driver's ->runtime_suspend()
callback. Similarily, upon resume, if the device was suspended during
->suspend_noirq(), the ->resume_noirq() method of the PM domain will
use omap_device_enable() to enable the HW and then call the driver's
->runtime_resume() callback.
If a device has already been runtime suspended, the noirq methods of
the PM domain leave the device runtime suspended by default.
However, if a driver needs to runtime resume a device during suspend
(for example, to change its wakeup settings), it may do so using
pm_runtime_get* in it's ->suspend() callback.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/plat-omap/include/plat/omap_device.h | 4 +++
arch/arm/plat-omap/omap_device.c | 36 +++++++++++++++++++++++++
2 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h
index e4c349f..bc36d05 100644
--- a/arch/arm/plat-omap/include/plat/omap_device.h
+++ b/arch/arm/plat-omap/include/plat/omap_device.h
@@ -44,6 +44,9 @@ extern struct device omap_device_parent;
#define OMAP_DEVICE_STATE_IDLE 2
#define OMAP_DEVICE_STATE_SHUTDOWN 3
+/* omap_device.flags values */
+#define OMAP_DEVICE_SUSPENDED BIT(0)
+
/**
* struct omap_device - omap_device wrapper for platform_devices
* @pdev: platform_device
@@ -73,6 +76,7 @@ struct omap_device {
s8 pm_lat_level;
u8 hwmods_cnt;
u8 _state;
+ u8 flags;
};
/* Device driver interface (call via platform_data fn ptrs) */
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index f7d2ff7..b93cfdc 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -566,11 +566,47 @@ static int _od_runtime_resume(struct device *dev)
}
#endif
+#ifdef CONFIG_SUSPEND
+static int _od_suspend_noirq(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct omap_device *od = to_omap_device(pdev);
+ int ret;
+
+ ret = pm_generic_suspend_noirq(dev);
+
+ if (!ret && !pm_runtime_status_suspended(dev)) {
+ if (pm_generic_runtime_suspend(dev) == 0) {
+ omap_device_idle(pdev);
+ od->flags |= OMAP_DEVICE_SUSPENDED;
+ }
+ }
+
+ return ret;
+}
+
+static int _od_resume_noirq(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct omap_device *od = to_omap_device(pdev);
+
+ if ((od->flags & OMAP_DEVICE_SUSPENDED) &&
+ !pm_runtime_status_suspended(dev)) {
+ od->flags &= ~OMAP_DEVICE_SUSPENDED;
+ omap_device_enable(pdev);
+ pm_generic_runtime_resume(dev);
+ }
+
+ return pm_generic_resume_noirq(dev);
+}
+#endif
+
static struct dev_pm_domain omap_device_pm_domain = {
.ops = {
SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume,
_od_runtime_idle)
USE_PLATFORM_PM_SLEEP_OPS
+ SET_SYSTEM_SLEEP_PM_OPS(_od_suspend_noirq, _od_resume_noirq)
}
};
--
1.7.6
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/4] OMAP: PM: omap_device: add API to disable idle on suspend
2011-07-11 23:29 [PATCH 0/4] OMAP: PM: omap_device: update PM domain support for v3.1 Kevin Hilman
2011-07-11 23:29 ` [PATCH 1/4] OMAP: PM: omap_device: conditionally use PM domain runtime helpers Kevin Hilman
2011-07-11 23:29 ` [PATCH 2/4] OMAP: PM: omap_device: add system PM methods for PM domain handling Kevin Hilman
@ 2011-07-11 23:29 ` Kevin Hilman
2011-07-11 23:29 ` [PATCH 4/4] OMAP: PM: disable idle on suspend for GPIO and UART Kevin Hilman
2011-07-12 20:42 ` [PATCH 0/4] OMAP: PM: omap_device: update PM domain support for v3.1 Rafael J. Wysocki
4 siblings, 0 replies; 6+ messages in thread
From: Kevin Hilman @ 2011-07-11 23:29 UTC (permalink / raw)
To: linux-arm-kernel
By default, omap_devices will be automatically idled on suspend
(and re-enabled on resume.) Using this new API, device init code
can disable this feature if desired.
NOTE: any driver/device that has been runtime PM converted should
not be using this API.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/plat-omap/include/plat/omap_device.h | 5 +++++
arch/arm/plat-omap/omap_device.c | 6 ++++++
2 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h
index bc36d05..ee405b36 100644
--- a/arch/arm/plat-omap/include/plat/omap_device.h
+++ b/arch/arm/plat-omap/include/plat/omap_device.h
@@ -46,6 +46,7 @@ extern struct device omap_device_parent;
/* omap_device.flags values */
#define OMAP_DEVICE_SUSPENDED BIT(0)
+#define OMAP_DEVICE_NO_IDLE_ON_SUSPEND BIT(1)
/**
* struct omap_device - omap_device wrapper for platform_devices
@@ -121,6 +122,10 @@ int omap_device_enable_hwmods(struct omap_device *od);
int omap_device_disable_clocks(struct omap_device *od);
int omap_device_enable_clocks(struct omap_device *od);
+static inline void omap_device_disable_idle_on_suspend(struct omap_device *od)
+{
+ od->flags |= OMAP_DEVICE_NO_IDLE_ON_SUSPEND;
+}
/*
* Entries should be kept in latency order ascending
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index b93cfdc..2526fa3 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -573,6 +573,9 @@ static int _od_suspend_noirq(struct device *dev)
struct omap_device *od = to_omap_device(pdev);
int ret;
+ if (od->flags & OMAP_DEVICE_NO_IDLE_ON_SUSPEND)
+ return pm_generic_suspend_noirq(dev);
+
ret = pm_generic_suspend_noirq(dev);
if (!ret && !pm_runtime_status_suspended(dev)) {
@@ -590,6 +593,9 @@ static int _od_resume_noirq(struct device *dev)
struct platform_device *pdev = to_platform_device(dev);
struct omap_device *od = to_omap_device(pdev);
+ if (od->flags & OMAP_DEVICE_NO_IDLE_ON_SUSPEND)
+ return pm_generic_resume_noirq(dev);
+
if ((od->flags & OMAP_DEVICE_SUSPENDED) &&
!pm_runtime_status_suspended(dev)) {
od->flags &= ~OMAP_DEVICE_SUSPENDED;
--
1.7.6
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/4] OMAP: PM: disable idle on suspend for GPIO and UART
2011-07-11 23:29 [PATCH 0/4] OMAP: PM: omap_device: update PM domain support for v3.1 Kevin Hilman
` (2 preceding siblings ...)
2011-07-11 23:29 ` [PATCH 3/4] OMAP: PM: omap_device: add API to disable idle on suspend Kevin Hilman
@ 2011-07-11 23:29 ` Kevin Hilman
2011-07-12 20:42 ` [PATCH 0/4] OMAP: PM: omap_device: update PM domain support for v3.1 Rafael J. Wysocki
4 siblings, 0 replies; 6+ messages in thread
From: Kevin Hilman @ 2011-07-11 23:29 UTC (permalink / raw)
To: linux-arm-kernel
Until these drivers are runtime PM converted, their device power
states are managed by calling custom driver hooks late in the
idle/suspend path. Therefore, do not let the suspend/resume core code
automatically idle these devices since they will be managed manually
by the OMAP PM core very late in the idle/suspend path.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/gpio.c | 2 ++
arch/arm/mach-omap2/serial.c | 1 +
2 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c
index 9529842..48e5ece 100644
--- a/arch/arm/mach-omap2/gpio.c
+++ b/arch/arm/mach-omap2/gpio.c
@@ -87,6 +87,8 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
return PTR_ERR(od);
}
+ omap_device_disable_idle_on_suspend(od);
+
gpio_bank_count++;
return 0;
}
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
index 1ac361b..466fc722 100644
--- a/arch/arm/mach-omap2/serial.c
+++ b/arch/arm/mach-omap2/serial.c
@@ -805,6 +805,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata)
WARN(IS_ERR(od), "Could not build omap_device for %s: %s.\n",
name, oh->name);
+ omap_device_disable_idle_on_suspend(od);
oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt);
uart->irq = oh->mpu_irqs[0].irq;
--
1.7.6
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 0/4] OMAP: PM: omap_device: update PM domain support for v3.1
2011-07-11 23:29 [PATCH 0/4] OMAP: PM: omap_device: update PM domain support for v3.1 Kevin Hilman
` (3 preceding siblings ...)
2011-07-11 23:29 ` [PATCH 4/4] OMAP: PM: disable idle on suspend for GPIO and UART Kevin Hilman
@ 2011-07-12 20:42 ` Rafael J. Wysocki
4 siblings, 0 replies; 6+ messages in thread
From: Rafael J. Wysocki @ 2011-07-12 20:42 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Tuesday, July 12, 2011, Kevin Hilman wrote:
> For v3.1, the PM core has some changes that impact various assumptions
> made (by me) during the design and implementation of the PM domain
> support in the omap_device layer.
>
> This series is needed to update our PM domain layer to behave properly
> under the new rules of the PM core code which are planned to be merged
> for v3.1 (see recent linux-pm discussions for the gory details.)
>
> This series is based on the pm-domains branch of Rafael Wysocki's
> suspend-2.6 tree, and also depends on the patch which adds
> pm_runtime_status_suspended() helper function[1].
>
> Rafael, because of the dependencies on your pm-domains branch (due to
> the pwr_domain -> pm_domain rename), it might be easiest to merge
> these via your tree. Let me know if that's OK with you.
Yes, it is. I'm going to apply them to my pm-runtime branch that is based
on pm-domains.
Thanks,
Rafael
^ permalink raw reply [flat|nested] 6+ messages in thread