All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
@ 2010-09-08  0:54 ` Kevin Hilman
  0 siblings, 0 replies; 16+ messages in thread
From: Kevin Hilman @ 2010-09-08  0:54 UTC (permalink / raw)
  To: linux-omap; +Cc: Grant Likely, linux-arm-kernel, Rajendra Nayak

From: Kevin Hilman <khilman@ti.com>

Implement the new runtime PM framework as a thin layer on top of the
omap_device API.  OMAP specific runtime PM methods are registered with
the as custom methods on the platform_bus.

In order to determine if a device is an omap_device, its parent device
is checked.  All omap_devices have a new 'omap_bus' device as their
parent device, so checking for this parent is used to check for valid
omap_devices.  If a device is an omap_device, then the appropriate
omap_device functions are called for it.  If not, only the generic
runtime PM functions are called.

Device driver's ->runtime_idle() hook is called when the runtime PM
usecount reaches zero for that device.  Driver's ->runtime_suspend()
hooks are called just before the device is disabled (via
omap_device_idle()), and device driver ->runtime_resume() hooks are
called just after device has been enabled (via omap_device_enable().)

OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.

Cc: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
NOTE: this depends on the driver core patch from me:
[PATCH v2] driver core: platform_bus: allow runtime override of dev_pm_ops
which Greg KH has queued now for 2.6.37:
http://marc.info/?l=linux-kernel&m=128276582108006&w=2

 arch/arm/mach-omap2/Makefile |    8 +++-
 arch/arm/mach-omap2/pm_bus.c |   82 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 2 deletions(-)
 create mode 100644 arch/arm/mach-omap2/pm_bus.c

diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 88d3a1e..ba644c2 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -50,13 +50,17 @@ obj-$(CONFIG_ARCH_OMAP2)		+= sdrc2xxx.o
 ifeq ($(CONFIG_PM),y)
 obj-$(CONFIG_ARCH_OMAP2)		+= pm24xx.o
 obj-$(CONFIG_ARCH_OMAP2)		+= sleep24xx.o
-obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o
-obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o
+obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o pm_bus.o
+obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o pm_bus.o
 obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o
 
 AFLAGS_sleep24xx.o			:=-Wa,-march=armv6
 AFLAGS_sleep34xx.o			:=-Wa,-march=armv7-a
 
+ifeq ($(CONFIG_PM_VERBOSE),y)
+CFLAGS_pm_bus.o				+= -DDEBUG
+endif
+
 endif
 
 # PRCM
diff --git a/arch/arm/mach-omap2/pm_bus.c b/arch/arm/mach-omap2/pm_bus.c
new file mode 100644
index 0000000..e85aced
--- /dev/null
+++ b/arch/arm/mach-omap2/pm_bus.c
@@ -0,0 +1,82 @@
+/*
+ * Runtime PM support code for OMAP
+ *
+ * Author: Kevin Hilman, Deep Root Systems, LLC
+ *
+ * Copyright (C) 2010 Texas Instruments, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/pm_runtime.h>
+#include <linux/platform_device.h>
+#include <linux/mutex.h>
+
+#include <plat/omap_device.h>
+#include <plat/omap-pm.h>
+
+#ifdef CONFIG_PM_RUNTIME
+int omap_pm_runtime_suspend(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	int r, ret = 0;
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	ret = pm_generic_runtime_suspend(dev);
+
+	if (!ret && dev->parent == &omap_bus) {
+		r = omap_device_idle(pdev);
+		WARN_ON(r);
+	}
+
+	return ret;
+};
+
+int omap_pm_runtime_resume(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	int r;
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	if (dev->parent == &omap_bus) {
+		r = omap_device_enable(pdev);
+		WARN_ON(r);
+	}
+
+	return pm_generic_runtime_resume(dev);
+};
+#endif /* CONFIG_PM_RUNTIME */
+
+static int __init omap_pm_runtime_init(void)
+{
+	const struct dev_pm_ops *pm;
+	struct dev_pm_ops *omap_pm;
+
+	pm = platform_bus_get_pm_ops();
+	if (!pm) {
+		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
+			__func__);
+		return -ENODEV;
+	}
+
+	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
+	if (!omap_pm) {
+		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
+			__func__);
+		return -ENOMEM;
+	}
+		
+	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
+	omap_pm->runtime_resume = omap_pm_runtime_resume;
+
+	platform_bus_set_pm_ops(omap_pm);
+
+	return 0;
+}
+core_initcall(omap_pm_runtime_init);
-- 
1.7.2.1


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

* [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
@ 2010-09-08  0:54 ` Kevin Hilman
  0 siblings, 0 replies; 16+ messages in thread
From: Kevin Hilman @ 2010-09-08  0:54 UTC (permalink / raw)
  To: linux-arm-kernel

From: Kevin Hilman <khilman@ti.com>

Implement the new runtime PM framework as a thin layer on top of the
omap_device API.  OMAP specific runtime PM methods are registered with
the as custom methods on the platform_bus.

In order to determine if a device is an omap_device, its parent device
is checked.  All omap_devices have a new 'omap_bus' device as their
parent device, so checking for this parent is used to check for valid
omap_devices.  If a device is an omap_device, then the appropriate
omap_device functions are called for it.  If not, only the generic
runtime PM functions are called.

Device driver's ->runtime_idle() hook is called when the runtime PM
usecount reaches zero for that device.  Driver's ->runtime_suspend()
hooks are called just before the device is disabled (via
omap_device_idle()), and device driver ->runtime_resume() hooks are
called just after device has been enabled (via omap_device_enable().)

OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.

Cc: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
NOTE: this depends on the driver core patch from me:
[PATCH v2] driver core: platform_bus: allow runtime override of dev_pm_ops
which Greg KH has queued now for 2.6.37:
http://marc.info/?l=linux-kernel&m=128276582108006&w=2

 arch/arm/mach-omap2/Makefile |    8 +++-
 arch/arm/mach-omap2/pm_bus.c |   82 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 2 deletions(-)
 create mode 100644 arch/arm/mach-omap2/pm_bus.c

diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 88d3a1e..ba644c2 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -50,13 +50,17 @@ obj-$(CONFIG_ARCH_OMAP2)		+= sdrc2xxx.o
 ifeq ($(CONFIG_PM),y)
 obj-$(CONFIG_ARCH_OMAP2)		+= pm24xx.o
 obj-$(CONFIG_ARCH_OMAP2)		+= sleep24xx.o
-obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o
-obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o
+obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o pm_bus.o
+obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o pm_bus.o
 obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o
 
 AFLAGS_sleep24xx.o			:=-Wa,-march=armv6
 AFLAGS_sleep34xx.o			:=-Wa,-march=armv7-a
 
+ifeq ($(CONFIG_PM_VERBOSE),y)
+CFLAGS_pm_bus.o				+= -DDEBUG
+endif
+
 endif
 
 # PRCM
diff --git a/arch/arm/mach-omap2/pm_bus.c b/arch/arm/mach-omap2/pm_bus.c
new file mode 100644
index 0000000..e85aced
--- /dev/null
+++ b/arch/arm/mach-omap2/pm_bus.c
@@ -0,0 +1,82 @@
+/*
+ * Runtime PM support code for OMAP
+ *
+ * Author: Kevin Hilman, Deep Root Systems, LLC
+ *
+ * Copyright (C) 2010 Texas Instruments, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/pm_runtime.h>
+#include <linux/platform_device.h>
+#include <linux/mutex.h>
+
+#include <plat/omap_device.h>
+#include <plat/omap-pm.h>
+
+#ifdef CONFIG_PM_RUNTIME
+int omap_pm_runtime_suspend(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	int r, ret = 0;
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	ret = pm_generic_runtime_suspend(dev);
+
+	if (!ret && dev->parent == &omap_bus) {
+		r = omap_device_idle(pdev);
+		WARN_ON(r);
+	}
+
+	return ret;
+};
+
+int omap_pm_runtime_resume(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	int r;
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	if (dev->parent == &omap_bus) {
+		r = omap_device_enable(pdev);
+		WARN_ON(r);
+	}
+
+	return pm_generic_runtime_resume(dev);
+};
+#endif /* CONFIG_PM_RUNTIME */
+
+static int __init omap_pm_runtime_init(void)
+{
+	const struct dev_pm_ops *pm;
+	struct dev_pm_ops *omap_pm;
+
+	pm = platform_bus_get_pm_ops();
+	if (!pm) {
+		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
+			__func__);
+		return -ENODEV;
+	}
+
+	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
+	if (!omap_pm) {
+		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
+			__func__);
+		return -ENOMEM;
+	}
+		
+	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
+	omap_pm->runtime_resume = omap_pm_runtime_resume;
+
+	platform_bus_set_pm_ops(omap_pm);
+
+	return 0;
+}
+core_initcall(omap_pm_runtime_init);
-- 
1.7.2.1

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

