Module Name: src Committed By: jmcneill Date: Tue May 8 22:05:25 UTC 2018
Modified Files: src/sys/arch/arm/sunxi: sunxi_ccu.h sunxi_ccu_fixed_factor.c Log Message: Pass set_rate calls on fixed factor clocks through to the parent clock (adjusting accordingly) To generate a diff of this commit: cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/sunxi/sunxi_ccu.h cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/sunxi/sunxi_ccu_fixed_factor.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/sunxi/sunxi_ccu.h diff -u src/sys/arch/arm/sunxi/sunxi_ccu.h:1.17 src/sys/arch/arm/sunxi/sunxi_ccu.h:1.18 --- src/sys/arch/arm/sunxi/sunxi_ccu.h:1.17 Sun Apr 1 21:19:17 2018 +++ src/sys/arch/arm/sunxi/sunxi_ccu.h Tue May 8 22:05:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_ccu.h,v 1.17 2018/04/01 21:19:17 bouyer Exp $ */ +/* $NetBSD: sunxi_ccu.h,v 1.18 2018/05/08 22:05:25 jmcneill Exp $ */ /*- * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> @@ -341,6 +341,8 @@ struct sunxi_ccu_fixed_factor { u_int sunxi_ccu_fixed_factor_get_rate(struct sunxi_ccu_softc *, struct sunxi_ccu_clk *); +int sunxi_ccu_fixed_factor_set_rate(struct sunxi_ccu_softc *, + struct sunxi_ccu_clk *, u_int); const char *sunxi_ccu_fixed_factor_get_parent(struct sunxi_ccu_softc *, struct sunxi_ccu_clk *); @@ -353,6 +355,7 @@ const char *sunxi_ccu_fixed_factor_get_p .u.fixed_factor.mult = (_mult), \ .get_rate = sunxi_ccu_fixed_factor_get_rate, \ .get_parent = sunxi_ccu_fixed_factor_get_parent, \ + .set_rate = sunxi_ccu_fixed_factor_set_rate, \ } struct sunxi_ccu_fractional { Index: src/sys/arch/arm/sunxi/sunxi_ccu_fixed_factor.c diff -u src/sys/arch/arm/sunxi/sunxi_ccu_fixed_factor.c:1.1 src/sys/arch/arm/sunxi/sunxi_ccu_fixed_factor.c:1.2 --- src/sys/arch/arm/sunxi/sunxi_ccu_fixed_factor.c:1.1 Sat Sep 30 12:48:58 2017 +++ src/sys/arch/arm/sunxi/sunxi_ccu_fixed_factor.c Tue May 8 22:05:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_ccu_fixed_factor.c,v 1.1 2017/09/30 12:48:58 jmcneill Exp $ */ +/* $NetBSD: sunxi_ccu_fixed_factor.c,v 1.2 2018/05/08 22:05:25 jmcneill Exp $ */ /*- * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu_fixed_factor.c,v 1.1 2017/09/30 12:48:58 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu_fixed_factor.c,v 1.2 2018/05/08 22:05:25 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -64,6 +64,33 @@ sunxi_ccu_fixed_factor_get_rate(struct s return (u_int)(((uint64_t)p_rate * fixed_factor->mult) / fixed_factor->div); } +static int +sunxi_ccu_fixed_factor_set_parent_rate(struct clk *clkp, u_int rate) +{ + struct clk *clkp_parent; + + clkp_parent = clk_get_parent(clkp); + if (clkp_parent == NULL) + return ENXIO; + + return clk_set_rate(clkp_parent, rate); +} + +int +sunxi_ccu_fixed_factor_set_rate(struct sunxi_ccu_softc *sc, + struct sunxi_ccu_clk *clk, u_int rate) +{ + struct sunxi_ccu_fixed_factor *fixed_factor = &clk->u.fixed_factor; + struct clk *clkp = &clk->base; + + KASSERT(clk->type == SUNXI_CCU_FIXED_FACTOR); + + rate *= fixed_factor->div; + rate /= fixed_factor->mult; + + return sunxi_ccu_fixed_factor_set_parent_rate(clkp, rate); +} + const char * sunxi_ccu_fixed_factor_get_parent(struct sunxi_ccu_softc *sc, struct sunxi_ccu_clk *clk)