Lines Matching refs:divider
40 static void _setup_mask(struct clk_omap_divider *divider)
46 if (divider->table) {
49 for (clkt = divider->table; clkt->div; clkt++)
53 max_val = divider->max;
55 if (!(divider->flags & CLK_DIVIDER_ONE_BASED) &&
56 !(divider->flags & CLK_DIVIDER_POWER_OF_TWO))
60 if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
65 divider->mask = (1 << fls(mask)) - 1;
68 static unsigned int _get_div(struct clk_omap_divider *divider, unsigned int val)
70 if (divider->flags & CLK_DIVIDER_ONE_BASED)
72 if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
74 if (divider->table)
75 return _get_table_div(divider->table, val);
90 static unsigned int _get_val(struct clk_omap_divider *divider, u8 div)
92 if (divider->flags & CLK_DIVIDER_ONE_BASED)
94 if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
96 if (divider->table)
97 return _get_table_val(divider->table, div);
104 struct clk_omap_divider *divider = to_clk_omap_divider(hw);
107 val = ti_clk_ll_ops->clk_readl(÷r->reg) >> divider->shift;
108 val &= divider->mask;
110 div = _get_div(divider, val);
112 WARN(!(divider->flags & CLK_DIVIDER_ALLOW_ZERO),
138 static bool _is_valid_div(struct clk_omap_divider *divider, unsigned int div)
140 if (divider->flags & CLK_DIVIDER_POWER_OF_TWO)
142 if (divider->table)
143 return _is_valid_table_div(divider->table, div);
179 struct clk_omap_divider *divider = to_clk_omap_divider(hw);
187 maxdiv = divider->max;
191 bestdiv = _div_round(divider->table, parent_rate, rate);
198 * The maximum divider we can use without overflowing
204 if (!_is_valid_div(divider, i))
210 * parent rate, so return the divider immediately.
226 bestdiv = divider->max;
246 struct clk_omap_divider *divider;
253 divider = to_clk_omap_divider(hw);
257 if (div > divider->max)
258 div = divider->max;
259 if (div < divider->min)
260 div = divider->min;
262 value = _get_val(divider, div);
264 val = ti_clk_ll_ops->clk_readl(÷r->reg);
265 val &= ~(divider->mask << divider->shift);
266 val |= value << divider->shift;
267 ti_clk_ll_ops->clk_writel(val, ÷r->reg);
269 ti_clk_latch(÷r->reg, divider->latch);
275 * clk_divider_save_context - Save the divider value
278 * Save the divider value
282 struct clk_omap_divider *divider = to_clk_omap_divider(hw);
285 val = ti_clk_ll_ops->clk_readl(÷r->reg) >> divider->shift;
286 divider->context = val & divider->mask;
292 * clk_divider_restore_context - restore the saved the divider value
295 * Restore the saved the divider value
299 struct clk_omap_divider *divider = to_clk_omap_divider(hw);
302 val = ti_clk_ll_ops->clk_readl(÷r->reg);
303 val &= ~(divider->mask << divider->shift);
304 val |= divider->context << divider->shift;
305 ti_clk_ll_ops->clk_writel(val, ÷r->reg);
340 u8 flags, struct clk_omap_divider *divider)
348 divider->min = 1;
349 divider->max = max_div;
350 _setup_mask(divider);
383 divider->min = min_div;
384 divider->max = max_div;
385 divider->table = tmp;
386 _setup_mask(divider);
410 /* Determine required size for divider table */
443 struct clk_omap_divider *divider)
450 if (!divider->table) {
451 /* Clk divider table not provided, determine min/max divs */
461 for (clkt = divider->table; clkt->div; clkt++) {
470 divider->min = min_div;
471 divider->max = max_div;
472 _setup_mask(divider);
521 * Sets up a basic divider clock.
547 CLK_OF_DECLARE(divider_clk, "ti,divider-clock", of_ti_divider_clk_setup);
568 CLK_OF_DECLARE(ti_composite_divider_clk, "ti,composite-divider-clock",