Lines Matching +full:m +full:- +full:den
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (c) 2024-2025 Haylen Chu <heylenay@4d2.org>
6 * DDN stands for "Divider Denominator Numerator", it's M/N clock with a
10 * 2 * ------------- = -------
16 * Fout = ----- * -------------
20 #include <linux/clk-provider.h>
26 unsigned long den, unsigned int pre_div) in ccu_ddn_calc_rate() argument
28 return prate * den / pre_div / num; in ccu_ddn_calc_rate()
33 unsigned long *num, unsigned long *den) in ccu_ddn_calc_best_rate() argument
35 rational_best_approximation(rate, prate / ddn->pre_div, in ccu_ddn_calc_best_rate()
36 ddn->den_mask >> ddn->den_shift, in ccu_ddn_calc_best_rate()
37 ddn->num_mask >> ddn->num_shift, in ccu_ddn_calc_best_rate()
38 den, num); in ccu_ddn_calc_best_rate()
39 return ccu_ddn_calc_rate(prate, *num, *den, ddn->pre_div); in ccu_ddn_calc_best_rate()
46 unsigned long num, den; in ccu_ddn_determine_rate() local
48 req->rate = ccu_ddn_calc_best_rate(ddn, req->rate, in ccu_ddn_determine_rate()
49 req->best_parent_rate, &num, &den); in ccu_ddn_determine_rate()
57 unsigned int val, num, den; in ccu_ddn_recalc_rate() local
59 val = ccu_read(&ddn->common, ctrl); in ccu_ddn_recalc_rate()
61 num = (val & ddn->num_mask) >> ddn->num_shift; in ccu_ddn_recalc_rate()
62 den = (val & ddn->den_mask) >> ddn->den_shift; in ccu_ddn_recalc_rate()
64 return ccu_ddn_calc_rate(prate, num, den, ddn->pre_div); in ccu_ddn_recalc_rate()
71 unsigned long num, den; in ccu_ddn_set_rate() local
73 ccu_ddn_calc_best_rate(ddn, rate, prate, &num, &den); in ccu_ddn_set_rate()
75 ccu_update(&ddn->common, ctrl, in ccu_ddn_set_rate()
76 ddn->num_mask | ddn->den_mask, in ccu_ddn_set_rate()
77 (num << ddn->num_shift) | (den << ddn->den_shift)); in ccu_ddn_set_rate()