Author: kevans
Date: Thu Nov 23 05:43:44 2017
New Revision: 326113
URL: https://svnweb.freebsd.org/changeset/base/326113

Log:
  aw_ccung: changes to accommodate upcoming a83t support
  
  Add a means to specify mask/value for the prediv condition instead of
  shift/width/value for clocks that have a more complex mux scenario.
  
  Specifically, ahb1 on the a83t has the prediv applied if mux is either b10
  or b11.
  
  Reviewed by:  manu
  Approved by:  emaste (mentor)
  Differential Revision:        https://reviews.freebsd.org/D12851

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

Modified: head/sys/arm/allwinner/clkng/aw_clk.h
==============================================================================
--- head/sys/arm/allwinner/clkng/aw_clk.h       Thu Nov 23 03:40:51 2017        
(r326112)
+++ head/sys/arm/allwinner/clkng/aw_clk.h       Thu Nov 23 05:43:44 2017        
(r326113)
@@ -48,6 +48,7 @@ Periph clocks:
 
 Clock Source/Divider N/Divider M
 Clock Source/Divider N/Divider M/2
+Clock Source*N/(Divider M+1)/(Divider P+1)
 
  */
 
@@ -389,6 +390,36 @@ aw_clk_factor_get_value(struct aw_clk_factor *factor, 
                .prediv.flags = _prediv_flags,                  \
                .prediv.cond_shift = _prediv_cond_shift,        \
                .prediv.cond_width = _prediv_cond_width,        \
+               .prediv.cond_value = _prediv_cond_value,        \
+       }
+
+#define PREDIV_CLK_WITH_MASK(_clkname, _id, _name, _pnames,    \
+  _offset,                                                     \
+  _mux_shift, _mux_width,                                      \
+  _div_shift, _div_width, _div_value, _div_flags,              \
+  _prediv_shift, _prediv_width, _prediv_value, _prediv_flags,  \
+  _prediv_cond_mask, _prediv_cond_value)                       \
+       static struct aw_clk_prediv_mux_def _clkname = {        \
+               .clkdef = {                                     \
+                       .id = _id,                              \
+                       .name = _name,                          \
+                       .parent_names = _pnames,                \
+                       .parent_cnt = nitems(_pnames),          \
+               },                                              \
+               .offset = _offset,                              \
+               .mux_shift = _mux_shift,                        \
+               .mux_width = _mux_width,                        \
+               .div.shift = _div_shift,                        \
+               .div.width = _div_width,                        \
+               .div.value = _div_value,                        \
+               .div.flags = _div_flags,                        \
+               .prediv.shift = _prediv_shift,                  \
+               .prediv.width = _prediv_width,                  \
+               .prediv.value = _prediv_value,                  \
+               .prediv.flags = _prediv_flags,                  \
+               .prediv.cond_shift = 0,                         \
+               .prediv.cond_width = 0,                         \
+               .prediv.cond_mask = _prediv_cond_mask,          \
                .prediv.cond_value = _prediv_cond_value,        \
        }
 

Modified: head/sys/arm/allwinner/clkng/aw_clk_prediv_mux.c
==============================================================================
--- head/sys/arm/allwinner/clkng/aw_clk_prediv_mux.c    Thu Nov 23 03:40:51 
2017        (r326112)
+++ head/sys/arm/allwinner/clkng/aw_clk_prediv_mux.c    Thu Nov 23 05:43:44 
2017        (r326113)
@@ -157,7 +157,10 @@ aw_clk_prediv_mux_register(struct clkdom *clkdom, stru
        sc->prediv.mask = ((1 << clkdef->prediv.width) - 1) << sc->prediv.shift;
        sc->prediv.value = clkdef->prediv.value;
        sc->prediv.cond_shift = clkdef->prediv.cond_shift;
-       sc->prediv.cond_mask = ((1 << clkdef->prediv.cond_width) - 1) << 
sc->prediv.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->prediv.flags = clkdef->prediv.flags;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to