diff options
Diffstat (limited to 'patches.sh7757lcr/drivers-sh-generalize-runtime-pm-platform-stub.patch')
-rw-r--r-- | patches.sh7757lcr/drivers-sh-generalize-runtime-pm-platform-stub.patch | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/patches.sh7757lcr/drivers-sh-generalize-runtime-pm-platform-stub.patch b/patches.sh7757lcr/drivers-sh-generalize-runtime-pm-platform-stub.patch new file mode 100644 index 00000000000000..f9d1a536719b3a --- /dev/null +++ b/patches.sh7757lcr/drivers-sh-generalize-runtime-pm-platform-stub.patch @@ -0,0 +1,198 @@ +From ltsi-dev-bounces@lists.linuxfoundation.org Tue Jul 10 22:13:21 2012 +From: "Shimoda, Yoshihiro" <yoshihiro.shimoda.uh@renesas.com> +Date: Wed, 11 Jul 2012 14:13:16 +0900 +Subject: drivers: sh: Generalize runtime PM platform stub. +To: ltsi-dev@lists.linuxfoundation.org +Message-ID: <4FFD0B6C.1060006@renesas.com> + + +>From 11b01cfe8fbb175d81f1049e7c265d5618234357 Mon Sep 17 00:00:00 2001 +From: Paul Mundt <lethal@linux-sh.org> +Date: Fri, 11 Nov 2011 15:41:50 +0900 +Subject: drivers: sh: Generalize runtime PM platform stub. + +The runtime PM platform support stub in use by ARM-based SH/R-Mobile +platforms contains nothing that's specifically ARM-related and instead of +wholly generic to anything using the clock framework. + +The recent runtime PM changes interact rather badly with the lazy +disabling of clocks late in the boot process through the clock framework, +leading to situations where the runtime suspend/resume paths are entered +without a clock being actively driven due to having been lazily gated +off. + +In order to correct this we can trivially tie in the aforementioned stub +as a general fallback for all SH platforms that don't presently have +their own runtime PM implementations (the corner case being SH-based +SH-Mobile platforms, which have their own stub through the hwblk API -- +which in turn has bitrotted and will be subsequently adapted to use the +same stub as everyone else), regardless of whether the platforms choose +to define power domains of their own or not. + +This fixes up regressions for clock framework users who also build in +runtime PM support without any specific power domains of their own, which +was previously causing the serial console to be lost when warring with +lazy clock disabling. + +Signed-off-by: Paul Mundt <lethal@linux-sh.org> +(cherry picked from commit 750a7eee7395492960a7aeb3a3a1aa74158ec326) +Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> +Tested-by: Simon Horman <horms@verge.net.au> +--- + arch/arm/mach-shmobile/Makefile | 2 - + arch/arm/mach-shmobile/pm_runtime.c | 59 ------------------------------------ + drivers/sh/Makefile | 8 ++++ + drivers/sh/pm_runtime.c | 59 ++++++++++++++++++++++++++++++++++++ + 4 files changed, 68 insertions(+), 60 deletions(-) + delete mode 100644 arch/arm/mach-shmobile/pm_runtime.c + create mode 100644 drivers/sh/pm_runtime.c + +--- a/arch/arm/mach-shmobile/Makefile ++++ b/arch/arm/mach-shmobile/Makefile +@@ -3,7 +3,7 @@ + # + + # Common objects +-obj-y := timer.o console.o clock.o pm_runtime.o ++obj-y := timer.o console.o clock.o + + # CPU objects + obj-$(CONFIG_ARCH_SH7367) += setup-sh7367.o clock-sh7367.o intc-sh7367.o +--- a/arch/arm/mach-shmobile/pm_runtime.c ++++ /dev/null +@@ -1,59 +0,0 @@ +-/* +- * arch/arm/mach-shmobile/pm_runtime.c +- * +- * Runtime PM support code for SuperH Mobile ARM +- * +- * Copyright (C) 2009-2010 Magnus Damm +- * +- * This file is subject to the terms and conditions of the GNU General Public +- * License. See the file "COPYING" in the main directory of this archive +- * for more details. +- */ +- +-#include <linux/init.h> +-#include <linux/kernel.h> +-#include <linux/io.h> +-#include <linux/pm_runtime.h> +-#include <linux/pm_clock.h> +-#include <linux/platform_device.h> +-#include <linux/clk.h> +-#include <linux/sh_clk.h> +-#include <linux/bitmap.h> +-#include <linux/slab.h> +- +-#ifdef CONFIG_PM_RUNTIME +- +-static int default_platform_runtime_idle(struct device *dev) +-{ +- /* suspend synchronously to disable clocks immediately */ +- return pm_runtime_suspend(dev); +-} +- +-static struct dev_pm_domain default_pm_domain = { +- .ops = { +- .runtime_suspend = pm_clk_suspend, +- .runtime_resume = pm_clk_resume, +- .runtime_idle = default_platform_runtime_idle, +- USE_PLATFORM_PM_SLEEP_OPS +- }, +-}; +- +-#define DEFAULT_PM_DOMAIN_PTR (&default_pm_domain) +- +-#else +- +-#define DEFAULT_PM_DOMAIN_PTR NULL +- +-#endif /* CONFIG_PM_RUNTIME */ +- +-static struct pm_clk_notifier_block platform_bus_notifier = { +- .pm_domain = DEFAULT_PM_DOMAIN_PTR, +- .con_ids = { NULL, }, +-}; +- +-static int __init sh_pm_runtime_init(void) +-{ +- pm_clk_add_notifier(&platform_bus_type, &platform_bus_notifier); +- return 0; +-} +-core_initcall(sh_pm_runtime_init); +--- a/drivers/sh/Makefile ++++ b/drivers/sh/Makefile +@@ -7,3 +7,11 @@ obj-$(CONFIG_HAVE_CLK) += clk/ + obj-$(CONFIG_MAPLE) += maple/ + obj-$(CONFIG_SUPERHYWAY) += superhyway/ + obj-$(CONFIG_GENERIC_GPIO) += pfc.o ++ ++# ++# For the moment we only use this framework for ARM-based SH/R-Mobile ++# platforms and generic SH. SH-based SH-Mobile platforms are still using ++# an older framework that is pending up-porting, at which point this ++# special casing can go away. ++# ++obj-$(CONFIG_SUPERH)$(CONFIG_ARCH_SHMOBILE) += pm_runtime.o +--- /dev/null ++++ b/drivers/sh/pm_runtime.c +@@ -0,0 +1,59 @@ ++/* ++ * arch/arm/mach-shmobile/pm_runtime.c ++ * ++ * Runtime PM support code for SuperH Mobile ARM ++ * ++ * Copyright (C) 2009-2010 Magnus Damm ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file "COPYING" in the main directory of this archive ++ * for more details. ++ */ ++ ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/io.h> ++#include <linux/pm_runtime.h> ++#include <linux/pm_clock.h> ++#include <linux/platform_device.h> ++#include <linux/clk.h> ++#include <linux/sh_clk.h> ++#include <linux/bitmap.h> ++#include <linux/slab.h> ++ ++#ifdef CONFIG_PM_RUNTIME ++ ++static int default_platform_runtime_idle(struct device *dev) ++{ ++ /* suspend synchronously to disable clocks immediately */ ++ return pm_runtime_suspend(dev); ++} ++ ++static struct dev_pm_domain default_pm_domain = { ++ .ops = { ++ .runtime_suspend = pm_clk_suspend, ++ .runtime_resume = pm_clk_resume, ++ .runtime_idle = default_platform_runtime_idle, ++ USE_PLATFORM_PM_SLEEP_OPS ++ }, ++}; ++ ++#define DEFAULT_PM_DOMAIN_PTR (&default_pm_domain) ++ ++#else ++ ++#define DEFAULT_PM_DOMAIN_PTR NULL ++ ++#endif /* CONFIG_PM_RUNTIME */ ++ ++static struct pm_clk_notifier_block platform_bus_notifier = { ++ .pm_domain = DEFAULT_PM_DOMAIN_PTR, ++ .con_ids = { NULL, }, ++}; ++ ++static int __init sh_pm_runtime_init(void) ++{ ++ pm_clk_add_notifier(&platform_bus_type, &platform_bus_notifier); ++ return 0; ++} ++core_initcall(sh_pm_runtime_init); |