diff options
| author | Patrice Chotard <[email protected]> | 2025-12-18 18:27:02 +0100 |
|---|---|---|
| committer | Peng Fan <[email protected]> | 2026-01-05 10:04:48 +0800 |
| commit | 0e9055b1488fe3c7d4c5143bc7bb7669af7f9cd1 (patch) | |
| tree | 930d09c1dd2bd8d1f95315ae9d7727d65983dd82 | |
| parent | 9a23c1e5f21ec5d13d9833953b2b608f28273309 (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.c | 12 |
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); |
