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)

Reply via email to