From patchwork Wed Aug 2 10:12:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 109208 Delivered-To: patch@linaro.org Received: by 10.140.101.6 with SMTP id t6csp2591835qge; Wed, 2 Aug 2017 03:14:19 -0700 (PDT) X-Received: by 10.84.196.1 with SMTP id k1mr17778865pld.137.1501668859339; Wed, 02 Aug 2017 03:14:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1501668859; cv=none; d=google.com; s=arc-20160816; b=yVb6O9HppVJvk/FrXOa6CG5P1FfMb2wxo1A4+V8Ald6URuUA4L6rnPTMBk9Pr8Iv2B TA/D1sQotvamFGbuE5Az+6VEBiOJNURFNVyUDNejSr6ehbfGNHY9trcmvNwyym64xzx4 33cQxVnXrnx5eukdEhD8Jae3KMNLRjUn6/K/CIUijHfNIboFgzWoYubWw+mhQfFt4cuY q625XT65Bggsr9anI7JoHgpCgIrp3X2cbo+/5RZgqfuucilYECQ6ZMzhFA4C2cbi8QcE OBROnbA78FLXEIbmR9pjBs7WrP87oYLUvf8CtzXNKF6JpmlhWHVze8iRXl5kbblfaDgo 6+IA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=xm5GlwUAr+6V3bQJLcK/tvssvbliHQ+h/F2H3rSl5ko=; b=esbwq8JF5i1zALEnqIKhzSaDxrqcwRAjPJgApd3hH1aoAE/w8ejpu32a0h5wk8F8Pj sW/dJabaPLMRn2p7hP6Bx8HvZTdZuG9nkyT3oIozMmH6sS2eh5vZi4oZaQceneLJJiWQ 2SFUcOfu69JLN2tyvDLloA6YiSRBeu88QNM04VwndmxS6T8m2OkiCw/p8qNEoH8/EOfV TPGbSJahsI8iYSL1BtlHBOo+Z4ztId1aJD6VFvpmj+Ro0wCaL1V4g0bZrJ5y4/GVPOLn Tt0Bdxp+XOGbVYLouT+ihPDB2suj6tYs+rkxOkH6podzOcvhim5jCnGDmkpfqk/giTfb dt8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=apXBElHo; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x13si13790243pfj.353.2017.08.02.03.14.18; Wed, 02 Aug 2017 03:14:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.b=apXBElHo; spf=pass (google.com: best guess record for domain of linux-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752957AbdHBKOR (ORCPT + 12 others); Wed, 2 Aug 2017 06:14:17 -0400 Received: from mail-pf0-f179.google.com ([209.85.192.179]:33393 "EHLO mail-pf0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752311AbdHBKMy (ORCPT ); Wed, 2 Aug 2017 06:12:54 -0400 Received: by mail-pf0-f179.google.com with SMTP id d67so19360935pfc.0 for ; Wed, 02 Aug 2017 03:12:53 -0700 (PDT) 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 :in-reply-to:references; bh=xm5GlwUAr+6V3bQJLcK/tvssvbliHQ+h/F2H3rSl5ko=; b=apXBElHoKpMu331qRWpylnKCRcKXHY09ytCJVwCZHENYQ4ubBjv1sBhqHyofztADno 08S5Cu1Lbi57yoxHvN7tMageQEwvfvrRUDRpS5c85lVpqOafSUSra6r/JLAmSAfidiTy Mga9O24s28WYOJkQKNwfKW/a2Rstj3v+6cobU= 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:in-reply-to:references; bh=xm5GlwUAr+6V3bQJLcK/tvssvbliHQ+h/F2H3rSl5ko=; b=HsV87sRt5+2fJAzp1Dca26l/mgQDp3owjB9ONMfSroxbygTcjFoPMiJAuGd4gWZ4kn WPbkCcd/rKWfs5X38MPYdIpKQP/tHjMVNtGSiwFv+xxfJWRP0drRXXVYG0Ssa9HO53/8 vH0pzeDAwEulewTzMiHXAP9xTeuX+WxwIZeDPeeqtMSVtwj8mS9uVyEk9GYSBfNMlDhy fQg9NxCgYBX/Cb6PSqMEqypH9mGThjSfcWE7cUpKvLWW+8IhdTPeoG8S2c3JS8zLB8jg 9pRrTOyb6g4L2v2xwulbAY3yMmmWbH1DosLCe0SYhp49gOt+R/U7HJBm4uhrWCbQMALq Hd8A== X-Gm-Message-State: AIVw112jYd60RH+axBy72bDu0VxAKYLrnooS07aJN5mWrwS0htWHGoX0 +x8yDF66q3Q+CFHY X-Received: by 10.99.53.75 with SMTP id c72mr22548007pga.397.1501668773411; Wed, 02 Aug 2017 03:12:53 -0700 (PDT) Received: from localhost ([122.171.108.183]) by smtp.gmail.com with ESMTPSA id v134sm66543917pgb.58.2017.08.02.03.12.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Aug 2017 03:12:52 -0700 (PDT) From: Viresh Kumar To: Rafael Wysocki , ulf.hansson@linaro.org, Kevin Hilman Cc: Viresh Kumar , linux-pm@vger.kernel.org, Vincent Guittot , Stephen Boyd , Nishanth Menon , robh+dt@kernel.org, lina.iyer@linaro.org, rnayak@codeaurora.org, sudeep.holla@arm.com, linux-kernel@vger.kernel.org, Len Brown , Pavel Machek , Andy Gross , David Brown Subject: [PATCH V9 3/7] PM / OPP: Support updating performance state of device's power domains Date: Wed, 2 Aug 2017 15:42:34 +0530 Message-Id: X-Mailer: git-send-email 2.13.0.71.gd7076ec9c9cb In-Reply-To: References: In-Reply-To: References: Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org The genpd framework now provides an API to request device's power domain to update its performance state based on a particular target frequency for the device. Use that interface from the OPP core for devices whose power domains support performance states. Note that the current implementation is restricted to the case where the device doesn't have separate regulators for itself. We shouldn't over engineer the code before we have real use case for them. We can always come back and add more code to support such cases later on. Tested-by: Rajendra Nayak Signed-off-by: Viresh Kumar --- drivers/base/power/opp/core.c | 48 ++++++++++++++++++++++++++++++++++++++++++- drivers/base/power/opp/opp.h | 2 ++ 2 files changed, 49 insertions(+), 1 deletion(-) -- 2.13.0.71.gd7076ec9c9cb diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c index a8cc14fd8ae4..4360b4efcd4c 100644 --- a/drivers/base/power/opp/core.c +++ b/drivers/base/power/opp/core.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include "opp.h" @@ -535,6 +536,42 @@ _generic_set_opp_clk_only(struct device *dev, struct clk *clk, return ret; } +static inline int +_generic_set_opp_domain(struct device *dev, struct clk *clk, + unsigned long old_freq, unsigned long freq) +{ + int ret; + + /* Scaling up? Scale domain performance state before frequency */ + if (freq > old_freq) { + ret = dev_pm_genpd_update_performance_state(dev, freq); + if (ret) + return ret; + } + + ret = _generic_set_opp_clk_only(dev, clk, old_freq, freq); + if (ret) + goto restore_domain_state; + + /* Scaling down? Scale domain performance state after frequency */ + if (freq < old_freq) { + ret = dev_pm_genpd_update_performance_state(dev, freq); + if (ret) + goto restore_freq; + } + + return 0; + +restore_freq: + if (_generic_set_opp_clk_only(dev, clk, freq, old_freq)) + dev_err(dev, "%s: failed to restore old-freq (%lu Hz)\n", + __func__, old_freq); +restore_domain_state: + dev_pm_genpd_update_performance_state(dev, old_freq); + + return ret; +} + static int _generic_set_opp_regulator(const struct opp_table *opp_table, struct device *dev, unsigned long old_freq, @@ -653,7 +690,14 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq) /* Only frequency scaling */ if (!opp_table->regulators) { - ret = _generic_set_opp_clk_only(dev, clk, old_freq, freq); + /* + * We don't support devices with both regulator and + * domain performance-state for now. + */ + if (opp_table->genpd_performance_state) + ret = _generic_set_opp_domain(dev, clk, old_freq, freq); + else + ret = _generic_set_opp_clk_only(dev, clk, old_freq, freq); } else if (!opp_table->set_opp) { ret = _generic_set_opp_regulator(opp_table, dev, old_freq, freq, IS_ERR(old_opp) ? NULL : old_opp->supplies, @@ -755,6 +799,8 @@ static struct opp_table *_allocate_opp_table(struct device *dev) ret); } + opp_table->genpd_performance_state = dev_pm_genpd_has_performance_state(dev); + BLOCKING_INIT_NOTIFIER_HEAD(&opp_table->head); INIT_LIST_HEAD(&opp_table->opp_list); mutex_init(&opp_table->lock); diff --git a/drivers/base/power/opp/opp.h b/drivers/base/power/opp/opp.h index 166eef990599..1efa253e1934 100644 --- a/drivers/base/power/opp/opp.h +++ b/drivers/base/power/opp/opp.h @@ -135,6 +135,7 @@ enum opp_table_access { * @clk: Device's clock handle * @regulators: Supply regulators * @regulator_count: Number of power supply regulators + * @genpd_performance_state: Device's power domain support performance state. * @set_opp: Platform specific set_opp callback * @set_opp_data: Data to be passed to set_opp callback * @dentry: debugfs dentry pointer of the real device directory (not links). @@ -170,6 +171,7 @@ struct opp_table { struct clk *clk; struct regulator **regulators; unsigned int regulator_count; + bool genpd_performance_state; int (*set_opp)(struct dev_pm_set_opp_data *data); struct dev_pm_set_opp_data *set_opp_data;