Lines Matching +full:div +full:- +full:clk

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
32 #include <dev/clk/clk.h>
34 #include <dev/clk/rockchip/rk_clk_armclk.h>
73 printf("%s:(%s)" format, __func__, clknode_get_name(clk), arg)
79 rk_clk_armclk_init(struct clknode *clk, device_t dev) in rk_clk_armclk_init() argument
84 sc = clknode_get_softc(clk); in rk_clk_armclk_init()
87 DEVICE_LOCK(clk); in rk_clk_armclk_init()
88 READ4(clk, sc->muxdiv_offset, &val); in rk_clk_armclk_init()
89 DEVICE_UNLOCK(clk); in rk_clk_armclk_init()
91 idx = (val & sc->mux_mask) >> sc->mux_shift; in rk_clk_armclk_init()
93 clknode_init_parent_idx(clk, idx); in rk_clk_armclk_init()
99 rk_clk_armclk_set_mux(struct clknode *clk, int index) in rk_clk_armclk_set_mux() argument
104 sc = clknode_get_softc(clk); in rk_clk_armclk_set_mux()
107 DEVICE_LOCK(clk); in rk_clk_armclk_set_mux()
108 val |= index << sc->mux_shift; in rk_clk_armclk_set_mux()
109 val |= sc->mux_mask << RK_ARMCLK_WRITE_MASK_SHIFT; in rk_clk_armclk_set_mux()
110 dprintf("Write: muxdiv_offset=%x, val=%x\n", sc->muxdiv_offset, val); in rk_clk_armclk_set_mux()
111 WRITE4(clk, sc->muxdiv_offset, val); in rk_clk_armclk_set_mux()
112 DEVICE_UNLOCK(clk); in rk_clk_armclk_set_mux()
118 rk_clk_armclk_recalc(struct clknode *clk, uint64_t *freq) in rk_clk_armclk_recalc() argument
121 uint32_t reg, div; in rk_clk_armclk_recalc() local
123 sc = clknode_get_softc(clk); in rk_clk_armclk_recalc()
125 DEVICE_LOCK(clk); in rk_clk_armclk_recalc()
127 READ4(clk, sc->muxdiv_offset, &reg); in rk_clk_armclk_recalc()
128 dprintf("Read: muxdiv_offset=%x, val=%x\n", sc->muxdiv_offset, reg); in rk_clk_armclk_recalc()
130 DEVICE_UNLOCK(clk); in rk_clk_armclk_recalc()
132 div = ((reg & sc->div_mask) >> sc->div_shift) + 1; in rk_clk_armclk_recalc()
133 dprintf("parent_freq=%ju, div=%u\n", *freq, div); in rk_clk_armclk_recalc()
135 *freq = *freq / div; in rk_clk_armclk_recalc()
141 rk_clk_armclk_set_freq(struct clknode *clk, uint64_t fparent, uint64_t *fout, in rk_clk_armclk_set_freq() argument
148 uint32_t div = 0, val = 0; in rk_clk_armclk_set_freq() local
151 sc = clknode_get_softc(clk); in rk_clk_armclk_set_freq()
153 dprintf("Finding best parent/div for target freq of %ju\n", *fout); in rk_clk_armclk_set_freq()
154 p_names = clknode_get_parent_names(clk); in rk_clk_armclk_set_freq()
155 p_main = clknode_find_by_name(p_names[sc->main_parent]); in rk_clk_armclk_set_freq()
157 for (i = 0; i < sc->nrates; i++) { in rk_clk_armclk_set_freq()
158 if (sc->rates[i].freq == *fout) { in rk_clk_armclk_set_freq()
159 best = sc->rates[i].freq; in rk_clk_armclk_set_freq()
160 div = sc->rates[i].div; in rk_clk_armclk_set_freq()
161 best_p = best * div; in rk_clk_armclk_set_freq()
165 sc->main_parent, in rk_clk_armclk_set_freq()
171 if (rate == sc->nrates) in rk_clk_armclk_set_freq()
188 clknode_set_parent_by_idx(clk, sc->main_parent); in rk_clk_armclk_set_freq()
192 DEVICE_LOCK(clk); in rk_clk_armclk_set_freq()
193 val |= (div - 1) << sc->div_shift; in rk_clk_armclk_set_freq()
194 val |= sc->div_mask << RK_ARMCLK_WRITE_MASK_SHIFT; in rk_clk_armclk_set_freq()
195 dprintf("Write: muxdiv_offset=%x, val=%x\n", sc->muxdiv_offset, val); in rk_clk_armclk_set_freq()
196 WRITE4(clk, sc->muxdiv_offset, val); in rk_clk_armclk_set_freq()
197 DEVICE_UNLOCK(clk); in rk_clk_armclk_set_freq()
221 struct clknode *clk; in rk_clk_armclk_register() local
224 clk = clknode_create(clkdom, &rk_clk_armclk_clknode_class, in rk_clk_armclk_register()
225 &clkdef->clkdef); in rk_clk_armclk_register()
226 if (clk == NULL) in rk_clk_armclk_register()
229 sc = clknode_get_softc(clk); in rk_clk_armclk_register()
231 sc->muxdiv_offset = clkdef->muxdiv_offset; in rk_clk_armclk_register()
233 sc->mux_shift = clkdef->mux_shift; in rk_clk_armclk_register()
234 sc->mux_width = clkdef->mux_width; in rk_clk_armclk_register()
235 sc->mux_mask = ((1 << clkdef->mux_width) - 1) << sc->mux_shift; in rk_clk_armclk_register()
237 sc->div_shift = clkdef->div_shift; in rk_clk_armclk_register()
238 sc->div_width = clkdef->div_width; in rk_clk_armclk_register()
239 sc->div_mask = ((1 << clkdef->div_width) - 1) << sc->div_shift; in rk_clk_armclk_register()
241 sc->flags = clkdef->flags; in rk_clk_armclk_register()
243 sc->main_parent = clkdef->main_parent; in rk_clk_armclk_register()
244 sc->alt_parent = clkdef->alt_parent; in rk_clk_armclk_register()
246 sc->rates = clkdef->rates; in rk_clk_armclk_register()
247 sc->nrates = clkdef->nrates; in rk_clk_armclk_register()
249 clknode_register(clkdom, clk); in rk_clk_armclk_register()