From patchwork Wed Jun 21 07:10:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 106050 Delivered-To: patch@linaro.org Received: by 10.140.91.2 with SMTP id y2csp1786211qgd; Wed, 21 Jun 2017 00:11:35 -0700 (PDT) X-Received: by 10.98.38.129 with SMTP id m123mr4262459pfm.183.1498029095568; Wed, 21 Jun 2017 00:11:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1498029095; cv=none; d=google.com; s=arc-20160816; b=VxJMmxGtHIGVu8Hmry3Yl9b79g2c0EkiThm2r2KmdlNZ/0Xkr39G/D2Drtp6w+8Kip 8L2MxJ1LGYmicrgj1BemXaChtagba0sJ9L2x8yKFOConK8POGZDDTXQRKiAXAg2Mj6xd JBUjxBOwgwGxk8QFxzJciyyRtVp/ObH8jDLSbOBs1+eUoRmIJtk+nUmWbOzZ9XKoREDA VrwDT/YZpR8xSxlpBkBX4ghFERLmc1eU2txmnqgpmdJaUNFs6utVU5STENVcHAJhCKIv 4MWXmqEm637KjN+H676iRPyzyS6gHsToPFOkHHLY3lgMYQvZ7Oym4lehDUwrKkGGtPLx dOug== 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=m+s6JsuMHct+vF461rcRxRWYhdMYL9+QiNWQa9d104E=; b=Ik9VgdU7ywz6tNyGepKNw9aLZlZAHh9LrixxuQc1ioNcNSA20nUVDpyyiBykem2ojd rGRkdeO7jvb5DFsGrz/NAPa9yhftXZQGBYteDzBLpSq9bYVuS1/mxRbO78QlYBdlgY2F mXad2tGjUoIw8wja+i7KGtq2W9mAa8oKsVwfcbo+tVPpFfp55jTDcW5m+KPtOLbXMvZT YQ0NRz1JBfzIFAO0uAxUU3O9ME4jRuA51QT01qz/+gPcz4M9A4ZW88oTYDu11pUPXKGZ QRvkrzQzuSXVoY9BN1U47cZ57d9IPH1EK3UaZIbSi0qeMEXqgk20MUMx59JPkC1XLgw9 O0Qw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=imbSJWeX; 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 h66si12330513pfa.285.2017.06.21.00.11.35; Wed, 21 Jun 2017 00:11:35 -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 header.b=imbSJWeX; 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 S1752493AbdFUHLP (ORCPT + 25 others); Wed, 21 Jun 2017 03:11:15 -0400 Received: from mail-pg0-f49.google.com ([74.125.83.49]:36706 "EHLO mail-pg0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751969AbdFUHLL (ORCPT ); Wed, 21 Jun 2017 03:11:11 -0400 Received: by mail-pg0-f49.google.com with SMTP id u62so54183043pgb.3 for ; Wed, 21 Jun 2017 00:11:11 -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=m+s6JsuMHct+vF461rcRxRWYhdMYL9+QiNWQa9d104E=; b=imbSJWeXXpOrDSL7/7sd7EAQelf/G2atOEpkMczUMu7IGt6SFD8xoOYDiOmr0+7rJ7 +9O99r5F9ad1odfbDRKMwe9dv29bGVVAvD1uhkLJUSgXg9JbhAgUT27OIGMKVkdC2Sxv ZeMsLUzwI1ub0/J3lEJ6vgN6SJOyWz+7Rcbnk= 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=m+s6JsuMHct+vF461rcRxRWYhdMYL9+QiNWQa9d104E=; b=iO85f1yIwaPTEbOGMECfK0i200PoyRXqfbmPWuiPKcj1NSqK7huFNhoH3XQFr/x0Xw m4+xKD5CriCy7HiKOheMCvknCNjtsfYL7ILQFvKYZDiPFYfYJrfDGYnku6N5g0wFju1d kZ53cv/1Jq9PUYWxV7TtN2kQ9LLQiO7sVtwjLJp2MNyH3c0dTKQ3jNBaviCm/gX1IjYH NtXwE7UAs8ZosEHTx3DomOgHULvaAFsXR+TIPTReiwFhiOrPnW0X14XUTWg1cTH/NL67 kP6xguYIkh1l6+3+tcNTHi1Jk5Em2aVo7zmV9wFhN48/Z34LxMooRPzTTB3BrfoJY/ZN 1g+A== X-Gm-Message-State: AKS2vOxvy1/WvM8y6evnN4xgP7cAWMGwnxNM0oMiLxpWtB3JnR1UveHX RRyzomIyS+cr/vGI X-Received: by 10.84.128.107 with SMTP id 98mr36006840pla.285.1498029065395; Wed, 21 Jun 2017 00:11:05 -0700 (PDT) Received: from localhost ([122.172.59.234]) by smtp.gmail.com with ESMTPSA id q14sm19259895pgr.11.2017.06.21.00.11.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Jun 2017 00:11:04 -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 V8 2/6] PM / OPP: Support updating performance state of device's power domains Date: Wed, 21 Jun 2017 12:40:49 +0530 Message-Id: X-Mailer: git-send-email 2.13.0.71.gd7076ec9c9cb 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 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..ef623afcc5fd 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(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 = 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;