* [PATCH 2/2] OMAP1: PM: add simple runtime PM layer to manage clocks
  2010-09-08  0:54 ` Kevin Hilman
@ 2010-09-08  0:54   ` Kevin Hilman
  -1 siblings, 0 replies; 16+ messages in thread
From: Kevin Hilman @ 2010-09-08  0:54 UTC (permalink / raw)
  To: linux-omap; +Cc: Grant Likely, linux-arm-kernel, Manjunatha GK

From: Kevin Hilman <khilman@ti.com>

On OMAP1, we do not have omap_device + omap_hwmod to manage the
device-specific idle, enable and shutdown.  Instead, just
enable/disable device clocks automatically at the runtime PM level.

This allows drivers to not have any OMAP1 specific clock management
and allows them to simply use the runtime PM API to manage clocks.

OMAP1 compile fixes Manjunatha GK <manjugk@ti.com>

Cc: Manjunatha GK <manjugk@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
 arch/arm/mach-omap1/Makefile |    2 +-
 arch/arm/mach-omap1/pm_bus.c |   98 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 99 insertions(+), 1 deletions(-)
 create mode 100644 arch/arm/mach-omap1/pm_bus.c

diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile
index facfaeb..9a304d8 100644
--- a/arch/arm/mach-omap1/Makefile
+++ b/arch/arm/mach-omap1/Makefile
@@ -12,7 +12,7 @@ obj-$(CONFIG_OMAP_MPU_TIMER)	+= time.o
 obj-$(CONFIG_OMAP_32K_TIMER)	+= timer32k.o
 
 # Power Management
-obj-$(CONFIG_PM) += pm.o sleep.o
+obj-$(CONFIG_PM) += pm.o sleep.o pm_bus.o
 
 # DSP
 obj-$(CONFIG_OMAP_MBOX_FWK)	+= mailbox_mach.o
diff --git a/arch/arm/mach-omap1/pm_bus.c b/arch/arm/mach-omap1/pm_bus.c
new file mode 100644
index 0000000..c831348
--- /dev/null
+++ b/arch/arm/mach-omap1/pm_bus.c
@@ -0,0 +1,98 @@
+/*
+ * Runtime PM support code for OMAP1
+ *
+ * Author: Kevin Hilman, Deep Root Systems, LLC
+ *
+ * Copyright (C) 2010 Texas Instruments, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/pm_runtime.h>
+#include <linux/platform_device.h>
+#include <linux/mutex.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+
+#include <plat/omap_device.h>
+#include <plat/omap-pm.h>
+
+#ifdef CONFIG_PM_RUNTIME
+static int omap1_pm_runtime_suspend(struct device *dev)
+{
+	struct clk *iclk, *fclk;
+	int ret = 0;
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	ret = pm_generic_runtime_suspend(dev);
+
+	fclk = clk_get(dev, "fck");
+	if (!IS_ERR(fclk)) {
+		clk_disable(fclk);
+		clk_put(fclk);
+	}
+
+	iclk = clk_get(dev, "ick");
+	if (!IS_ERR(iclk)) {
+		clk_disable(iclk);
+		clk_put(iclk);
+	}
+
+	return 0;
+};
+
+static int omap1_pm_runtime_resume(struct device *dev)
+{
+	int ret = 0;
+	struct clk *iclk, *fclk;
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	iclk = clk_get(dev, "ick");
+	if (!IS_ERR(iclk)) {
+		clk_enable(iclk);
+		clk_put(iclk);
+	}
+
+	fclk = clk_get(dev, "fck");
+	if (!IS_ERR(fclk)) {
+		clk_enable(fclk);
+		clk_put(fclk);
+	}
+
+	return pm_generic_runtime_resume(dev);
+};
+
+static int __init omap1_pm_runtime_init(void)
+{
+	const struct dev_pm_ops *pm;
+	struct dev_pm_ops *omap_pm;
+
+	pm = platform_bus_get_pm_ops();
+	if (!pm) {
+		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
+			__func__);
+		return -ENODEV;
+	}
+
+	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
+	if (!omap_pm) {
+		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
+			__func__);
+		return -ENOMEM;
+	}
+		
+	omap_pm->runtime_suspend = omap1_pm_runtime_suspend;
+	omap_pm->runtime_resume = omap1_pm_runtime_resume;
+
+	platform_bus_set_pm_ops(omap_pm);
+
+	return 0;
+}
+core_initcall(omap1_pm_runtime_init);
+#endif /* CONFIG_PM_RUNTIME */
-- 
1.7.2.1


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

* [PATCH 2/2] OMAP1: PM: add simple runtime PM layer to manage clocks
@ 2010-09-08  0:54   ` Kevin Hilman
  0 siblings, 0 replies; 16+ messages in thread
From: Kevin Hilman @ 2010-09-08  0:54 UTC (permalink / raw)
  To: linux-arm-kernel

From: Kevin Hilman <khilman@ti.com>

On OMAP1, we do not have omap_device + omap_hwmod to manage the
device-specific idle, enable and shutdown.  Instead, just
enable/disable device clocks automatically at the runtime PM level.

This allows drivers to not have any OMAP1 specific clock management
and allows them to simply use the runtime PM API to manage clocks.

OMAP1 compile fixes Manjunatha GK <manjugk@ti.com>

Cc: Manjunatha GK <manjugk@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
 arch/arm/mach-omap1/Makefile |    2 +-
 arch/arm/mach-omap1/pm_bus.c |   98 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 99 insertions(+), 1 deletions(-)
 create mode 100644 arch/arm/mach-omap1/pm_bus.c

diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile
index facfaeb..9a304d8 100644
--- a/arch/arm/mach-omap1/Makefile
+++ b/arch/arm/mach-omap1/Makefile
@@ -12,7 +12,7 @@ obj-$(CONFIG_OMAP_MPU_TIMER)	+= time.o
 obj-$(CONFIG_OMAP_32K_TIMER)	+= timer32k.o
 
 # Power Management
-obj-$(CONFIG_PM) += pm.o sleep.o
+obj-$(CONFIG_PM) += pm.o sleep.o pm_bus.o
 
 # DSP
 obj-$(CONFIG_OMAP_MBOX_FWK)	+= mailbox_mach.o
diff --git a/arch/arm/mach-omap1/pm_bus.c b/arch/arm/mach-omap1/pm_bus.c
new file mode 100644
index 0000000..c831348
--- /dev/null
+++ b/arch/arm/mach-omap1/pm_bus.c
@@ -0,0 +1,98 @@
+/*
+ * Runtime PM support code for OMAP1
+ *
+ * Author: Kevin Hilman, Deep Root Systems, LLC
+ *
+ * Copyright (C) 2010 Texas Instruments, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/pm_runtime.h>
+#include <linux/platform_device.h>
+#include <linux/mutex.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+
+#include <plat/omap_device.h>
+#include <plat/omap-pm.h>
+
+#ifdef CONFIG_PM_RUNTIME
+static int omap1_pm_runtime_suspend(struct device *dev)
+{
+	struct clk *iclk, *fclk;
+	int ret = 0;
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	ret = pm_generic_runtime_suspend(dev);
+
+	fclk = clk_get(dev, "fck");
+	if (!IS_ERR(fclk)) {
+		clk_disable(fclk);
+		clk_put(fclk);
+	}
+
+	iclk = clk_get(dev, "ick");
+	if (!IS_ERR(iclk)) {
+		clk_disable(iclk);
+		clk_put(iclk);
+	}
+
+	return 0;
+};
+
+static int omap1_pm_runtime_resume(struct device *dev)
+{
+	int ret = 0;
+	struct clk *iclk, *fclk;
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	iclk = clk_get(dev, "ick");
+	if (!IS_ERR(iclk)) {
+		clk_enable(iclk);
+		clk_put(iclk);
+	}
+
+	fclk = clk_get(dev, "fck");
+	if (!IS_ERR(fclk)) {
+		clk_enable(fclk);
+		clk_put(fclk);
+	}
+
+	return pm_generic_runtime_resume(dev);
+};
+
+static int __init omap1_pm_runtime_init(void)
+{
+	const struct dev_pm_ops *pm;
+	struct dev_pm_ops *omap_pm;
+
+	pm = platform_bus_get_pm_ops();
+	if (!pm) {
+		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
+			__func__);
+		return -ENODEV;
+	}
+
+	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
+	if (!omap_pm) {
+		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
+			__func__);
+		return -ENOMEM;
+	}
+		
+	omap_pm->runtime_suspend = omap1_pm_runtime_suspend;
+	omap_pm->runtime_resume = omap1_pm_runtime_resume;
+
+	platform_bus_set_pm_ops(omap_pm);
+
+	return 0;
+}
+core_initcall(omap1_pm_runtime_init);
+#endif /* CONFIG_PM_RUNTIME */
-- 
1.7.2.1

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

* Re: [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
  2010-09-08  0:54 ` Kevin Hilman
