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

1 /*-
30 #include <dev/clk/clk.h>
32 #include <dev/clk/allwinner/aw_clk.h>
33 #include <dev/clk/allwinner/aw_clk_prediv_mux.h>
40 * clk = clkin / prediv / div
52 struct aw_clk_factor div; member
70 aw_clk_prediv_mux_init(struct clknode *clk, device_t dev) in aw_clk_prediv_mux_init() argument
75 sc = clknode_get_softc(clk); in aw_clk_prediv_mux_init()
77 DEVICE_LOCK(clk); in aw_clk_prediv_mux_init()
78 READ4(clk, sc->offset, &val); in aw_clk_prediv_mux_init()
79 DEVICE_UNLOCK(clk); in aw_clk_prediv_mux_init()
82 val = (val & sc->mux_mask) >> sc->mux_shift; in aw_clk_prediv_mux_init()
83 clknode_init_parent_idx(clk, val); in aw_clk_prediv_mux_init()
89 aw_clk_prediv_mux_set_mux(struct clknode *clk, int index) in aw_clk_prediv_mux_set_mux() argument
94 sc = clknode_get_softc(clk); in aw_clk_prediv_mux_set_mux()
96 DEVICE_LOCK(clk); in aw_clk_prediv_mux_set_mux()
97 READ4(clk, sc->offset, &val); in aw_clk_prediv_mux_set_mux()
98 val &= ~sc->mux_mask; in aw_clk_prediv_mux_set_mux()
99 val |= index << sc->mux_shift; in aw_clk_prediv_mux_set_mux()
100 WRITE4(clk, sc->offset, val); in aw_clk_prediv_mux_set_mux()
101 DEVICE_UNLOCK(clk); in aw_clk_prediv_mux_set_mux()
107 aw_clk_prediv_mux_recalc(struct clknode *clk, uint64_t *freq) in aw_clk_prediv_mux_recalc() argument
110 uint32_t val, div, prediv; in aw_clk_prediv_mux_recalc() local
112 sc = clknode_get_softc(clk); in aw_clk_prediv_mux_recalc()
114 DEVICE_LOCK(clk); in aw_clk_prediv_mux_recalc()
115 READ4(clk, sc->offset, &val); in aw_clk_prediv_mux_recalc()
116 DEVICE_UNLOCK(clk); in aw_clk_prediv_mux_recalc()
118 div = aw_clk_get_factor(val, &sc->div); in aw_clk_prediv_mux_recalc()
119 prediv = aw_clk_get_factor(val, &sc->prediv); in aw_clk_prediv_mux_recalc()
121 *freq = *freq / prediv / div; in aw_clk_prediv_mux_recalc()
140 struct clknode *clk; in aw_clk_prediv_mux_register() local
143 clk = clknode_create(clkdom, &aw_prediv_mux_clknode_class, &clkdef->clkdef); in aw_clk_prediv_mux_register()
144 if (clk == NULL) in aw_clk_prediv_mux_register()
147 sc = clknode_get_softc(clk); in aw_clk_prediv_mux_register()
149 sc->offset = clkdef->offset; in aw_clk_prediv_mux_register()
151 sc->mux_shift = clkdef->mux_shift; in aw_clk_prediv_mux_register()
152 sc->mux_mask = ((1 << clkdef->mux_width) - 1) << sc->mux_shift; in aw_clk_prediv_mux_register()
154 sc->div.shift = clkdef->div.shift; in aw_clk_prediv_mux_register()
155 sc->div.mask = ((1 << clkdef->div.width) - 1) << sc->div.shift; in aw_clk_prediv_mux_register()
156 sc->div.value = clkdef->div.value; in aw_clk_prediv_mux_register()
157 sc->div.cond_shift = clkdef->div.cond_shift; in aw_clk_prediv_mux_register()
158 sc->div.cond_mask = ((1 << clkdef->div.cond_width) - 1) << sc->div.shift; in aw_clk_prediv_mux_register()
159 sc->div.cond_value = clkdef->div.cond_value; in aw_clk_prediv_mux_register()
160 sc->div.flags = clkdef->div.flags; in aw_clk_prediv_mux_register()
162 sc->prediv.shift = clkdef->prediv.shift; in aw_clk_prediv_mux_register()
163 sc->prediv.mask = ((1 << clkdef->prediv.width) - 1) << sc->prediv.shift; in aw_clk_prediv_mux_register()
164 sc->prediv.value = clkdef->prediv.value; in aw_clk_prediv_mux_register()
165 sc->prediv.cond_shift = clkdef->prediv.cond_shift; in aw_clk_prediv_mux_register()
166 if (clkdef->prediv.cond_width != 0) in aw_clk_prediv_mux_register()
167 sc->prediv.cond_mask = ((1 << clkdef->prediv.cond_width) - 1) << sc->prediv.shift; in aw_clk_prediv_mux_register()
169 sc->prediv.cond_mask = clkdef->prediv.cond_mask; in aw_clk_prediv_mux_register()
170 sc->prediv.cond_value = clkdef->prediv.cond_value; in aw_clk_prediv_mux_register()
171 sc->prediv.flags = clkdef->prediv.flags; in aw_clk_prediv_mux_register()
173 sc->flags = clkdef->flags; in aw_clk_prediv_mux_register()
175 clknode_register(clkdom, clk); in aw_clk_prediv_mux_register()