Commit b26bcf9b authored by Tero Kristo's avatar Tero Kristo Committed by Michael Turquette

clk: ti: composite: add support for legacy composite clock init

Legacy clock data is initialized slightly differently compared to
DT clocks, thus add support for this.
Signed-off-by: default avatarTero Kristo <t-kristo@ti.com>
Acked-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarMichael Turquette <mturquette@linaro.org>
parent ed405a23
...@@ -217,6 +217,9 @@ struct clk __init *ti_clk_register_clk(struct ti_clk *setup) ...@@ -217,6 +217,9 @@ struct clk __init *ti_clk_register_clk(struct ti_clk *setup)
case TI_CLK_DIVIDER: case TI_CLK_DIVIDER:
clk = ti_clk_register_divider(setup); clk = ti_clk_register_divider(setup);
break; break;
case TI_CLK_COMPOSITE:
clk = ti_clk_register_composite(setup);
break;
case TI_CLK_FIXED_FACTOR: case TI_CLK_FIXED_FACTOR:
fixed_factor = setup->data; fixed_factor = setup->data;
......
...@@ -158,6 +158,7 @@ struct clk *ti_clk_register_gate(struct ti_clk *setup); ...@@ -158,6 +158,7 @@ struct clk *ti_clk_register_gate(struct ti_clk *setup);
struct clk *ti_clk_register_interface(struct ti_clk *setup); struct clk *ti_clk_register_interface(struct ti_clk *setup);
struct clk *ti_clk_register_mux(struct ti_clk *setup); struct clk *ti_clk_register_mux(struct ti_clk *setup);
struct clk *ti_clk_register_divider(struct ti_clk *setup); struct clk *ti_clk_register_divider(struct ti_clk *setup);
struct clk *ti_clk_register_composite(struct ti_clk *setup);
struct clk *ti_clk_register_dpll(struct ti_clk *setup); struct clk *ti_clk_register_dpll(struct ti_clk *setup);
struct clk_hw *ti_clk_build_component_div(struct ti_clk_divider *setup); struct clk_hw *ti_clk_build_component_div(struct ti_clk_divider *setup);
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include <linux/clk/ti.h> #include <linux/clk/ti.h>
#include <linux/list.h> #include <linux/list.h>
#include "clock.h"
#undef pr_fmt #undef pr_fmt
#define pr_fmt(fmt) "%s: " fmt, __func__ #define pr_fmt(fmt) "%s: " fmt, __func__
...@@ -116,8 +118,44 @@ static inline struct clk_hw *_get_hw(struct clk_hw_omap_comp *clk, int idx) ...@@ -116,8 +118,44 @@ static inline struct clk_hw *_get_hw(struct clk_hw_omap_comp *clk, int idx)
#define to_clk_hw_comp(_hw) container_of(_hw, struct clk_hw_omap_comp, hw) #define to_clk_hw_comp(_hw) container_of(_hw, struct clk_hw_omap_comp, hw)
static void __init ti_clk_register_composite(struct clk_hw *hw, struct clk *ti_clk_register_composite(struct ti_clk *setup)
struct device_node *node) {
struct ti_clk_composite *comp;
struct clk_hw *gate;
struct clk_hw *mux;
struct clk_hw *div;
int num_parents = 1;
const char **parent_names = NULL;
struct clk *clk;
comp = setup->data;
div = ti_clk_build_component_div(comp->divider);
gate = ti_clk_build_component_gate(comp->gate);
mux = ti_clk_build_component_mux(comp->mux);
if (div)
parent_names = &comp->divider->parent;
if (gate)
parent_names = &comp->gate->parent;
if (mux) {
num_parents = comp->mux->num_parents;
parent_names = comp->mux->parents;
}
clk = clk_register_composite(NULL, setup->name,
parent_names, num_parents, mux,
&ti_clk_mux_ops, div,
&ti_composite_divider_ops, gate,
&ti_composite_gate_ops, 0);
return clk;
}
static void __init _register_composite(struct clk_hw *hw,
struct device_node *node)
{ {
struct clk *clk; struct clk *clk;
struct clk_hw_omap_comp *cclk = to_clk_hw_comp(hw); struct clk_hw_omap_comp *cclk = to_clk_hw_comp(hw);
...@@ -136,7 +174,7 @@ static void __init ti_clk_register_composite(struct clk_hw *hw, ...@@ -136,7 +174,7 @@ static void __init ti_clk_register_composite(struct clk_hw *hw,
pr_debug("component %s not ready for %s, retry\n", pr_debug("component %s not ready for %s, retry\n",
cclk->comp_nodes[i]->name, node->name); cclk->comp_nodes[i]->name, node->name);
if (!ti_clk_retry_init(node, hw, if (!ti_clk_retry_init(node, hw,
ti_clk_register_composite)) _register_composite))
return; return;
goto cleanup; goto cleanup;
...@@ -216,7 +254,7 @@ static void __init of_ti_composite_clk_setup(struct device_node *node) ...@@ -216,7 +254,7 @@ static void __init of_ti_composite_clk_setup(struct device_node *node)
for (i = 0; i < num_clks; i++) for (i = 0; i < num_clks; i++)
cclk->comp_nodes[i] = _get_component_node(node, i); cclk->comp_nodes[i] = _get_component_node(node, i);
ti_clk_register_composite(&cclk->hw, node); _register_composite(&cclk->hw, node);
} }
CLK_OF_DECLARE(ti_composite_clock, "ti,composite-clock", CLK_OF_DECLARE(ti_composite_clock, "ti,composite-clock",
of_ti_composite_clk_setup); of_ti_composite_clk_setup);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment