clk: scmi: add the command CLOCK_PARENT_SET
authorPeng Fan <peng.fan@nxp.com>
Mon, 28 Apr 2025 10:37:30 +0000 (18:37 +0800)
committerFabio Estevam <festevam@gmail.com>
Sat, 3 May 2025 19:55:32 +0000 (16:55 -0300)
This patch adds the command CLOCK_PARENT_SET that can be used to set the
parent of a clock. ARM SCMI Version 3.2 supports to change the parent of
a clock device.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Signed-off-by: Alice Guo <alice.guo@nxp.com>
Reviewed-by: Ye Li <ye.li@nxp.com>
Reviewed-by: Marek Vasut <marex@denx.de>
drivers/clk/clk_scmi.c
include/scmi_protocols.h

index b8d40cc..af5e867 100644 (file)
@@ -179,11 +179,31 @@ static int scmi_clk_probe(struct udevice *dev)
        return 0;
 }
 
+static int scmi_clk_set_parent(struct clk *clk, struct clk *parent)
+{
+       struct scmi_clk_parent_set_in in = {
+               .clock_id = clk->id,
+               .parent_clk = parent->id,
+       };
+       struct scmi_clk_parent_set_out out;
+       struct scmi_msg msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_CLOCK,
+                                         SCMI_CLOCK_PARENT_SET,
+                                         in, out);
+       int ret;
+
+       ret = devm_scmi_process_msg(clk->dev, &msg);
+       if (ret < 0)
+               return ret;
+
+       return scmi_to_linux_errno(out.status);
+}
+
 static const struct clk_ops scmi_clk_ops = {
        .enable = scmi_clk_enable,
        .disable = scmi_clk_disable,
        .get_rate = scmi_clk_get_rate,
        .set_rate = scmi_clk_set_rate,
+       .set_parent = scmi_clk_set_parent,
 };
 
 U_BOOT_DRIVER(scmi_clock) = {
index 34f272c..342a65a 100644 (file)
@@ -737,6 +737,7 @@ enum scmi_clock_message_id {
        SCMI_CLOCK_RATE_SET = 0x5,
        SCMI_CLOCK_RATE_GET = 0x6,
        SCMI_CLOCK_CONFIG_SET = 0x7,
+       SCMI_CLOCK_PARENT_SET = 0xD,
 };
 
 #define SCMI_CLK_PROTO_ATTR_COUNT_MASK GENMASK(15, 0)
@@ -839,6 +840,24 @@ struct scmi_clk_rate_set_out {
        s32 status;
 };
 
+/**
+ * struct scmi_clk_parent_state_in - Message payload for CLOCK_PARENT_SET command
+ * @clock_id:          SCMI clock ID
+ * @parent_clk:                SCMI clock ID
+ */
+struct scmi_clk_parent_set_in {
+       u32 clock_id;
+       u32 parent_clk;
+};
+
+/**
+ * struct scmi_clk_parent_set_out - Response payload for CLOCK_PARENT_SET command
+ * @status:    SCMI command status
+ */
+struct scmi_clk_parent_set_out {
+       s32 status;
+};
+
 /*
  * SCMI Reset Domain Protocol
  */