[PATCH 1/2] clk: scmi: export scmi_clk_resolve_attr
Peng Fan (OSS)
peng.fan at oss.nxp.com
Thu Dec 11 09:31:43 CET 2025
From: Peng Fan <peng.fan at nxp.com>
With commit 3547e315c188 ("clk: scmi: Defer issue of SCMI_CLOCK_ATTRIBUTES"),
the SCMI clock names might be defered. However the SCMI clock may be
input to other clock controllers, such as clk-imx95-blkctrl.
Without the clock names being resolved, there will be error:
clk_register: failed to get hsiopll device (parent of hsio_blk_ctl_clk)
So export this API for users.
Fixes: 3547e315c188 ("clk: scmi: Defer issue of SCMI_CLOCK_ATTRIBUTES"),
Signed-off-by: Peng Fan <peng.fan at nxp.com>
---
drivers/clk/clk_scmi.c | 20 +++++++++++---------
include/clk/scmi.h | 12 ++++++++++++
2 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/drivers/clk/clk_scmi.c b/drivers/clk/clk_scmi.c
index cbd44f310b1..bc665e0bd3a 100644
--- a/drivers/clk/clk_scmi.c
+++ b/drivers/clk/clk_scmi.c
@@ -6,6 +6,7 @@
#define LOG_CATEGORY UCLASS_CLK
#include <clk-uclass.h>
+#include <clk/scmi.h>
#include <dm.h>
#include <dm/device_compat.h>
#include <dm/device-internal.h>
@@ -170,7 +171,7 @@ static int scmi_clk_gate(struct clk *clk, int enable)
return scmi_to_linux_errno(out.status);
}
-static int scmi_clk_get_ctrl_flags(struct clk *clk, u32 *ctrl_flags)
+int scmi_clk_resolve_attr(ulong id, u32 *ctrl_flags)
{
struct clk_scmi *clkscmi;
struct udevice *dev;
@@ -178,7 +179,7 @@ static int scmi_clk_get_ctrl_flags(struct clk *clk, u32 *ctrl_flags)
struct clk *c;
int ret;
- ret = clk_get_by_id(clk->id, &c);
+ ret = clk_get_by_id(id, &c);
if (ret)
return ret;
@@ -188,7 +189,7 @@ static int scmi_clk_get_ctrl_flags(struct clk *clk, u32 *ctrl_flags)
if (!clkscmi->attrs_resolved) {
char name[SCMI_CLOCK_NAME_LENGTH_MAX];
- ret = scmi_clk_get_attribute(dev, clk->id & CLK_ID_MSK,
+ ret = scmi_clk_get_attribute(dev, id & CLK_ID_MSK,
name, &attributes);
if (ret)
return ret;
@@ -197,7 +198,7 @@ static int scmi_clk_get_ctrl_flags(struct clk *clk, u32 *ctrl_flags)
if (CLK_HAS_RESTRICTIONS(attributes)) {
u32 perm;
- ret = scmi_clk_get_permissions(dev, clk->id & CLK_ID_MSK, &perm);
+ ret = scmi_clk_get_permissions(dev, id & CLK_ID_MSK, &perm);
if (ret < 0)
clkscmi->ctrl_flags = 0;
else
@@ -211,7 +212,8 @@ static int scmi_clk_get_ctrl_flags(struct clk *clk, u32 *ctrl_flags)
clkscmi->attrs_resolved = true;
}
- *ctrl_flags = clkscmi->ctrl_flags;
+ if (ctrl_flags)
+ *ctrl_flags = clkscmi->ctrl_flags;
return 0;
}
@@ -224,7 +226,7 @@ static int scmi_clk_enable(struct clk *clk)
if (!CONFIG_IS_ENABLED(CLK_CCF))
return scmi_clk_gate(clk, 1);
- ret = scmi_clk_get_ctrl_flags(clk, &ctrl_flags);
+ ret = scmi_clk_resolve_attr(clk->id, &ctrl_flags);
if (ret)
return ret;
@@ -244,7 +246,7 @@ static int scmi_clk_disable(struct clk *clk)
if (!CONFIG_IS_ENABLED(CLK_CCF))
return scmi_clk_gate(clk, 0);
- ret = scmi_clk_get_ctrl_flags(clk, &ctrl_flags);
+ ret = scmi_clk_resolve_attr(clk->id, &ctrl_flags);
if (ret)
return ret;
@@ -312,7 +314,7 @@ static ulong scmi_clk_set_rate(struct clk *clk, ulong rate)
if (!CONFIG_IS_ENABLED(CLK_CCF))
return __scmi_clk_set_rate(clk, rate);
- ret = scmi_clk_get_ctrl_flags(clk, &ctrl_flags);
+ ret = scmi_clk_resolve_attr(clk->id, &ctrl_flags);
if (ret)
return ret;
@@ -402,7 +404,7 @@ static int scmi_clk_set_parent(struct clk *clk, struct clk *parent)
if (!CONFIG_IS_ENABLED(CLK_CCF))
return __scmi_clk_set_parent(clk, parent);
- ret = scmi_clk_get_ctrl_flags(clk, &ctrl_flags);
+ ret = scmi_clk_resolve_attr(clk->id, &ctrl_flags);
if (ret)
return ret;
diff --git a/include/clk/scmi.h b/include/clk/scmi.h
new file mode 100644
index 00000000000..9c669ba4adc
--- /dev/null
+++ b/include/clk/scmi.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2025 NXP
+ */
+
+#ifndef _CLK_SCMI_H
+#define _CLK_SCMI_H
+
+#include <linux/types.h>
+
+int scmi_clk_resolve_attr(ulong id, u32 *ctrl_flags);
+#endif
--
2.51.0
More information about the U-Boot
mailing list