@ 2010-09-08 16:21   ` Grant Likely
  -1 siblings, 0 replies; 16+ messages in thread
From: Grant Likely @ 2010-09-08 16:21 UTC (permalink / raw)
  To: Kevin Hilman; +Cc: linux-omap, linux-arm-kernel, Rajendra Nayak

On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
> From: Kevin Hilman <khilman@ti.com>
> 
> Implement the new runtime PM framework as a thin layer on top of the
> omap_device API.  OMAP specific runtime PM methods are registered with
> the as custom methods on the platform_bus.
> 
> In order to determine if a device is an omap_device, its parent device
> is checked.  All omap_devices have a new 'omap_bus' device as their
> parent device, so checking for this parent is used to check for valid
> omap_devices.  If a device is an omap_device, then the appropriate
> omap_device functions are called for it.  If not, only the generic
> runtime PM functions are called.
> 
> Device driver's ->runtime_idle() hook is called when the runtime PM
> usecount reaches zero for that device.  Driver's ->runtime_suspend()
> hooks are called just before the device is disabled (via
> omap_device_idle()), and device driver ->runtime_resume() hooks are
> called just after device has been enabled (via omap_device_enable().)
> 
> OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.
> 
> Cc: Rajendra Nayak <rnayak@ti.com>
> Signed-off-by: Kevin Hilman <khilman@ti.com>

It appears that this one will fail to compile when CONFIG_PM_RUNTIME is unset.  Once you've fixed that you can add my a-b line:

Acked-by: Grant Likely <grant.likely@secretlab.ca>

I think this should go via Greg's tree to avoid ordering issues.

> ---
> NOTE: this depends on the driver core patch from me:
> [PATCH v2] driver core: platform_bus: allow runtime override of dev_pm_ops
> which Greg KH has queued now for 2.6.37:
> http://marc.info/?l=linux-kernel&m=128276582108006&w=2
> 
>  arch/arm/mach-omap2/Makefile |    8 +++-
>  arch/arm/mach-omap2/pm_bus.c |   82 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 88 insertions(+), 2 deletions(-)
>  create mode 100644 arch/arm/mach-omap2/pm_bus.c
> 
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index 88d3a1e..ba644c2 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -50,13 +50,17 @@ obj-$(CONFIG_ARCH_OMAP2)		+= sdrc2xxx.o
>  ifeq ($(CONFIG_PM),y)
>  obj-$(CONFIG_ARCH_OMAP2)		+= pm24xx.o
>  obj-$(CONFIG_ARCH_OMAP2)		+= sleep24xx.o
> -obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o
> -obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o
> +obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o pm_bus.o
> +obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o pm_bus.o
>  obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o
>  
>  AFLAGS_sleep24xx.o			:=-Wa,-march=armv6
>  AFLAGS_sleep34xx.o			:=-Wa,-march=armv7-a
>  
> +ifeq ($(CONFIG_PM_VERBOSE),y)
> +CFLAGS_pm_bus.o				+= -DDEBUG
> +endif
> +
>  endif
>  
>  # PRCM
> diff --git a/arch/arm/mach-omap2/pm_bus.c b/arch/arm/mach-omap2/pm_bus.c
> new file mode 100644
> index 0000000..e85aced
> --- /dev/null
> +++ b/arch/arm/mach-omap2/pm_bus.c
> @@ -0,0 +1,82 @@
> +/*
> + * Runtime PM support code for OMAP
> + *
> + * Author: Kevin Hilman, Deep Root Systems, LLC
> + *
> + * Copyright (C) 2010 Texas Instruments, Inc.
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/io.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/platform_device.h>
> +#include <linux/mutex.h>
> +
> +#include <plat/omap_device.h>
> +#include <plat/omap-pm.h>
> +
> +#ifdef CONFIG_PM_RUNTIME
> +int omap_pm_runtime_suspend(struct device *dev)
> +{
> +	struct platform_device *pdev = to_platform_device(dev);
> +	int r, ret = 0;
> +
> +	dev_dbg(dev, "%s\n", __func__);
> +
> +	ret = pm_generic_runtime_suspend(dev);
> +
> +	if (!ret && dev->parent == &omap_bus) {
> +		r = omap_device_idle(pdev);
> +		WARN_ON(r);
> +	}
> +
> +	return ret;
> +};
> +
> +int omap_pm_runtime_resume(struct device *dev)
> +{
> +	struct platform_device *pdev = to_platform_device(dev);
> +	int r;
> +
> +	dev_dbg(dev, "%s\n", __func__);
> +
> +	if (dev->parent == &omap_bus) {
> +		r = omap_device_enable(pdev);
> +		WARN_ON(r);
> +	}
> +
> +	return pm_generic_runtime_resume(dev);
> +};
> +#endif /* CONFIG_PM_RUNTIME */
> +
> +static int __init omap_pm_runtime_init(void)
> +{
> +	const struct dev_pm_ops *pm;
> +	struct dev_pm_ops *omap_pm;
> +
> +	pm = platform_bus_get_pm_ops();
> +	if (!pm) {
> +		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
> +			__func__);
> +		return -ENODEV;
> +	}
> +
> +	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
> +	if (!omap_pm) {
> +		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
> +			__func__);
> +		return -ENOMEM;
> +	}
> +		
> +	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
> +	omap_pm->runtime_resume = omap_pm_runtime_resume;

This will fail to build when CONFIG_PM_RUNTIME is unset.  None of this file should be build when CONFIG_PM_RUNTIME=n.

> +
> +	platform_bus_set_pm_ops(omap_pm);
> +
> +	return 0;
> +}
> +core_initcall(omap_pm_runtime_init);
> -- 
> 1.7.2.1
> 

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

* [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
@ 2010-09-08 16:21   ` Grant Likely
  0 siblings, 0 replies; 16+ messages in thread
From: Grant Likely @ 2010-09-08 16:21 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
> From: Kevin Hilman <khilman@ti.com>
> 
> Implement the new runtime PM framework as a thin layer on top of the
> omap_device API.  OMAP specific runtime PM methods are registered with
> the as custom methods on the platform_bus.
> 
> In order to determine if a device is an omap_device, its parent device
> is checked.  All omap_devices have a new 'omap_bus' device as their
> parent device, so checking for this parent is used to check for valid
> omap_devices.  If a device is an omap_device, then the appropriate
> omap_device functions are called for it.  If not, only the generic
> runtime PM functions are called.
> 
> Device driver's ->runtime_idle() hook is called when the runtime PM
> usecount reaches zero for that device.  Driver's ->runtime_suspend()
> hooks are called just before the device is disabled (via
> omap_device_idle()), and device driver ->runtime_resume() hooks are
> called just after device has been enabled (via omap_device_enable().)
> 
> OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.
> 
> Cc: Rajendra Nayak <rnayak@ti.com>
> Signed-off-by: Kevin Hilman <khilman@ti.com>

It appears that this one will fail to compile when CONFIG_PM_RUNTIME is unset.  Once you've fixed that you can add my a-b line:

Acked-by: Grant Likely <grant.likely@secretlab.ca>

I think this should go via Greg's tree to avoid ordering issues.

