summaryrefslogtreecommitdiffstats
path: root/drivers/clk/clk-mux.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clk/clk-mux.c')
-rw-r--r--drivers/clk/clk-mux.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c
index d5fe640dce..e9cb614005 100644
--- a/drivers/clk/clk-mux.c
+++ b/drivers/clk/clk-mux.c
@@ -33,6 +33,13 @@ static int clk_mux_set_parent(struct clk *clk, u8 idx)
struct clk_mux *m = container_of(clk, struct clk_mux, clk);
u32 val;
+ if (m->flags & CLK_MUX_READ_ONLY) {
+ if (clk_mux_get_parent(clk) != idx)
+ return -EPERM;
+ else
+ return 0;
+ }
+
val = readl(m->reg);
val &= ~(((1 << m->width) - 1) << m->shift);
val |= idx << m->shift;
@@ -51,18 +58,19 @@ struct clk_ops clk_mux_ops = {
.set_parent = clk_mux_set_parent,
};
-struct clk *clk_mux_alloc(const char *name, void __iomem *reg,
- u8 shift, u8 width, const char **parents, u8 num_parents,
- unsigned flags)
+struct clk *clk_mux_alloc(const char *name, unsigned clk_flags, void __iomem *reg,
+ u8 shift, u8 width, const char * const *parents, u8 num_parents,
+ unsigned mux_flags)
{
struct clk_mux *m = xzalloc(sizeof(*m));
m->reg = reg;
m->shift = shift;
m->width = width;
+ m->flags = mux_flags;
m->clk.ops = &clk_mux_ops;
m->clk.name = name;
- m->clk.flags = flags;
+ m->clk.flags = clk_flags;
m->clk.parent_names = parents;
m->clk.num_parents = num_parents;
@@ -76,13 +84,15 @@ void clk_mux_free(struct clk *clk_mux)
free(m);
}
-struct clk *clk_mux(const char *name, void __iomem *reg,
- u8 shift, u8 width, const char **parents, u8 num_parents, unsigned flags)
+struct clk *clk_mux(const char *name, unsigned clk_flags, void __iomem *reg,
+ u8 shift, u8 width, const char * const *parents,
+ u8 num_parents, unsigned mux_flags)
{
struct clk *m;
int ret;
- m = clk_mux_alloc(name, reg, shift, width, parents, num_parents, flags);
+ m = clk_mux_alloc(name, clk_flags, reg, shift, width, parents,
+ num_parents, mux_flags);
ret = clk_register(m);
if (ret) {