From 0e9055b1488fe3c7d4c5143bc7bb7669af7f9cd1 Mon Sep 17 00:00:00 2001 From: Patrice Chotard Date: Thu, 18 Dec 2025 18:27:02 +0100 Subject: [PATCH] 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 Reviewed-by: Marek Vasut Signed-off-by: Patrice Chotard Signed-off-by: Peng Fan --- drivers/clk/clk_scmi.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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);