> ---
> NOTE: this depends on the driver core patch from me:
> [PATCH v2] driver core: platform_bus: allow runtime override of dev_pm_ops
> which Greg KH has queued now for 2.6.37:
> http://marc.info/?l=linux-kernel&m=128276582108006&w=2
> 
>  arch/arm/mach-omap2/Makefile |    8 +++-
>  arch/arm/mach-omap2/pm_bus.c |   82 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 88 insertions(+), 2 deletions(-)
>  create mode 100644 arch/arm/mach-omap2/pm_bus.c
> 
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index 88d3a1e..ba644c2 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -50,13 +50,17 @@ obj-$(CONFIG_ARCH_OMAP2)		+= sdrc2xxx.o
>  ifeq ($(CONFIG_PM),y)
>  obj-$(CONFIG_ARCH_OMAP2)		+= pm24xx.o
>  obj-$(CONFIG_ARCH_OMAP2)		+= sleep24xx.o
> -obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o
> -obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o
> +obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o pm_bus.o
> +obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o pm_bus.o
>  obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o
>  
>  AFLAGS_sleep24xx.o			:=-Wa,-march=armv6
>  AFLAGS_sleep34xx.o			:=-Wa,-march=armv7-a
>  
> +ifeq ($(CONFIG_PM_VERBOSE),y)
> +CFLAGS_pm_bus.o				+= -DDEBUG
> +endif
> +
>  endif
>  
>  # PRCM
> diff --git a/arch/arm/mach-omap2/pm_bus.c b/arch/arm/mach-omap2/pm_bus.c
> new file mode 100644
> index 0000000..e85aced
> --- /dev/null
> +++ b/arch/arm/mach-omap2/pm_bus.c
> @@ -0,0 +1,82 @@
> +/*
> + * Runtime PM support code for OMAP
> + *
> + * Author: Kevin Hilman, Deep Root Systems, LLC
> + *
> + * Copyright (C) 2010 Texas Instruments, Inc.
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/io.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/platform_device.h>
> +#include <linux/mutex.h>
> +
> +#include <plat/omap_device.h>
> +#include <plat/omap-pm.h>
> +
> +#ifdef CONFIG_PM_RUNTIME
> +int omap_pm_runtime_suspend(struct device *dev)
> +{
> +	struct platform_device *pdev = to_platform_device(dev);
> +	int r, ret = 0;
> +
> +	dev_dbg(dev, "%s\n", __func__);
> +
> +	ret = pm_generic_runtime_suspend(dev);
> +
> +	if (!ret && dev->parent == &omap_bus) {
> +		r = omap_device_idle(pdev);
> +		WARN_ON(r);
> +	}
> +
> +	return ret;
> +};
> +
> +int omap_pm_runtime_resume(struct device *dev)
> +{
> +	struct platform_device *pdev = to_platform_device(dev);
> +	int r;
> +
> +	dev_dbg(dev, "%s\n", __func__);
> +
> +	if (dev->parent == &omap_bus) {
> +		r = omap_device_enable(pdev);
> +		WARN_ON(r);
> +	}
> +
> +	return pm_generic_runtime_resume(dev);
> +};
> +#endif /* CONFIG_PM_RUNTIME */
> +
> +static int __init omap_pm_runtime_init(void)
> +{
> +	const struct dev_pm_ops *pm;
> +	struct dev_pm_ops *omap_pm;
> +
> +	pm = platform_bus_get_pm_ops();
> +	if (!pm) {
> +		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
> +			__func__);
> +		return -ENODEV;
> +	}
> +
> +	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
> +	if (!omap_pm) {
> +		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
> +			__func__);
> +		return -ENOMEM;
> +	}
> +		
> +	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
> +	omap_pm->runtime_resume = omap_pm_runtime_resume;

This will fail to build when CONFIG_PM_RUNTIME is unset.  None of this file should be build when CONFIG_PM_RUNTIME=n.

> +
> +	platform_bus_set_pm_ops(omap_pm);
> +
> +	return 0;
> +}
> +core_initcall(omap_pm_runtime_init);
> -- 
> 1.7.2.1
> 

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

* Re: [PATCH 2/2] OMAP1: PM: add simple runtime PM layer to manage clocks
  2010-09-08  0:54   ` Kevin Hilman
@ 2010-09-08 16:22     ` Grant Likely
  -1 siblings, 0 replies; 16+ messages in thread
From: Grant Likely @ 2010-09-08 16:22 UTC (permalink / raw)
  To: Kevin Hilman; +Cc: linux-omap, linux-arm-kernel, Manjunatha GK

On Tue, Sep 07, 2010 at 05:54:42PM -0700, Kevin Hilman wrote:
> From: Kevin Hilman <khilman@ti.com>
> 
> On OMAP1, we do not have omap_device + omap_hwmod to manage the
> device-specific idle, enable and shutdown.  Instead, just
> enable/disable device clocks automatically at the runtime PM level.
> 
> This allows drivers to not have any OMAP1 specific clock management
> and allows them to simply use the runtime PM API to manage clocks.
> 
> OMAP1 compile fixes Manjunatha GK <manjugk@ti.com>
> 
> Cc: Manjunatha GK <manjugk@ti.com>
> Signed-off-by: Kevin Hilman <khilman@ti.com>

Acked-by: Grant Likely <grant.likely@secretlab.ca>

Also should go via Greg's tree.

g.

> ---
>  arch/arm/mach-omap1/Makefile |    2 +-
>  arch/arm/mach-omap1/pm_bus.c |   98 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 99 insertions(+), 1 deletions(-)
>  create mode 100644 arch/arm/mach-omap1/pm_bus.c
> 
> diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile
> index facfaeb..9a304d8 100644
> --- a/arch/arm/mach-omap1/Makefile
> +++ b/arch/arm/mach-omap1/Makefile
> @@ -12,7 +12,7 @@ obj-$(CONFIG_OMAP_MPU_TIMER)	+= time.o
>  obj-$(CONFIG_OMAP_32K_TIMER)	+= timer32k.o
>  
>  # Power Management
> -obj-$(CONFIG_PM) += pm.o sleep.o
> +obj-$(CONFIG_PM) += pm.o sleep.o pm_bus.o
>  
>  # DSP
>  obj-$(CONFIG_OMAP_MBOX_FWK)	+= mailbox_mach.o
> diff --git a/arch/arm/mach-omap1/pm_bus.c b/arch/arm/mach-omap1/pm_bus.c
> new file mode 100644
> index 0000000..c831348
> --- /dev/null
> +++ b/arch/arm/mach-omap1/pm_bus.c
> @@ -0,0 +1,98 @@
> +/*
> + * Runtime PM support code for OMAP1
> + *
> + * Author: Kevin Hilman, Deep Root Systems, LLC
> + *
> + * Copyright (C) 2010 Texas Instruments, Inc.
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/io.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/platform_device.h>
> +#include <linux/mutex.h>
> +#include <linux/clk.h>
> +#include <linux/err.h>
> +
> +#include <plat/omap_device.h>
> +#include <plat/omap-pm.h>
> +
> +#ifdef CONFIG_PM_RUNTIME
> +static int omap1_pm_runtime_suspend(struct device *dev)
> +{
> +	struct clk *iclk, *fclk;
> +	int ret = 0;
> +
> +	dev_dbg(dev, "%s\n", __func__);
> +
> +	ret = pm_generic_runtime_suspend(dev);
> +
> +	fclk = clk_get(dev, "fck");
> +	if (!IS_ERR(fclk)) {
> +		clk_disable(fclk);
> +		clk_put(fclk);
> +	}
> +
> +	iclk = clk_get(dev, "ick");
> +	if (!IS_ERR(iclk)) {
> +		clk_disable(iclk);
> +		clk_put(iclk);
> +	}
> +
> +	return 0;
> +};
> +
> +static int omap1_pm_runtime_resume(struct device *dev)
> +{
> +	int ret = 0;
> +	struct clk *iclk, *fclk;
> +
> +	dev_dbg(dev, "%s\n", __func__);
> +
> +	iclk = clk_get(dev, "ick");
> +	if (!IS_ERR(iclk)) {
> +		clk_enable(iclk);
> +		clk_put(iclk);
> +	}
> +
> +	fclk = clk_get(dev, "fck");
> +	if (!IS_ERR(fclk)) {
> +		clk_enable(fclk);
> +		clk_put(fclk);
> +	}
> +
> +	return pm_generic_runtime_resume(dev);
> +};
> +
> +static int __init omap1_pm_runtime_init(void)
> +{
> +	const struct dev_pm_ops *pm;
> +	struct dev_pm_ops *omap_pm;
> +
> +	pm = platform_bus_get_pm_ops();
> +	if (!pm) {
> +		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
> +			__func__);
> +		return -ENODEV;
> +	}
> +
> +	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
> +	if (!omap_pm) {
> +		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
> +			__func__);
> +		return -ENOMEM;
> +	}
> +		
> +	omap_pm->runtime_suspend = omap1_pm_runtime_suspend;
> +	omap_pm->runtime_resume = omap1_pm_runtime_resume;
> +
> +	platform_bus_set_pm_ops(omap_pm);
> +
> +	return 0;
> +}
> +core_initcall(omap1_pm_runtime_init);
> +#endif /* CONFIG_PM_RUNTIME */
> -- 
> 1.7.2.1
> 

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

