|
@@ -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)
|
|
|
|
|
|
#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 device_node *node)
|
|
|
|
|
|
+struct clk *ti_clk_register_composite(struct ti_clk *setup)
|
|
|
|
+{
|
|
|
|
+ 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,
|
|
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)
|
|
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);
|