clk: Return value calculated by ERR_PTR

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@linaro.org>
This commit is contained in:
Andrew Goodbody
2025-11-21 17:34:32 +00:00
committed by Tom Rini
parent 1c0a46e291
commit fe780310cf
4 changed files with 23 additions and 4 deletions

View File

@@ -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];

View File

@@ -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]);

View File

@@ -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),

View File

@@ -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));