* [PATCH 2/2] OMAP1: PM: add simple runtime PM layer to manage clocks
@ 2010-09-08 16:22     ` Grant Likely
  0 siblings, 0 replies; 16+ messages in thread
From: Grant Likely @ 2010-09-08 16:22 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 07, 2010 at 05:54:42PM -0700, Kevin Hilman wrote:
> From: Kevin Hilman <khilman@ti.com>
> 
> On OMAP1, we do not have omap_device + omap_hwmod to manage the
> device-specific idle, enable and shutdown.  Instead, just
> enable/disable device clocks automatically at the runtime PM level.
> 
> This allows drivers to not have any OMAP1 specific clock management
> and allows them to simply use the runtime PM API to manage clocks.
> 
> OMAP1 compile fixes Manjunatha GK <manjugk@ti.com>
> 
> Cc: Manjunatha GK <manjugk@ti.com>
> Signed-off-by: Kevin Hilman <khilman@ti.com>

Acked-by: Grant Likely <grant.likely@secretlab.ca>

Also should go via Greg's tree.

g.

> ---
>  arch/arm/mach-omap1/Makefile |    2 +-
>  arch/arm/mach-omap1/pm_bus.c |   98 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 99 insertions(+), 1 deletions(-)
>  create mode 100644 arch/arm/mach-omap1/pm_bus.c
> 
> diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile
> index facfaeb..9a304d8 100644
> --- a/arch/arm/mach-omap1/Makefile
> +++ b/arch/arm/mach-omap1/Makefile
> @@ -12,7 +12,7 @@ obj-$(CONFIG_OMAP_MPU_TIMER)	+= time.o
>  obj-$(CONFIG_OMAP_32K_TIMER)	+= timer32k.o
>  
>  # Power Management
> -obj-$(CONFIG_PM) += pm.o sleep.o
> +obj-$(CONFIG_PM) += pm.o sleep.o pm_bus.o
>  
>  # DSP
>  obj-$(CONFIG_OMAP_MBOX_FWK)	+= mailbox_mach.o
> diff --git a/arch/arm/mach-omap1/pm_bus.c b/arch/arm/mach-omap1/pm_bus.c
> new file mode 100644
> index 0000000..c831348
> --- /dev/null
> +++ b/arch/arm/mach-omap1/pm_bus.c
> @@ -0,0 +1,98 @@
> +/*
> + * Runtime PM support code for OMAP1
> + *
> + * Author: Kevin Hilman, Deep Root Systems, LLC
> + *
> + * Copyright (C) 2010 Texas Instruments, Inc.
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/io.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/platform_device.h>
> +#include <linux/mutex.h>
> +#include <linux/clk.h>
> +#include <linux/err.h>
> +
> +#include <plat/omap_device.h>
> +#include <plat/omap-pm.h>
> +
> +#ifdef CONFIG_PM_RUNTIME
> +static int omap1_pm_runtime_suspend(struct device *dev)
> +{
> +	struct clk *iclk, *fclk;
> +	int ret = 0;
> +
> +	dev_dbg(dev, "%s\n", __func__);
> +
> +	ret = pm_generic_runtime_suspend(dev);
> +
> +	fclk = clk_get(dev, "fck");
> +	if (!IS_ERR(fclk)) {
> +		clk_disable(fclk);
> +		clk_put(fclk);
> +	}
> +
> +	iclk = clk_get(dev, "ick");
> +	if (!IS_ERR(iclk)) {
> +		clk_disable(iclk);
> +		clk_put(iclk);
> +	}
> +
> +	return 0;
> +};
> +
> +static int omap1_pm_runtime_resume(struct device *dev)
> +{
> +	int ret = 0;
> +	struct clk *iclk, *fclk;
> +
> +	dev_dbg(dev, "%s\n", __func__);
> +
> +	iclk = clk_get(dev, "ick");
> +	if (!IS_ERR(iclk)) {
> +		clk_enable(iclk);
> +		clk_put(iclk);
> +	}
> +
> +	fclk = clk_get(dev, "fck");
> +	if (!IS_ERR(fclk)) {
> +		clk_enable(fclk);
> +		clk_put(fclk);
> +	}
> +
> +	return pm_generic_runtime_resume(dev);
> +};
> +
> +static int __init omap1_pm_runtime_init(void)
> +{
> +	const struct dev_pm_ops *pm;
> +	struct dev_pm_ops *omap_pm;
> +
> +	pm = platform_bus_get_pm_ops();
> +	if (!pm) {
> +		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
> +			__func__);
> +		return -ENODEV;
> +	}
> +
> +	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
> +	if (!omap_pm) {
> +		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
> +			__func__);
> +		return -ENOMEM;
> +	}
> +		
> +	omap_pm->runtime_suspend = omap1_pm_runtime_suspend;
> +	omap_pm->runtime_resume = omap1_pm_runtime_resume;
> +
> +	platform_bus_set_pm_ops(omap_pm);
> +
> +	return 0;
> +}
> +core_initcall(omap1_pm_runtime_init);
> +#endif /* CONFIG_PM_RUNTIME */
> -- 
> 1.7.2.1
> 

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

* Re: [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
  2010-09-08 16:21   ` Grant Likely
