[PATCH v2 1/3] clk: mux: Add regmap support for simple mux
From: Joachim Eastwood <hidden>
Date: 2015-05-29 16:54:34
Also in:
linux-clk, linux-mediatek, lkml
On 29 May 2015 at 18:01, Matthias Brugger [off-list ref] wrote:
Some devices like SoCs from Mediatek need to use the clock muxes through a regmap interface. This patch adds regmap support for the simple multiplexer clock code. Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> --- drivers/clk/clk-mux.c | 134 ++++++++++++++++++++++++++++++++++++++----- include/linux/clk-provider.h | 44 +++++++++++++- 2 files changed, 162 insertions(+), 16 deletions(-)
What is this patch generated against? I can't seem to apply it to either clk-next, next or Linus master.
quoted hunk ↗ jump to hunk
diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c index 1fa2a8d..6f75116 100644 --- a/drivers/clk/clk-mux.c +++ b/drivers/clk/clk-mux.c@@ -29,6 +29,43 @@ #define to_clk_mux(_hw) container_of(_hw, struct clk_mux, hw) +static void clk_mux_writel(struct clk_mux *mux, u32 val) +{ + if (mux->flags & CLK_MUX_USE_REGMAP) + regmap_write(mux->regmap, mux->offset, val); + else + clk_writel(val, mux->reg); +} + +static u32 clk_mux_readl(struct clk_mux *mux) +{ + u32 val; + + if (mux->flags & CLK_MUX_USE_REGMAP) + regmap_read(mux->regmap, mux->offset, &val); + else + val = clk_readl(mux->reg); + + return val; +} + +static int clk_mux_update_bits(struct clk_mux *mux, u32 mask, u32 val) +{ + unsigned int ret; + + if (mux->flags & CLK_MUX_USE_REGMAP) { + ret = regmap_update_bits(mux->regmap, mux->offset, mask, val);
If you just do a "return regmap_update_bits(...)" here you can drop the else below and also remove the ret variable.
+ } else {
+ ret = clk_readl(mux->reg);
+ ret &= ~mask;
+ ret |= val;
+ clk_writel(ret, mux->reg);
+ ret = 0;
+ }
+
+ return ret;
+}The three functions above seems pretty generic and should be usable in both gate and divider as well. Maybe we could figure out a way to share them across the mux, gate and divider clk drivers.
quoted hunk ↗ jump to hunk
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index ec609e5..c7487ad 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h@@ -14,6 +14,7 @@ #include <linux/clk.h> #include <linux/io.h> #include <linux/of.h> +#include <linux/regmap.h> #ifdef CONFIG_COMMON_CLK@@ -408,8 +409,12 @@ void clk_unregister_divider(struct clk *clk); */ struct clk_mux { struct clk_hw hw; - void __iomem *reg; + union { + void __iomem *reg; + struct regmap *regmap; + }; u32 *table; + u32 offset; u32 mask; u8 shift; u8 flags;@@ -421,6 +426,7 @@ struct clk_mux { #define CLK_MUX_HIWORD_MASK BIT(2) #define CLK_MUX_READ_ONLY BIT(3) /* mux can't be changed */ #define CLK_MUX_ROUND_CLOSEST BIT(4) +#define CLK_MUX_USE_REGMAP BIT(5)
Since you are adding both fields and a flag to struct clk_mux it would be nice if you could update the documentation above the struct definition in clk-provider.h also. regards, Joachim Eastwood