Lines Matching refs:mix

3  * mmp mix(div and mux) clock operation source file
17 * The mix clock is a clock combined mux and div type clock.
24 static unsigned int _get_maxdiv(struct mmp_clk_mix *mix)
26 unsigned int div_mask = (1 << mix->reg_info.width_div) - 1;
30 if (mix->div_flags & CLK_DIVIDER_ONE_BASED)
32 if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO)
34 if (mix->div_table) {
35 for (clkt = mix->div_table; clkt->div; clkt++)
43 static unsigned int _get_div(struct mmp_clk_mix *mix, unsigned int val)
47 if (mix->div_flags & CLK_DIVIDER_ONE_BASED)
49 if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO)
51 if (mix->div_table) {
52 for (clkt = mix->div_table; clkt->div; clkt++)
61 static unsigned int _get_mux(struct mmp_clk_mix *mix, unsigned int val)
63 int num_parents = clk_hw_get_num_parents(&mix->hw);
66 if (mix->mux_flags & CLK_MUX_INDEX_BIT)
68 if (mix->mux_flags & CLK_MUX_INDEX_ONE)
70 if (mix->mux_table) {
72 if (mix->mux_table[i] == val)
80 static unsigned int _get_div_val(struct mmp_clk_mix *mix, unsigned int div)
84 if (mix->div_flags & CLK_DIVIDER_ONE_BASED)
86 if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO)
88 if (mix->div_table) {
89 for (clkt = mix->div_table; clkt->div; clkt++)
99 static unsigned int _get_mux_val(struct mmp_clk_mix *mix, unsigned int mux)
101 if (mix->mux_table)
102 return mix->mux_table[mux];
107 static void _filter_clk_table(struct mmp_clk_mix *mix,
116 hw = &mix->hw;
131 static int _set_rate(struct mmp_clk_mix *mix, u32 mux_val, u32 div_val,
134 struct mmp_clk_mix_reg_info *ri = &mix->reg_info;
143 if (mix->lock)
144 spin_lock_irqsave(mix->lock, flags);
146 if (mix->type == MMP_CLK_MIX_TYPE_V1
147 || mix->type == MMP_CLK_MIX_TYPE_V2)
166 if (mix->type == MMP_CLK_MIX_TYPE_V1) {
168 } else if (mix->type == MMP_CLK_MIX_TYPE_V2) {
181 __func__, clk_hw_get_name(&mix->hw));
195 if (mix->lock)
196 spin_unlock_irqrestore(mix->lock, flags);
204 struct mmp_clk_mix *mix = to_clk_mix(hw);
219 if (mix->table) {
220 for (i = 0; i < mix->table_size; i++) {
221 item = &mix->table[i];
242 div_val_max = _get_maxdiv(mix);
244 div = _get_div(mix, j);
275 struct mmp_clk_mix *mix = to_clk_mix(hw);
280 div_val = _get_div_val(mix, div);
281 mux_val = _get_mux_val(mix, index);
283 return _set_rate(mix, mux_val, div_val, 1, 1);
288 struct mmp_clk_mix *mix = to_clk_mix(hw);
289 struct mmp_clk_mix_reg_info *ri = &mix->reg_info;
295 if (mix->lock)
296 spin_lock_irqsave(mix->lock, flags);
298 if (mix->type == MMP_CLK_MIX_TYPE_V1
299 || mix->type == MMP_CLK_MIX_TYPE_V2)
304 if (mix->lock)
305 spin_unlock_irqrestore(mix->lock, flags);
307 width = mix->reg_info.width_mux;
308 shift = mix->reg_info.shift_mux;
312 return _get_mux(mix, mux_val);
318 struct mmp_clk_mix *mix = to_clk_mix(hw);
319 struct mmp_clk_mix_reg_info *ri = &mix->reg_info;
325 if (mix->lock)
326 spin_lock_irqsave(mix->lock, flags);
328 if (mix->type == MMP_CLK_MIX_TYPE_V1
329 || mix->type == MMP_CLK_MIX_TYPE_V2)
334 if (mix->lock)
335 spin_unlock_irqrestore(mix->lock, flags);
337 width = mix->reg_info.width_div;
338 shift = mix->reg_info.shift_div;
340 div = _get_div(mix, MMP_CLK_BITS_GET_VAL(mux_div, width, shift));
347 struct mmp_clk_mix *mix = to_clk_mix(hw);
352 if (mix->table) {
353 for (i = 0; i < mix->table_size; i++) {
354 item = &mix->table[i];
360 if (i < mix->table_size) {
361 div_val = _get_div_val(mix, item->divisor);
362 mux_val = _get_mux_val(mix, item->parent_index);
366 mux_val = _get_mux_val(mix, index);
370 return _set_rate(mix, mux_val, div_val, 1, div_val ? 1 : 0);
376 struct mmp_clk_mix *mix = to_clk_mix(hw);
385 if (mix->table) {
386 for (i = 0; i < mix->table_size; i++) {
387 item = &mix->table[i];
397 if (i < mix->table_size)
398 return _set_rate(mix,
399 _get_mux_val(mix, item->parent_index),
400 _get_div_val(mix, item->divisor),
412 return _set_rate(mix, _get_mux_val(mix, i),
413 _get_div_val(mix, best_divisor), 1, 1);
421 struct mmp_clk_mix *mix = to_clk_mix(hw);
423 if (mix->table)
424 _filter_clk_table(mix, mix->table, mix->table_size);
447 struct mmp_clk_mix *mix;
452 mix = kzalloc(sizeof(*mix), GFP_KERNEL);
453 if (!mix)
462 memcpy(&mix->reg_info, &config->reg_info, sizeof(config->reg_info));
465 mix->table = kmemdup(config->table, table_bytes, GFP_KERNEL);
466 if (!mix->table)
469 mix->table_size = config->table_size;
474 mix->mux_table = kmemdup(config->mux_table, table_bytes,
476 if (!mix->mux_table) {
477 kfree(mix->table);
482 mix->div_flags = config->div_flags;
483 mix->mux_flags = config->mux_flags;
484 mix->lock = lock;
485 mix->hw.init = &init;
488 mix->type = MMP_CLK_MIX_TYPE_V1;
490 mix->type = MMP_CLK_MIX_TYPE_V3;
492 mix->type = MMP_CLK_MIX_TYPE_V2;
493 clk = clk_register(dev, &mix->hw);
496 kfree(mix->mux_table);
497 kfree(mix->table);
498 kfree(mix);
504 kfree(mix);