@ 2010-09-08 17:08     ` Kevin Hilman
  -1 siblings, 0 replies; 16+ messages in thread
From: Kevin Hilman @ 2010-09-08 17:08 UTC (permalink / raw)
  To: Grant Likely; +Cc: linux-omap, linux-arm-kernel, Rajendra Nayak

Grant Likely <grant.likely@secretlab.ca> writes:

> On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
>> From: Kevin Hilman <khilman@ti.com>
>> 
>> Implement the new runtime PM framework as a thin layer on top of the
>> omap_device API.  OMAP specific runtime PM methods are registered with
>> the as custom methods on the platform_bus.
>> 
>> In order to determine if a device is an omap_device, its parent device
>> is checked.  All omap_devices have a new 'omap_bus' device as their
>> parent device, so checking for this parent is used to check for valid
>> omap_devices.  If a device is an omap_device, then the appropriate
>> omap_device functions are called for it.  If not, only the generic
>> runtime PM functions are called.
>> 
>> Device driver's ->runtime_idle() hook is called when the runtime PM
>> usecount reaches zero for that device.  Driver's ->runtime_suspend()
>> hooks are called just before the device is disabled (via
>> omap_device_idle()), and device driver ->runtime_resume() hooks are
>> called just after device has been enabled (via omap_device_enable().)
>> 
>> OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.
>> 
>> Cc: Rajendra Nayak <rnayak@ti.com>
>> Signed-off-by: Kevin Hilman <khilman@ti.com>
>
> It appears that this one will fail to compile when CONFIG_PM_RUNTIME
> is unset.  Once you've fixed that you can add my a-b line:

Thanks for catching this. 

> Acked-by: Grant Likely <grant.likely@secretlab.ca>
>
> I think this should go via Greg's tree to avoid ordering issues.

Not a strong preference, but I'd rather see this go via OMAP as we are
building on it in the OMAP tree for this merge window.  The ordering
issues will only affect OMAP users and I have taken care of that in my
staging branches that other are using for their runtime PM conversions.

Kevin

>> ---
>> NOTE: this depends on the driver core patch from me:
>> [PATCH v2] driver core: platform_bus: allow runtime override of dev_pm_ops
>> which Greg KH has queued now for 2.6.37:
>> http://marc.info/?l=linux-kernel&m=128276582108006&w=2
>> 
>>  arch/arm/mach-omap2/Makefile |    8 +++-
>>  arch/arm/mach-omap2/pm_bus.c |   82 ++++++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 88 insertions(+), 2 deletions(-)
>>  create mode 100644 arch/arm/mach-omap2/pm_bus.c
>> 
>> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
>> index 88d3a1e..ba644c2 100644
>> --- a/arch/arm/mach-omap2/Makefile
>> +++ b/arch/arm/mach-omap2/Makefile
>> @@ -50,13 +50,17 @@ obj-$(CONFIG_ARCH_OMAP2)		+= sdrc2xxx.o
>>  ifeq ($(CONFIG_PM),y)
>>  obj-$(CONFIG_ARCH_OMAP2)		+= pm24xx.o
>>  obj-$(CONFIG_ARCH_OMAP2)		+= sleep24xx.o
>> -obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o
>> -obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o
>> +obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o pm_bus.o
>> +obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o pm_bus.o
>>  obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o
>>  
>>  AFLAGS_sleep24xx.o			:=-Wa,-march=armv6
>>  AFLAGS_sleep34xx.o			:=-Wa,-march=armv7-a
>>  
>> +ifeq ($(CONFIG_PM_VERBOSE),y)
>> +CFLAGS_pm_bus.o				+= -DDEBUG
>> +endif
>> +
>>  endif
>>  
>>  # PRCM
>> diff --git a/arch/arm/mach-omap2/pm_bus.c b/arch/arm/mach-omap2/pm_bus.c
>> new file mode 100644
>> index 0000000..e85aced
>> --- /dev/null
>> +++ b/arch/arm/mach-omap2/pm_bus.c
>> @@ -0,0 +1,82 @@
>> +/*
>> + * Runtime PM support code for OMAP
>> + *
>> + * Author: Kevin Hilman, Deep Root Systems, LLC
>> + *
>> + * Copyright (C) 2010 Texas Instruments, Inc.
>> + *
>> + * This file is licensed under the terms of the GNU General Public
>> + * License version 2. This program is licensed "as is" without any
>> + * warranty of any kind, whether express or implied.
>> + */
>> +#include <linux/init.h>
>> +#include <linux/kernel.h>
>> +#include <linux/io.h>
>> +#include <linux/pm_runtime.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/mutex.h>
>> +
>> +#include <plat/omap_device.h>
>> +#include <plat/omap-pm.h>
>> +
>> +#ifdef CONFIG_PM_RUNTIME
>> +int omap_pm_runtime_suspend(struct device *dev)
>> +{
>> +	struct platform_device *pdev = to_platform_device(dev);
>> +	int r, ret = 0;
>> +
>> +	dev_dbg(dev, "%s\n", __func__);
>> +
>> +	ret = pm_generic_runtime_suspend(dev);
>> +
>> +	if (!ret && dev->parent == &omap_bus) {
>> +		r = omap_device_idle(pdev);
>> +		WARN_ON(r);
>> +	}
>> +
>> +	return ret;
>> +};
>> +
>> +int omap_pm_runtime_resume(struct device *dev)
>> +{
>> +	struct platform_device *pdev = to_platform_device(dev);
>> +	int r;
>> +
>> +	dev_dbg(dev, "%s\n", __func__);
>> +
>> +	if (dev->parent == &omap_bus) {
>> +		r = omap_device_enable(pdev);
>> +		WARN_ON(r);
>> +	}
>> +
>> +	return pm_generic_runtime_resume(dev);
>> +};
>> +#endif /* CONFIG_PM_RUNTIME */
>> +
>> +static int __init omap_pm_runtime_init(void)
>> +{
>> +	const struct dev_pm_ops *pm;
>> +	struct dev_pm_ops *omap_pm;
>> +
>> +	pm = platform_bus_get_pm_ops();
>> +	if (!pm) {
>> +		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
>> +			__func__);
>> +		return -ENODEV;
>> +	}
>> +
>> +	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
>> +	if (!omap_pm) {
>> +		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
>> +			__func__);
>> +		return -ENOMEM;
>> +	}
>> +		
>> +	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
>> +	omap_pm->runtime_resume = omap_pm_runtime_resume;
>
> This will fail to build when CONFIG_PM_RUNTIME is unset.  None of this file should be build when CONFIG_PM_RUNTIME=n.
>
>> +
>> +	platform_bus_set_pm_ops(omap_pm);
>> +
>> +	return 0;
>> +}
>> +core_initcall(omap_pm_runtime_init);
>> -- 
>> 1.7.2.1
>> 

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

* [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
@ 2010-09-08 17:08     ` Kevin Hilman
  0 siblings, 0 replies; 16+ messages in thread
From: Kevin Hilman @ 2010-09-08 17:08 UTC (permalink / raw)
  To: linux-arm-kernel

Grant Likely <grant.likely@secretlab.ca> writes:

> On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
>> From: Kevin Hilman <khilman@ti.com>
>> 
>> Implement the new runtime PM framework as a thin layer on top of the
>> omap_device API.  OMAP specific runtime PM methods are registered with
>> the as custom methods on the platform_bus.
>> 
>> In order to determine if a device is an omap_device, its parent device
>> is checked.  All omap_devices have a new 'omap_bus' device as their
>> parent device, so checking for this parent is used to check for valid
>> omap_devices.  If a device is an omap_device, then the appropriate
>> omap_device functions are called for it.  If not, only the generic
>> runtime PM functions are called.
>> 
>> Device driver's ->runtime_idle() hook is called when the runtime PM
>> usecount reaches zero for that device.  Driver's ->runtime_suspend()
>> hooks are called just before the device is disabled (via
>> omap_device_idle()), and device driver ->runtime_resume() hooks are
>> called just after device has been enabled (via omap_device_enable().)
>> 
>> OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.
>> 
>> Cc: Rajendra Nayak <rnayak@ti.com>
>> Signed-off-by: Kevin Hilman <khilman@ti.com>
>
> It appears that this one will fail to compile when CONFIG_PM_RUNTIME
> is unset.  Once you've fixed that you can add my a-b line:

Thanks for catching this. 

> Acked-by: Grant Likely <grant.likely@secretlab.ca>
>
> I think this should go via Greg's tree to avoid ordering issues.

Not a strong preference, but I'd rather see this go via OMAP as we are
building on it in the OMAP tree for this merge window.  The ordering
issues will only affect OMAP users and I have taken care of that in my
staging branches that other are using for their runtime PM conversions.

Kevin

