On Wed, Aug 13, 2025 at 03:59:36PM +0530, Kamlesh Gurudasani wrote: >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 <kaml...@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,
Use clk_get_id >+ .attributes = enable, .extended_config_val = 0, >+ }; >+ 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, This is wrong, I think you need to use 'struct scmi_clk_state_in in = {' Regards Peng >+ }; >+ 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 >