Lines Matching +full:reg +full:- +full:init
1 // SPDX-License-Identifier: GPL-2.0-only
10 #include <linux/clk-provider.h>
14 #define pll_out_override(p) (BIT((p->shift - 6)))
15 #define div_mask(d) ((1 << (d->width)) - 1)
16 #define get_mul(d) (1 << d->frac_width)
26 div = div_frac_get(rate, parent_rate, divider->width, in get_div()
27 divider->frac_width, divider->flags); in get_div()
39 u32 reg; in clk_frac_div_recalc_rate() local
43 reg = readl_relaxed(divider->reg); in clk_frac_div_recalc_rate()
45 if ((divider->flags & TEGRA_DIVIDER_UART) && in clk_frac_div_recalc_rate()
46 !(reg & PERIPH_CLK_UART_DIV_ENB)) in clk_frac_div_recalc_rate()
49 div = (reg >> divider->shift) & div_mask(divider); in clk_frac_div_recalc_rate()
55 rate += div - 1; in clk_frac_div_recalc_rate()
66 unsigned long output_rate = req->best_parent_rate; in clk_frac_div_determine_rate()
68 if (!req->rate) { in clk_frac_div_determine_rate()
69 req->rate = output_rate; in clk_frac_div_determine_rate()
74 div = get_div(divider, req->rate, output_rate); in clk_frac_div_determine_rate()
76 req->rate = req->best_parent_rate; in clk_frac_div_determine_rate()
83 req->rate = DIV_ROUND_UP(output_rate * mul, div + mul); in clk_frac_div_determine_rate()
100 if (divider->lock) in clk_frac_div_set_rate()
101 spin_lock_irqsave(divider->lock, flags); in clk_frac_div_set_rate()
103 val = readl_relaxed(divider->reg); in clk_frac_div_set_rate()
104 val &= ~(div_mask(divider) << divider->shift); in clk_frac_div_set_rate()
105 val |= div << divider->shift; in clk_frac_div_set_rate()
107 if (divider->flags & TEGRA_DIVIDER_UART) { in clk_frac_div_set_rate()
114 if (divider->flags & TEGRA_DIVIDER_FIXED) in clk_frac_div_set_rate()
117 writel_relaxed(val, divider->reg); in clk_frac_div_set_rate()
119 if (divider->lock) in clk_frac_div_set_rate()
120 spin_unlock_irqrestore(divider->lock, flags); in clk_frac_div_set_rate()
143 const char *parent_name, void __iomem *reg, in tegra_clk_register_divider() argument
149 struct clk_init_data init; in tegra_clk_register_divider() local
155 return ERR_PTR(-ENOMEM); in tegra_clk_register_divider()
158 init.name = name; in tegra_clk_register_divider()
159 init.ops = &tegra_clk_frac_div_ops; in tegra_clk_register_divider()
160 init.flags = flags; in tegra_clk_register_divider()
161 init.parent_names = parent_name ? &parent_name : NULL; in tegra_clk_register_divider()
162 init.num_parents = parent_name ? 1 : 0; in tegra_clk_register_divider()
164 divider->reg = reg; in tegra_clk_register_divider()
165 divider->shift = shift; in tegra_clk_register_divider()
166 divider->width = width; in tegra_clk_register_divider()
167 divider->frac_width = frac_width; in tegra_clk_register_divider()
168 divider->lock = lock; in tegra_clk_register_divider()
169 divider->flags = clk_divider_flags; in tegra_clk_register_divider()
171 /* Data in .init is copied by clk_register(), so stack variable OK */ in tegra_clk_register_divider()
172 divider->hw.init = &init; in tegra_clk_register_divider()
174 clk = clk_register(NULL, ÷r->hw); in tegra_clk_register_divider()
188 void __iomem *reg, spinlock_t *lock) in tegra_clk_register_mc() argument
192 reg, 16, 1, CLK_DIVIDER_READ_ONLY, in tegra_clk_register_mc()