Lines Matching +full:mix +full:-

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (c) 2024-2025 Haylen Chu <heylenay@4d2.org>
6 * MIX clock type is the combination of mux, factor or divider, and gate
9 #include <linux/clk-provider.h>
18 struct ccu_mix *mix = hw_to_ccu_mix(hw); in ccu_gate_disable() local
20 ccu_update(&mix->common, ctrl, mix->gate.mask, 0); in ccu_gate_disable()
25 struct ccu_mix *mix = hw_to_ccu_mix(hw); in ccu_gate_enable() local
26 struct ccu_gate_config *gate = &mix->gate; in ccu_gate_enable()
28 ccu_update(&mix->common, ctrl, gate->mask, gate->mask); in ccu_gate_enable()
35 struct ccu_mix *mix = hw_to_ccu_mix(hw); in ccu_gate_is_enabled() local
36 struct ccu_gate_config *gate = &mix->gate; in ccu_gate_is_enabled()
38 return (ccu_read(&mix->common, ctrl) & gate->mask) == gate->mask; in ccu_gate_is_enabled()
44 struct ccu_mix *mix = hw_to_ccu_mix(hw); in ccu_factor_recalc_rate() local
46 return parent_rate * mix->factor.mul / mix->factor.div; in ccu_factor_recalc_rate()
52 struct ccu_mix *mix = hw_to_ccu_mix(hw); in ccu_div_recalc_rate() local
53 struct ccu_div_config *div = &mix->div; in ccu_div_recalc_rate()
56 val = ccu_read(&mix->common, ctrl) >> div->shift; in ccu_div_recalc_rate()
57 val &= (1 << div->width) - 1; in ccu_div_recalc_rate()
59 return divider_recalc_rate(hw, parent_rate, val, NULL, 0, div->width); in ccu_div_recalc_rate()
72 if (common->reg_fc) in ccu_mix_trigger_fc()
75 ccu_update(common, fc, common->mask_fc, common->mask_fc); in ccu_mix_trigger_fc()
77 return regmap_read_poll_timeout_atomic(common->regmap, common->reg_fc, in ccu_mix_trigger_fc()
78 val, !(val & common->mask_fc), in ccu_mix_trigger_fc()
86 req->rate = ccu_factor_recalc_rate(hw, req->best_parent_rate); in ccu_factor_determine_rate()
103 struct ccu_mix *mix = hw_to_ccu_mix(hw); in ccu_mix_calc_best_rate() local
105 struct ccu_div_config *div = &mix->div; in ccu_mix_calc_best_rate()
106 u32 div_max = 1 << div->width; in ccu_mix_calc_best_rate()
121 if (abs(tmp - rate) < abs(best_rate - rate)) { in ccu_mix_calc_best_rate()
125 *div_val = j - 1; in ccu_mix_calc_best_rate()
141 req->rate = ccu_mix_calc_best_rate(hw, req->rate, in ccu_mix_determine_rate()
142 &req->best_parent_hw, in ccu_mix_determine_rate()
143 &req->best_parent_rate, in ccu_mix_determine_rate()
151 struct ccu_mix *mix = hw_to_ccu_mix(hw); in ccu_mix_set_rate() local
152 struct ccu_common *common = &mix->common; in ccu_mix_set_rate()
153 struct ccu_div_config *div = &mix->div; in ccu_mix_set_rate()
158 current_div = ccu_read(common, ctrl) >> div->shift; in ccu_mix_set_rate()
159 current_div &= (1 << div->width) - 1; in ccu_mix_set_rate()
164 mask = GENMASK(div->width + div->shift - 1, div->shift); in ccu_mix_set_rate()
166 ccu_update(common, ctrl, mask, target_div << div->shift); in ccu_mix_set_rate()
173 struct ccu_mix *mix = hw_to_ccu_mix(hw); in ccu_mux_get_parent() local
174 struct ccu_mux_config *mux = &mix->mux; in ccu_mux_get_parent()
177 parent = ccu_read(&mix->common, ctrl) >> mux->shift; in ccu_mux_get_parent()
178 parent &= (1 << mux->width) - 1; in ccu_mux_get_parent()
185 struct ccu_mix *mix = hw_to_ccu_mix(hw); in ccu_mux_set_parent() local
186 struct ccu_mux_config *mux = &mix->mux; in ccu_mux_set_parent()
189 mask = GENMASK(mux->width + mux->shift - 1, mux->shift); in ccu_mux_set_parent()
191 ccu_update(&mix->common, ctrl, mask, index << mux->shift); in ccu_mux_set_parent()