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