[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240725090741.1039642-1-peng.fan@oss.nxp.com>
Date: Thu, 25 Jul 2024 17:07:41 +0800
From: "Peng Fan (OSS)" <peng.fan@....nxp.com>
To: sudeep.holla@....com,
cristian.marussi@....com,
mturquette@...libre.com,
sboyd@...nel.org,
linux-clk@...r.kernel.org
Cc: linux-arm-kernel@...ts.infradead.org,
linux-kernel@...r.kernel.org,
arm-scmi@...r.kernel.org,
Peng Fan <peng.fan@....com>
Subject: [PATCH] clk: scmi: add is_prepared hook
From: Peng Fan <peng.fan@....com>
Some clks maybe default enabled by hardware, so add is_prepared hook
to get the status of the clk. Then when disabling unused clks, those
unused clks but default hardware on clks could be in off state to save
power.
Signed-off-by: Peng Fan <peng.fan@....com>
---
drivers/clk/clk-scmi.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/drivers/clk/clk-scmi.c b/drivers/clk/clk-scmi.c
index d86a02563f6c..d2d370337ba5 100644
--- a/drivers/clk/clk-scmi.c
+++ b/drivers/clk/clk-scmi.c
@@ -142,6 +142,20 @@ static void scmi_clk_disable(struct clk_hw *hw)
scmi_proto_clk_ops->disable(clk->ph, clk->id, NOT_ATOMIC);
}
+static int scmi_clk_is_enabled(struct clk_hw *hw)
+{
+ int ret;
+ bool enabled = false;
+ struct scmi_clk *clk = to_scmi_clk(hw);
+
+ ret = scmi_proto_clk_ops->state_get(clk->ph, clk->id, &enabled, NOT_ATOMIC);
+ if (ret)
+ dev_warn(clk->dev,
+ "Failed to get state for clock ID %d\n", clk->id);
+
+ return !!enabled;
+}
+
static int scmi_clk_atomic_enable(struct clk_hw *hw)
{
struct scmi_clk *clk = to_scmi_clk(hw);
@@ -280,6 +294,7 @@ scmi_clk_ops_alloc(struct device *dev, unsigned long feats_key)
} else {
ops->prepare = scmi_clk_enable;
ops->unprepare = scmi_clk_disable;
+ ops->is_prepared = scmi_clk_is_enabled;
}
}
--
2.37.1
Powered by blists - more mailing lists