aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTero Kristo <t-kristo@ti.com>2017-07-26 09:47:28 -0400
committerTero Kristo <t-kristo@ti.com>2018-03-08 04:42:04 -0500
commite31922eda18c950d6b51450711ae459b97eae097 (patch)
treeaccb2d8fc22285386e3d1228e1262840725ea3f3
parent4902c2025b8ade9c230d4bca25ec5f691e91cb1f (diff)
clk: ti: add generic support for clock latching
Certain clocks require latching to be done, so that the actual settings get updated on the HW that generates the clock signal. One example of such a clock is the dra76x GMAC DPLL H14 output, which requires its divider settings to be latched when updated. Signed-off-by: Tero Kristo <t-kristo@ti.com>
-rw-r--r--drivers/clk/ti/clk.c14
-rw-r--r--drivers/clk/ti/clock.h2
2 files changed, 16 insertions, 0 deletions
diff --git a/drivers/clk/ti/clk.c b/drivers/clk/ti/clk.c
index 4efa2c9ea908..7d22e1af2247 100644
--- a/drivers/clk/ti/clk.c
+++ b/drivers/clk/ti/clk.c
@@ -275,6 +275,20 @@ int ti_clk_get_reg_addr(struct device_node *node, int index,
275 return 0; 275 return 0;
276} 276}
277 277
278void ti_clk_latch(struct clk_omap_reg *reg, s8 shift)
279{
280 u32 latch;
281
282 if (shift < 0)
283 return;
284
285 latch = 1 << shift;
286
287 ti_clk_ll_ops->clk_rmw(latch, latch, reg);
288 ti_clk_ll_ops->clk_rmw(0, latch, reg);
289 ti_clk_ll_ops->clk_readl(reg); /* OCP barrier */
290}
291
278/** 292/**
279 * omap2_clk_provider_init - init master clock provider 293 * omap2_clk_provider_init - init master clock provider
280 * @parent: master node 294 * @parent: master node
diff --git a/drivers/clk/ti/clock.h b/drivers/clk/ti/clock.h
index d9b43bfc2532..2f8af8fd886a 100644
--- a/drivers/clk/ti/clock.h
+++ b/drivers/clk/ti/clock.h
@@ -194,6 +194,8 @@ struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw,
194int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con); 194int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con);
195void ti_clk_add_aliases(void); 195void ti_clk_add_aliases(void);
196 196
197void ti_clk_latch(struct clk_omap_reg *reg, s8 shift);
198
197struct clk_hw *ti_clk_build_component_mux(struct ti_clk_mux *setup); 199struct clk_hw *ti_clk_build_component_mux(struct ti_clk_mux *setup);
198 200
199int ti_clk_parse_divider_data(int *div_table, int num_dividers, int max_div, 201int ti_clk_parse_divider_data(int *div_table, int num_dividers, int max_div,