summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAndreas Kemnade <andreas@kemnade.info>2026-09-09 14:16:36 +0200
committerBrian Masney <bmasney@redhat.com>2026-09-11 19:08:36 -0400
commit59e0cc31cc5c43586c6eaada62c2c863bfbcbfb5 (patch)
treec4ba2998347f2ff972304d4c4ca0b101d357a416 /drivers
parentdf2908090cda368b01ff43709f51890076c56157 (diff)
downloadlinux-stable-59e0cc31cc5c43586c6eaada62c2c863bfbcbfb5.tar.gz
linux-stable-59e0cc31cc5c43586c6eaada62c2c863bfbcbfb5.zip
clk: ti: composite: resolve parent clocks by name again
Trying to resolve them by DT index causes massive havoc on OMAP3, Clocks around the timers used as a system clocksource are not properly resolved causing ealy boot failures. The problem seems to be that parents must be resolved by looking into the clocks property of the component node marked with "ti,composite-mux-clock", with the switch to dt index, that node was not used anymore. It was used by the of_clk_parent_fill() call. To a lesser extent also OMAP4/5 boards are affected. Since this patch was introduced just because of a cleanup request and not to solve the actual problem (https://lore.kernel.org/linux-omap/alkZmw-XmnCOZfOD@redhat.com/) just revert it. Cleanup needs really more thought here. The similar change to the TI mux clock, which solves a problem on the AM3 platform, seems to be harmless. So just revert commit fe3dd92ac54a ("clk: ti: composite: resolve parent clocks by DT index, not by name") for now. Fixes: fe3dd92ac54a ("clk: ti: composite: resolve parent clocks by DT index, not by name") Reviewed-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com> Signed-off-by: Andreas Kemnade <andreas@kemnade.info> Signed-off-by: Brian Masney <bmasney@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/ti/composite.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/drivers/clk/ti/composite.c b/drivers/clk/ti/composite.c
index 83c3592cd..c379bbdae 100644
--- a/drivers/clk/ti/composite.c
+++ b/drivers/clk/ti/composite.c
@@ -52,7 +52,7 @@ static const struct clk_ops ti_composite_gate_ops = {
struct component_clk {
int num_parents;
- struct clk_parent_data *parent_data;
+ const char **parent_names;
struct device_node *node;
int type;
struct clk_hw *hw;
@@ -116,7 +116,7 @@ static void __init _register_composite(void *user,
struct clk_hw_omap_comp *cclk = to_clk_hw_comp(hw);
struct component_clk *comp;
int num_parents = 0;
- struct clk_parent_data *parent_data = NULL;
+ const char **parent_names = NULL;
const char *name;
int i;
int ret;
@@ -155,7 +155,7 @@ static void __init _register_composite(void *user,
continue;
if (comp->num_parents) {
num_parents = comp->num_parents;
- parent_data = comp->parent_data;
+ parent_names = comp->parent_names;
break;
}
}
@@ -166,8 +166,8 @@ static void __init _register_composite(void *user,
}
name = ti_dt_clk_name(node);
- clk = clk_register_composite_pdata(NULL, name,
- parent_data, num_parents,
+ clk = clk_register_composite(NULL, name,
+ parent_names, num_parents,
_get_hw(cclk, CLK_COMPONENT_TYPE_MUX),
&ti_clk_mux_ops,
_get_hw(cclk, CLK_COMPONENT_TYPE_DIVIDER),
@@ -190,7 +190,7 @@ cleanup:
if (!cclk->comp_clks[i])
continue;
list_del(&cclk->comp_clks[i]->link);
- kfree(cclk->comp_clks[i]->parent_data);
+ kfree(cclk->comp_clks[i]->parent_names);
kfree(cclk->comp_clks[i]);
}
@@ -237,9 +237,8 @@ int __init ti_clk_add_component(struct device_node *node, struct clk_hw *hw,
int type)
{
unsigned int num_parents;
- struct clk_parent_data *parent_data;
+ const char **parent_names;
struct component_clk *clk;
- unsigned int i;
num_parents = of_clk_get_parent_count(node);
@@ -248,21 +247,20 @@ int __init ti_clk_add_component(struct device_node *node, struct clk_hw *hw,
return -EINVAL;
}
- parent_data = kzalloc_objs(*parent_data, num_parents);
- if (!parent_data)
+ parent_names = kcalloc(num_parents, sizeof(char *), GFP_KERNEL);
+ if (!parent_names)
return -ENOMEM;
- for (i = 0; i < num_parents; i++)
- parent_data[i].index = i;
+ of_clk_parent_fill(node, parent_names, num_parents);
clk = kzalloc_obj(*clk);
if (!clk) {
- kfree(parent_data);
+ kfree(parent_names);
return -ENOMEM;
}
clk->num_parents = num_parents;
- clk->parent_data = parent_data;
+ clk->parent_names = parent_names;
clk->hw = hw;
clk->node = node;
clk->type = type;