Lines Matching refs:mix
2 * mmp mix(div and mux) clock operation source file
20 * The mix clock is a clock combined mux and div type clock.
27 static unsigned int _get_maxdiv(struct mmp_clk_mix *mix)
29 unsigned int div_mask = (1 << mix->reg_info.width_div) - 1;
33 if (mix->div_flags & CLK_DIVIDER_ONE_BASED)
35 if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO)
37 if (mix->div_table) {
38 for (clkt = mix->div_table; clkt->div; clkt++)
46 static unsigned int _get_div(struct mmp_clk_mix *mix, unsigned int val)
50 if (mix->div_flags & CLK_DIVIDER_ONE_BASED)
52 if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO)
54 if (mix->div_table) {
55 for (clkt = mix->div_table; clkt->div; clkt++)
64 static unsigned int _get_mux(struct mmp_clk_mix *mix, unsigned int val)
66 int num_parents = clk_hw_get_num_parents(&mix->hw);
69 if (mix->mux_flags & CLK_MUX_INDEX_BIT)
71 if (mix->mux_flags & CLK_MUX_INDEX_ONE)
73 if (mix->mux_table) {
75 if (mix->mux_table[i] == val)
83 static unsigned int _get_div_val(struct mmp_clk_mix *mix, unsigned int div)
87 if (mix->div_flags & CLK_DIVIDER_ONE_BASED)
89 if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO)
91 if (mix->div_table) {
92 for (clkt = mix->div_table; clkt->div; clkt++)
102 static unsigned int _get_mux_val(struct mmp_clk_mix *mix, unsigned int mux)
104 if (mix->mux_table)
105 return mix->mux_table[mux];
110 static void _filter_clk_table(struct mmp_clk_mix *mix,
119 hw = &mix->hw;
134 static int _set_rate(struct mmp_clk_mix *mix, u32 mux_val, u32 div_val,
137 struct mmp_clk_mix_reg_info *ri = &mix->reg_info;
146 if (mix->lock)
147 spin_lock_irqsave(mix->lock, flags);
149 if (mix->type == MMP_CLK_MIX_TYPE_V1
150 || mix->type == MMP_CLK_MIX_TYPE_V2)
169 if (mix->type == MMP_CLK_MIX_TYPE_V1) {
171 } else if (mix->type == MMP_CLK_MIX_TYPE_V2) {
184 __func__, clk_hw_get_name(&mix->hw));
198 if (mix->lock)
199 spin_unlock_irqrestore(mix->lock, flags);
207 struct mmp_clk_mix *mix = to_clk_mix(hw);
222 if (mix->table) {
223 for (i = 0; i < mix->table_size; i++) {
224 item = &mix->table[i];
245 div_val_max = _get_maxdiv(mix);
247 div = _get_div(mix, j);
278 struct mmp_clk_mix *mix = to_clk_mix(hw);
283 div_val = _get_div_val(mix, div);
284 mux_val = _get_mux_val(mix, index);
286 return _set_rate(mix, mux_val, div_val, 1, 1);
291 struct mmp_clk_mix *mix = to_clk_mix(hw);
292 struct mmp_clk_mix_reg_info *ri = &mix->reg_info;
298 if (mix->lock)
299 spin_lock_irqsave(mix->lock, flags);
301 if (mix->type == MMP_CLK_MIX_TYPE_V1
302 || mix->type == MMP_CLK_MIX_TYPE_V2)
307 if (mix->lock)
308 spin_unlock_irqrestore(mix->lock, flags);
310 width = mix->reg_info.width_mux;
311 shift = mix->reg_info.shift_mux;
315 return _get_mux(mix, mux_val);
321 struct mmp_clk_mix *mix = to_clk_mix(hw);
322 struct mmp_clk_mix_reg_info *ri = &mix->reg_info;
328 if (mix->lock)
329 spin_lock_irqsave(mix->lock, flags);
331 if (mix->type == MMP_CLK_MIX_TYPE_V1
332 || mix->type == MMP_CLK_MIX_TYPE_V2)
337 if (mix->lock)
338 spin_unlock_irqrestore(mix->lock, flags);
340 width = mix->reg_info.width_div;
341 shift = mix->reg_info.shift_div;
343 div = _get_div(mix, MMP_CLK_BITS_GET_VAL(mux_div, width, shift));
350 struct mmp_clk_mix *mix = to_clk_mix(hw);
355 if (mix->table) {
356 for (i = 0; i < mix->table_size; i++) {
357 item = &mix->table[i];
363 if (i < mix->table_size) {
364 div_val = _get_div_val(mix, item->divisor);
365 mux_val = _get_mux_val(mix, item->parent_index);
369 mux_val = _get_mux_val(mix, index);
373 return _set_rate(mix, mux_val, div_val, 1, div_val ? 1 : 0);
379 struct mmp_clk_mix *mix = to_clk_mix(hw);
388 if (mix->table) {
389 for (i = 0; i < mix->table_size; i++) {
390 item = &mix->table[i];
400 if (i < mix->table_size)
401 return _set_rate(mix,
402 _get_mux_val(mix, item->parent_index),
403 _get_div_val(mix, item->divisor),
415 return _set_rate(mix, _get_mux_val(mix, i),
416 _get_div_val(mix, best_divisor), 1, 1);
424 struct mmp_clk_mix *mix = to_clk_mix(hw);
426 if (mix->table)
427 _filter_clk_table(mix, mix->table, mix->table_size);
450 struct mmp_clk_mix *mix;
455 mix = kzalloc(sizeof(*mix), GFP_KERNEL);
456 if (!mix)
465 memcpy(&mix->reg_info, &config->reg_info, sizeof(config->reg_info));
468 mix->table = kmemdup(config->table, table_bytes, GFP_KERNEL);
469 if (!mix->table)
472 mix->table_size = config->table_size;
477 mix->mux_table = kmemdup(config->mux_table, table_bytes,
479 if (!mix->mux_table) {
480 kfree(mix->table);
485 mix->div_flags = config->div_flags;
486 mix->mux_flags = config->mux_flags;
487 mix->lock = lock;
488 mix->hw.init = &init;
491 mix->type = MMP_CLK_MIX_TYPE_V1;
493 mix->type = MMP_CLK_MIX_TYPE_V3;
495 mix->type = MMP_CLK_MIX_TYPE_V2;
496 clk = clk_register(dev, &mix->hw);
499 kfree(mix->mux_table);
500 kfree(mix->table);
501 kfree(mix);
507 kfree(mix);