Lines Matching refs:div

56 static inline u64 scaled_div_value(struct bcm_clk_div *div, u32 reg_div)  in scaled_div_value()  argument
58 return (u64)reg_div + ((u64)1 << div->u.s.frac_width); in scaled_div_value()
66 u64 scaled_div_build(struct bcm_clk_div *div, u32 div_value, u32 billionths) in scaled_div_build() argument
74 combined <<= div->u.s.frac_width; in scaled_div_build()
81 scaled_div_min(struct bcm_clk_div *div) in scaled_div_min() argument
83 if (divider_is_fixed(div)) in scaled_div_min()
84 return (u64)div->u.fixed; in scaled_div_min()
86 return scaled_div_value(div, 0); in scaled_div_min()
90 u64 scaled_div_max(struct bcm_clk_div *div) in scaled_div_max() argument
94 if (divider_is_fixed(div)) in scaled_div_max()
95 return (u64)div->u.fixed; in scaled_div_max()
97 reg_div = ((u32)1 << div->u.s.width) - 1; in scaled_div_max()
99 return scaled_div_value(div, reg_div); in scaled_div_max()
107 divider(struct bcm_clk_div *div, u64 scaled_div) in divider() argument
109 BUG_ON(scaled_div < scaled_div_min(div)); in divider()
110 BUG_ON(scaled_div > scaled_div_max(div)); in divider()
112 return (u32)(scaled_div - ((u64)1 << div->u.s.frac_width)); in divider()
117 scale_rate(struct bcm_clk_div *div, u32 rate) in scale_rate() argument
119 if (divider_is_fixed(div)) in scale_rate()
122 return (u64)rate << div->u.s.frac_width; in scale_rate()
562 static u64 divider_read_scaled(struct ccu_data *ccu, struct bcm_clk_div *div) in divider_read_scaled() argument
568 if (divider_is_fixed(div)) in divider_read_scaled()
569 return (u64)div->u.fixed; in divider_read_scaled()
572 reg_val = __ccu_read(ccu, div->u.s.offset); in divider_read_scaled()
576 reg_div = bitfield_extract(reg_val, div->u.s.shift, div->u.s.width); in divider_read_scaled()
579 return scaled_div_value(div, reg_div); in divider_read_scaled()
590 struct bcm_clk_div *div, struct bcm_clk_trig *trig) in __div_commit() argument
597 BUG_ON(divider_is_fixed(div)); in __div_commit()
604 if (div->u.s.scaled_div == BAD_SCALED_DIV_VALUE) { in __div_commit()
605 reg_val = __ccu_read(ccu, div->u.s.offset); in __div_commit()
606 reg_div = bitfield_extract(reg_val, div->u.s.shift, in __div_commit()
607 div->u.s.width); in __div_commit()
608 div->u.s.scaled_div = scaled_div_value(div, reg_div); in __div_commit()
614 reg_div = divider(div, div->u.s.scaled_div); in __div_commit()
624 reg_val = __ccu_read(ccu, div->u.s.offset); in __div_commit()
625 reg_val = bitfield_replace(reg_val, div->u.s.shift, div->u.s.width, in __div_commit()
627 __ccu_write(ccu, div->u.s.offset, reg_val); in __div_commit()
646 struct bcm_clk_div *div, struct bcm_clk_trig *trig) in div_init() argument
648 if (!divider_exists(div) || divider_is_fixed(div)) in div_init()
650 return !__div_commit(ccu, gate, div, trig); in div_init()
654 struct bcm_clk_div *div, struct bcm_clk_trig *trig, in divider_write() argument
661 BUG_ON(divider_is_fixed(div)); in divider_write()
663 previous = div->u.s.scaled_div; in divider_write()
667 div->u.s.scaled_div = scaled_div; in divider_write()
672 ret = __div_commit(ccu, gate, div, trig); in divider_write()
678 div->u.s.scaled_div = previous; /* Revert the change */ in divider_write()
692 struct bcm_clk_div *div, struct bcm_clk_div *pre_div, in clk_recalc_rate() argument
699 if (!divider_exists(div)) in clk_recalc_rate()
718 scaled_rate = scale_rate(div, scaled_rate); in clk_recalc_rate()
723 scaled_parent_rate = scale_rate(div, parent_rate); in clk_recalc_rate()
731 scaled_div = divider_read_scaled(ccu, div); in clk_recalc_rate()
746 static long round_rate(struct ccu_data *ccu, struct bcm_clk_div *div, in round_rate() argument
757 BUG_ON(!divider_exists(div)); in round_rate()
777 scaled_rate = scale_rate(div, scaled_rate); in round_rate()
782 scaled_parent_rate = scale_rate(div, parent_rate); in round_rate()
790 if (!divider_is_fixed(div)) { in round_rate()
793 min_scaled_div = scaled_div_min(div); in round_rate()
794 max_scaled_div = scaled_div_max(div); in round_rate()
800 best_scaled_div = divider_read_scaled(ccu, div); in round_rate()
1002 return clk_recalc_rate(bcm_clk->ccu, &data->div, &data->pre_div, in kona_peri_clk_recalc_rate()
1010 struct bcm_clk_div *div = &bcm_clk->u.peri->div; in kona_peri_clk_round_rate() local
1012 if (!divider_exists(div)) in kona_peri_clk_round_rate()
1016 return round_rate(bcm_clk->ccu, div, &bcm_clk->u.peri->pre_div, in kona_peri_clk_round_rate()
1126 struct bcm_clk_div *div = &data->div; in kona_peri_clk_set_rate() local
1136 if (!divider_exists(div)) in kona_peri_clk_set_rate()
1144 if (divider_is_fixed(&data->div)) in kona_peri_clk_set_rate()
1152 (void)round_rate(bcm_clk->ccu, div, &data->pre_div, in kona_peri_clk_set_rate()
1159 ret = divider_write(bcm_clk->ccu, &data->gate, &data->div, in kona_peri_clk_set_rate()
1207 if (!div_init(ccu, &peri->gate, &peri->div, &peri->trig)) { in __peri_clk_init()