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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to