--- /dev/null
+From rjw@sisk.pl Mon Mar 26 14:57:30 2012
+From: "Rafael J. Wysocki" <rjw@sisk.pl>
+Date: Mon, 26 Mar 2012 23:24:40 +0200
+Subject: PM / Domains: Check domain status during hibernation restore of devices
+To: Greg KH <gregkh@linuxfoundation.org>
+Cc: horms@verge.net.au, lethal@linux-sh.org, stable@vger.kernel.org, stable-commits@vger.kernel.org
+Message-ID: <201203262324.40855.rjw@sisk.pl>
+
+
+From: Rafael J. Wysocki <rjw@sisk.pl>
+
+This is a backport of mainline commit
+18dd2ece3cde14cfd42e95a89eb14016699a5f15.
+
+Power domains that were off before hibernation shouldn't be turned on
+during device restore, so prevent that from happening.
+
+This change fixed up mainline commit
+65533bbf63b4f37723fdfedc73d0653958973323
+
+ PM / Domains: Fix hibernation restore of devices, v2
+
+that didn't include it by mistake.
+
+Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/base/power/domain.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/base/power/domain.c
++++ b/drivers/base/power/domain.c
+@@ -1064,6 +1064,9 @@ static int pm_genpd_restore_noirq(struct
+ }
+ }
+
++ if (genpd->suspend_power_off)
++ return 0;
++
+ pm_genpd_poweron(genpd);
+ genpd_start_dev(genpd, dev);
+
--- /dev/null
+From rjw@sisk.pl Mon Mar 26 14:56:42 2012
+From: "Rafael J. Wysocki" <rjw@sisk.pl>
+Date: Mon, 26 Mar 2012 23:23:59 +0200
+Subject: PM / Domains: Fix hibernation restore of devices, v2
+To: Greg KH <gregkh@linuxfoundation.org>
+Cc: horms@verge.net.au, lethal@linux-sh.org, stable@vger.kernel.org, stable-commits@vger.kernel.org
+Message-ID: <201203262324.00031.rjw@sisk.pl>
+
+
+From: Rafael J. Wysocki <rjw@sisk.pl>
+
+This is a backport of mainline commit
+65533bbf63b4f37723fdfedc73d0653958973323.
+
+During resume from hibernation pm_genpd_restore_noirq() should only
+power off domains whose suspend_power_off flags are set once and
+not every time it is called for a device in the given domain.
+Moreover, it shouldn't decrement genpd->suspended_count, because
+that field is not touched during device freezing and therefore it is
+always equal to 0 when pm_genpd_restore_noirq() runs for the first
+device in the given domain.
+
+This means pm_genpd_restore_noirq() may use genpd->suspended_count
+to determine whether or not it it has been called for the domain in
+question already in this cycle (it only needs to increment that
+field every time it runs for this purpose) and whether or not it
+should check if the domain needs to be powered off. For that to
+work, though, pm_genpd_prepare() has to clear genpd->suspended_count
+when it runs for the first device in the given domain (in which case
+that flag need not be cleared during domain initialization).
+
+Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/base/power/domain.c | 29 +++++++++++++++++++----------
+ 1 file changed, 19 insertions(+), 10 deletions(-)
+
+--- a/drivers/base/power/domain.c
++++ b/drivers/base/power/domain.c
+@@ -764,8 +764,10 @@ static int pm_genpd_prepare(struct devic
+
+ genpd_acquire_lock(genpd);
+
+- if (genpd->prepared_count++ == 0)
++ if (genpd->prepared_count++ == 0) {
++ genpd->suspended_count = 0;
+ genpd->suspend_power_off = genpd->status == GPD_STATE_POWER_OFF;
++ }
+
+ genpd_release_lock(genpd);
+
+@@ -1041,20 +1043,28 @@ static int pm_genpd_restore_noirq(struct
+ * Since all of the "noirq" callbacks are executed sequentially, it is
+ * guaranteed that this function will never run twice in parallel for
+ * the same PM domain, so it is not necessary to use locking here.
++ *
++ * At this point suspended_count == 0 means we are being run for the
++ * first time for the given domain in the present cycle.
+ */
+- genpd->status = GPD_STATE_POWER_OFF;
+- if (genpd->suspend_power_off) {
++ if (genpd->suspended_count++ == 0) {
+ /*
+- * The boot kernel might put the domain into the power on state,
+- * so make sure it really is powered off.
++ * The boot kernel might put the domain into arbitrary state,
++ * so make it appear as powered off to pm_genpd_poweron(), so
++ * that it tries to power it on in case it was really off.
+ */
+- if (genpd->power_off)
+- genpd->power_off(genpd);
+- return 0;
++ genpd->status = GPD_STATE_POWER_OFF;
++ if (genpd->suspend_power_off) {
++ /*
++ * If the domain was off before the hibernation, make
++ * sure it will be off going forward.
++ */
++ if (genpd->power_off)
++ genpd->power_off(genpd);
++ }
+ }
+
+ pm_genpd_poweron(genpd);
+- genpd->suspended_count--;
+ genpd_start_dev(genpd, dev);
+
+ return genpd_resume_early(genpd, dev);
+@@ -1558,7 +1568,6 @@ void pm_genpd_init(struct generic_pm_dom
+ genpd->poweroff_task = NULL;
+ genpd->resume_count = 0;
+ genpd->device_count = 0;
+- genpd->suspended_count = 0;
+ genpd->max_off_time_ns = -1;
+ genpd->domain.ops.runtime_suspend = pm_genpd_runtime_suspend;
+ genpd->domain.ops.runtime_resume = pm_genpd_runtime_resume;