Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Apr 2018 15:38:42 +0000 (UTC)
From:      Emmanuel Vadot <manu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r332180 - head/sys/arm/allwinner/clkng
Message-ID:  <201804071538.w37FcgSm036294@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201804071538.w37FcgSm036294>