All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ulf Hansson <ulf.hansson@linaro.org>
To: Wolfram Sang <wsa@the-dreams.de>,
	"Rafael J . Wysocki" <rjw@rjwysocki.net>,
	Len Brown <lenb@kernel.org>,
	linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org
Cc: Kevin Hilman <khilman@kernel.org>,
	Jarkko Nikula <jarkko.nikula@linux.intel.com>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	Jisheng Zhang <jszhang@marvell.com>,
	John Stultz <john.stultz@linaro.org>,
	Guodong Xu <guodong.xu@linaro.org>,
	Sumit Semwal <sumit.semwal@linaro.org>,
	Haojian Zhuang <haojian.zhuang@linaro.org>,
	linux-arm-kernel@lists.infradead.org, linux-i2c@vger.kernel.org,
	Ulf Hansson <ulf.hansson@linaro.org>
Subject: [PATCH 6/9] PM / ACPI: Provide option to disable direct_complete for ACPI devices
Date: Wed, 21 Jun 2017 21:21:25 +0200	[thread overview]
Message-ID: <1498072888-14782-7-git-send-email-ulf.hansson@linaro.org> (raw)
In-Reply-To: <1498072888-14782-1-git-send-email-ulf.hansson@linaro.org>

In some cases a driver for an ACPI device needs to be able to prevent the
ACPI PM domain from using the direct_complete path during system sleep.

One typical case is when the driver for the device needs its device to stay
runtime enabled, during the __device_suspend phase. This isn't the case
when the direct_complete path is being executed by the PM core, as it then
disables runtime PM for the device in __device_suspend(). Any following
attempts to runtime resume the device after that point, just fails.

A workaround to this problem is to let the driver runtime resume its device
from its ->prepare() callback, as that would prevent the direct_complete
path from being executed. However, that may often be a waste, especially if
it turned out that no one really needed the device.

For this reason, invent acpi_dev_disable|enable_direct_complete(), to allow
drivers to inform the ACPI PM domain to change its default behaviour during
system sleep, and thus control whether it may use the direct_complete path
or not.

Typically a driver should call acpi_dev_disable_direct_comlete() during
->probe() and acpi_dev_enable_direct_complete() in ->remove().

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
 drivers/acpi/device_pm.c | 37 ++++++++++++++++++++++++++++++++++++-
 include/acpi/acpi_bus.h  |  1 +
 include/linux/acpi.h     |  4 ++++
 3 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
index ee51e75..2393a1a 100644
--- a/drivers/acpi/device_pm.c
+++ b/drivers/acpi/device_pm.c
@@ -879,6 +879,41 @@ EXPORT_SYMBOL_GPL(acpi_subsys_runtime_resume);
 
 #ifdef CONFIG_PM_SLEEP
 /**
+ * acpi_dev_disable_direct_complete - Disable the direct_complete path for ACPI.
+ * @dev: Device to disable the path for.
+ *
+ * Per default the ACPI PM domain tries to use the direct_complete path for its
+ * devices during system sleep. This function allows a user, typically a driver
+ * during probe, to disable the direct_complete path from being used by ACPI.
+ */
+void acpi_dev_disable_direct_complete(struct device *dev)
+{
+	struct acpi_device *adev = ACPI_COMPANION(dev);
+
+	if (adev)
+		adev->no_direct_complete = true;
+}
+EXPORT_SYMBOL_GPL(acpi_dev_disable_direct_complete);
+
+/**
+ * acpi_dev_enable_direct_complete - Enable the direct_complete path for ACPI.
+ * @dev: Device to enable the path for.
+ *
+ * Enable the direct_complete path to be used during system suspend for the ACPI
+ * PM domain, which is the default option. Typically a driver that disabled the
+ * path during ->probe(), must call this function during ->remove() to re-enable
+ * the direct_complete path to be used by ACPI.
+ */
+void acpi_dev_enable_direct_complete(struct device *dev)
+{
+	struct acpi_device *adev = ACPI_COMPANION(dev);
+
+	if (adev)
+		adev->no_direct_complete = false;
+}
+EXPORT_SYMBOL_GPL(acpi_dev_enable_direct_complete);
+
+/**
  * acpi_dev_suspend_late - Put device into a low-power state using ACPI.
  * @dev: Device to put into a low-power state.
  *
@@ -967,7 +1002,7 @@ int acpi_subsys_prepare(struct device *dev)
 	if (ret < 0)
 		return ret;
 
-	if (!adev || !pm_runtime_suspended(dev))
+	if (!adev || adev->no_direct_complete || !pm_runtime_suspended(dev))
 		return 0;
 
 	return !acpi_dev_needs_resume(dev, adev);
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 63a90a6..2293d24 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -380,6 +380,7 @@ struct acpi_device {
 	struct list_head physical_node_list;
 	struct mutex physical_node_lock;
 	void (*remove)(struct acpi_device *);
+	bool no_direct_complete;
 };
 
 /* Non-device subnode */
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 137e4a3..a41cca5 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -859,6 +859,8 @@ static inline int acpi_dev_pm_attach(struct device *dev, bool power_on)
 #endif
 
 #if defined(CONFIG_ACPI) && defined(CONFIG_PM_SLEEP)
