[PATCH 2/2] clk: scmi: add compatibility for clock version 3.0 and onwards
Kamlesh Gurudasani
kamlesh at ti.com
Wed Aug 13 12:29:36 CEST 2025
Clock version 3.0 specified in ARM SCMI Platform design document
v3.2, adds extended_config_val parameter in CLOCK_CONFIG_SET.
The SCMI server with clock version 3.0 rejects the message if
they don't have this field.
Add support so that both SCMI server with clock version 2.0 and 3.0
can be handled.
Signed-off-by: Kamlesh Gurudasani <kamlesh at ti.com>
---
drivers/clk/clk_scmi.c | 49 ++++++++++++++++++++++++++++++++++++++-----------
include/scmi_protocols.h | 6 ++++++
2 files changed, 44 insertions(+), 11 deletions(-)
diff --git a/drivers/clk/clk_scmi.c b/drivers/clk/clk_scmi.c
index 83ea7bb4286..b547f2494c6 100644
--- a/drivers/clk/clk_scmi.c
+++ b/drivers/clk/clk_scmi.c
@@ -135,17 +135,44 @@ static int scmi_clk_gate(struct clk *clk, int enable)
.clock_id = clk_get_id(clk),
.attributes = enable,
};
- struct scmi_clk_state_out out;
- struct scmi_msg msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_CLOCK,
- SCMI_CLOCK_CONFIG_SET,
- in, out);
+
+ struct scmi_clock_priv *priv = dev_get_priv(clk->dev);
+
int ret;
- ret = devm_scmi_process_msg(clk->dev, &msg);
- if (ret)
- return ret;
+ if (priv->version >= CLOCK_PROTOCOL_VERSION_3_0) {
+ struct scmi_clk_state_in_v2 in = {
+ .clock_id = clk->id,
+ .attributes = enable,
+ };
+ struct scmi_clk_state_out out;
+ struct scmi_msg msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_CLOCK,
+ SCMI_CLOCK_CONFIG_SET,
+ in, out);
- return scmi_to_linux_errno(out.status);
+ ret = devm_scmi_process_msg(clk->dev, &msg);
+ if (ret)
+ return ret;
+
+ return scmi_to_linux_errno(out.status);
+ } else {
+ struct scmi_clk_state_in_v2 in = {
+ .clock_id = clk->id,
+ .attributes = enable,
+ };
+ struct scmi_clk_state_out out;
+ struct scmi_msg msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_CLOCK,
+ SCMI_CLOCK_CONFIG_SET,
+ in, out);
+
+ ret = devm_scmi_process_msg(clk->dev, &msg);
+ if (ret)
+ return ret;
+
+ return scmi_to_linux_errno(out.status);
+ }
+
+ return 0;
}
static int scmi_clk_enable(struct clk *clk)
@@ -275,12 +302,12 @@ static int scmi_clk_probe(struct udevice *dev)
if (ret)
return ret;
- if (!CONFIG_IS_ENABLED(CLK_CCF))
- return 0;
-
ret = scmi_generic_protocol_version(dev, SCMI_PROTOCOL_ID_CLOCK,
&priv->version);
+ if (!CONFIG_IS_ENABLED(CLK_CCF))
+ return 0;
+
/* register CCF children: CLK UCLASS, no probed again */
if (device_get_uclass_id(dev->parent) == UCLASS_CLK)
return 0;
diff --git a/include/scmi_protocols.h b/include/scmi_protocols.h
index 762a1032c37..a4d1a4c80c8 100644
--- a/include/scmi_protocols.h
+++ b/include/scmi_protocols.h
@@ -807,6 +807,12 @@ struct scmi_clk_state_in {
u32 attributes;
};
+struct scmi_clk_state_in_v2 {
+ u32 clock_id;
+ u32 attributes;
+ u32 extended_config_val;
+};
+
/**
* struct scmi_clk_state_out - Response payload for CLOCK_CONFIG_SET command
* @status: SCMI command status
--
2.34.1
More information about the U-Boot
mailing list