clk: sunxi-ng: mux: Add support for mux tables
authorChen-Yu Tsai <wens@csie.org>
Thu, 25 Aug 2016 06:21:56 +0000 (14:21 +0800)
committerMaxime Ripard <maxime.ripard@free-electrons.com>
Thu, 25 Aug 2016 20:26:44 +0000 (22:26 +0200)
Some clock muxes have holes, i.e. invalid or unconnected inputs,
between parent mux values.

Add support for specifying a mux table to map clock parents to
mux values.

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

index 1329b9a..68b32f1 100644 (file)
@@ -107,6 +107,15 @@ u8 ccu_mux_helper_get_parent(struct ccu_common *common,
        parent = reg >> cm->shift;
        parent &= (1 << cm->width) - 1;
 
+       if (cm->table) {
+               int num_parents = clk_hw_get_num_parents(&common->hw);
+               int i;
+
+               for (i = 0; i < num_parents; i++)
+                       if (cm->table[i] == parent)
+                               return i;
+       }
+
        return parent;
 }
 
@@ -117,6 +126,9 @@ int ccu_mux_helper_set_parent(struct ccu_common *common,
        unsigned long flags;
        u32 reg;
 
+       if (cm->table)
+               index = cm->table[index];
+
        spin_lock_irqsave(common->lock, flags);
 
        reg = readl(common->base + common->reg);
index 83737c2..b1e0856 100644 (file)
@@ -6,8 +6,9 @@
 #include "ccu_common.h"
 
 struct ccu_mux_internal {
-       u8      shift;
-       u8      width;
+       u8              shift;
+       u8              width;
+       const u8        *table;
 
        struct {
                u8      index;
@@ -21,12 +22,16 @@ struct ccu_mux_internal {
        } variable_prediv;
 };
 
-#define _SUNXI_CCU_MUX(_shift, _width)         \
-       {                                       \
-               .shift  = _shift,               \
-               .width  = _width,               \
+#define _SUNXI_CCU_MUX_TABLE(_shift, _width, _table)   \
+       {                                               \
+               .shift  = _shift,                       \
+               .width  = _width,                       \
+               .table  = _table,                       \
        }
 
+#define _SUNXI_CCU_MUX(_shift, _width) \
+       _SUNXI_CCU_MUX_TABLE(_shift, _width, NULL)
+
 struct ccu_mux {
        u16                     reg;
        u32                     enable;