+void acpi_dev_disable_direct_complete(struct device *dev);
+void acpi_dev_enable_direct_complete(struct device *dev);
 int acpi_dev_suspend_late(struct device *dev);
 int acpi_dev_resume_early(struct device *dev);
 int acpi_subsys_prepare(struct device *dev);
@@ -868,6 +870,8 @@ int acpi_subsys_resume_early(struct device *dev);
 int acpi_subsys_suspend(struct device *dev);
 int acpi_subsys_freeze(struct device *dev);
 #else
+static inline void acpi_dev_disable_direct_complete(struct device *dev) {}
+static inline void acpi_dev_enable_direct_complete(struct device *dev) {}
 static inline int acpi_dev_suspend_late(struct device *dev) { return 0; }
 static inline int acpi_dev_resume_early(struct device *dev) { return 0; }
 static inline int acpi_subsys_prepare(struct device *dev) { return 0; }
-- 
2.7.4

WARNING: multiple messages have this Message-ID (diff)
From: ulf.hansson@linaro.org (Ulf Hansson)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 6/9] PM / ACPI: Provide option to disable direct_complete for ACPI devices
Date: Wed, 21 Jun 2017 21:21:25 +0200	[thread overview]
Message-ID: <1498072888-14782-7-git-send-email-ulf.hansson@linaro.org> (raw)
In-Reply-To: <1498072888-14782-1-git-send-email-ulf.hansson@linaro.org>

In some cases a driver for an ACPI device needs to be able to prevent the
ACPI PM domain from using the direct_complete path during system sleep.

One typical case is when the driver for the device needs its device to stay
runtime enabled, during the __device_suspend phase. This isn't the case
when the direct_complete path is being executed by the PM core, as it then
disables runtime PM for the device in __device_suspend(). Any following
attempts to runtime resume the device after that point, just fails.

A workaround to this problem is to let the driver runtime resume its device
from its ->prepare() callback, as that would prevent the direct_complete
path from being executed. However, that may often be a waste, especially if
it turned out that no one really needed the device.

For this reason, invent acpi_dev_disable|enable_direct_complete(), to allow
drivers to inform the ACPI PM domain to change its default behaviour during
system sleep, and thus control whether it may use the direct_complete path
or not.

Typically a driver should call acpi_dev_disable_direct_comlete() during
->probe() and acpi_dev_enable_direct_complete() in ->remove().

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
 drivers/acpi/device_pm.c | 37 ++++++++++++++++++++++++++++++++++++-
 include/acpi/acpi_bus.h  |  1 +
 include/linux/acpi.h     |  4 ++++
 3 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
index ee51e75..2393a1a 100644
--- a/drivers/acpi/device_pm.c
+++ b/drivers/acpi/device_pm.c
@@ -879,6 +879,41 @@ EXPORT_SYMBOL_GPL(acpi_subsys_runtime_resume);
 
 #ifdef CONFIG_PM_SLEEP
 /**
+ * acpi_dev_disable_direct_complete - Disable the direct_complete path for ACPI.
+ * @dev: Device to disable the path for.
+ *
+ * Per default the ACPI PM domain tries to use the direct_complete path for its
+ * devices during system sleep. This function allows a user, typically a driver
+ * during probe, to disable the direct_complete path from being used by ACPI.
+ */
+void acpi_dev_disable_direct_complete(struct device *dev)
+{
+	struct acpi_device *adev = ACPI_COMPANION(dev);
+
+	if (adev)
+		adev->no_direct_complete = true;
+}
+EXPORT_SYMBOL_GPL(acpi_dev_disable_direct_complete);
+
+/**
+ * acpi_dev_enable_direct_complete - Enable the direct_complete path for ACPI.
+ * @dev: Device to enable the path for.
+ *
+ * Enable the direct_complete path to be used during system suspend for the ACPI
+ * PM domain, which is the default option. Typically a driver that disabled the
+ * path during ->probe(), must call this function during ->remove() to re-enable
+ * the direct_complete path to be used by ACPI.
+ */
+void acpi_dev_enable_direct_complete(struct device *dev)
+{
+	struct acpi_device *adev = ACPI_COMPANION(dev);
+
+	if (adev)
+		adev->no_direct_complete = false;
+}
+EXPORT_SYMBOL_GPL(acpi_dev_enable_direct_complete);
+
+/**
  * acpi_dev_suspend_late - Put device into a low-power state using ACPI.
  * @dev: Device to put into a low-power state.
  *
@@ -967,7 +1002,7 @@ int acpi_subsys_prepare(struct device *dev)
 	if (ret < 0)
 		return ret;
 
-	if (!adev || !pm_runtime_suspended(dev))
+	if (!adev || adev->no_direct_complete || !pm_runtime_suspended(dev))
 		return 0;
 
 	return !acpi_dev_needs_resume(dev, adev);
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 63a90a6..2293d24 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -380,6 +380,7 @@ struct acpi_device {
 	struct list_head physical_node_list;
 	struct mutex physical_node_lock;
 	void (*remove)(struct acpi_device *);
+	bool no_direct_complete;
 };
 
 /* Non-device subnode */
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 137e4a3..a41cca5 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -859,6 +859,8 @@ static inline int acpi_dev_pm_attach(struct device *dev, bool power_on)
 #endif
 
 #if defined(CONFIG_ACPI) && defined(CONFIG_PM_SLEEP)
+void acpi_dev_disable_direct_complete(struct device *dev);
+void acpi_dev_enable_direct_complete(struct device *dev);
 int acpi_dev_suspend_late(struct device *dev);
 int acpi_dev_resume_early(struct device *dev);
 int acpi_subsys_prepare(struct device *dev);
@@ -868,6 +870,8 @@ int acpi_subsys_resume_early(struct device *dev);
 int acpi_subsys_suspend(struct device *dev);
 int acpi_subsys_freeze(struct device *dev);
 #else
+static inline void acpi_dev_disable_direct_complete(struct device *dev) {}
+static inline void acpi_dev_enable_direct_complete(struct device *dev) {}
 static inline int acpi_dev_suspend_late(struct device *dev) { return 0; }
 static inline int acpi_dev_resume_early(struct device *dev) { return 0; }
 static inline int acpi_subsys_prepare(struct device *dev) { return 0; }
