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.4.1 retrieving revision 1.7.4.2 diff -u -p -r1.7.4.1 -r1.7.4.2 --- src/sys/arch/arm/sunxi/sunxi_ccu.c 2018/03/22 01:44:43 1.7.4.1 +++ src/sys/arch/arm/sunxi/sunxi_ccu.c 2018/04/07 04:12:12 1.7.4.2 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_ccu.c,v 1.7.4.1 2018/03/22 01:44:43 pgoyette Exp $ */ +/* $NetBSD: sunxi_ccu.c,v 1.7.4.2 2018/04/07 04:12:12 pgoyette Exp $ */ /*- * Copyright (c) 2017 Jared McNeill @@ -31,7 +31,7 @@ #include "opt_fdt_arm.h" #include -__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu.c,v 1.7.4.1 2018/03/22 01:44:43 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu.c,v 1.7.4.2 2018/04/07 04:12:12 pgoyette Exp $"); #include #include @@ -184,6 +184,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 +281,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,