From: "Peng Fan (OSS)" <peng.fan@oss.nxp.com>
To: ulf.hansson@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de
Cc: kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org,
Peng Fan <peng.fan@nxp.com>
Subject: [PATCH V3 7/8] genpd: imx: scu-pd: add multi states support
Date: Mon, 31 Jul 2023 14:47:45 +0800 [thread overview]
Message-ID: <20230731064746.2717684-8-peng.fan@oss.nxp.com> (raw)
In-Reply-To: <20230731064746.2717684-1-peng.fan@oss.nxp.com>
From: Peng Fan <peng.fan@nxp.com>
Add multi states support, this is to support devices could run in LP mode
when runtime suspend, and OFF mode when system suspend.
Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
drivers/genpd/imx/scu-pd.c | 48 ++++++++++++++++++++++++++++++++++++--
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/drivers/genpd/imx/scu-pd.c b/drivers/genpd/imx/scu-pd.c
index 2f693b67ddb4..30da101119eb 100644
--- a/drivers/genpd/imx/scu-pd.c
+++ b/drivers/genpd/imx/scu-pd.c
@@ -65,6 +65,12 @@
#include <linux/pm_domain.h>
#include <linux/slab.h>
+enum {
+ PD_STATE_LP,
+ PD_STATE_OFF,
+ PD_STATE_MAX
+};
+
/* SCU Power Mode Protocol definition */
struct imx_sc_msg_req_set_resource_power_mode {
struct imx_sc_rpc_msg hdr;
@@ -368,7 +374,8 @@ static int imx_sc_pd_power(struct generic_pm_domain *domain, bool power_on)
hdr->size = 2;
msg.resource = pd->rsrc;
- msg.mode = power_on ? IMX_SC_PM_PW_MODE_ON : IMX_SC_PM_PW_MODE_LP;
+ msg.mode = power_on ? IMX_SC_PM_PW_MODE_ON : pd->pd.state_idx ?
+ IMX_SC_PM_PW_MODE_OFF : IMX_SC_PM_PW_MODE_LP;
/* keep uart console power on for no_console_suspend */
if (imx_con_rsrc == pd->rsrc && !console_suspend_enabled && !power_on)
@@ -412,11 +419,33 @@ static struct generic_pm_domain *imx_scu_pd_xlate(struct of_phandle_args *spec,
return domain;
}
+static bool imx_sc_pd_suspend_ok(struct device *dev)
+{
+ /* Always true */
+ return true;
+}
+
+static bool imx_sc_pd_power_down_ok(struct dev_pm_domain *pd)
+{
+ struct generic_pm_domain *genpd = pd_to_genpd(pd);
+
+ /* For runtime suspend, choose LP mode */
+ genpd->state_idx = 0;
+
+ return true;
+}
+
+struct dev_power_governor imx_sc_pd_qos_governor = {
+ .suspend_ok = imx_sc_pd_suspend_ok,
+ .power_down_ok = imx_sc_pd_power_down_ok,
+};
+
static struct imx_sc_pm_domain *
imx_scu_add_pm_domain(struct device *dev, int idx,
const struct imx_sc_pd_range *pd_ranges)
{
struct imx_sc_pm_domain *sc_pd;
+ struct genpd_power_state *states;
bool is_off;
int mode, ret;
@@ -427,9 +456,22 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
if (!sc_pd)
return ERR_PTR(-ENOMEM);
+ states = devm_kcalloc(dev, PD_STATE_MAX, sizeof(*states), GFP_KERNEL);
+ if (!states) {
+ devm_kfree(dev, sc_pd);
+ return ERR_PTR(-ENOMEM);
+ }
+
sc_pd->rsrc = pd_ranges->rsrc + idx;
sc_pd->pd.power_off = imx_sc_pd_power_off;
sc_pd->pd.power_on = imx_sc_pd_power_on;
+ states[PD_STATE_LP].power_off_latency_ns = 25000;
+ states[PD_STATE_LP].power_on_latency_ns = 25000;
+ states[PD_STATE_OFF].power_off_latency_ns = 2500000;
+ states[PD_STATE_OFF].power_on_latency_ns = 2500000;
+
+ sc_pd->pd.states = states;
+ sc_pd->pd.state_count = PD_STATE_MAX;
if (pd_ranges->postfix)
snprintf(sc_pd->name, sizeof(sc_pd->name),
@@ -455,14 +497,16 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
sc_pd->name, sc_pd->rsrc);
devm_kfree(dev, sc_pd);
+ devm_kfree(dev, states);
return NULL;
}
- ret = pm_genpd_init(&sc_pd->pd, NULL, is_off);
+ ret = pm_genpd_init(&sc_pd->pd, &imx_sc_pd_qos_governor, is_off);
if (ret) {
dev_warn(dev, "failed to init pd %s rsrc id %d",
sc_pd->name, sc_pd->rsrc);
devm_kfree(dev, sc_pd);
+ devm_kfree(dev, states);
return NULL;
}
--
2.37.1
next prev parent reply other threads:[~2023-07-31 6:44 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-31 6:47 [PATCH V3 0/8] genpd: imx: relocate scu-pd and misc update Peng Fan (OSS)
2023-07-31 6:47 ` [PATCH V3 1/8] genpd: imx: relocate scu-pd under genpd Peng Fan (OSS)
2023-07-31 6:47 ` [PATCH V3 2/8] genpd: imx: scu-pd: enlarge PD range Peng Fan (OSS)
2023-07-31 6:47 ` [PATCH V3 3/8] genpd: imx: scu-pd: add more PDs Peng Fan (OSS)
2023-07-31 6:47 ` [PATCH V3 4/8] genpd: imx: scu-pd: do not power off console if no_console_suspend Peng Fan (OSS)
2023-08-10 14:05 ` Ulf Hansson
2023-08-14 10:26 ` Peng Fan
2023-07-31 6:47 ` [PATCH V3 5/8] genpd: imx: scu-pd: Suppress bind attrs Peng Fan (OSS)
2023-07-31 6:47 ` [PATCH V3 6/8] genpd: imx: scu-pd: initialize is_off according to HW state Peng Fan (OSS)
2023-07-31 6:47 ` Peng Fan (OSS) [this message]
2023-07-31 6:47 ` [PATCH V3 8/8] genpd: imx: scu-pd: change init level to subsys_initcall Peng Fan (OSS)
2023-08-08 14:57 ` [PATCH V3 0/8] genpd: imx: relocate scu-pd and misc update Ulf Hansson
2023-08-09 1:32 ` Peng Fan
2023-08-11 14:02 ` Shawn Guo
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=20230731064746.2717684-8-peng.fan@oss.nxp.com \
--to=peng.fan@oss.nxp.com \
--cc=festevam@gmail.com \
--cc=kernel@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-imx@nxp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=peng.fan@nxp.com \
--cc=s.hauer@pengutronix.de \
--cc=shawnguo@kernel.org \
--cc=ulf.hansson@linaro.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