-- 
2.7.4

  parent reply	other threads:[~2017-06-21 19:21 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-21 19:21 [PATCH 0/9] PM / ACPI / i2c: Fix system suspend and deploy runtime PM centric path for ACPI Ulf Hansson
2017-06-21 19:21 ` Ulf Hansson
2017-06-21 19:21 ` [PATCH 1/9] i2c: designware: Fix system suspend Ulf Hansson
2017-06-21 19:21   ` Ulf Hansson
2017-06-21 23:31   ` Rafael J. Wysocki
2017-06-21 23:31     ` Rafael J. Wysocki
2017-06-22 10:49     ` Mika Westerberg
2017-06-22 10:49       ` Mika Westerberg
2017-06-22 11:16       ` Jarkko Nikula
2017-06-22 11:16         ` Jarkko Nikula
2017-06-27  7:55         ` Jarkko Nikula
2017-06-27  7:55           ` Jarkko Nikula
2017-06-28 14:01           ` Ulf Hansson
2017-06-28 14:01             ` Ulf Hansson
2017-06-28 14:51             ` Rafael J. Wysocki
2017-06-28 14:51               ` Rafael J. Wysocki
2017-06-28 15:06               ` Ulf Hansson
2017-06-28 15:06                 ` Ulf Hansson
2017-06-22 14:41       ` Rafael J. Wysocki
2017-06-22 14:41         ` Rafael J. Wysocki
2017-06-22 21:37         ` Ulf Hansson
2017-06-22 21:37           ` Ulf Hansson
2017-06-22 22:01           ` Rafael J. Wysocki
2017-06-22 22:01             ` Rafael J. Wysocki
2017-06-26 16:49             ` Ulf Hansson
2017-06-26 16:49               ` Ulf Hansson
2017-06-26 19:39               ` Grygorii Strashko
2017-06-26 19:39                 ` Grygorii Strashko
2017-06-26 21:11                 ` Rafael J. Wysocki
2017-06-26 21:11                   ` Rafael J. Wysocki
2017-06-27  7:33                   ` Jarkko Nikula
2017-06-27  7:33                     ` Jarkko Nikula
2017-06-27 15:25                   ` Rafael J. Wysocki
2017-06-27 15:25                     ` Rafael J. Wysocki
2017-06-28 14:31                 ` Ulf Hansson
2017-06-28 14:31                   ` Ulf Hansson
2017-06-28 16:52                   ` Grygorii Strashko
2017-06-28 16:52                     ` Grygorii Strashko
2017-09-08  3:23   ` [1/9] " Wangtao (Kevin, Kirin)
2017-09-08  3:23     ` Wangtao (Kevin, Kirin)
2017-09-08  8:29     ` Ulf Hansson
2017-09-08  8:29       ` Ulf Hansson
2017-09-12  9:44       ` Wangtao (Kevin, Kirin)
2017-09-12  9:44         ` Wangtao (Kevin, Kirin)
2017-06-21 19:21 ` [PATCH 2/9] PM / ACPI: Restore acpi_subsys_complete() Ulf Hansson
2017-06-21 19:21   ` Ulf Hansson
2017-06-21 19:21 ` [PATCH 3/9] PM / Sleep: Remove pm_complete_with_resume_check() Ulf Hansson
2017-06-21 19:21   ` Ulf Hansson
2017-06-21 19:21 ` [PATCH 4/9] PM / ACPI: Split code validating need for runtime resume in ->prepare() Ulf Hansson
2017-06-21 19:21   ` Ulf Hansson
2017-06-21 21:35   ` Rafael J. Wysocki
2017-06-21 21:35     ` Rafael J. Wysocki
2017-06-21 19:21 ` [PATCH 5/9] PM / ACPI: Split acpi_lpss_suspend_late|resume_early() Ulf Hansson
2017-06-21 19:21   ` Ulf Hansson
2017-06-21 19:21 ` Ulf Hansson [this message]
2017-06-21 19:21   ` [PATCH 6/9] PM / ACPI: Provide option to disable direct_complete for ACPI devices Ulf Hansson
2017-06-21 21:42   ` Rafael J. Wysocki
2017-06-21 21:42     ` Rafael J. Wysocki
2017-06-22  9:35     ` Ulf Hansson
2017-06-22  9:35       ` Ulf Hansson
2017-06-22 14:38       ` Rafael J. Wysocki
2017-06-22 14:38         ` Rafael J. Wysocki
2017-06-22 21:29         ` Ulf Hansson
2017-06-22 21:29           ` Ulf Hansson
2017-06-22 21:33           ` Rafael J. Wysocki
2017-06-22 21:33             ` Rafael J. Wysocki
2017-06-21 19:21 ` [PATCH 7/9] PM / ACPI: Enable the runtime PM centric approach for system sleep Ulf Hansson
2017-06-21 19:21   ` Ulf Hansson
2017-06-21 21:47   ` Rafael J. Wysocki
2017-06-21 21:47     ` Rafael J. Wysocki
2017-06-22  9:42     ` Ulf Hansson
2017-06-22  9:42       ` Ulf Hansson
2017-06-22 14:32       ` Rafael J. Wysocki
2017-06-22 14:32         ` Rafael J. Wysocki
2017-06-22 21:14         ` Ulf Hansson
2017-06-22 21:14           ` Ulf Hansson
2017-06-22 21:28           ` Rafael J. Wysocki
2017-06-22 21:28             ` Rafael J. Wysocki
2017-06-21 19:21 ` [PATCH 8/9] PM / ACPI: Avoid runtime resuming device in acpi_subsys_suspend|freeze() Ulf Hansson
2017-06-21 19:21   ` Ulf Hansson
2017-06-21 19:21 ` [PATCH 9/9] i2c: designware: Deploy the runtime PM centric approach for system sleep Ulf Hansson
2017-06-21 19:21   ` Ulf Hansson
2017-06-21 22:39 ` [PATCH 0/9] PM / ACPI / i2c: Fix system suspend and deploy runtime PM centric path for ACPI John Stultz
2017-06-21 22:39   ` John Stultz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1498072888-14782-7-git-send-email-ulf.hansson@linaro.org \
    --to=ulf.hansson@linaro.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=guodong.xu@linaro.org \
    --cc=haojian.zhuang@linaro.org \
    --cc=jarkko.nikula@linux.intel.com \
    --cc=john.stultz@linaro.org \
    --cc=jszhang@marvell.com \
    --cc=khilman@kernel.org \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=rjw@rjwysocki.net \
    --cc=sumit.semwal@linaro.org \
    --cc=wsa@the-dreams.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.