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

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
45 #include <dev/clk/clk.h>
46 #include <dev/clk/clk_fixed.h>
47 #include <dev/clk/clk_gate.h>
85 #define PRCI_LOCK(sc) mtx_lock(&(sc)->mtx)
86 #define PRCI_UNLOCK(sc) mtx_unlock(&(sc)->mtx)
87 #define PRCI_ASSERT_LOCKED(sc) mtx_assert(&(sc)->mtx, MA_OWNED);
88 #define PRCI_ASSERT_UNLOCKED(sc) mtx_assert(&(sc)->mtx, MA_NOTOWNED);
101 bus_space_read_4((_sc)->bst, (_sc)->bsh, (_reg))
103 bus_space_write_4((_sc)->bst, (_sc)->bsh, (_reg), (_val))
128 #define DIV(_id, _name, _parent_name, _base, _bias) \ macro
137 #define DIV_END DIV(0, NULL, NULL, 0, 0)
191 .div = 2,
235 DIV(FU740_PRCI_PCLK, "pclk", "hfpclk", FU740_PRCI_HFPCLK_DIV, 2),
253 .div = 2,
268 { "sifive,fu540-c000-prci", (uintptr_t)&fu540_prci_config },
269 { "sifive,fu740-c000-prci", (uintptr_t)&fu740_prci_config },
274 prci_clk_pll_init(struct clknode *clk, device_t dev) in prci_clk_pll_init() argument
277 clknode_init_parent_idx(clk, 0); in prci_clk_pll_init()
283 prci_clk_pll_recalc(struct clknode *clk, uint64_t *freq) in prci_clk_pll_recalc() argument
293 sc = clknode_get_softc(clk); in prci_clk_pll_recalc()
295 PRCI_LOCK(sc->parent_sc); in prci_clk_pll_recalc()
298 parent_clk = clknode_get_parent(clk); in prci_clk_pll_recalc()
301 device_printf(sc->parent_sc->dev, in prci_clk_pll_recalc()
303 PRCI_UNLOCK(sc->parent_sc); in prci_clk_pll_recalc()
308 val = PRCI_READ(sc->parent_sc, sc->reg); in prci_clk_pll_recalc()
316 PRCI_UNLOCK(sc->parent_sc); in prci_clk_pll_recalc()
332 prci_clk_div_init(struct clknode *clk, device_t dev) in prci_clk_div_init() argument
335 clknode_init_parent_idx(clk, 0); in prci_clk_div_init()
341 prci_clk_div_recalc(struct clknode *clk, uint64_t *freq) in prci_clk_div_recalc() argument
345 uint32_t div; in prci_clk_div_recalc() local
351 sc = clknode_get_softc(clk); in prci_clk_div_recalc()
353 PRCI_LOCK(sc->parent_sc); in prci_clk_div_recalc()
356 parent_clk = clknode_get_parent(clk); in prci_clk_div_recalc()
359 device_printf(sc->parent_sc->dev, in prci_clk_div_recalc()
361 PRCI_UNLOCK(sc->parent_sc); in prci_clk_div_recalc()
366 div = PRCI_READ(sc->parent_sc, sc->reg); in prci_clk_div_recalc()
368 *freq = refclk / (div + sc->bias); in prci_clk_div_recalc()
370 PRCI_UNLOCK(sc->parent_sc); in prci_clk_div_recalc()
392 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) in prci_probe()
404 struct clknode *clk; in prci_pll_register() local
407 clk = clknode_create(parent_sc->clkdom, &prci_clk_pll_clknode_class, in prci_pll_register()
409 if (clk == NULL) in prci_pll_register()
412 sc = clknode_get_softc(clk); in prci_pll_register()
413 sc->parent_sc = parent_sc; in prci_pll_register()
414 sc->reg = reg; in prci_pll_register()
416 clknode_register(parent_sc->clkdom, clk); in prci_pll_register()
423 struct clknode *clk; in prci_div_register() local
426 clk = clknode_create(parent_sc->clkdom, &prci_clk_div_clknode_class, in prci_div_register()
428 if (clk == NULL) in prci_div_register()
431 sc = clknode_get_softc(clk); in prci_div_register()
432 sc->parent_sc = parent_sc; in prci_div_register()
433 sc->reg = reg; in prci_div_register()
434 sc->bias = bias; in prci_div_register()
436 clknode_register(parent_sc->clkdom, clk); in prci_div_register()
454 sc->dev = dev; in prci_attach()
457 compat_data)->ocd_data; in prci_attach()
459 mtx_init(&sc->mtx, device_get_nameunit(sc->dev), NULL, MTX_DEF); in prci_attach()
461 error = bus_alloc_resources(dev, prci_spec, &sc->res); in prci_attach()
466 sc->bst = rman_get_bustag(sc->res); in prci_attach()
467 sc->bsh = rman_get_bushandle(sc->res); in prci_attach()
471 "#clock-cells", &ncells); in prci_attach()
488 device_printf(dev, "clk parent: %s\n", in prci_attach()
494 sc->clkdom = clkdom_create(dev); in prci_attach()
495 if (sc->clkdom == NULL) { in prci_attach()
501 for (pll_clk = cfg->pll_clks; pll_clk->name; pll_clk++) { in prci_attach()
502 clkdef.id = pll_clk->id; in prci_attach()
503 clkdef.name = pll_clk->name; in prci_attach()
504 prci_pll_register(sc, &clkdef, pll_clk->reg); in prci_attach()
507 if (cfg->div_clks != NULL) { in prci_attach()
509 for (div_clk = cfg->div_clks; div_clk->name; div_clk++) { in prci_attach()
510 clkdef_div.id = div_clk->id; in prci_attach()
511 clkdef_div.name = div_clk->name; in prci_attach()
512 clkdef_div.parent_names = &div_clk->parent_name; in prci_attach()
514 prci_div_register(sc, &clkdef_div, div_clk->reg, in prci_attach()
515 div_clk->bias); in prci_attach()
519 if (cfg->gate_clks != NULL) { in prci_attach()
521 for (gate_clk = cfg->gate_clks; gate_clk->name; gate_clk++) { in prci_attach()
522 clkdef_gate.clkdef.id = gate_clk->id; in prci_attach()
523 clkdef_gate.clkdef.name = gate_clk->name; in prci_attach()
524 clkdef_gate.clkdef.parent_names = &gate_clk->parent_name; in prci_attach()
526 clkdef_gate.offset = gate_clk->reg; in prci_attach()
531 error = clknode_gate_register(sc->clkdom, in prci_attach()
536 gate_clk->name, error); in prci_attach()
550 clknode_fixed_register(sc->clkdom, cfg->tlclk_def); in prci_attach()
552 error = clkdom_finit(sc->clkdom); in prci_attach()
556 sc->nresets = cfg->nresets; in prci_attach()
564 bus_release_resources(dev, prci_spec, &sc->res); in prci_attach()
565 mtx_destroy(&sc->mtx); in prci_attach()
635 if (id >= sc->nresets) in prci_reset_assert()
658 if (id >= sc->nresets) in prci_reset_is_asserted()