From: Patrice Chotard Date: Thu, 18 Dec 2025 17:27:02 +0000 (+0100) Subject: clk: scmi: Fix priv initialization in scmi_clk_gate() X-Git-Tag: v2026.01~1^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e9055b1488fe3c7d4c5143bc7bb7669af7f9cd1;p=thirdparty%2Fu-boot.git 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 --- 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);