From patchwork Fri Jun 17 06:26:58 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 70285 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp126741qgy; Thu, 16 Jun 2016 23:29:50 -0700 (PDT) X-Received: by 10.66.155.167 with SMTP id vx7mr594740pab.125.1466144990757; Thu, 16 Jun 2016 23:29:50 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g144si10634515pfb.195.2016.06.16.23.29.50; Thu, 16 Jun 2016 23:29:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933530AbcFQG33 (ORCPT + 30 others); Fri, 17 Jun 2016 02:29:29 -0400 Received: from mailout1.w1.samsung.com ([210.118.77.11]:32224 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755084AbcFQG1R (ORCPT ); Fri, 17 Jun 2016 02:27:17 -0400 Received: from eucpsbgm2.samsung.com (unknown [203.254.199.245]) by mailout1.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0O8W00BSPKLF4P80@mailout1.w1.samsung.com>; Fri, 17 Jun 2016 07:27:15 +0100 (BST) X-AuditID: cbfec7f5-f792a6d000001302-2d-576398437558 Received: from eusync4.samsung.com ( [203.254.199.214]) by eucpsbgm2.samsung.com (EUCPMTA) with SMTP id 20.6F.04866.34893675; Fri, 17 Jun 2016 07:27:15 +0100 (BST) Received: from AMDC2765.digital.local ([106.116.147.25]) by eusync4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0O8W00HUZKL21910@eusync4.samsung.com>; Fri, 17 Jun 2016 07:27:15 +0100 (BST) From: Marek Szyprowski To: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Marek Szyprowski , Joerg Roedel , Inki Dae , Kukjin Kim , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz , "Rafael J. Wysocki" , Ulf Hansson , Mark Brown , Greg Kroah-Hartman Subject: [PATCH v2 08/10] PM core: Fix restoring devices with links during system PM transition Date: Fri, 17 Jun 2016 08:26:58 +0200 Message-id: <1466144820-6286-9-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1466144820-6286-1-git-send-email-m.szyprowski@samsung.com> References: <1466144820-6286-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrDLMWRmVeSWpSXmKPExsVy+t/xa7rOM5LDDVb2SVtsnLGe1WLqwyds Fs2L17NZTLo/gcViwX5ri87ZG9gtXr8wtOh//JrZYtPja6wWl3fNYbP43HuE0WLG+X1MFmuP 3GW3OHP6EqvF8bXhDvweTw7OY/LYtKqTzePOtT1sHvvnrmH32Lyk3mPyjeWMHluutrN49G1Z xejxeZNcAGcUl01Kak5mWWqRvl0CV0Zr73S2gtkCFVeWtrA0MM7l7WLk5JAQMJE4dWslM4Qt JnHh3nq2LkYuDiGBpYwSO79vZgJJCAk0MUkcWMQJYrMJGEp0ve0CKxIRWMkosW3PPmYQh1lg IbNE85pmli5GDg5hgUSJ4ysFQRpYBFQlnvyeAzaIV8BdYn7jFhaIbXISJ49NZgWxOQU8JF7c +sECscxdYtfhU8wTGHkXMDKsYhRNLU0uKE5KzzXSK07MLS7NS9dLzs/dxAgJ4687GJceszrE KMDBqMTDu0I0OVyINbGsuDL3EKMEB7OSCG/JJKAQb0piZVVqUX58UWlOavEhRmkOFiVx3pm7 3ocICaQnlqRmp6YWpBbBZJk4OKUaGA8/Y3nnMD3N5VMat16Wm/F2JcXO1uO1Oyx0T4ox+J5T 5d+RWF2xpmj7hqjMz9NkF6Zwn+1fqHlQ6VfjOa+zvhOfLNofZZNvXJpgdXg/i4aoOm9fzY6C 5dm8sjtvds9asMRZNfqvyK0bi0WPTVWcs/bs2wfdNS3GAmsDBduEWgsP3Fxxc0ffHyWW4oxE Qy3mouJEADav7W9fAgAA Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When devices are being runtime resumed during the system PM transition to suspend state, the link suppliers might be already resumed and have runtime pm disabled. This is normal case. This patch adds special support for such case. Simple call to pm_runtime_get_syncreturns error when device has runtime PM disabled, what results in incorrect runtime PM state during system wide PM transition. Signed-off-by: Marek Szyprowski --- drivers/base/power/runtime.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) -- 1.9.1 diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 0ea00d442e0f..d00b079fad88 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -261,6 +261,26 @@ static int rpm_check_suspend_allowed(struct device *dev) } /** + * __pm_runtime_force_resume - force resume of the device + * @dev: Device to resume + * + * This function works like __pm_runtime_resume(dev, RPM_GET_PUT), but + * also handles devices with runtime PM disabled. This allows to properly + * control all devices during preparation for system PM transition. + */ +static int __pm_runtime_force_resume(struct device *dev) +{ + if (!dev->power.disable_depth) + return pm_runtime_get_sync(dev); + + if (dev->power.runtime_status != RPM_ACTIVE || + atomic_inc_not_zero(&dev->power.usage_count) == 0) + return -EINVAL; + + return 0; +} + +/** * __rpm_callback - Run a given runtime PM callback for a given device. * @cb: Runtime PM callback to run. * @dev: Device to run the callback for. @@ -291,7 +311,7 @@ static int __rpm_callback(int (*cb)(struct device *), struct device *dev) if ((link->flags & DEVICE_LINK_PM_RUNTIME) && link->status != DEVICE_LINK_SUPPLIER_UNBIND && !link->rpm_active) { - retval = pm_runtime_get_sync(link->supplier); + retval = __pm_runtime_force_resume(link->supplier); if (retval < 0) { pm_runtime_put_noidle(link->supplier); goto fail;