Lines Matching full:divider
7 * Adjustable divider clock implementation
20 * DOC: basic adjustable divider clock that cannot gate
29 static inline u32 clk_div_readl(struct clk_divider *divider) in clk_div_readl() argument
31 if (divider->flags & CLK_DIVIDER_BIG_ENDIAN) in clk_div_readl()
32 return ioread32be(divider->reg); in clk_div_readl()
34 return readl(divider->reg); in clk_div_readl()
37 static inline void clk_div_writel(struct clk_divider *divider, u32 val) in clk_div_writel() argument
39 if (divider->flags & CLK_DIVIDER_BIG_ENDIAN) in clk_div_writel()
40 iowrite32be(val, divider->reg); in clk_div_writel()
42 writel(val, divider->reg); in clk_div_writel()
158 struct clk_divider *divider = to_clk_divider(hw); in clk_divider_recalc_rate() local
161 val = clk_div_readl(divider) >> divider->shift; in clk_divider_recalc_rate()
162 val &= clk_div_mask(divider->width); in clk_divider_recalc_rate()
164 return divider_recalc_rate(hw, parent_rate, val, divider->table, in clk_divider_recalc_rate()
165 divider->flags, divider->width); in clk_divider_recalc_rate()
319 * The maximum divider we can use without overflowing in clk_divider_bestdiv()
330 * parent rate, so return the divider immediately. in clk_divider_bestdiv()
437 struct clk_divider *divider = to_clk_divider(hw); in clk_divider_determine_rate() local
440 if (divider->flags & CLK_DIVIDER_READ_ONLY) { in clk_divider_determine_rate()
443 val = clk_div_readl(divider) >> divider->shift; in clk_divider_determine_rate()
444 val &= clk_div_mask(divider->width); in clk_divider_determine_rate()
446 return divider_ro_determine_rate(hw, req, divider->table, in clk_divider_determine_rate()
447 divider->width, in clk_divider_determine_rate()
448 divider->flags, val); in clk_divider_determine_rate()
451 return divider_determine_rate(hw, req, divider->table, divider->width, in clk_divider_determine_rate()
452 divider->flags); in clk_divider_determine_rate()
475 struct clk_divider *divider = to_clk_divider(hw); in clk_divider_set_rate() local
480 value = divider_get_val(rate, parent_rate, divider->table, in clk_divider_set_rate()
481 divider->width, divider->flags); in clk_divider_set_rate()
485 if (divider->lock) in clk_divider_set_rate()
486 spin_lock_irqsave(divider->lock, flags); in clk_divider_set_rate()
488 __acquire(divider->lock); in clk_divider_set_rate()
490 if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { in clk_divider_set_rate()
491 val = clk_div_mask(divider->width) << (divider->shift + 16); in clk_divider_set_rate()
493 val = clk_div_readl(divider); in clk_divider_set_rate()
494 val &= ~(clk_div_mask(divider->width) << divider->shift); in clk_divider_set_rate()
496 val |= (u32)value << divider->shift; in clk_divider_set_rate()
497 clk_div_writel(divider, val); in clk_divider_set_rate()
499 if (divider->lock) in clk_divider_set_rate()
500 spin_unlock_irqrestore(divider->lock, flags); in clk_divider_set_rate()
502 __release(divider->lock); in clk_divider_set_rate()
535 pr_warn("divider value exceeds LOWORD field\n"); in __clk_hw_register_divider()
540 /* allocate the divider */ in __clk_hw_register_divider()
581 * clk_register_divider_table - register a table based divider clock with
587 * @reg: register address to adjust divider
590 * @clk_divider_flags: divider-specific flags for this clock
591 * @table: array of divider/value pairs ending with a div set to 0
628 * clk_hw_unregister_divider - unregister a clk divider