svn commit: r332180 - head/sys/arm/allwinner/clkng

Emmanuel Vadot manu at FreeBSD.org
Sat Apr 7 15:38:43 UTC 2018


Author: manu
Date: Sat Apr  7 15:38:42 2018
New Revision: 332180
URL: https://svnweb.freebsd.org/changeset/base/332180

Log:
  allwinner: aw_clk_nm: Add prediv value
  
  Some NM clocks needs a fixed prediv value applied to the parent frequency
  on some conditions. Add support for it.

Modified:
  head/sys/arm/allwinner/clkng/aw_clk.h
  head/sys/arm/allwinner/clkng/aw_clk_nm.c
  head/sys/arm/allwinner/clkng/aw_clk_nm.h

Modified: head/sys/arm/allwinner/clkng/aw_clk.h
==============================================================================
--- head/sys/arm/allwinner/clkng/aw_clk.h	Sat Apr  7 15:19:10 2018	(r332179)
+++ head/sys/arm/allwinner/clkng/aw_clk.h	Sat Apr  7 15:38:42 2018	(r332180)
@@ -66,6 +66,7 @@ struct aw_clk_init {
 #define	AW_CLK_SCALE_CHANGE	0x0010
 #define	AW_CLK_HAS_FRAC		0x0020
 #define	AW_CLK_HAS_UPDATE	0x0040
+#define	AW_CLK_HAS_PREDIV	0x0080
 
 #define	AW_CLK_FACTOR_POWER_OF_TWO	0x0001
 #define	AW_CLK_FACTOR_ZERO_BASED	0x0002

Modified: head/sys/arm/allwinner/clkng/aw_clk_nm.c
==============================================================================
--- head/sys/arm/allwinner/clkng/aw_clk_nm.c	Sat Apr  7 15:19:10 2018	(r332179)
+++ head/sys/arm/allwinner/clkng/aw_clk_nm.c	Sat Apr  7 15:38:42 2018	(r332180)
@@ -52,6 +52,7 @@ struct aw_clk_nm_sc {
 
 	struct aw_clk_factor	m;
 	struct aw_clk_factor	n;
+	struct aw_clk_factor	prediv;
 	struct aw_clk_frac	frac;
 
 	uint32_t	mux_shift;
@@ -278,7 +279,7 @@ static int
 aw_clk_nm_recalc(struct clknode *clk, uint64_t *freq)
 {
 	struct aw_clk_nm_sc *sc;
-	uint32_t val, m, n;
+	uint32_t val, m, n, prediv;
 
 	sc = clknode_get_softc(clk);
 
@@ -294,8 +295,12 @@ aw_clk_nm_recalc(struct clknode *clk, uint64_t *freq)
 	} else {
 		m = aw_clk_get_factor(val, &sc->m);
 		n = aw_clk_get_factor(val, &sc->n);
+		if (sc->flags & AW_CLK_HAS_PREDIV)
+			prediv = aw_clk_get_factor(val, &sc->prediv);
+		else
+			prediv = 1;
 
-		*freq = *freq / n / m;
+		*freq = *freq / prediv / n / m;
 	}
 
 	return (0);
@@ -339,6 +344,18 @@ aw_clk_nm_register(struct clkdom *clkdom, struct aw_cl
 	sc->n.mask = ((1 << sc->n.width) - 1) << sc->n.shift;
 	sc->n.value = clkdef->n.value;
 	sc->n.flags = clkdef->n.flags;
+
+	sc->prediv.shift = clkdef->prediv.shift;
+	sc->prediv.width = clkdef->prediv.width;
+	sc->prediv.mask = ((1 << sc->prediv.width) - 1) << sc->prediv.shift;
+	sc->prediv.value = clkdef->prediv.value;
+	sc->prediv.flags = clkdef->prediv.flags;
+	sc->prediv.cond_shift = clkdef->prediv.cond_shift;
+	if (clkdef->prediv.cond_width != 0)
+		sc->prediv.cond_mask = ((1 << clkdef->prediv.cond_width) - 1) << sc->prediv.shift;
+	else
+		sc->prediv.cond_mask = clkdef->prediv.cond_mask;
+	sc->prediv.cond_value = clkdef->prediv.cond_value;
 
 	sc->frac.freq0 = clkdef->frac.freq0;
 	sc->frac.freq1 = clkdef->frac.freq1;

Modified: head/sys/arm/allwinner/clkng/aw_clk_nm.h
==============================================================================
--- head/sys/arm/allwinner/clkng/aw_clk_nm.h	Sat Apr  7 15:19:10 2018	(r332179)
+++ head/sys/arm/allwinner/clkng/aw_clk_nm.h	Sat Apr  7 15:38:42 2018	(r332180)
@@ -37,6 +37,7 @@ struct aw_clk_nm_def {
 
 	struct aw_clk_factor	m;
 	struct aw_clk_factor	n;
+	struct aw_clk_factor	prediv;
 	struct aw_clk_frac	frac;
 
 	uint32_t		mux_shift;


More information about the svn-src-all mailing list