linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: ulf.hansson@linaro.org (Ulf Hansson)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 8/8] i2c: designware: Deploy the runtime PM centric path for system sleep
Date: Tue, 29 Aug 2017 16:56:50 +0200	[thread overview]
Message-ID: <1504018610-10822-9-git-send-email-ulf.hansson@linaro.org> (raw)
In-Reply-To: <1504018610-10822-1-git-send-email-ulf.hansson@linaro.org>

Currently the device is runtime resumed in the i2c-dw-plat driver's
->suspend() callback, which is needed to manage system sleep properly.

The particular reason for the runtime resume is because the PM core may
unset the direct_complete flag for a parent device, in case its child
device are being system suspended before. This leads to that the
i2c-dw-plat driver's ->suspend() callback can be invoked when the device is
runtime suspended.

Runtime resuming the device in this scenario may be unnecessary, in case
when the device is already in its proper lower power state for system
sleep. This behaviour increases the time it takes to put the device into
low power state, but means also a waste of power.

Let's fix the behaviour by deploying the runtime PM centric path for system
sleep, via assigning the pm_runtime_force_suspend|resume() helpers as the
system sleep callbacks for the i2c-dw-plat driver. We must also inform the
PM core and the ACPI PM domain that we are now using the runtime PM centric
path, therefore we call dev_pm_use_rpm_sleep() during ->probe().

While deploying the runtime PM centric path, the ->prepare() callback
becomes redundant, so let's drop it.

Along with these improvements, of course we also get the other regular
benefits one get when deploying the runtime PM centric path.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---

Changes in v3:
	- Use dev_pm_use_rpm_sleep() instead of the earlier
	acpi_disable_direct_complete() from v2.
	- Updated changelog.

---
 drivers/i2c/busses/i2c-designware-platdrv.c | 26 +++++---------------------
 1 file changed, 5 insertions(+), 21 deletions(-)

diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index 38121c9..20db3c2 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -371,6 +371,7 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
 	if (ret)
 		goto exit_probe;
 
+	dev_pm_use_rpm_sleep(&pdev->dev);
 	return ret;
 
 exit_probe:
@@ -412,15 +413,6 @@ static const struct of_device_id dw_i2c_of_match[] = {
 MODULE_DEVICE_TABLE(of, dw_i2c_of_match);
 #endif
 
-#ifdef CONFIG_PM_SLEEP
-static int dw_i2c_plat_prepare(struct device *dev)
-{
-	return pm_runtime_suspended(dev);
-}
-#else
-#define dw_i2c_plat_prepare	NULL
-#endif
-
 #ifdef CONFIG_PM
 static int dw_i2c_plat_runtime_suspend(struct device *dev)
 {
@@ -433,7 +425,7 @@ static int dw_i2c_plat_runtime_suspend(struct device *dev)
 	return 0;
 }
 
-static int dw_i2c_plat_resume(struct device *dev)
+static int dw_i2c_plat_runtime_resume(struct device *dev)
 {
 	struct platform_device *pdev = to_platform_device(dev);
 	struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
@@ -444,19 +436,11 @@ static int dw_i2c_plat_resume(struct device *dev)
 	return 0;
 }
 
-#ifdef CONFIG_PM_SLEEP
-static int dw_i2c_plat_suspend(struct device *dev)
-{
-	pm_runtime_resume(dev);
-	return dw_i2c_plat_runtime_suspend(dev);
-}
-#endif
-
 static const struct dev_pm_ops dw_i2c_dev_pm_ops = {
-	.prepare = dw_i2c_plat_prepare,
-	SET_SYSTEM_SLEEP_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume)
+	SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+				     pm_runtime_force_resume)
 	SET_RUNTIME_PM_OPS(dw_i2c_plat_runtime_suspend,
-			   dw_i2c_plat_resume,
+			   dw_i2c_plat_runtime_resume,
 			   NULL)
 };
 
-- 
2.7.4

  parent reply	other threads:[~2017-08-29 14:56 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-29 14:56 [PATCH v3 0/8] PM / ACPI / i2c: Deploy runtime PM centric path for system sleep Ulf Hansson
2017-08-29 14:56 ` [PATCH v3 1/8] PM / Sleep: Make the runtime PM centric path known to the PM core Ulf Hansson
2017-08-29 15:15   ` Rafael J. Wysocki
2017-08-30  7:13     ` Ulf Hansson
2017-08-30 13:37       ` Rafael J. Wysocki
2017-08-31  9:06         ` Ulf Hansson
2017-09-02 14:48           ` Rafael J. Wysocki
2017-08-29 14:56 ` [PATCH v3 2/8] PM / ACPI: Restore acpi_subsys_complete() Ulf Hansson
2017-08-29 14:56 ` [PATCH v3 3/8] PM / Sleep: Remove pm_complete_with_resume_check() Ulf Hansson
2017-08-29 14:56 ` [PATCH v3 4/8] PM / ACPI: Split code validating need for runtime resume in ->prepare() Ulf Hansson
2017-08-29 14:56 ` [PATCH v3 5/8] PM / ACPI: Split acpi_lpss_suspend_late|resume_early() Ulf Hansson
2017-08-29 14:56 ` [PATCH v3 6/8] PM / ACPI: Enable the runtime PM centric approach for system sleep Ulf Hansson
2017-08-29 15:27   ` Rafael J. Wysocki
2017-09-01  8:27     ` Ulf Hansson
2017-09-02 15:38       ` Rafael J. Wysocki
2017-09-04 13:21         ` Ulf Hansson
2017-09-06  0:02           ` Rafael J. Wysocki
2017-08-29 14:56 ` [PATCH v3 7/8] i2c: designware: Don't resume device in the ->complete() callback Ulf Hansson
2017-08-29 14:56 ` Ulf Hansson [this message]
2017-08-29 20:19 ` [PATCH v3 0/8] PM / ACPI / i2c: Deploy runtime PM centric path for system sleep Rafael J. Wysocki
2017-08-30  9:57   ` Ulf Hansson
2017-08-31  0:17     ` Rafael J. Wysocki
2017-09-01 10:42       ` Ulf Hansson
2017-09-04  0:17         ` Rafael J. Wysocki
2017-09-04  5:46           ` Lukas Wunner
2017-09-04 10:04             ` Rafael J. Wysocki
2017-09-04 12:55           ` Ulf Hansson
2017-09-06  0:52             ` Rafael J. Wysocki
2017-09-06 10:46               ` Rafael J. Wysocki
2017-09-06 13:59                 ` Ulf Hansson
2017-09-06 21:39                   ` Rafael J. Wysocki
2017-09-06 13:54               ` Ulf Hansson

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=1504018610-10822-9-git-send-email-ulf.hansson@linaro.org \
    --to=ulf.hansson@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).