[PATCH RFC 23/40] clk/ccf: adapt clk-conf for U-Boot
Casey Connolly
casey.connolly at linaro.org
Thu Mar 19 21:56:45 CET 2026
Basic changes to adapt clk-conf to build properly on U-Boot
Signed-off-by: Casey Connolly <casey.connolly at linaro.org>
---
drivers/clk/ccf/clk-conf.c | 84 ++++++++++++++++++++++++--------------------
include/linux/clk/clk-conf.h | 12 +++----
2 files changed, 50 insertions(+), 46 deletions(-)
diff --git a/drivers/clk/ccf/clk-conf.c b/drivers/clk/ccf/clk-conf.c
index 303a0bb26e54..7b29562e297c 100644
--- a/drivers/clk/ccf/clk-conf.c
+++ b/drivers/clk/ccf/clk-conf.c
@@ -3,66 +3,65 @@
* Copyright (C) 2014 Samsung Electronics Co., Ltd.
* Sylwester Nawrocki <s.nawrocki at samsung.com>
*/
-#include <linux/clk.h>
+#include <dm/ofnode.h>
#include <linux/clk-provider.h>
#include <linux/clk/clk-conf.h>
+#include <linux/compat.h>
#include <linux/device.h>
-#include <linux/of.h>
#include <linux/printk.h>
-#include <linux/slab.h>
-static int __set_clk_parents(struct device_node *node, bool clk_supplier)
+static int __set_clk_parents(ofnode node, bool clk_supplier)
{
- struct of_phandle_args clkspec;
+ struct ofnode_phandle_args clkspec;
int index, rc, num_parents;
struct clk *clk, *pclk;
- num_parents = of_count_phandle_with_args(node, "assigned-clock-parents",
- "#clock-cells");
+ num_parents = ofnode_count_phandle_with_args(node, "assigned-clock-parents",
+ "#clock-cells", 0);
if (num_parents == -EINVAL)
pr_err("clk: invalid value of clock-parents property at %pOF\n",
- node);
+ &node);
for (index = 0; index < num_parents; index++) {
- rc = of_parse_phandle_with_args(node, "assigned-clock-parents",
- "#clock-cells", index, &clkspec);
+ rc = ofnode_parse_phandle_with_args(node, "assigned-clock-parents",
+ "#clock-cells", 0, index, &clkspec);
if (rc < 0) {
/* skip empty (null) phandles */
if (rc == -ENOENT)
continue;
else
return rc;
}
- if (clkspec.np == node && !clk_supplier) {
- of_node_put(clkspec.np);
+ if (ofnode_equal(clkspec.node, node) && !clk_supplier) {
+ ofnode_put(clkspec.node);
return 0;
}
pclk = of_clk_get_from_provider(&clkspec);
- of_node_put(clkspec.np);
+ ofnode_put(clkspec.node);
if (IS_ERR(pclk)) {
if (PTR_ERR(pclk) != -EPROBE_DEFER)
pr_warn("clk: couldn't get parent clock %d for %pOF\n",
- index, node);
+ index, &node);
return PTR_ERR(pclk);
}
- rc = of_parse_phandle_with_args(node, "assigned-clocks",
- "#clock-cells", index, &clkspec);
+ rc = ofnode_parse_phandle_with_args(node, "assigned-clocks",
+ "#clock-cells", 0, index, &clkspec);
if (rc < 0)
goto err;
- if (clkspec.np == node && !clk_supplier) {
- of_node_put(clkspec.np);
+ if (ofnode_equal(clkspec.node, node) && !clk_supplier) {
+ ofnode_put(clkspec.node);
rc = 0;
goto err;
}
clk = of_clk_get_from_provider(&clkspec);
- of_node_put(clkspec.np);
+ ofnode_put(clkspec.node);
if (IS_ERR(clk)) {
if (PTR_ERR(clk) != -EPROBE_DEFER)
pr_warn("clk: couldn't get assigned clock %d for %pOF\n",
- index, node);
+ index, &node);
rc = PTR_ERR(clk);
goto err;
}
@@ -78,40 +77,40 @@ err:
clk_put(pclk);
return rc;
}
-static int __set_clk_rates(struct device_node *node, bool clk_supplier)
+static int __set_clk_rates(ofnode node, bool clk_supplier)
{
- struct of_phandle_args clkspec;
+ struct ofnode_phandle_args clkspec;
int rc, count, count_64, index;
struct clk *clk;
- u64 *rates_64 __free(kfree) = NULL;
- u32 *rates __free(kfree) = NULL;
+ u64 *rates_64 = NULL;
+ u32 *rates = NULL;
- count = of_property_count_u32_elems(node, "assigned-clock-rates");
- count_64 = of_property_count_u64_elems(node, "assigned-clock-rates-u64");
+ count = ofnode_count_u32_elems(node, "assigned-clock-rates");
+ count_64 = ofnode_count_u64_elems(node, "assigned-clock-rates-u64");
if (count_64 > 0) {
count = count_64;
rates_64 = kcalloc(count, sizeof(*rates_64), GFP_KERNEL);
if (!rates_64)
return -ENOMEM;
- rc = of_property_read_u64_array(node,
+ rc = ofnode_read_u64_array(node,
"assigned-clock-rates-u64",
rates_64, count);
} else if (count > 0) {
rates = kcalloc(count, sizeof(*rates), GFP_KERNEL);
if (!rates)
return -ENOMEM;
- rc = of_property_read_u32_array(node, "assigned-clock-rates",
+ rc = ofnode_read_u32_array(node, "assigned-clock-rates",
rates, count);
} else {
return 0;
}
if (rc)
- return rc;
+ goto out_free;
for (index = 0; index < count; index++) {
unsigned long rate;
@@ -120,29 +119,30 @@ static int __set_clk_rates(struct device_node *node, bool clk_supplier)
else
rate = rates[index];
if (rate) {
- rc = of_parse_phandle_with_args(node, "assigned-clocks",
- "#clock-cells", index, &clkspec);
+ rc = ofnode_parse_phandle_with_args(node, "assigned-clocks",
+ "#clock-cells", 0, index, &clkspec);
if (rc < 0) {
/* skip empty (null) phandles */
if (rc == -ENOENT)
continue;
else
- return rc;
+ goto out_free;
}
- if (clkspec.np == node && !clk_supplier) {
- of_node_put(clkspec.np);
+ if (ofnode_equal(clkspec.node, node) && !clk_supplier) {
+ ofnode_put(clkspec.node);
return 0;
}
clk = of_clk_get_from_provider(&clkspec);
- of_node_put(clkspec.np);
+ ofnode_put(clkspec.node);
if (IS_ERR(clk)) {
if (PTR_ERR(clk) != -EPROBE_DEFER)
pr_warn("clk: couldn't get clock %d for %pOF\n",
- index, node);
- return PTR_ERR(clk);
+ index, &node);
+ rc = PTR_ERR(clk);
+ goto out_free;
}
rc = clk_set_rate(clk, rate);
if (rc < 0)
@@ -152,8 +152,14 @@ static int __set_clk_rates(struct device_node *node, bool clk_supplier)
clk_put(clk);
}
}
return 0;
+
+out_free:
+ kfree(rates);
+ kfree(rates_64);
+
+ return rc;
}
/**
* of_clk_set_defaults() - parse and set assigned clocks configuration
@@ -166,13 +172,13 @@ static int __set_clk_rates(struct device_node *node, bool clk_supplier)
* listed in its 'assigned-clocks' or 'assigned-clock-parents' properties.
* If @clk_supplier is false the function exits returning 0 as soon as it
* determines the @node is also a supplier of any of the clocks.
*/
-int of_clk_set_defaults(struct device_node *node, bool clk_supplier)
+int of_clk_set_defaults(ofnode node, bool clk_supplier)
{
int rc;
- if (!node)
+ if (!ofnode_valid(node))
return 0;
rc = __set_clk_parents(node, clk_supplier);
if (rc < 0)
diff --git a/include/linux/clk/clk-conf.h b/include/linux/clk/clk-conf.h
index eae9652c70cd..93bb6c582b4e 100644
--- a/include/linux/clk/clk-conf.h
+++ b/include/linux/clk/clk-conf.h
@@ -6,19 +6,17 @@
#ifndef __CLK_CONF_H
#define __CLK_CONF_H
+#include <dm/ofnode.h>
#include <linux/types.h>
-struct device_node;
-
-#if defined(CONFIG_OF) && defined(CONFIG_COMMON_CLK)
-int of_clk_set_defaults(struct device_node *node, bool clk_supplier);
+#if CONFIG_IS_ENABLED(CLK_CCF_FULL)
+int of_clk_set_defaults(ofnode node, bool clk_supplier);
#else
-static inline int of_clk_set_defaults(struct device_node *node,
- bool clk_supplier)
+int of_clk_set_defaults(ofnode node, bool clk_supplier)
{
- return 0;
+ return -ENOSYS;
}
#endif
#endif /* __CLK_CONF_H */
--
2.51.0
More information about the U-Boot
mailing list