Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/806885/?format=api
{ "id": 806885, "url": "http://patchwork.ozlabs.org/api/patches/806885/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/patch/3064581.Sjxxt4B3vR@aspire.rjw.lan/", "project": { "id": 35, "url": "http://patchwork.ozlabs.org/api/projects/35/?format=api", "name": "Linux I2C development", "link_name": "linux-i2c", "list_id": "linux-i2c.vger.kernel.org", "list_email": "linux-i2c@vger.kernel.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<3064581.Sjxxt4B3vR@aspire.rjw.lan>", "list_archive_url": null, "date": "2017-08-29T00:59:08", "name": "[2/3] PM / ACPI: Use SAFE_SUSPEND in the generic ACPI PM domain", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "a327099ed6b99e4f9240d581b8324d7b7059dd8a", "submitter": { "id": 26536, "url": "http://patchwork.ozlabs.org/api/people/26536/?format=api", "name": "Rafael J. Wysocki", "email": "rjw@rjwysocki.net" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-i2c/patch/3064581.Sjxxt4B3vR@aspire.rjw.lan/mbox/", "series": [ { "id": 283, "url": "http://patchwork.ozlabs.org/api/series/283/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/list/?series=283", "date": "2017-08-29T00:59:49", "name": "PM / ACPI / i2c: Runtime PM aware system sleep handling", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/283/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/806885/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/806885/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<linux-i2c-owner@vger.kernel.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=linux-i2c-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xh9Xz33N3z9sP5\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 29 Aug 2017 11:10:11 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751211AbdH2BKD (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tMon, 28 Aug 2017 21:10:03 -0400", "from cloudserver094114.home.net.pl ([79.96.170.134]:59602 \"EHLO\n\tcloudserver094114.home.net.pl\" rhost-flags-OK-OK-OK-OK)\n\tby vger.kernel.org with ESMTP id S1751215AbdH2BKC (ORCPT\n\t<rfc822; linux-i2c@vger.kernel.org>); Mon, 28 Aug 2017 21:10:02 -0400", "from 79.184.253.199.ipv4.supernova.orange.pl (79.184.253.199)\n\t(HELO aspire.rjw.lan)\n\tby serwer1319399.home.pl (79.96.170.134) with SMTP (IdeaSmtpServer\n\t0.82) id 582c821e495364af; Tue, 29 Aug 2017 03:10:00 +0200" ], "From": "\"Rafael J. Wysocki\" <rjw@rjwysocki.net>", "To": "Ulf Hansson <ulf.hansson@linaro.org>", "Cc": "Wolfram Sang <wsa@the-dreams.de>, Len Brown <lenb@kernel.org>,\n\tlinux-acpi@vger.kernel.org, linux-pm@vger.kernel.org,\n\tKevin Hilman <khilman@kernel.org>,\n\tJarkko Nikula <jarkko.nikula@linux.intel.com>,\n\tAndy Shevchenko <andriy.shevchenko@linux.intel.com>,\n\tMika Westerberg <mika.westerberg@linux.intel.com>,\n\tJisheng Zhang <jszhang@marvell.com>,\n\tJohn Stultz <john.stultz@linaro.org>, Guodong Xu <guodong.xu@linaro.org>,\n\tSumit Semwal <sumit.semwal@linaro.org>,\n\tHaojian Zhuang <haojian.zhuang@linaro.org>,\n\tlinux-arm-kernel@lists.infradead.org, linux-i2c@vger.kernel.org,\n\tGreg Kroah-Hartman <gregkh@linuxfoundation.org>", "Subject": "[PATCH 2/3] PM / ACPI: Use SAFE_SUSPEND in the generic ACPI PM\n\tdomain", "Date": "Tue, 29 Aug 2017 02:59:08 +0200", "Message-ID": "<3064581.Sjxxt4B3vR@aspire.rjw.lan>", "In-Reply-To": "<4245176.X6JjkhnUAM@aspire.rjw.lan>", "References": "<1503499329-28834-1-git-send-email-ulf.hansson@linaro.org>\n\t<4245176.X6JjkhnUAM@aspire.rjw.lan>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "7Bit", "Content-Type": "text/plain; charset=\"us-ascii\"", "Sender": "linux-i2c-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<linux-i2c.vger.kernel.org>", "X-Mailing-List": "linux-i2c@vger.kernel.org" }, "content": "From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>\nSubject: [PATCH] PM / ACPI: Use SAFE_SUSPEND in the generic ACPI PM domain\n\nMake the generic ACPI PM domain and the ACPI LPSS driver take the\nSAFE_SUSPEND driver flag into consideration when deciding whether\nor not to runtime resume devices during system suspend.\n\nNamely, if the flag is set, acpi_subsys_suspend() will not attempt\nto runtime resume the device unless acpi_subsys_prepare() has found\nthat the power state of the device has to be updated. Accordingly,\nacpi_subsys_suspend_late(), acpi_subsys_resume_late(),\nacpi_lpss_suspend_late(), and acpi_lpss_resume_late() will only\ntry to update the power state of the device and its wakeup settings\nif the device has been runtime resumed beforehand.\n\nSigned-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>\n---\n drivers/acpi/acpi_lpss.c | 20 ++++++----\n drivers/acpi/device_pm.c | 90 ++++++++++++++++++++++++++++++++++++-----------\n include/acpi/acpi_bus.h | 1 \n 3 files changed, 84 insertions(+), 27 deletions(-)", "diff": "Index: linux-pm/include/acpi/acpi_bus.h\n===================================================================\n--- linux-pm.orig/include/acpi/acpi_bus.h\n+++ linux-pm/include/acpi/acpi_bus.h\n@@ -287,6 +287,7 @@ struct acpi_device_power {\n \tint state;\t\t/* Current state */\n \tstruct acpi_device_power_flags flags;\n \tstruct acpi_device_power_state states[ACPI_D_STATE_COUNT];\t/* Power states (D0-D3Cold) */\n+\tbool update_state;\n };\n \n /* Performance Management */\nIndex: linux-pm/drivers/acpi/device_pm.c\n===================================================================\n--- linux-pm.orig/drivers/acpi/device_pm.c\n+++ linux-pm/drivers/acpi/device_pm.c\n@@ -899,6 +899,7 @@ int acpi_dev_runtime_resume(struct devic\n \n \terror = acpi_dev_pm_full_power(adev);\n \tacpi_device_wakeup_disable(adev);\n+\tadev->power.update_state = true;\n \treturn error;\n }\n EXPORT_SYMBOL_GPL(acpi_dev_runtime_resume);\n@@ -989,33 +990,47 @@ int acpi_dev_resume_early(struct device\n }\n EXPORT_SYMBOL_GPL(acpi_dev_resume_early);\n \n-/**\n- * acpi_subsys_prepare - Prepare device for system transition to a sleep state.\n- * @dev: Device to prepare.\n- */\n-int acpi_subsys_prepare(struct device *dev)\n+static bool acpi_dev_state_update_needed(struct device *dev)\n {\n \tstruct acpi_device *adev = ACPI_COMPANION(dev);\n \tu32 sys_target;\n \tint ret, state;\n \n-\tret = pm_generic_prepare(dev);\n-\tif (ret < 0)\n-\t\treturn ret;\n+\tif (!pm_runtime_suspended(dev))\n+\t\treturn true;\n \n-\tif (!adev || !pm_runtime_suspended(dev)\n-\t || device_may_wakeup(dev) != !!adev->wakeup.prepare_count)\n-\t\treturn 0;\n+\tif (device_may_wakeup(dev) != !!adev->wakeup.prepare_count)\n+\t\treturn true;\n \n \tsys_target = acpi_target_system_state();\n \tif (sys_target == ACPI_STATE_S0)\n-\t\treturn 1;\n+\t\treturn false;\n \n \tif (adev->power.flags.dsw_present)\n-\t\treturn 0;\n+\t\treturn true;\n \n \tret = acpi_dev_pm_get_state(dev, adev, sys_target, NULL, &state);\n-\treturn !ret && state == adev->power.state;\n+\tif (ret)\n+\t\treturn true;\n+\n+\treturn state != adev->power.state;\n+}\n+\n+/**\n+ * acpi_subsys_prepare - Prepare device for system transition to a sleep state.\n+ * @dev: Device to prepare.\n+ */\n+int acpi_subsys_prepare(struct device *dev)\n+{\n+\tstruct acpi_device *adev = ACPI_COMPANION(dev);\n+\tint ret;\n+\n+\tret = pm_generic_prepare(dev);\n+\tif (ret < 0 || !adev)\n+\t\treturn ret;\n+\n+\tadev->power.update_state = acpi_dev_state_update_needed(dev);\n+\treturn !adev->power.update_state;\n }\n EXPORT_SYMBOL_GPL(acpi_subsys_prepare);\n \n@@ -1024,11 +1039,30 @@ EXPORT_SYMBOL_GPL(acpi_subsys_prepare);\n * @dev: Device to handle.\n *\n * Follow PCI and resume devices suspended at run time before running their\n- * system suspend callbacks.\n+ * system suspend callbacks, unless the DPM_FLAG_SAFE_SUSPEND driver flag is\n+ * set for them.\n */\n int acpi_subsys_suspend(struct device *dev)\n {\n-\tpm_runtime_resume(dev);\n+\tstruct acpi_device *adev = ACPI_COMPANION(dev);\n+\tbool resume = !(dev->power.driver_flags & DPM_FLAG_SAFE_SUSPEND);\n+\n+\tif (adev) {\n+\t\t/* The device may have resumed in the meantime. */\n+\t\tif (pm_runtime_suspended(dev)) {\n+\t\t\tresume = resume || adev->power.update_state;\n+\t\t} else {\n+\t\t\t/*\n+\t\t\t * Work around a super-theoretical race between runtime\n+\t\t\t * resume and acpi_dev_state_update_needed().\n+\t\t\t */\n+\t\t\tadev->power.update_state = true;\n+\t\t\tresume = false;\n+\t\t}\n+\t}\n+\tif (resume)\n+\t\tpm_runtime_resume(dev);\n+\n \treturn pm_generic_suspend(dev);\n }\n EXPORT_SYMBOL_GPL(acpi_subsys_suspend);\n@@ -1042,8 +1076,17 @@ EXPORT_SYMBOL_GPL(acpi_subsys_suspend);\n */\n int acpi_subsys_suspend_late(struct device *dev)\n {\n-\tint ret = pm_generic_suspend_late(dev);\n-\treturn ret ? ret : acpi_dev_suspend_late(dev);\n+\tstruct acpi_device *adev = ACPI_COMPANION(dev);\n+\tint ret;\n+\n+\tret = pm_generic_suspend_late(dev);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tif (adev && adev->power.update_state)\n+\t\treturn acpi_dev_suspend_late(dev);\n+\n+\treturn 0;\n }\n EXPORT_SYMBOL_GPL(acpi_subsys_suspend_late);\n \n@@ -1057,8 +1100,15 @@ EXPORT_SYMBOL_GPL(acpi_subsys_suspend_la\n */\n int acpi_subsys_resume_early(struct device *dev)\n {\n-\tint ret = acpi_dev_resume_early(dev);\n-\treturn ret ? ret : pm_generic_resume_early(dev);\n+\tstruct acpi_device *adev = ACPI_COMPANION(dev);\n+\n+\tif (adev && adev->power.update_state) {\n+\t\tint ret = acpi_dev_resume_early(dev);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n+\treturn pm_generic_resume_early(dev);\n }\n EXPORT_SYMBOL_GPL(acpi_subsys_resume_early);\n \nIndex: linux-pm/drivers/acpi/acpi_lpss.c\n===================================================================\n--- linux-pm.orig/drivers/acpi/acpi_lpss.c\n+++ linux-pm/drivers/acpi/acpi_lpss.c\n@@ -719,7 +719,8 @@ static void acpi_lpss_dismiss(struct dev\n #ifdef CONFIG_PM_SLEEP\n static int acpi_lpss_suspend_late(struct device *dev)\n {\n-\tstruct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));\n+\tstruct acpi_device *adev = ACPI_COMPANION(dev);\n+\tstruct lpss_private_data *pdata = acpi_driver_data(adev);\n \tint ret;\n \n \tret = pm_generic_suspend_late(dev);\n@@ -729,17 +730,22 @@ static int acpi_lpss_suspend_late(struct\n \tif (pdata->dev_desc->flags & LPSS_SAVE_CTX)\n \t\tacpi_lpss_save_ctx(dev, pdata);\n \n-\treturn acpi_dev_suspend_late(dev);\n+\tif (adev->power.update_state)\n+\t\treturn acpi_dev_suspend_late(dev);\n+\n+\treturn 0;\n }\n \n static int acpi_lpss_resume_early(struct device *dev)\n {\n-\tstruct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));\n-\tint ret;\n+\tstruct acpi_device *adev = ACPI_COMPANION(dev);\n+\tstruct lpss_private_data *pdata = acpi_driver_data(adev);\n \n-\tret = acpi_dev_resume_early(dev);\n-\tif (ret)\n-\t\treturn ret;\n+\tif (adev->power.update_state) {\n+\t\tint ret = acpi_dev_resume_early(dev);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n \n \tacpi_lpss_d3_to_d0_delay(pdata);\n \n", "prefixes": [ "2/3" ] }