Lines Matching +full:clk +full:- +full:div
21 #include <linux/clk-provider.h>
23 #include "clk.h"
25 #define pll_out_override(p) (BIT((p->shift - 6)))
26 #define div_mask(d) ((1 << (d->width)) - 1)
27 #define get_mul(d) (1 << d->frac_width)
35 int div; in get_div() local
37 div = div_frac_get(rate, parent_rate, divider->width, in get_div()
38 divider->frac_width, divider->flags); in get_div()
40 if (div < 0) in get_div()
43 return div; in get_div()
51 int div, mul; in clk_frac_div_recalc_rate() local
54 reg = readl_relaxed(divider->reg) >> divider->shift; in clk_frac_div_recalc_rate()
55 div = reg & div_mask(divider); in clk_frac_div_recalc_rate()
58 div += mul; in clk_frac_div_recalc_rate()
61 rate += div - 1; in clk_frac_div_recalc_rate()
62 do_div(rate, div); in clk_frac_div_recalc_rate()
71 int div, mul; in clk_frac_div_round_rate() local
77 div = get_div(divider, rate, output_rate); in clk_frac_div_round_rate()
78 if (div < 0) in clk_frac_div_round_rate()
83 return DIV_ROUND_UP(output_rate * mul, div + mul); in clk_frac_div_round_rate()
90 int div; in clk_frac_div_set_rate() local
94 div = get_div(divider, rate, parent_rate); in clk_frac_div_set_rate()
95 if (div < 0) in clk_frac_div_set_rate()
96 return div; in clk_frac_div_set_rate()
98 if (divider->lock) in clk_frac_div_set_rate()
99 spin_lock_irqsave(divider->lock, flags); in clk_frac_div_set_rate()
101 val = readl_relaxed(divider->reg); in clk_frac_div_set_rate()
102 val &= ~(div_mask(divider) << divider->shift); in clk_frac_div_set_rate()
103 val |= div << divider->shift; in clk_frac_div_set_rate()
105 if (divider->flags & TEGRA_DIVIDER_UART) { in clk_frac_div_set_rate()
106 if (div) in clk_frac_div_set_rate()
112 if (divider->flags & TEGRA_DIVIDER_FIXED) in clk_frac_div_set_rate()
115 writel_relaxed(val, divider->reg); in clk_frac_div_set_rate()
117 if (divider->lock) in clk_frac_div_set_rate()
118 spin_unlock_irqrestore(divider->lock, flags); in clk_frac_div_set_rate()
129 struct clk *tegra_clk_register_divider(const char *name, in tegra_clk_register_divider()
135 struct clk *clk; in tegra_clk_register_divider() local
140 pr_err("%s: could not allocate fractional divider clk\n", in tegra_clk_register_divider()
142 return ERR_PTR(-ENOMEM); in tegra_clk_register_divider()
151 divider->reg = reg; in tegra_clk_register_divider()
152 divider->shift = shift; in tegra_clk_register_divider()
153 divider->width = width; in tegra_clk_register_divider()
154 divider->frac_width = frac_width; in tegra_clk_register_divider()
155 divider->lock = lock; in tegra_clk_register_divider()
156 divider->flags = clk_divider_flags; in tegra_clk_register_divider()
159 divider->hw.init = &init; in tegra_clk_register_divider()
161 clk = clk_register(NULL, ÷r->hw); in tegra_clk_register_divider()
162 if (IS_ERR(clk)) in tegra_clk_register_divider()
165 return clk; in tegra_clk_register_divider()
169 { .val = 0, .div = 2 },
170 { .val = 1, .div = 1 },
171 { .val = 0, .div = 0 },
174 struct clk *tegra_clk_register_mc(const char *name, const char *parent_name, in tegra_clk_register_mc()