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_get_num_parents(mix->hw.clk); 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 clk = mix->hw.clk; 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_get_name(mix->hw.clk)); in _set_rate()
198 if (mix->lock) in _set_rate()
199 spin_unlock_irqrestore(mix->lock, flags); in _set_rate()
210 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_determine_rate() local
227 if (mix->table) { in mmp_clk_mix_determine_rate()
228 for (i = 0; i < mix->table_size; i++) { in mmp_clk_mix_determine_rate()
229 item = &mix->table[i]; in mmp_clk_mix_determine_rate()
250 div_val_max = _get_maxdiv(mix); in mmp_clk_mix_determine_rate()
252 div = _get_div(mix, j); in mmp_clk_mix_determine_rate()
279 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_set_rate_and_parent() local
284 div_val = _get_div_val(mix, div); in mmp_clk_mix_set_rate_and_parent()
285 mux_val = _get_mux_val(mix, index); in mmp_clk_mix_set_rate_and_parent()
287 return _set_rate(mix, mux_val, div_val, 1, 1); in mmp_clk_mix_set_rate_and_parent()
292 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_get_parent() local
293 struct mmp_clk_mix_reg_info *ri = &mix->reg_info; in mmp_clk_mix_get_parent()
299 if (mix->lock) in mmp_clk_mix_get_parent()
300 spin_lock_irqsave(mix->lock, flags); in mmp_clk_mix_get_parent()
302 if (mix->type == MMP_CLK_MIX_TYPE_V1 in mmp_clk_mix_get_parent()
303 || mix->type == MMP_CLK_MIX_TYPE_V2) in mmp_clk_mix_get_parent()
308 if (mix->lock) in mmp_clk_mix_get_parent()
309 spin_unlock_irqrestore(mix->lock, flags); in mmp_clk_mix_get_parent()
311 width = mix->reg_info.width_mux; in mmp_clk_mix_get_parent()
312 shift = mix->reg_info.shift_mux; in mmp_clk_mix_get_parent()
316 return _get_mux(mix, mux_val); in mmp_clk_mix_get_parent()
322 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_recalc_rate() local
323 struct mmp_clk_mix_reg_info *ri = &mix->reg_info; in mmp_clk_mix_recalc_rate()
329 if (mix->lock) in mmp_clk_mix_recalc_rate()
330 spin_lock_irqsave(mix->lock, flags); in mmp_clk_mix_recalc_rate()
332 if (mix->type == MMP_CLK_MIX_TYPE_V1 in mmp_clk_mix_recalc_rate()
333 || mix->type == MMP_CLK_MIX_TYPE_V2) in mmp_clk_mix_recalc_rate()
338 if (mix->lock) in mmp_clk_mix_recalc_rate()
339 spin_unlock_irqrestore(mix->lock, flags); in mmp_clk_mix_recalc_rate()
341 width = mix->reg_info.width_div; in mmp_clk_mix_recalc_rate()
342 shift = mix->reg_info.shift_div; in mmp_clk_mix_recalc_rate()
344 div = _get_div(mix, MMP_CLK_BITS_GET_VAL(mux_div, width, shift)); in mmp_clk_mix_recalc_rate()
351 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_set_parent() local
356 if (mix->table) { in mmp_clk_set_parent()
357 for (i = 0; i < mix->table_size; i++) { in mmp_clk_set_parent()
358 item = &mix->table[i]; in mmp_clk_set_parent()
364 if (i < mix->table_size) { in mmp_clk_set_parent()
365 div_val = _get_div_val(mix, item->divisor); in mmp_clk_set_parent()
366 mux_val = _get_mux_val(mix, item->parent_index); in mmp_clk_set_parent()
370 mux_val = _get_mux_val(mix, index); in mmp_clk_set_parent()
374 return _set_rate(mix, mux_val, div_val, 1, div_val ? 1 : 0); in mmp_clk_set_parent()
380 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_set_rate() local
390 if (mix->table) { in mmp_clk_set_rate()
391 for (i = 0; i < mix->table_size; i++) { in mmp_clk_set_rate()
392 item = &mix->table[i]; in mmp_clk_set_rate()
402 if (i < mix->table_size) in mmp_clk_set_rate()
403 return _set_rate(mix, in mmp_clk_set_rate()
404 _get_mux_val(mix, item->parent_index), in mmp_clk_set_rate()
405 _get_div_val(mix, item->divisor), in mmp_clk_set_rate()
417 return _set_rate(mix, _get_mux_val(mix, i), in mmp_clk_set_rate()
418 _get_div_val(mix, best_divisor), 1, 1); in mmp_clk_set_rate()
426 struct mmp_clk_mix *mix = to_clk_mix(hw); in mmp_clk_mix_init() local
428 if (mix->table) in mmp_clk_mix_init()
429 _filter_clk_table(mix, mix->table, mix->table_size); in mmp_clk_mix_init()
450 struct mmp_clk_mix *mix; in mmp_clk_register_mix() local
455 mix = kzalloc(sizeof(*mix), GFP_KERNEL); in mmp_clk_register_mix()
456 if (!mix) { in mmp_clk_register_mix()
468 memcpy(&mix->reg_info, &config->reg_info, sizeof(config->reg_info)); in mmp_clk_register_mix()
471 mix->table = kzalloc(table_bytes, GFP_KERNEL); in mmp_clk_register_mix()
472 if (!mix->table) { in mmp_clk_register_mix()
475 kfree(mix); in mmp_clk_register_mix()
478 memcpy(mix->table, config->table, table_bytes); in mmp_clk_register_mix()
479 mix->table_size = config->table_size; in mmp_clk_register_mix()
484 mix->mux_table = kzalloc(table_bytes, GFP_KERNEL); in mmp_clk_register_mix()
485 if (!mix->mux_table) { in mmp_clk_register_mix()
488 kfree(mix->table); in mmp_clk_register_mix()
489 kfree(mix); in mmp_clk_register_mix()
492 memcpy(mix->mux_table, config->mux_table, table_bytes); in mmp_clk_register_mix()
495 mix->div_flags = config->div_flags; in mmp_clk_register_mix()
496 mix->mux_flags = config->mux_flags; in mmp_clk_register_mix()
497 mix->lock = lock; in mmp_clk_register_mix()
498 mix->hw.init = &init; in mmp_clk_register_mix()
501 mix->type = MMP_CLK_MIX_TYPE_V1; in mmp_clk_register_mix()
503 mix->type = MMP_CLK_MIX_TYPE_V3; in mmp_clk_register_mix()
505 mix->type = MMP_CLK_MIX_TYPE_V2; in mmp_clk_register_mix()
506 clk = clk_register(dev, &mix->hw); in mmp_clk_register_mix()
509 kfree(mix->mux_table); in mmp_clk_register_mix()
510 kfree(mix->table); in mmp_clk_register_mix()
511 kfree(mix); in mmp_clk_register_mix()