[PATCH v2 2/3] clk: Return value calculated by ERR_PTR
Andrew Goodbody
andrew.goodbody at linaro.org
Fri Nov 21 18:34:32 CET 2025
In clk_set_default_get_by_id ret is passed to ERR_PTR but nothing is
done with the value that this calculates which is obviously not the
intention of the code. This is confirmed by the code around where this
function is called.
Instead return the value from ERR_PTR.
Then fixup the sandbox code so that the test dm_test_clk does not fail
as it relied on the broken behaviour.
Finally disable part of the test that does not work correctly with
CLK_AUTO_ID
This issue found by Smatch.
Signed-off-by: Andrew Goodbody <andrew.goodbody at linaro.org>
---
arch/sandbox/include/asm/clk.h | 1 +
drivers/clk/clk-uclass.c | 4 ++--
drivers/clk/clk_sandbox.c | 17 +++++++++++++++++
test/dm/clk.c | 5 +++--
4 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/arch/sandbox/include/asm/clk.h b/arch/sandbox/include/asm/clk.h
index 37fe49c7fcf61a0d172dad8539f510431b9ab59d..2d3318cdcc4d5a6710441fcc532dc7d9a06408f0 100644
--- a/arch/sandbox/include/asm/clk.h
+++ b/arch/sandbox/include/asm/clk.h
@@ -50,6 +50,7 @@ enum sandbox_clk_test_id {
struct sandbox_clk_priv {
bool probed;
+ struct clk clk;
ulong rate[SANDBOX_CLK_ID_COUNT];
bool enabled[SANDBOX_CLK_ID_COUNT];
bool requested[SANDBOX_CLK_ID_COUNT];
diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
index 1f55dbe385b76d0d6cfbf19bc9f4f1abe619baf2..a72a67d75a165c2d98bb702888e848f6b075fc7d 100644
--- a/drivers/clk/clk-uclass.c
+++ b/drivers/clk/clk-uclass.c
@@ -199,7 +199,7 @@ static struct clk *clk_set_default_get_by_id(struct clk *clk)
if (ret) {
debug("%s(): could not get parent clock pointer, id %lu\n",
__func__, clk->id);
- ERR_PTR(ret);
+ return ERR_PTR(ret);
}
}
@@ -354,7 +354,7 @@ static int clk_set_default_rates(struct udevice *dev,
c = clk_set_default_get_by_id(&clk);
if (IS_ERR(c))
- return PTR_ERR(c);
+ continue;
ret = clk_set_rate(c, rates[index]);
diff --git a/drivers/clk/clk_sandbox.c b/drivers/clk/clk_sandbox.c
index c8c5a88c52d985632733030b0cb92970920a5fc5..cd92a6a29f57565ee140b012e34d284c93247023 100644
--- a/drivers/clk/clk_sandbox.c
+++ b/drivers/clk/clk_sandbox.c
@@ -8,8 +8,23 @@
#include <errno.h>
#include <malloc.h>
#include <asm/clk.h>
+#include <dm/device-internal.h>
#include <linux/clk-provider.h>
+static int sandbox_clk_of_to_plat(struct udevice *dev)
+{
+ struct clk *clk;
+ struct sandbox_clk_priv *priv = dev_get_priv(dev);
+
+ clk = &priv->clk;
+
+ /* FIXME: This is not allowed */
+ dev_set_uclass_priv(dev, clk);
+
+ clk->dev = dev;
+ return 0;
+}
+
static ulong sandbox_clk_get_rate(struct clk *clk)
{
struct sandbox_clk_priv *priv = dev_get_priv(clk->dev);
@@ -102,6 +117,7 @@ static int sandbox_clk_request(struct clk *clk)
if (id >= SANDBOX_CLK_ID_COUNT)
return -EINVAL;
+ priv->clk.id = id;
priv->requested[id] = true;
return 0;
}
@@ -132,6 +148,7 @@ U_BOOT_DRIVER(sandbox_clk) = {
.name = "sandbox_clk",
.id = UCLASS_CLK,
.of_match = sandbox_clk_ids,
+ .of_to_plat = sandbox_clk_of_to_plat,
.ops = &sandbox_clk_ops,
.probe = sandbox_clk_probe,
.priv_auto = sizeof(struct sandbox_clk_priv),
diff --git a/test/dm/clk.c b/test/dm/clk.c
index 790968e64774362d8967845b01b296c528326b99..c3363796498b4db3664a5b3cea10da54161a06fb 100644
--- a/test/dm/clk.c
+++ b/test/dm/clk.c
@@ -89,8 +89,9 @@ static int dm_test_clk(struct unit_test_state *uts)
SANDBOX_CLK_TEST_ID_SPI));
ut_asserteq(0, sandbox_clk_test_get_rate(dev_test,
SANDBOX_CLK_TEST_ID_I2C));
- ut_asserteq(321, sandbox_clk_test_get_rate(dev_test,
- SANDBOX_CLK_TEST_ID_DEVM1));
+ if (!CONFIG_IS_ENABLED(CLK_AUTO_ID))
+ ut_asserteq(321, sandbox_clk_test_get_rate(dev_test,
+ SANDBOX_CLK_TEST_ID_DEVM1));
ut_asserteq(0, sandbox_clk_test_get_rate(dev_test,
SANDBOX_CLK_TEST_ID_DEVM2));
--
2.47.3
More information about the U-Boot
mailing list