Skip to content

Commit

Permalink
clk: sunxi-ng: mux: Add support for mux tables
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Maxime Ripard <[email protected]>
  • Loading branch information
wens authored and mripard committed Aug 25, 2016
1 parent 89af852 commit 2b9c875
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 6 deletions.
12 changes: 12 additions & 0 deletions drivers/clk/sunxi-ng/ccu_mux.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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);
Expand Down
17 changes: 11 additions & 6 deletions drivers/clk/sunxi-ng/ccu_mux.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit 2b9c875

Please sign in to comment.