Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/arch/arm/sunxi/sunxi_ccu.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/arch/arm/sunxi/sunxi_ccu.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.7 retrieving revision 1.7.4.4 diff -u -p -r1.7 -r1.7.4.4 --- src/sys/arch/arm/sunxi/sunxi_ccu.c 2017/09/30 12:48:58 1.7 +++ src/sys/arch/arm/sunxi/sunxi_ccu.c 2018/09/30 01:45:39 1.7.4.4 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_ccu.c,v 1.7 2017/09/30 12:48:58 jmcneill Exp $ */ +/* $NetBSD: sunxi_ccu.c,v 1.7.4.4 2018/09/30 01:45:39 pgoyette Exp $ */ /*- * Copyright (c) 2017 Jared McNeill @@ -28,10 +28,10 @@ #include "opt_soc.h" #include "opt_multiprocessor.h" -#include "opt_fdt_arm.h" +#include "opt_console.h" #include -__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu.c,v 1.7 2017/09/30 12:48:58 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu.c,v 1.7.4.4 2018/09/30 01:45:39 pgoyette Exp $"); #include #include @@ -102,7 +102,8 @@ static const struct fdtbus_reset_control }; static struct clk * -sunxi_ccu_clock_decode(device_t dev, const void *data, size_t len) +sunxi_ccu_clock_decode(device_t dev, int cc_phandle, const void *data, + size_t len) { struct sunxi_ccu_softc * const sc = device_private(dev); struct sunxi_ccu_clk *clk; @@ -184,6 +185,28 @@ sunxi_ccu_clock_set_rate(void *priv, str return ENXIO; } +static u_int +sunxi_ccu_clock_round_rate(void *priv, struct clk *clkp, u_int rate) +{ + struct sunxi_ccu_softc * const sc = priv; + struct sunxi_ccu_clk *clk = (struct sunxi_ccu_clk *)clkp; + struct clk *clkp_parent; + + if (clkp->flags & CLK_SET_RATE_PARENT) { + clkp_parent = clk_get_parent(clkp); + if (clkp_parent == NULL) { + aprint_error("%s: no parent for %s\n", __func__, clk->base.name); + return 0; + } + return clk_round_rate(clkp_parent, rate); + } + + if (clk->round_rate) + return clk->round_rate(sc, clk, rate); + + return 0; +} + static int sunxi_ccu_clock_enable(void *priv, struct clk *clkp) { @@ -259,6 +282,7 @@ static const struct clk_funcs sunxi_ccu_ .put = sunxi_ccu_clock_put, .get_rate = sunxi_ccu_clock_get_rate, .set_rate = sunxi_ccu_clock_set_rate, + .round_rate = sunxi_ccu_clock_round_rate, .enable = sunxi_ccu_clock_enable, .disable = sunxi_ccu_clock_disable, .set_parent = sunxi_ccu_clock_set_parent, @@ -294,10 +318,13 @@ sunxi_ccu_attach(struct sunxi_ccu_softc return ENXIO; } + sc->sc_clkdom.name = device_xname(sc->sc_dev); sc->sc_clkdom.funcs = &sunxi_ccu_clock_funcs; sc->sc_clkdom.priv = sc; - for (i = 0; i < sc->sc_nclks; i++) + for (i = 0; i < sc->sc_nclks; i++) { sc->sc_clks[i].base.domain = &sc->sc_clkdom; + clk_attach(&sc->sc_clks[i].base); + } fdtbus_register_clock_controller(sc->sc_dev, sc->sc_phandle, &sunxi_ccu_fdtclock_funcs); @@ -331,6 +358,7 @@ sunxi_ccu_print(struct sunxi_ccu_softc * case SUNXI_CCU_DIV: type = "div"; break; case SUNXI_CCU_PHASE: type = "phase"; break; case SUNXI_CCU_FIXED_FACTOR: type = "fixed-factor"; break; + case SUNXI_CCU_FRACTIONAL: type = "fractional"; break; default: type = "???"; break; }