summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrice Chotard <[email protected]>2025-12-18 18:27:02 +0100
committerPeng Fan <[email protected]>2026-01-05 10:04:48 +0800
commit0e9055b1488fe3c7d4c5143bc7bb7669af7f9cd1 (patch)
tree930d09c1dd2bd8d1f95315ae9d7727d65983dd82
parent9a23c1e5f21ec5d13d9833953b2b608f28273309 (diff)
clk: scmi: Fix priv initialization in scmi_clk_gate()
In scmi_clk_probe(), in case of CLK_CCF is not enabled, parent private data is not set, so in scmi_clk_gate(), an uninitialized priv struct is retrieved. SCMI request is performed either using scmi_clk_state_in_v1 or scmi_clk_state_in_v2 struct depending of the unpredictable value of priv->version which leads to error during SCMI clock enable. Issue detected on STM32MP157C-DK2 board using the SCMI device tree stm32mp157c-dk2-scmi.dts. Fixes: 0619cb32030b ("firmware: scmi: Add clock v3.2 CONFIG_SET support") Reviewed-by: Peng Fan <[email protected]> Reviewed-by: Marek Vasut <[email protected]> Signed-off-by: Patrice Chotard <[email protected]> Signed-off-by: Peng Fan <[email protected]>
-rw-r--r--drivers/clk/clk_scmi.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/clk/clk_scmi.c b/drivers/clk/clk_scmi.c
index f6132178205..a4fc4f8da89 100644
--- a/drivers/clk/clk_scmi.c
+++ b/drivers/clk/clk_scmi.c
@@ -137,7 +137,7 @@ static int scmi_clk_get_attribute(struct udevice *dev, int clkid, char *name,
static int scmi_clk_gate(struct clk *clk, int enable)
{
- struct scmi_clock_priv *priv = dev_get_parent_priv(clk->dev);
+ struct scmi_clock_priv *priv;
struct scmi_clk_state_in_v1 in_v1 = {
.clock_id = clk_get_id(clk),
.attributes = enable,
@@ -156,6 +156,16 @@ static int scmi_clk_gate(struct clk *clk, int enable)
in_v2, out);
int ret;
+ /*
+ * In scmi_clk_probe(), in case of CLK_CCF is set, SCMI clock
+ * version is set in dev's parent priv struct. Otherwise
+ * SCMI clock version is set in dev priv struct.
+ */
+ if (CONFIG_IS_ENABLED(CLK_CCF))
+ priv = dev_get_parent_priv(clk->dev);
+ else
+ priv = dev_get_priv(clk->dev);
+
ret = devm_scmi_process_msg(clk->dev,
(priv->version < CLOCK_PROTOCOL_VERSION_2_1) ?
&msg_v1 : &msg_v2);