Lines Matching refs:divider

32 static void _setup_mask(struct clk_omap_divider *divider)
38 if (divider->table) {
41 for (clkt = divider->table; clkt->div; clkt++)
45 max_val = divider->max;
47 if (!(divider->flags & CLK_DIVIDER_ONE_BASED) &&
48 !(divider->flags & CLK_DIVIDER_POWER_OF_TWO))
52 if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
57 divider->mask = (1 << fls(mask)) - 1;
60 static unsigned int _get_div(struct clk_omap_divider *divider, unsigned int val)
62 if (divider->flags & CLK_DIVIDER_ONE_BASED)
64 if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
66 if (divider->table)
67 return _get_table_div(divider->table, val);
82 static unsigned int _get_val(struct clk_omap_divider *divider, u8 div)
84 if (divider->flags & CLK_DIVIDER_ONE_BASED)
86 if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
88 if (divider->table)
89 return _get_table_val(divider->table, div);
96 struct clk_omap_divider *divider = to_clk_omap_divider(hw);
99 val = ti_clk_ll_ops->clk_readl(&divider->reg) >> divider->shift;
100 val &= divider->mask;
102 div = _get_div(divider, val);
104 WARN(!(divider->flags & CLK_DIVIDER_ALLOW_ZERO),
130 static bool _is_valid_div(struct clk_omap_divider *divider, unsigned int div)
132 if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
134 if (divider->table)
135 return _is_valid_table_div(divider->table, div);
171 struct clk_omap_divider *divider = to_clk_omap_divider(hw);
179 maxdiv = divider->max;
183 bestdiv = _div_round(divider->table, parent_rate, rate);
190 * The maximum divider we can use without overflowing
196 if (!_is_valid_div(divider, i))
202 * parent rate, so return the divider immediately.
218 bestdiv = divider->max;
238 struct clk_omap_divider *divider;
245 divider = to_clk_omap_divider(hw);
249 if (div > divider->max)
250 div = divider->max;
251 if (div < divider->min)
252 div = divider->min;
254 value = _get_val(divider, div);
256 val = ti_clk_ll_ops->clk_readl(&divider->reg);
257 val &= ~(divider->mask << divider->shift);
258 val |= value << divider->shift;
259 ti_clk_ll_ops->clk_writel(val, &divider->reg);
261 ti_clk_latch(&divider->reg, divider->latch);
267 * clk_divider_save_context - Save the divider value
270 * Save the divider value
274 struct clk_omap_divider *divider = to_clk_omap_divider(hw);
277 val = ti_clk_ll_ops->clk_readl(&divider->reg) >> divider->shift;
278 divider->context = val & divider->mask;
284 * clk_divider_restore_context - restore the saved the divider value
287 * Restore the saved the divider value
291 struct clk_omap_divider *divider = to_clk_omap_divider(hw);
294 val = ti_clk_ll_ops->clk_readl(&divider->reg);
295 val &= ~(divider->mask << divider->shift);
296 val |= divider->context << divider->shift;
297 ti_clk_ll_ops->clk_writel(val, &divider->reg);
332 u8 flags, struct clk_omap_divider *divider)
340 divider->min = 1;
341 divider->max = max_div;
342 _setup_mask(divider);
375 divider->min = min_div;
376 divider->max = max_div;
377 divider->table = tmp;
378 _setup_mask(divider);
402 /* Determine required size for divider table */
435 struct clk_omap_divider *divider)
442 if (!divider->table) {
443 /* Clk divider table not provided, determine min/max divs */
453 for (clkt = divider->table; clkt->div; clkt++) {
462 divider->min = min_div;
463 divider->max = max_div;
464 _setup_mask(divider);
510 * Sets up a basic divider clock.
536 CLK_OF_DECLARE(divider_clk, "ti,divider-clock", of_ti_divider_clk_setup);
557 CLK_OF_DECLARE(ti_composite_divider_clk, "ti,composite-divider-clock",