From patchwork Wed May 17 07:02:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 99906 Delivered-To: patch@linaro.org Received: by 10.140.96.100 with SMTP id j91csp100022qge; Wed, 17 May 2017 00:03:19 -0700 (PDT) X-Received: by 10.84.216.77 with SMTP id f13mr2501775plj.130.1495004599136; Wed, 17 May 2017 00:03:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1495004599; cv=none; d=google.com; s=arc-20160816; b=wXhol1aj8fo/1X7GgnoK9QusS8dNTz9sceasy73Y3zoCBI/vOPJSCzL+H7p8zJJ1y/ kvVF5tKBO3L57/O7eI9Dbdh5V0284id/ymR4EJFNrQT50P3getrtcyYgS7F+5p1bjifg OyiRVnfl2XV4pvJHK7PwTilFuxxZMep+Hh1uqKrL2rGdew0p5oqGR/QSFMdrJvWUB0Fb TKqudatGBP3qHVYbEMZiXIIPpp0H2oX/CSoHjsRN0hSrc/U7JVjXQJ9stnGCMeJmGZvs kroDP6wU1aR7kGZZQZ/kpz5QiWHqvvgmY8i3go+LVpFE7kQTfC3VAVGoNBG/obXo1oWK n2eg== 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=M8NO2cFEs6B0cFo1BztVl82+yfDMzWXfL2RElAY9GgY=; b=q6Fy2GhztBiKkBVGl9g/33q5kjVpeB0dZddWsRC746ybJshvL46SQSXhaZ1r33sYUf 9I/6caXyEnVOqImQ6fkGjREaal/vyaXAYfHKHNRkYmqsIBKEwYfWHz33hQ/AFlsvG+tb g6AR2I7fv7aaUDpJlmjdYVY77nbwprvdeXRLp7hqmjjq/gwdhze66uijAnWnjLkxsqaR b1krL0A4MlIf0zNY6NQelJgKJl40BtGY5f3rmVF3EKYr+1ZeOijWFZkaULQ2q2doyqcw ee+140urYzScNl2Jn3LLXhXuXtThtu+JfN+fUmt1ZODU+0yx8aTf6Yg23bGaM+zLjV16 krsg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org; 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; 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 y8si1257708pfd.317.2017.05.17.00.03.18; Wed, 17 May 2017 00:03:19 -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; dkim=pass header.i=@linaro.org; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753815AbdEQHDG (ORCPT + 25 others); Wed, 17 May 2017 03:03:06 -0400 Received: from mail-pf0-f176.google.com ([209.85.192.176]:35546 "EHLO mail-pf0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753528AbdEQHCy (ORCPT ); Wed, 17 May 2017 03:02:54 -0400 Received: by mail-pf0-f176.google.com with SMTP id n23so2734759pfb.2 for ; Wed, 17 May 2017 00:02:54 -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=M8NO2cFEs6B0cFo1BztVl82+yfDMzWXfL2RElAY9GgY=; b=aMNLT4t+dSKkW5Wj0uzeay85XaCHqVVRkOXta/tiIJSe8uThBubq5XVrgY6GowYlVx Jb4QTe1yeLe8u7PO5Enpju7UkJuvhSQuaQtIXk87LAcEuIlvYRzG4VoQlHlAt+656QTV CUc/idTuwRopvLgv84iI9hVKChC1cbDQ9C1yg= 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=M8NO2cFEs6B0cFo1BztVl82+yfDMzWXfL2RElAY9GgY=; b=HESUhH/m5PoDgNt70sNsXAWxcJQ5APIoEoeaoOptM81ho3MhQ55UTEGPx/MUsJeWKz PdMezOU5fqO1nsU2wl2uZ/ZF0oWlFGexj3jlrAdRZawn7ICaofvHPkVRiyb0TEydlRI/ qB+o948UaR4QSrPkXmHD2jVgka0suBihpWkadTNnqCNrP+4IWYZW8huq6umfy9YuPolU 44ebRex+HmQ3iRwwfh1Iw5U4XokwjO6kY4g+R4Ij/DZ+W1+tC2TFyIe/KviMVDU2DJ9a wPFG7ZfLDWMw8wlmh5kNg44F/UM/iV/2xmb120Ec+1RcwH7yXcpd827GXdMjNLHJOord kU3w== X-Gm-Message-State: AODbwcDgZdGBYH3ktaL8fm8Lp/xqTXmmP5pKa6rQpXJEb8et32G+5vd9 M6NSr7PWfKT9EygE X-Received: by 10.99.109.199 with SMTP id i190mr2150685pgc.71.1495004573839; Wed, 17 May 2017 00:02:53 -0700 (PDT) Received: from localhost ([122.172.129.253]) by smtp.gmail.com with ESMTPSA id q82sm2170589pfl.28.2017.05.17.00.02.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 May 2017 00:02:53 -0700 (PDT) From: Viresh Kumar To: Rafael Wysocki , ulf.hansson@linaro.org, Kevin Hilman , Viresh Kumar , Nishanth Menon , Stephen Boyd Cc: linaro-kernel@lists.linaro.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Guittot , robh+dt@kernel.org, lina.iyer@linaro.org, rnayak@codeaurora.org, sudeep.holla@arm.com, Viresh Kumar Subject: [PATCH V7 2/2] PM / OPP: Support updating performance state of device's power domains Date: Wed, 17 May 2017 12:32:43 +0530 Message-Id: X-Mailer: git-send-email 2.13.0.303.g4ebf3021692d In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The gendpd 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. 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.303.g4ebf3021692d diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c index 898f19ea0f60..3c1036f638f6 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 = 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 = 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: + pm_genpd_update_performance_state(dev, old_freq); + + return ret; +} + static int _generic_set_opp_regulator(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 = 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;