Lines Matching +full:n +full:- +full:factor
1 // SPDX-License-Identifier: GPL-2.0-only
3 * mmp factor clock operation source file
9 #include <linux/clk-provider.h>
16 * It is M/N clock
19 * numerator/denominator = Fin / (Fout * factor)
27 struct mmp_clk_factor *factor = to_clk_factor(hw); in clk_factor_determine_rate() local
32 for (i = 0; i < factor->ftbl_cnt; i++) { in clk_factor_determine_rate()
33 d = &factor->ftbl[i]; in clk_factor_determine_rate()
36 rate = (u64)(req->best_parent_rate) * d->denominator; in clk_factor_determine_rate()
37 do_div(rate, d->numerator * factor->masks->factor); in clk_factor_determine_rate()
38 if (rate > req->rate) in clk_factor_determine_rate()
42 if ((i == 0) || (i == factor->ftbl_cnt)) in clk_factor_determine_rate()
43 req->rate = rate; in clk_factor_determine_rate()
44 else if ((req->rate - prev_rate) > (rate - req->rate)) in clk_factor_determine_rate()
45 req->rate = rate; in clk_factor_determine_rate()
47 req->rate = prev_rate; in clk_factor_determine_rate()
55 struct mmp_clk_factor *factor = to_clk_factor(hw); in clk_factor_recalc_rate() local
56 struct mmp_clk_factor_masks *masks = factor->masks; in clk_factor_recalc_rate()
61 val = readl_relaxed(factor->base); in clk_factor_recalc_rate()
64 d.numerator = (val >> masks->num_shift) & masks->num_mask; in clk_factor_recalc_rate()
67 d.denominator = (val >> masks->den_shift) & masks->den_mask; in clk_factor_recalc_rate()
72 do_div(rate, d.numerator * factor->masks->factor); in clk_factor_recalc_rate()
81 struct mmp_clk_factor *factor = to_clk_factor(hw); in clk_factor_set_rate() local
82 struct mmp_clk_factor_masks *masks = factor->masks; in clk_factor_set_rate()
89 for (i = 0; i < factor->ftbl_cnt; i++) { in clk_factor_set_rate()
90 d = &factor->ftbl[i]; in clk_factor_set_rate()
92 rate = (u64)prate * d->denominator; in clk_factor_set_rate()
93 do_div(rate, d->numerator * factor->masks->factor); in clk_factor_set_rate()
97 d = i ? &factor->ftbl[i - 1] : &factor->ftbl[0]; in clk_factor_set_rate()
99 if (factor->lock) in clk_factor_set_rate()
100 spin_lock_irqsave(factor->lock, flags); in clk_factor_set_rate()
102 val = readl_relaxed(factor->base); in clk_factor_set_rate()
104 val &= ~(masks->num_mask << masks->num_shift); in clk_factor_set_rate()
105 val |= (d->numerator & masks->num_mask) << masks->num_shift; in clk_factor_set_rate()
107 val &= ~(masks->den_mask << masks->den_shift); in clk_factor_set_rate()
108 val |= (d->denominator & masks->den_mask) << masks->den_shift; in clk_factor_set_rate()
110 writel_relaxed(val, factor->base); in clk_factor_set_rate()
112 if (factor->lock) in clk_factor_set_rate()
113 spin_unlock_irqrestore(factor->lock, flags); in clk_factor_set_rate()
120 struct mmp_clk_factor *factor = to_clk_factor(hw); in clk_factor_init() local
121 struct mmp_clk_factor_masks *masks = factor->masks; in clk_factor_init()
127 if (factor->lock) in clk_factor_init()
128 spin_lock_irqsave(factor->lock, flags); in clk_factor_init()
130 val = readl(factor->base); in clk_factor_init()
133 d.numerator = (val >> masks->num_shift) & masks->num_mask; in clk_factor_init()
136 d.denominator = (val >> masks->den_shift) & masks->den_mask; in clk_factor_init()
138 for (i = 0; i < factor->ftbl_cnt; i++) in clk_factor_init()
139 if (d.denominator == factor->ftbl[i].denominator && in clk_factor_init()
140 d.numerator == factor->ftbl[i].numerator) in clk_factor_init()
143 if (i >= factor->ftbl_cnt) { in clk_factor_init()
144 val &= ~(masks->num_mask << masks->num_shift); in clk_factor_init()
145 val |= (factor->ftbl[0].numerator & masks->num_mask) << masks->num_shift; in clk_factor_init()
147 val &= ~(masks->den_mask << masks->den_shift); in clk_factor_init()
148 val |= (factor->ftbl[0].denominator & masks->den_mask) << masks->den_shift; in clk_factor_init()
151 if (!(val & masks->enable_mask) || i >= factor->ftbl_cnt) { in clk_factor_init()
152 val |= masks->enable_mask; in clk_factor_init()
153 writel(val, factor->base); in clk_factor_init()
156 if (factor->lock) in clk_factor_init()
157 spin_unlock_irqrestore(factor->lock, flags); in clk_factor_init()
174 struct mmp_clk_factor *factor; in mmp_clk_register_factor() local
179 pr_err("%s: must pass a clk_factor_mask\n", __func__); in mmp_clk_register_factor()
180 return ERR_PTR(-EINVAL); in mmp_clk_register_factor()
183 factor = kzalloc(sizeof(*factor), GFP_KERNEL); in mmp_clk_register_factor()
184 if (!factor) in mmp_clk_register_factor()
185 return ERR_PTR(-ENOMEM); in mmp_clk_register_factor()
188 factor->base = base; in mmp_clk_register_factor()
189 factor->masks = masks; in mmp_clk_register_factor()
190 factor->ftbl = ftbl; in mmp_clk_register_factor()
191 factor->ftbl_cnt = ftbl_cnt; in mmp_clk_register_factor()
192 factor->hw.init = &init; in mmp_clk_register_factor()
193 factor->lock = lock; in mmp_clk_register_factor()
201 clk = clk_register(NULL, &factor->hw); in mmp_clk_register_factor()
203 kfree(factor); in mmp_clk_register_factor()