Lines Matching refs:mix
27 static unsigned int _get_maxdiv(struct mmp_clk_mix *mix) in _get_maxdiv() argument
29 unsigned int div_mask = (1 << mix->reg_info.width_div) - 1; in _get_maxdiv()
33 if (mix->div_flags & CLK_DIVIDER_ONE_BASED) in _get_maxdiv()
35 if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO) in _get_maxdiv()
37 if (mix->div_table) { in _get_maxdiv()
38 for (clkt = mix->div_table; clkt->div; clkt++) in _get_maxdiv()
46 static unsigned int _get_div(struct mmp_clk_mix *mix, unsigned int val) in _get_div() argument
50 if (mix->div_flags & CLK_DIVIDER_ONE_BASED) in _get_div()
52 if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO) in _get_div()
54 if (mix->div_table) { in _get_div()
55 for (clkt = mix->div_table; clkt->div; clkt++) in _get_div()
64 static unsigned int _get_mux(struct mmp_clk_mix *mix, unsigned int val) in _get_mux() argument
66 int num_parents = clk_hw_get_num_parents(&mix->hw); in _get_mux()
69 if (mix->mux_flags & CLK_MUX_INDEX_BIT) in _get_mux()
71 if (mix->mux_flags & CLK_MUX_INDEX_ONE) in _get_mux()
73 if (mix->mux_table) { in _get_mux()
75 if (mix->mux_table[i] == val) in _get_mux()
83 static unsigned int _get_div_val(struct mmp_clk_mix *mix, unsigned int div) in _get_div_val() argument
87 if (mix->div_flags & CLK_DIVIDER_ONE_BASED) in _get_div_val()
89 if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO) in _get_div_val()
91 if (mix->div_table) { in _get_div_val()
92 for (clkt = mix->div_table; clkt->div; clkt++) in _get_div_val()
102 static unsigned int _get_mux_val(struct mmp_clk_mix *mix, unsigned int mux) in _get_mux_val() argument
104 if (mix->mux_table) in _get_mux_val()
105 return mix->mux_table[mux]; in _get_mux_val()
110 static void _filter_clk_table(struct mmp_clk_mix *mix, in _filter_clk_table() argument
119 hw = &mix->hw; in _filter_clk_table()
134 static int _set_rate(struct mmp_clk_mix *mix, u32 mux_val, u32 div_val, in _set_rate() argument
137 struct mmp_clk_mix_reg_info *ri = &mix->reg_info; in _set_rate()
146 if (mix->lock) in _set_rate()
147 spin_lock_irqsave(mix->lock, flags); in _set_rate()
149 if (mix->type == MMP_CLK_MIX_TYPE_V1 in _set_rate()
150 || mix->type == MMP_CLK_MIX_TYPE_V2) in _set_rate()
169 if (mix->type == MMP_CLK_MIX_TYPE_V1) { in _set_rate()
171 } else if (mix->type == MMP_CLK_MIX_TYPE_V2) { in _set_rate()
184 __func__, clk_hw_get_name(&mix->hw)); in _set_rate()
198 if (mix->lock) in _set_rate()
199 spin_unlock_irqrestore(mix->lock, flags); in _set_rate()
207 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_determine_rate() local
222 if (mix->table) { in mmp_clk_mix_determine_rate()
223 for (i = 0; i < mix->table_size; i++) { in mmp_clk_mix_determine_rate()
224 item = &mix->table[i]; in mmp_clk_mix_determine_rate()
245 div_val_max = _get_maxdiv(mix); in mmp_clk_mix_determine_rate()
247 div = _get_div(mix, j); in mmp_clk_mix_determine_rate()
278 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_set_rate_and_parent() local
283 div_val = _get_div_val(mix, div); in mmp_clk_mix_set_rate_and_parent()
284 mux_val = _get_mux_val(mix, index); in mmp_clk_mix_set_rate_and_parent()
286 return _set_rate(mix, mux_val, div_val, 1, 1); in mmp_clk_mix_set_rate_and_parent()
291 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_get_parent() local
292 struct mmp_clk_mix_reg_info *ri = &mix->reg_info; in mmp_clk_mix_get_parent()
298 if (mix->lock) in mmp_clk_mix_get_parent()
299 spin_lock_irqsave(mix->lock, flags); in mmp_clk_mix_get_parent()
301 if (mix->type == MMP_CLK_MIX_TYPE_V1 in mmp_clk_mix_get_parent()
302 || mix->type == MMP_CLK_MIX_TYPE_V2) in mmp_clk_mix_get_parent()
307 if (mix->lock) in mmp_clk_mix_get_parent()
308 spin_unlock_irqrestore(mix->lock, flags); in mmp_clk_mix_get_parent()
310 width = mix->reg_info.width_mux; in mmp_clk_mix_get_parent()
311 shift = mix->reg_info.shift_mux; in mmp_clk_mix_get_parent()
315 return _get_mux(mix, mux_val); in mmp_clk_mix_get_parent()
321 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_recalc_rate() local
322 struct mmp_clk_mix_reg_info *ri = &mix->reg_info; in mmp_clk_mix_recalc_rate()
328 if (mix->lock) in mmp_clk_mix_recalc_rate()
329 spin_lock_irqsave(mix->lock, flags); in mmp_clk_mix_recalc_rate()
331 if (mix->type == MMP_CLK_MIX_TYPE_V1 in mmp_clk_mix_recalc_rate()
332 || mix->type == MMP_CLK_MIX_TYPE_V2) in mmp_clk_mix_recalc_rate()
337 if (mix->lock) in mmp_clk_mix_recalc_rate()
338 spin_unlock_irqrestore(mix->lock, flags); in mmp_clk_mix_recalc_rate()
340 width = mix->reg_info.width_div; in mmp_clk_mix_recalc_rate()
341 shift = mix->reg_info.shift_div; in mmp_clk_mix_recalc_rate()
343 div = _get_div(mix, MMP_CLK_BITS_GET_VAL(mux_div, width, shift)); in mmp_clk_mix_recalc_rate()
350 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_set_parent() local
355 if (mix->table) { in mmp_clk_set_parent()
356 for (i = 0; i < mix->table_size; i++) { in mmp_clk_set_parent()
357 item = &mix->table[i]; in mmp_clk_set_parent()
363 if (i < mix->table_size) { in mmp_clk_set_parent()
364 div_val = _get_div_val(mix, item->divisor); in mmp_clk_set_parent()
365 mux_val = _get_mux_val(mix, item->parent_index); in mmp_clk_set_parent()
369 mux_val = _get_mux_val(mix, index); in mmp_clk_set_parent()
373 return _set_rate(mix, mux_val, div_val, 1, div_val ? 1 : 0); in mmp_clk_set_parent()
379 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_set_rate() local
388 if (mix->table) { in mmp_clk_set_rate()
389 for (i = 0; i < mix->table_size; i++) { in mmp_clk_set_rate()
390 item = &mix->table[i]; in mmp_clk_set_rate()
400 if (i < mix->table_size) in mmp_clk_set_rate()
401 return _set_rate(mix, in mmp_clk_set_rate()
402 _get_mux_val(mix, item->parent_index), in mmp_clk_set_rate()
403 _get_div_val(mix, item->divisor), in mmp_clk_set_rate()
415 return _set_rate(mix, _get_mux_val(mix, i), in mmp_clk_set_rate()
416 _get_div_val(mix, best_divisor), 1, 1); in mmp_clk_set_rate()
424 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_init() local
426 if (mix->table) in mmp_clk_mix_init()
427 _filter_clk_table(mix, mix->table, mix->table_size); in mmp_clk_mix_init()
448 struct mmp_clk_mix *mix; in mmp_clk_register_mix() local
453 mix = kzalloc(sizeof(*mix), GFP_KERNEL); in mmp_clk_register_mix()
454 if (!mix) { in mmp_clk_register_mix()
466 memcpy(&mix->reg_info, &config->reg_info, sizeof(config->reg_info)); in mmp_clk_register_mix()
469 mix->table = kmemdup(config->table, table_bytes, GFP_KERNEL); in mmp_clk_register_mix()
470 if (!mix->table) { in mmp_clk_register_mix()
473 kfree(mix); in mmp_clk_register_mix()
476 mix->table_size = config->table_size; in mmp_clk_register_mix()
481 mix->mux_table = kmemdup(config->mux_table, table_bytes, in mmp_clk_register_mix()
483 if (!mix->mux_table) { in mmp_clk_register_mix()
486 kfree(mix->table); in mmp_clk_register_mix()
487 kfree(mix); in mmp_clk_register_mix()
492 mix->div_flags = config->div_flags; in mmp_clk_register_mix()
493 mix->mux_flags = config->mux_flags; in mmp_clk_register_mix()
494 mix->lock = lock; in mmp_clk_register_mix()
495 mix->hw.init = &init; in mmp_clk_register_mix()
498 mix->type = MMP_CLK_MIX_TYPE_V1; in mmp_clk_register_mix()
500 mix->type = MMP_CLK_MIX_TYPE_V3; in mmp_clk_register_mix()
502 mix->type = MMP_CLK_MIX_TYPE_V2; in mmp_clk_register_mix()
503 clk = clk_register(dev, &mix->hw); in mmp_clk_register_mix()
506 kfree(mix->mux_table); in mmp_clk_register_mix()
507 kfree(mix->table); in mmp_clk_register_mix()
508 kfree(mix); in mmp_clk_register_mix()