summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2016-11-09 08:13:59 -0800
committerSascha Hauer <s.hauer@pengutronix.de>2017-01-11 08:07:00 +0100
commit3ae4754b51da47d612a72a843ac1131b755a5a0e (patch)
tree18028605a643019c09e2c56964fe98b05c1b60bd
parente187942b9a8552b1ada3475af42aabe2f4335a62 (diff)
downloadbarebox-3ae4754b51da47d612a72a843ac1131b755a5a0e.tar.gz
barebox-3ae4754b51da47d612a72a843ac1131b755a5a0e.tar.xz
i.MX: clk: Port imx_clk_gate2_cgr()
Update clk-gate2 code to be able to accept arbitrary 'cgr' value and introduce imx_clk_gate2_cgr() (Used by Vybrid clock tree) Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/clk/imx/clk-gate2.c12
-rw-r--r--drivers/clk/imx/clk.h11
2 files changed, 16 insertions, 7 deletions
diff --git a/drivers/clk/imx/clk-gate2.c b/drivers/clk/imx/clk-gate2.c
index faed6313fb..f952f3e3f6 100644
--- a/drivers/clk/imx/clk-gate2.c
+++ b/drivers/clk/imx/clk-gate2.c
@@ -26,6 +26,7 @@ struct clk_gate2 {
struct clk clk;
void __iomem *reg;
int shift;
+ u8 cgr_val;
const char *parent;
#define CLK_GATE_INVERTED (1 << 0)
unsigned flags;
@@ -43,7 +44,7 @@ static int clk_gate2_enable(struct clk *clk)
if (g->flags & CLK_GATE_INVERTED)
val &= ~(3 << g->shift);
else
- val |= 3 << g->shift;
+ val |= g->cgr_val << g->shift;
writel(val, g->reg);
@@ -87,12 +88,13 @@ static struct clk_ops clk_gate2_ops = {
};
struct clk *clk_gate2_alloc(const char *name, const char *parent,
- void __iomem *reg, u8 shift)
+ void __iomem *reg, u8 shift, u8 cgr_val)
{
struct clk_gate2 *g = xzalloc(sizeof(*g));
g->parent = parent;
g->reg = reg;
+ g->cgr_val = cgr_val;
g->shift = shift;
g->clk.ops = &clk_gate2_ops;
g->clk.name = name;
@@ -111,12 +113,12 @@ void clk_gate2_free(struct clk *clk)
}
struct clk *clk_gate2(const char *name, const char *parent, void __iomem *reg,
- u8 shift)
+ u8 shift, u8 cgr_val)
{
struct clk *g;
int ret;
- g = clk_gate2_alloc(name , parent, reg, shift);
+ g = clk_gate2_alloc(name , parent, reg, shift, cgr_val);
ret = clk_register(g);
if (ret) {
@@ -133,7 +135,7 @@ struct clk *clk_gate2_inverted(const char *name, const char *parent,
struct clk *clk;
struct clk_gate2 *g;
- clk = clk_gate2(name, parent, reg, shift);
+ clk = clk_gate2(name, parent, reg, shift, 0x3);
if (IS_ERR(clk))
return clk;
diff --git a/drivers/clk/imx/clk.h b/drivers/clk/imx/clk.h
index c5913e1879..2aeb35631d 100644
--- a/drivers/clk/imx/clk.h
+++ b/drivers/clk/imx/clk.h
@@ -2,7 +2,7 @@
#define __IMX_CLK_H
struct clk *clk_gate2(const char *name, const char *parent, void __iomem *reg,
- u8 shift);
+ u8 shift, u8 cgr_val);
static inline struct clk *imx_clk_divider(const char *name, const char *parent,
void __iomem *reg, u8 shift, u8 width)
@@ -51,9 +51,16 @@ static inline struct clk *imx_clk_gate(const char *name, const char *parent,
static inline struct clk *imx_clk_gate2(const char *name, const char *parent,
void __iomem *reg, u8 shift)
{
- return clk_gate2(name, parent, reg, shift);
+ return clk_gate2(name, parent, reg, shift, 0x3);
}
+static inline struct clk *imx_clk_gate2_cgr(const char *name, const char *parent,
+ void __iomem *reg, u8 shift, u8 cgr_val)
+{
+ return clk_gate2(name, parent, reg, shift, cgr_val);
+}
+
+
struct clk *imx_clk_pllv1(const char *name, const char *parent,
void __iomem *base);