From: Dmitry Osipenko <digetx@gmail.com>
To: Thierry Reding <thierry.reding@gmail.com>,
Jonathan Hunter <jonathanh@nvidia.com>,
Ulf Hansson <ulf.hansson@linaro.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Kevin Hilman <khilman@kernel.org>,
Viresh Kumar <vireshk@kernel.org>,
Stephen Boyd <sboyd@kernel.org>, Nishanth Menon <nm@ti.com>
Cc: linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org,
linux-pm@vger.kernel.org
Subject: [PATCH v9 4/8] PM: domains: Add get_performance_state() callback
Date: Fri, 27 Aug 2021 04:34:11 +0300 [thread overview]
Message-ID: <20210827013415.24027-5-digetx@gmail.com> (raw)
In-Reply-To: <20210827013415.24027-1-digetx@gmail.com>
Add get_performance_state() callback that retrieves and initializes
performance state of a device attached to a power domain. This removes
inconsistency of the performance state with hardware state.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/base/power/domain.c | 32 +++++++++++++++++++++++++++++---
include/linux/pm_domain.h | 2 ++
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 3a13a942d012..8b828dcdf7f8 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -2700,15 +2700,41 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev,
goto err;
} else if (pstate > 0) {
ret = dev_pm_genpd_set_performance_state(dev, pstate);
- if (ret)
+ if (ret) {
+ dev_err(dev, "failed to set required performance state for power-domain %s: %d\n",
+ pd->name, ret);
goto err;
+ }
dev_gpd_data(dev)->default_pstate = pstate;
}
+
+ if (pd->get_performance_state && !dev_gpd_data(dev)->default_pstate) {
+ bool dev_suspended = false;
+
+ ret = pd->get_performance_state(pd, base_dev, &dev_suspended);
+ if (ret < 0) {
+ dev_err(dev, "failed to get performance state for power-domain %s: %d\n",
+ pd->name, ret);
+ goto err;
+ }
+
+ pstate = ret;
+
+ if (dev_suspended) {
+ dev_gpd_data(dev)->rpm_pstate = pstate;
+ } else if (pstate > 0) {
+ ret = dev_pm_genpd_set_performance_state(dev, pstate);
+ if (ret) {
+ dev_err(dev, "failed to set required performance state for power-domain %s: %d\n",
+ pd->name, ret);
+ goto err;
+ }
+ }
+ }
+
return 1;
err:
- dev_err(dev, "failed to set required performance state for power-domain %s: %d\n",
- pd->name, ret);
genpd_remove_device(pd, dev);
return ret;
}
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index 67017c9390c8..4f78b31791ae 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -133,6 +133,8 @@ struct generic_pm_domain {
struct dev_pm_opp *opp);
int (*set_performance_state)(struct generic_pm_domain *genpd,
unsigned int state);
+ int (*get_performance_state)(struct generic_pm_domain *genpd,
+ struct device *dev, bool *dev_suspended);
struct gpd_dev_ops dev_ops;
s64 max_off_time_ns; /* Maximum allowed "suspended" time. */
ktime_t next_wakeup; /* Maintained by the domain governor */
--
2.32.0
next prev parent reply other threads:[~2021-08-27 1:38 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-27 1:34 [PATCH v9 0/8] NVIDIA Tegra power management patches for 5.16 Dmitry Osipenko
2021-08-27 1:34 ` [PATCH v9 1/8] opp: Add dev_pm_opp_from_clk_rate() Dmitry Osipenko
2021-08-27 1:42 ` Dmitry Osipenko
2021-08-27 3:00 ` kernel test robot
2021-08-27 3:00 ` Viresh Kumar
2021-08-27 3:28 ` Dmitry Osipenko
2021-08-27 7:27 ` kernel test robot
2021-08-27 1:34 ` [PATCH v9 2/8] opp: Allow dev_pm_opp_set_clkname() to replace released clock Dmitry Osipenko
2021-08-27 1:34 ` [PATCH v9 3/8] opp: Change type of dev_pm_opp_attach_genpd(names) argument Dmitry Osipenko
2021-08-27 1:34 ` Dmitry Osipenko [this message]
2021-08-27 14:23 ` [PATCH v9 4/8] PM: domains: Add get_performance_state() callback Ulf Hansson
2021-08-27 15:50 ` Dmitry Osipenko
2021-08-30 9:19 ` Ulf Hansson
2021-08-27 1:34 ` [PATCH v9 5/8] soc/tegra: pmc: Implement " Dmitry Osipenko
2021-08-27 3:05 ` Viresh Kumar
2021-08-27 3:28 ` Dmitry Osipenko
2021-08-27 3:47 ` Dmitry Osipenko
2021-08-27 3:56 ` Dmitry Osipenko
2021-08-27 4:02 ` Viresh Kumar
2021-08-27 4:08 ` Dmitry Osipenko
2021-08-27 4:13 ` Viresh Kumar
2021-08-27 4:15 ` Dmitry Osipenko
2021-08-27 1:34 ` [PATCH v9 6/8] soc/tegra: Add devm_tegra_core_dev_init_opp_table_simple() Dmitry Osipenko
2021-08-27 1:34 ` [PATCH v9 7/8] gpu: host1x: Add host1x_channel_stop() Dmitry Osipenko
2021-08-27 1:34 ` [PATCH v9 8/8] drm/tegra: gr3d: Support generic power domain and runtime PM Dmitry Osipenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210827013415.24027-5-digetx@gmail.com \
--to=digetx@gmail.com \
--cc=jonathanh@nvidia.com \
--cc=khilman@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=nm@ti.com \
--cc=rjw@rjwysocki.net \
--cc=sboyd@kernel.org \
--cc=thierry.reding@gmail.com \
--cc=ulf.hansson@linaro.org \
--cc=vireshk@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox