From patchwork Tue Dec 19 21:22:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 122408 Delivered-To: patches@linaro.org Received: by 10.140.22.227 with SMTP id 90csp4696966qgn; Tue, 19 Dec 2017 13:22:59 -0800 (PST) X-Received: by 10.46.64.76 with SMTP id n73mr3142164lja.33.1513718579180; Tue, 19 Dec 2017 13:22:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513718579; cv=none; d=google.com; s=arc-20160816; b=gC8C4Pjte/qcM+TXE/Qz4Q0bAfazu5yiF8iS7LbXCw2W9v1nbA1Dn+KNXV6kVD8ptD gE5+MdhqHTa+dGHUKKgsv5qW68QP1GgmzS7BsIpc0Vx/e7hqH2fm7O5HBH7q/px/3VGI kDPb0Y0rhf0N+raHUYR0kWDI8Kl8//mi+JgMHBNmrd6TzKcO4epZrZyKFlumm/Lf0M6y iJvTbFBkCCNH7yd2+Ew3g2zdjL26KdTIVSuYP0MLMJwZYfdOH2DMiCGA7iATq56lmX9j +CzRkID4JJyYNxtxTHXdUpArCxMB69bWE1rjfpS5yfaZwMFr9BnQopVvc45KNmtTR5za XKlA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=MBdQLx9+ubkVCVMjLHMxqfsimMMdg0nAUUENKeXiQtM=; b=aYAQgYXwd+JXm3SofTMdso7+Ngnvb7wvuumFN/cUCd08X8MdwlM6BfPuKAc/9syD1O mARtwf6+UCA+sYjYmMKVMie20zJoD5bbMtaf6L8Fi4zpHj1YLsUkSnNsc4PknDVNIyx8 uTT0PAYPgDgl9k61UMlc/JLgJsVD8QOjgj2RagSYsaYWQgk+Al6xXYzeThFuOlTx4wR6 jzuvx8Z4UbL4fM7/VJJU6gGDqXEAkq+FZwgEGUX8ytKLG76LhdUar7mBG4vh1YFh205q cvqm14b1XSqV4HX5QZz1AG8APiSkk51PoQEsObsVr+p4Se6WR0ivbpju1d2EX4vQojYl JQpg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=bLhCbJDV; spf=pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=ulf.hansson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id t22sor3010657lje.97.2017.12.19.13.22.59 for (Google Transport Security); Tue, 19 Dec 2017 13:22:59 -0800 (PST) Received-SPF: pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=bLhCbJDV; spf=pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=ulf.hansson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MBdQLx9+ubkVCVMjLHMxqfsimMMdg0nAUUENKeXiQtM=; b=bLhCbJDVpmtMHPJLWOWVMJdzSl6SjJo10ONv9OskTu74nxNmuqEkOR51+R7ZWU0pRC V07KpeGMHRr09TlGVv6l87Sy9cljLhv04RuougrZYLp1V/h3DIFWgOwxmilLAsKk6pd5 AZDiU0NeE0gEf8W6hPPUiPiLFmyFhcrWylBOQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MBdQLx9+ubkVCVMjLHMxqfsimMMdg0nAUUENKeXiQtM=; b=FWXmIa8OhcNwEVblHWn9QHwIXBWL85zNE7LO9c9I1xppGBh/e2H/B2emhZlRTDbkSV uH7Ga6oRrX2Q+DhHnHaPgShJVI2LK2ahV/uiWLeVBJyOKWsGVBVco8sMMxh5nQAoHOZf AOSQjsz4sQ8joxigDUz2elG3Jc5mfjDNk65fh2PQdcHJhVTb1jHmpmNPY4x6ChZ9ckC3 sTVyfntwhW9T+8bLHOsWyAZdvYfXn3X7BbuM6r2RYv033xbzjzjmEKROQCunEdnyhMEQ 3yyDPItossyg15wybxayksPnYUBPilbivZwRhgqZJB+O5bkxLPRU4paY93f7kaqMaXp2 B6pQ== X-Gm-Message-State: AKGB3mJK9VNlHBu3y6Ia2K3WsAwjj/12FvryX17Nd9fsmpQgZJYk/Bso EU3WYdQHTtnyHMLGWKHz8jqyHXsNUCplbQ== X-Google-Smtp-Source: ACJfBovBsovZnJOIlCvA8/hkGAkE58NlRQElM36NiVqqhawbJ6ulcYLKHkDrSNCRSF0HkdraB51CHg== X-Received: by 10.46.55.20 with SMTP id e20mr3153875lja.118.1513718578825; Tue, 19 Dec 2017 13:22:58 -0800 (PST) Return-Path: Received: from localhost.localdomain (h-158-174-22-67.NA.cust.bahnhof.se. [158.174.22.67]) by smtp.gmail.com with ESMTPSA id 13sm3173068ljv.37.2017.12.19.13.22.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 19 Dec 2017 13:22:58 -0800 (PST) From: Ulf Hansson To: Kishon Vijay Abraham I , linux-kernel@vger.kernel.org Cc: "Rafael J . Wysocki" , linux-pm@vger.kernel.org, Yoshihiro Shimoda , Geert Uytterhoeven , linux-renesas-soc@vger.kernel.org, Ulf Hansson Subject: [PATCH 1/3] phy: core: Move runtime PM reference counting to the parent device Date: Tue, 19 Dec 2017 22:22:29 +0100 Message-Id: <1513718551-28624-2-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513718551-28624-1-git-send-email-ulf.hansson@linaro.org> References: <1513718551-28624-1-git-send-email-ulf.hansson@linaro.org> The runtime PM deployment in the phy core is a bit unnecessary complicated and the main reason is because it operates on the phy device, which is created by the phy core and assigned as a child device of the phy provider device. Let's simplify the code, by replacing the existing calls to phy_pm_runtime_get_sync() and phy_pm_runtime_put(), with regular calls to pm_runtime_get_sync() and pm_runtime_put(). While doing that, let's also change to give the phy provider device as the parameter to the runtime PM calls. This together with adding error paths, that allows the phy provider device to be runtime PM disabled, enables further clean up the code. More precisely, we can simply avoid to enable runtime PM for the phy device altogether, so let's do that as well. More importantly, this change also fixes an issue for system suspend. Especially in those cases when the phy provider device gets put into a low power state via calling the pm_runtime_force_suspend() helper, as is the case for a Renesas SoC, which has the phy provider device attached to the generic PM domain. The problem in this case, is that pm_runtime_force_suspend() expects the child device of the provider device to be runtime suspended, else this will trigger a WARN splat (correctly) when runtime PM gets re-enabled at system resume. In the current case, even if phy_power_off() triggers a pm_runtime_put() during system suspend the phy device (child) doesn't get runtime suspended, because that is prevented in the system suspend phases. However, by avoiding to enable runtime PM, this problem goes away. Signed-off-by: Ulf Hansson --- drivers/phy/phy-core.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) -- 2.7.4 diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index b4964b0..9fa3f13 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c @@ -222,10 +222,10 @@ int phy_init(struct phy *phy) if (!phy) return 0; - ret = phy_pm_runtime_get_sync(phy); - if (ret < 0 && ret != -ENOTSUPP) + ret = pm_runtime_get_sync(phy->dev.parent); + if (ret < 0 && ret != -EACCES) return ret; - ret = 0; /* Override possible ret == -ENOTSUPP */ + ret = 0; mutex_lock(&phy->mutex); if (phy->init_count == 0 && phy->ops->init) { @@ -239,7 +239,7 @@ int phy_init(struct phy *phy) out: mutex_unlock(&phy->mutex); - phy_pm_runtime_put(phy); + pm_runtime_put(phy->dev.parent); return ret; } EXPORT_SYMBOL_GPL(phy_init); @@ -251,10 +251,10 @@ int phy_exit(struct phy *phy) if (!phy) return 0; - ret = phy_pm_runtime_get_sync(phy); - if (ret < 0 && ret != -ENOTSUPP) + ret = pm_runtime_get_sync(phy->dev.parent); + if (ret < 0 && ret != -EACCES) return ret; - ret = 0; /* Override possible ret == -ENOTSUPP */ + ret = 0; mutex_lock(&phy->mutex); if (phy->init_count == 1 && phy->ops->exit) { @@ -268,7 +268,7 @@ int phy_exit(struct phy *phy) out: mutex_unlock(&phy->mutex); - phy_pm_runtime_put(phy); + pm_runtime_put(phy->dev.parent); return ret; } EXPORT_SYMBOL_GPL(phy_exit); @@ -286,11 +286,10 @@ int phy_power_on(struct phy *phy) goto out; } - ret = phy_pm_runtime_get_sync(phy); - if (ret < 0 && ret != -ENOTSUPP) + ret = pm_runtime_get_sync(phy->dev.parent); + if (ret < 0 && ret != -EACCES) goto err_pm_sync; - - ret = 0; /* Override possible ret == -ENOTSUPP */ + ret = 0; mutex_lock(&phy->mutex); if (phy->power_count == 0 && phy->ops->power_on) { @@ -306,7 +305,7 @@ int phy_power_on(struct phy *phy) err_pwr_on: mutex_unlock(&phy->mutex); - phy_pm_runtime_put_sync(phy); + pm_runtime_put(phy->dev.parent); err_pm_sync: if (phy->pwr) regulator_disable(phy->pwr); @@ -333,7 +332,7 @@ int phy_power_off(struct phy *phy) } --phy->power_count; mutex_unlock(&phy->mutex); - phy_pm_runtime_put(phy); + pm_runtime_put(phy->dev.parent); if (phy->pwr) regulator_disable(phy->pwr); @@ -774,11 +773,6 @@ struct phy *phy_create(struct device *dev, struct device_node *node, if (ret) goto put_dev; - if (pm_runtime_enabled(dev)) { - pm_runtime_enable(&phy->dev); - pm_runtime_no_callbacks(&phy->dev); - } - return phy; put_dev: @@ -831,7 +825,6 @@ EXPORT_SYMBOL_GPL(devm_phy_create); */ void phy_destroy(struct phy *phy) { - pm_runtime_disable(&phy->dev); device_unregister(&phy->dev); } EXPORT_SYMBOL_GPL(phy_destroy);