[PATCH v3 2/2] clk: scmi: add compatibility for clock version 3.0 and onwards

Kamlesh Gurudasani kamlesh at ti.com
Tue Aug 19 09:33:27 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   | 43 ++++++++++++++++++++++++++++++-------------
 include/scmi_protocols.h |  6 ++++++
 2 files changed, 36 insertions(+), 13 deletions(-)

diff --git a/drivers/clk/clk_scmi.c b/drivers/clk/clk_scmi.c
index 83ea7bb4286..b33cc05685d 100644
--- a/drivers/clk/clk_scmi.c
+++ b/drivers/clk/clk_scmi.c
@@ -131,19 +131,36 @@ static int scmi_clk_get_attibute(struct udevice *dev, int clkid, char **name,
 
 static int scmi_clk_gate(struct clk *clk, int enable)
 {
-	struct scmi_clk_state_in in = {
-		.clock_id = clk_get_id(clk),
-		.attributes = enable,
-	};
+	struct scmi_clock_priv *priv = dev_get_priv(clk->dev);
 	struct scmi_clk_state_out out;
-	struct scmi_msg msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_CLOCK,
-					  SCMI_CLOCK_CONFIG_SET,
-					  in, out);
 	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_get_id(clk),
+			.attributes = enable,
+			.extended_config_val = 0,
+		};
+		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;
+	} else {
+		struct scmi_clk_state_in in = {
+			.clock_id = clk_get_id(clk),
+			.attributes = enable,
+		};
+		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);
 }
@@ -275,12 +292,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