Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/807361/?format=api
{ "id": 807361, "url": "http://patchwork.ozlabs.org/api/patches/807361/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/patch/1668024.TYSJ14SKLf@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": "<1668024.TYSJ14SKLf@aspire.rjw.lan>", "list_archive_url": null, "date": "2017-08-30T00:04:23", "name": "[RFT,v2,2/3] PM / ACPI: Use SAFE_SUSPEND in the generic ACPI PM domain", "commit_ref": null, "pull_url": null, "state": "rejected", "archived": false, "hash": "a14b8e031f09c00c2931070691c0c9eb51e83aac", "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/1668024.TYSJ14SKLf@aspire.rjw.lan/mbox/", "series": [ { "id": 507, "url": "http://patchwork.ozlabs.org/api/series/507/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-i2c/list/?series=507", "date": "2017-08-30T00:07:20", "name": "PM / ACPI / i2c: Runtime PM aware system sleep handling", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/507/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/807361/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/807361/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 3xhmRH4rb9z9sNc\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed, 30 Aug 2017 10:22:19 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751380AbdH3AWO (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tTue, 29 Aug 2017 20:22:14 -0400", "from cloudserver094114.home.net.pl ([79.96.170.134]:63920 \"EHLO\n\tcloudserver094114.home.net.pl\" rhost-flags-OK-OK-OK-OK)\n\tby vger.kernel.org with ESMTP id S1751290AbdH3AWM (ORCPT\n\t<rfc822; linux-i2c@vger.kernel.org>); Tue, 29 Aug 2017 20:22:12 -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 4732d1aa1abf3b8f; Wed, 30 Aug 2017 02:22:11 +0200" ], "From": "\"Rafael J. Wysocki\" <rjw@rjwysocki.net>", "To": "linux-pm@vger.kernel.org", "Cc": "Wolfram Sang <wsa@the-dreams.de>, linux-acpi@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\tJohannes Stezenbach <js@sig21.net>, linux-i2c@vger.kernel.org,\n\tUlf Hansson <ulf.hansson@linaro.org>,\n\tGreg Kroah-Hartman <gregkh@linuxfoundation.org>", "Subject": "[RFT][PATCH v2 2/3] PM / ACPI: Use SAFE_SUSPEND in the generic ACPI\n\tPM domain", "Date": "Wed, 30 Aug 2017 02:04:23 +0200", "Message-ID": "<1668024.TYSJ14SKLf@aspire.rjw.lan>", "In-Reply-To": "<1551534.5XKjjnxbAy@aspire.rjw.lan>", "References": "<1551534.5XKjjnxbAy@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>\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\nAlso, if the flag is set, acpi_subsys_freeze() will not attempt\nto runtime resume the device at all.\n\nSigned-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>\n---\n\n-> v2: Also check SAFE_SUSPEND in acpi_subsys_freeze().\n\n---\n drivers/acpi/acpi_lpss.c | 20 ++++++---\n drivers/acpi/device_pm.c | 101 +++++++++++++++++++++++++++++++++++------------\n include/acpi/acpi_bus.h | 1 \n 3 files changed, 90 insertions(+), 32 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 \n@@ -1069,12 +1119,13 @@ EXPORT_SYMBOL_GPL(acpi_subsys_resume_ear\n int acpi_subsys_freeze(struct device *dev)\n {\n \t/*\n-\t * This used to be done in acpi_subsys_prepare() for all devices and\n-\t * some drivers may depend on it, so do it here. Ideally, however,\n-\t * runtime-suspended devices should not be touched during freeze/thaw\n-\t * transitions.\n+\t * The drivers of devices without the DPM_FLAG_SAFE_SUSPEND flag set\n+\t * may not be able to handle runtime-suspended devices going forward, so\n+\t * resume them here here.\n \t */\n-\tpm_runtime_resume(dev);\n+\tif (!(dev->power.driver_flags & DPM_FLAG_SAFE_SUSPEND))\n+\t\tpm_runtime_resume(dev);\n+\n \treturn pm_generic_freeze(dev);\n }\n EXPORT_SYMBOL_GPL(acpi_subsys_freeze);\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": [ "RFT", "v2", "2/3" ] }