clk: sunxi-ng: mux: support fixed pre-dividers on multiple parents
authorChen-Yu Tsai <wens@csie.org>
Thu, 25 Aug 2016 06:21:57 +0000 (14:21 +0800)
committerMaxime Ripard <maxime.ripard@free-electrons.com>
Thu, 25 Aug 2016 20:27:22 +0000 (22:27 +0200)
Some clocks on the A31 have fixed pre-dividers on multiple parents.
Add support for them.

Signed-off-by: Chen-Yu Tsai <wens@csie.org>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
drivers/clk/sunxi-ng/ccu-sun8i-h3.c
drivers/clk/sunxi-ng/ccu_mux.c
drivers/clk/sunxi-ng/ccu_mux.h

index 9af359544110b59fd61dca76e69a7b922107fb15..4fa9374c2959e56730c9c28e31f46e4e3b8a1f79 100644 (file)
@@ -184,15 +184,15 @@ static SUNXI_CCU_MP_WITH_MUX(apb2_clk, "apb2", apb2_parents, 0x058,
                             0);
 
 static const char * const ahb2_parents[] = { "ahb1" , "pll-periph0" };
+static const struct ccu_mux_fixed_prediv ahb2_fixed_predivs[] = {
+       { .index = 1, .div = 2 },
+};
 static struct ccu_mux ahb2_clk = {
        .mux            = {
                .shift  = 0,
                .width  = 1,
-
-               .fixed_prediv   = {
-                       .index  = 1,
-                       .div    = 2,
-               },
+               .fixed_predivs  = ahb2_fixed_predivs,
+               .n_predivs      = ARRAY_SIZE(ahb2_fixed_predivs),
        },
 
        .common         = {
index 68b32f168a74fdcb2291128ff0f645c8d38e8951..7b17e0c26b0101fa9a4d642fbf62ea06a15fa2a4 100644 (file)
@@ -20,6 +20,7 @@ void ccu_mux_helper_adjust_parent_for_prediv(struct ccu_common *common,
 {
        u16 prediv = 1;
        u32 reg;
+       int i;
 
        if (!((common->features & CCU_FEATURE_FIXED_PREDIV) ||
              (common->features & CCU_FEATURE_VARIABLE_PREDIV)))
@@ -32,8 +33,9 @@ void ccu_mux_helper_adjust_parent_for_prediv(struct ccu_common *common,
        }
 
        if (common->features & CCU_FEATURE_FIXED_PREDIV)
-               if (parent_index == cm->fixed_prediv.index)
-                       prediv = cm->fixed_prediv.div;
+               for (i = 0; i < cm->n_predivs; i++)
+                       if (parent_index == cm->fixed_predivs[i].index)
+                               prediv = cm->fixed_predivs[i].div;
 
        if (common->features & CCU_FEATURE_VARIABLE_PREDIV)
                if (parent_index == cm->variable_prediv.index) {
index b1e085612e5ef929f623b4c58328d6663f6b1a91..8eab1733eeac0528b975bc7ffdfcd6edf2c2f539 100644 (file)
@@ -5,15 +5,18 @@
 
 #include "ccu_common.h"
 
+struct ccu_mux_fixed_prediv {
+       u8      index;
+       u16     div;
+};
+
 struct ccu_mux_internal {
        u8              shift;
        u8              width;
        const u8        *table;
 
-       struct {
-               u8      index;
-               u16     div;
-       } fixed_prediv;
+       const struct ccu_mux_fixed_prediv       *fixed_predivs;
+       u8              n_predivs;
 
        struct {
                u8      index;