>> ---
>> NOTE: this depends on the driver core patch from me:
>> [PATCH v2] driver core: platform_bus: allow runtime override of dev_pm_ops
>> which Greg KH has queued now for 2.6.37:
>> http://marc.info/?l=linux-kernel&m=128276582108006&w=2
>> 
>>  arch/arm/mach-omap2/Makefile |    8 +++-
>>  arch/arm/mach-omap2/pm_bus.c |   82 ++++++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 88 insertions(+), 2 deletions(-)
>>  create mode 100644 arch/arm/mach-omap2/pm_bus.c
>> 
>> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
>> index 88d3a1e..ba644c2 100644
>> --- a/arch/arm/mach-omap2/Makefile
>> +++ b/arch/arm/mach-omap2/Makefile
>> @@ -50,13 +50,17 @@ obj-$(CONFIG_ARCH_OMAP2)		+= sdrc2xxx.o
>>  ifeq ($(CONFIG_PM),y)
>>  obj-$(CONFIG_ARCH_OMAP2)		+= pm24xx.o
>>  obj-$(CONFIG_ARCH_OMAP2)		+= sleep24xx.o
>> -obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o
>> -obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o
>> +obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o cpuidle34xx.o pm_bus.o
>> +obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o pm_bus.o
>>  obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o
>>  
>>  AFLAGS_sleep24xx.o			:=-Wa,-march=armv6
>>  AFLAGS_sleep34xx.o			:=-Wa,-march=armv7-a
>>  
>> +ifeq ($(CONFIG_PM_VERBOSE),y)
>> +CFLAGS_pm_bus.o				+= -DDEBUG
>> +endif
>> +
>>  endif
>>  
>>  # PRCM
>> diff --git a/arch/arm/mach-omap2/pm_bus.c b/arch/arm/mach-omap2/pm_bus.c
>> new file mode 100644
>> index 0000000..e85aced
>> --- /dev/null
>> +++ b/arch/arm/mach-omap2/pm_bus.c
>> @@ -0,0 +1,82 @@
>> +/*
>> + * Runtime PM support code for OMAP
>> + *
>> + * Author: Kevin Hilman, Deep Root Systems, LLC
>> + *
>> + * Copyright (C) 2010 Texas Instruments, Inc.
>> + *
>> + * This file is licensed under the terms of the GNU General Public
>> + * License version 2. This program is licensed "as is" without any
>> + * warranty of any kind, whether express or implied.
>> + */
>> +#include <linux/init.h>
>> +#include <linux/kernel.h>
>> +#include <linux/io.h>
>> +#include <linux/pm_runtime.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/mutex.h>
>> +
>> +#include <plat/omap_device.h>
>> +#include <plat/omap-pm.h>
>> +
>> +#ifdef CONFIG_PM_RUNTIME
>> +int omap_pm_runtime_suspend(struct device *dev)
>> +{
>> +	struct platform_device *pdev = to_platform_device(dev);
>> +	int r, ret = 0;
>> +
>> +	dev_dbg(dev, "%s\n", __func__);
>> +
>> +	ret = pm_generic_runtime_suspend(dev);
>> +
>> +	if (!ret && dev->parent == &omap_bus) {
>> +		r = omap_device_idle(pdev);
>> +		WARN_ON(r);
>> +	}
>> +
>> +	return ret;
>> +};
>> +
>> +int omap_pm_runtime_resume(struct device *dev)
>> +{
>> +	struct platform_device *pdev = to_platform_device(dev);
>> +	int r;
>> +
>> +	dev_dbg(dev, "%s\n", __func__);
>> +
>> +	if (dev->parent == &omap_bus) {
>> +		r = omap_device_enable(pdev);
>> +		WARN_ON(r);
>> +	}
>> +
>> +	return pm_generic_runtime_resume(dev);
>> +};
>> +#endif /* CONFIG_PM_RUNTIME */
>> +
>> +static int __init omap_pm_runtime_init(void)
>> +{
>> +	const struct dev_pm_ops *pm;
>> +	struct dev_pm_ops *omap_pm;
>> +
>> +	pm = platform_bus_get_pm_ops();
>> +	if (!pm) {
>> +		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
>> +			__func__);
>> +		return -ENODEV;
>> +	}
>> +
>> +	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
>> +	if (!omap_pm) {
>> +		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
>> +			__func__);
>> +		return -ENOMEM;
>> +	}
>> +		
>> +	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
>> +	omap_pm->runtime_resume = omap_pm_runtime_resume;
>
> This will fail to build when CONFIG_PM_RUNTIME is unset.  None of this file should be build when CONFIG_PM_RUNTIME=n.
>
>> +
>> +	platform_bus_set_pm_ops(omap_pm);
>> +
>> +	return 0;
>> +}
>> +core_initcall(omap_pm_runtime_init);
>> -- 
>> 1.7.2.1
>> 

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

* Re: [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
  2010-09-08 16:21   ` Grant Likely
@ 2010-09-08 17:24     ` Kevin Hilman
  -1 siblings, 0 replies; 16+ messages in thread
From: Kevin Hilman @ 2010-09-08 17:24 UTC (permalink / raw)
  To: Grant Likely; +Cc: linux-omap, linux-arm-kernel, Rajendra Nayak

Grant Likely <grant.likely@secretlab.ca> writes:

> On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
>> From: Kevin Hilman <khilman@ti.com>
>> 
>> Implement the new runtime PM framework as a thin layer on top of the
>> omap_device API.  OMAP specific runtime PM methods are registered with
>> the as custom methods on the platform_bus.
>> 
>> In order to determine if a device is an omap_device, its parent device
>> is checked.  All omap_devices have a new 'omap_bus' device as their
>> parent device, so checking for this parent is used to check for valid
>> omap_devices.  If a device is an omap_device, then the appropriate
>> omap_device functions are called for it.  If not, only the generic
>> runtime PM functions are called.
>> 
>> Device driver's ->runtime_idle() hook is called when the runtime PM
>> usecount reaches zero for that device.  Driver's ->runtime_suspend()
>> hooks are called just before the device is disabled (via
>> omap_device_idle()), and device driver ->runtime_resume() hooks are
>> called just after device has been enabled (via omap_device_enable().)
>> 
>> OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.
>> 
>> Cc: Rajendra Nayak <rnayak@ti.com>
>> Signed-off-by: Kevin Hilman <khilman@ti.com>
>

[...]

>> +static int __init omap_pm_runtime_init(void)
>> +{
>> +	const struct dev_pm_ops *pm;
>> +	struct dev_pm_ops *omap_pm;
>> +
>> +	pm = platform_bus_get_pm_ops();
>> +	if (!pm) {
>> +		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
>> +			__func__);
>> +		return -ENODEV;
>> +	}
>> +
>> +	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
>> +	if (!omap_pm) {
>> +		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
>> +			__func__);
>> +		return -ENOMEM;
>> +	}
>> +		
>> +	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
>> +	omap_pm->runtime_resume = omap_pm_runtime_resume;
>
> This will fail to build when CONFIG_PM_RUNTIME is unset.  None of this
> file should be build when CONFIG_PM_RUNTIME=n.

FYI... Rather than not building the whole file, I'm fixing this by
adding an #else clause to the #ifdef:

#else
#define omap_pm_runtime_suspend NULL
#define omap_pm_runtime_resume NULL
#endif /* CONFIG_PM_RUNTIME */

This is because I'll also be building on this to hook up the
_[suspend|resume]_noirq() methods which are based on #ifdef
CONFIG_SUSPEND and not CONFIG_PM_RUNTIME.

Kevin

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

* [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
@ 2010-09-08 17:24     ` Kevin Hilman
  0 siblings, 0 replies; 16+ messages in thread
From: Kevin Hilman @ 2010-09-08 17:24 UTC (permalink / raw)
  To: linux-arm-kernel

Grant Likely <grant.likely@secretlab.ca> writes:

> On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
>> From: Kevin Hilman <khilman@ti.com>
>> 
>> Implement the new runtime PM framework as a thin layer on top of the
>> omap_device API.  OMAP specific runtime PM methods are registered with
>> the as custom methods on the platform_bus.
>> 
>> In order to determine if a device is an omap_device, its parent device
>> is checked.  All omap_devices have a new 'omap_bus' device as their
>> parent device, so checking for this parent is used to check for valid
>> omap_devices.  If a device is an omap_device, then the appropriate
>> omap_device functions are called for it.  If not, only the generic
>> runtime PM functions are called.
>> 
>> Device driver's ->runtime_idle() hook is called when the runtime PM
>> usecount reaches zero for that device.  Driver's ->runtime_suspend()
>> hooks are called just before the device is disabled (via
>> omap_device_idle()), and device driver ->runtime_resume() hooks are
>> called just after device has been enabled (via omap_device_enable().)
>> 
>> OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.
>> 
>> Cc: Rajendra Nayak <rnayak@ti.com>
>> Signed-off-by: Kevin Hilman <khilman@ti.com>
>

[...]

>> +static int __init omap_pm_runtime_init(void)
>> +{
>> +	const struct dev_pm_ops *pm;
>> +	struct dev_pm_ops *omap_pm;
>> +
>> +	pm = platform_bus_get_pm_ops();
>> +	if (!pm) {
>> +		pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
>> +			__func__);
>> +		return -ENODEV;
>> +	}
>> +
>> +	omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
>> +	if (!omap_pm) {
>> +		pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
>> +			__func__);
>> +		return -ENOMEM;
>> +	}
>> +		
>> +	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
>> +	omap_pm->runtime_resume = omap_pm_runtime_resume;
>
> This will fail to build when CONFIG_PM_RUNTIME is unset.  None of this
> file should be build when CONFIG_PM_RUNTIME=n.

FYI... Rather than not building the whole file, I'm fixing this by
adding an #else clause to the #ifdef:

#else
#define omap_pm_runtime_suspend NULL
#define omap_pm_runtime_resume NULL
#endif /* CONFIG_PM_RUNTIME */

This is because I'll also be building on this to hook up the
_[suspend|resume]_noirq() methods which are based on #ifdef
CONFIG_SUSPEND and not CONFIG_PM_RUNTIME.

Kevin

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

* Re: [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
  2010-09-08 17:24     ` Kevin Hilman
@ 2010-09-08 17:39       ` Grant Likely
  -1 siblings, 0 replies; 16+ messages in thread
From: Grant Likely @ 2010-09-08 17:39 UTC (permalink / raw)
  To: Kevin Hilman; +Cc: linux-omap, linux-arm-kernel, Rajendra Nayak

On Wed, Sep 08, 2010 at 10:24:48AM -0700, Kevin Hilman wrote:
> Grant Likely <grant.likely@secretlab.ca> writes:
> 
> > On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
> >> +	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
> >> +	omap_pm->runtime_resume = omap_pm_runtime_resume;
> >
> > This will fail to build when CONFIG_PM_RUNTIME is unset.  None of this
> > file should be build when CONFIG_PM_RUNTIME=n.
> 
> FYI... Rather than not building the whole file, I'm fixing this by
> adding an #else clause to the #ifdef:
> 
> #else
> #define omap_pm_runtime_suspend NULL
> #define omap_pm_runtime_resume NULL
> #endif /* CONFIG_PM_RUNTIME */
> 
> This is because I'll also be building on this to hook up the
> _[suspend|resume]_noirq() methods which are based on #ifdef
> CONFIG_SUSPEND and not CONFIG_PM_RUNTIME.

okay.

g.


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

* [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
@ 2010-09-08 17:39       ` Grant Likely
  0 siblings, 0 replies; 16+ messages in thread
From: Grant Likely @ 2010-09-08 17:39 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Sep 08, 2010 at 10:24:48AM -0700, Kevin Hilman wrote:
> Grant Likely <grant.likely@secretlab.ca> writes:
> 
> > On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
> >> +	omap_pm->runtime_suspend = omap_pm_runtime_suspend;
> >> +	omap_pm->runtime_resume = omap_pm_runtime_resume;
> >
> > This will fail to build when CONFIG_PM_RUNTIME is unset.  None of this
> > file should be build when CONFIG_PM_RUNTIME=n.
> 
> FYI... Rather than not building the whole file, I'm fixing this by
> adding an #else clause to the #ifdef:
> 
> #else
> #define omap_pm_runtime_suspend NULL
> #define omap_pm_runtime_resume NULL
> #endif /* CONFIG_PM_RUNTIME */
> 
> This is because I'll also be building on this to hook up the
> _[suspend|resume]_noirq() methods which are based on #ifdef
> CONFIG_SUSPEND and not CONFIG_PM_RUNTIME.

okay.

g.

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

* Re: [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
  2010-09-08 17:08     ` Kevin Hilman
@ 2010-09-08 17:40       ` Grant Likely
  -1 siblings, 0 replies; 16+ messages in thread
From: Grant Likely @ 2010-09-08 17:40 UTC (permalink / raw)
  To: Kevin Hilman; +Cc: linux-omap, linux-arm-kernel, Rajendra Nayak

On Wed, Sep 08, 2010 at 10:08:42AM -0700, Kevin Hilman wrote:
> Grant Likely <grant.likely@secretlab.ca> writes:
> 
> > On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
> >> From: Kevin Hilman <khilman@ti.com>
> >> 
> >> Implement the new runtime PM framework as a thin layer on top of the
> >> omap_device API.  OMAP specific runtime PM methods are registered with
> >> the as custom methods on the platform_bus.
> >> 
> >> In order to determine if a device is an omap_device, its parent device
> >> is checked.  All omap_devices have a new 'omap_bus' device as their
> >> parent device, so checking for this parent is used to check for valid
> >> omap_devices.  If a device is an omap_device, then the appropriate
> >> omap_device functions are called for it.  If not, only the generic
> >> runtime PM functions are called.
> >> 
> >> Device driver's ->runtime_idle() hook is called when the runtime PM
> >> usecount reaches zero for that device.  Driver's ->runtime_suspend()
> >> hooks are called just before the device is disabled (via
> >> omap_device_idle()), and device driver ->runtime_resume() hooks are
> >> called just after device has been enabled (via omap_device_enable().)
> >> 
> >> OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.
> >> 
> >> Cc: Rajendra Nayak <rnayak@ti.com>
> >> Signed-off-by: Kevin Hilman <khilman@ti.com>
> >
> > It appears that this one will fail to compile when CONFIG_PM_RUNTIME
> > is unset.  Once you've fixed that you can add my a-b line:
> 
> Thanks for catching this. 
> 
> > Acked-by: Grant Likely <grant.likely@secretlab.ca>
> >
> > I think this should go via Greg's tree to avoid ordering issues.
> 
> Not a strong preference, but I'd rather see this go via OMAP as we are
> building on it in the OMAP tree for this merge window.  The ordering
> issues will only affect OMAP users and I have taken care of that in my
> staging branches that other are using for their runtime PM conversions.

okay.

g.


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

* [PATCH 1/2] OMAP2+: PM: initial runtime PM core support
@ 2010-09-08 17:40       ` Grant Likely
  0 siblings, 0 replies; 16+ messages in thread
From: Grant Likely @ 2010-09-08 17:40 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Sep 08, 2010 at 10:08:42AM -0700, Kevin Hilman wrote:
> Grant Likely <grant.likely@secretlab.ca> writes:
> 
> > On Tue, Sep 07, 2010 at 05:54:41PM -0700, Kevin Hilman wrote:
> >> From: Kevin Hilman <khilman@ti.com>
> >> 
> >> Implement the new runtime PM framework as a thin layer on top of the
> >> omap_device API.  OMAP specific runtime PM methods are registered with
> >> the as custom methods on the platform_bus.
> >> 
> >> In order to determine if a device is an omap_device, its parent device
> >> is checked.  All omap_devices have a new 'omap_bus' device as their
> >> parent device, so checking for this parent is used to check for valid
> >> omap_devices.  If a device is an omap_device, then the appropriate
> >> omap_device functions are called for it.  If not, only the generic
> >> runtime PM functions are called.
> >> 
> >> Device driver's ->runtime_idle() hook is called when the runtime PM
> >> usecount reaches zero for that device.  Driver's ->runtime_suspend()
> >> hooks are called just before the device is disabled (via
> >> omap_device_idle()), and device driver ->runtime_resume() hooks are
> >> called just after device has been enabled (via omap_device_enable().)
> >> 
> >> OMAP4 build support from Rajendra Nayak <rnayak@ti.com>.
> >> 
> >> Cc: Rajendra Nayak <rnayak@ti.com>
> >> Signed-off-by: Kevin Hilman <khilman@ti.com>
> >
> > It appears that this one will fail to compile when CONFIG_PM_RUNTIME
> > is unset.  Once you've fixed that you can add my a-b line:
> 
> Thanks for catching this. 
> 
> > Acked-by: Grant Likely <grant.likely@secretlab.ca>
> >
> > I think this should go via Greg's tree to avoid ordering issues.
> 
> Not a strong preference, but I'd rather see this go via OMAP as we are
> building on it in the OMAP tree for this merge window.  The ordering
> issues will only affect OMAP users and I have taken care of that in my
> staging branches that other are using for their runtime PM conversions.

okay.

g.

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

end of thread, other threads:[~2010-09-08 17:40 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-08  0:54 [PATCH 1/2] OMAP2+: PM: initial runtime PM core support Kevin Hilman
2010-09-08  0:54 ` Kevin Hilman
2010-09-08  0:54 ` [PATCH 2/2] OMAP1: PM: add simple runtime PM layer to manage clocks Kevin Hilman
2010-09-08  0:54   ` Kevin Hilman
2010-09-08 16:22   ` Grant Likely
2010-09-08 16:22     ` Grant Likely
2010-09-08 16:21 ` [PATCH 1/2] OMAP2+: PM: initial runtime PM core support Grant Likely
2010-09-08 16:21   ` Grant Likely
2010-09-08 17:08   ` Kevin Hilman
2010-09-08 17:08     ` Kevin Hilman
2010-09-08 17:40     ` Grant Likely
2010-09-08 17:40       ` Grant Likely
2010-09-08 17:24   ` Kevin Hilman
2010-09-08 17:24     ` Kevin Hilman
2010-09-08 17:39     ` Grant Likely
2010-09-08 17:39       ` Grant Likely

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.