aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJun Nie <jun.nie@linaro.org>2016-09-06 02:02:41 -0400
committerStephen Boyd <sboyd@codeaurora.org>2016-09-14 16:48:32 -0400
commit8d9a0860b75525e3cf240bc152bfdeaeb2e562a1 (patch)
tree7e3ee13a267085c5ba5869e3ed5af020de2481aa
parent6e2e7c9fdae316bfb2724d2dbf230678d3f09092 (diff)
clk: zx: reform pll config info to ease code extension
Add power down bit and pll lock bit in pll config structure to ease new SoC support. Signed-off-by: Jun Nie <jun.nie@linaro.org> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
-rw-r--r--drivers/clk/zte/clk.c21
-rw-r--r--drivers/clk/zte/clk.h4
2 files changed, 16 insertions, 9 deletions
diff --git a/drivers/clk/zte/clk.c b/drivers/clk/zte/clk.c
index 7c73c538c43d..c4c1251bc1e7 100644
--- a/drivers/clk/zte/clk.c
+++ b/drivers/clk/zte/clk.c
@@ -21,8 +21,8 @@
21#define to_clk_zx_audio(_hw) container_of(_hw, struct clk_zx_audio, hw) 21#define to_clk_zx_audio(_hw) container_of(_hw, struct clk_zx_audio, hw)
22 22
23#define CFG0_CFG1_OFFSET 4 23#define CFG0_CFG1_OFFSET 4
24#define LOCK_FLAG BIT(30) 24#define LOCK_FLAG 30
25#define POWER_DOWN BIT(31) 25#define POWER_DOWN 31
26 26
27static int rate_to_idx(struct clk_zx_pll *zx_pll, unsigned long rate) 27static int rate_to_idx(struct clk_zx_pll *zx_pll, unsigned long rate)
28{ 28{
@@ -50,8 +50,8 @@ static int hw_to_idx(struct clk_zx_pll *zx_pll)
50 hw_cfg1 = readl_relaxed(zx_pll->reg_base + CFG0_CFG1_OFFSET); 50 hw_cfg1 = readl_relaxed(zx_pll->reg_base + CFG0_CFG1_OFFSET);
51 51
52 /* For matching the value in lookup table */ 52 /* For matching the value in lookup table */
53 hw_cfg0 &= ~LOCK_FLAG; 53 hw_cfg0 &= ~BIT(zx_pll->lock_bit);
54 hw_cfg0 |= POWER_DOWN; 54 hw_cfg0 |= BIT(zx_pll->pd_bit);
55 55
56 for (i = 0; i < zx_pll->count; i++) { 56 for (i = 0; i < zx_pll->count; i++) {
57 if (hw_cfg0 == config[i].cfg0 && hw_cfg1 == config[i].cfg1) 57 if (hw_cfg0 == config[i].cfg0 && hw_cfg1 == config[i].cfg1)
@@ -108,10 +108,10 @@ static int zx_pll_enable(struct clk_hw *hw)
108 u32 reg; 108 u32 reg;
109 109
110 reg = readl_relaxed(zx_pll->reg_base); 110 reg = readl_relaxed(zx_pll->reg_base);
111 writel_relaxed(reg & ~POWER_DOWN, zx_pll->reg_base); 111 writel_relaxed(reg & ~BIT(zx_pll->pd_bit), zx_pll->reg_base);
112 112
113 return readl_relaxed_poll_timeout(zx_pll->reg_base, reg, 113 return readl_relaxed_poll_timeout(zx_pll->reg_base, reg,
114 reg & LOCK_FLAG, 0, 100); 114 reg & BIT(zx_pll->lock_bit), 0, 100);
115} 115}
116 116
117static void zx_pll_disable(struct clk_hw *hw) 117static void zx_pll_disable(struct clk_hw *hw)
@@ -120,7 +120,7 @@ static void zx_pll_disable(struct clk_hw *hw)
120 u32 reg; 120 u32 reg;
121 121
122 reg = readl_relaxed(zx_pll->reg_base); 122 reg = readl_relaxed(zx_pll->reg_base);
123 writel_relaxed(reg | POWER_DOWN, zx_pll->reg_base); 123 writel_relaxed(reg | BIT(zx_pll->pd_bit), zx_pll->reg_base);
124} 124}
125 125
126static int zx_pll_is_enabled(struct clk_hw *hw) 126static int zx_pll_is_enabled(struct clk_hw *hw)
@@ -130,10 +130,10 @@ static int zx_pll_is_enabled(struct clk_hw *hw)
130 130
131 reg = readl_relaxed(zx_pll->reg_base); 131 reg = readl_relaxed(zx_pll->reg_base);
132 132
133 return !(reg & POWER_DOWN); 133 return !(reg & BIT(zx_pll->pd_bit));
134} 134}
135 135
136static const struct clk_ops zx_pll_ops = { 136const struct clk_ops zx_pll_ops = {
137 .recalc_rate = zx_pll_recalc_rate, 137 .recalc_rate = zx_pll_recalc_rate,
138 .round_rate = zx_pll_round_rate, 138 .round_rate = zx_pll_round_rate,
139 .set_rate = zx_pll_set_rate, 139 .set_rate = zx_pll_set_rate,
@@ -141,6 +141,7 @@ static const struct clk_ops zx_pll_ops = {
141 .disable = zx_pll_disable, 141 .disable = zx_pll_disable,
142 .is_enabled = zx_pll_is_enabled, 142 .is_enabled = zx_pll_is_enabled,
143}; 143};
144EXPORT_SYMBOL(zx_pll_ops);
144 145
145struct clk *clk_register_zx_pll(const char *name, const char *parent_name, 146struct clk *clk_register_zx_pll(const char *name, const char *parent_name,
146 unsigned long flags, void __iomem *reg_base, 147 unsigned long flags, void __iomem *reg_base,
@@ -164,6 +165,8 @@ struct clk *clk_register_zx_pll(const char *name, const char *parent_name,
164 zx_pll->reg_base = reg_base; 165 zx_pll->reg_base = reg_base;
165 zx_pll->lookup_table = lookup_table; 166 zx_pll->lookup_table = lookup_table;
166 zx_pll->count = count; 167 zx_pll->count = count;
168 zx_pll->lock_bit = LOCK_FLAG;
169 zx_pll->pd_bit = POWER_DOWN;
167 zx_pll->lock = lock; 170 zx_pll->lock = lock;
168 zx_pll->hw.init = &init; 171 zx_pll->hw.init = &init;
169 172
diff --git a/drivers/clk/zte/clk.h b/drivers/clk/zte/clk.h
index 65ae08b818d3..8f6b5f05bb7f 100644
--- a/drivers/clk/zte/clk.h
+++ b/drivers/clk/zte/clk.h
@@ -24,6 +24,8 @@ struct clk_zx_pll {
24 const struct zx_pll_config *lookup_table; /* order by rate asc */ 24 const struct zx_pll_config *lookup_table; /* order by rate asc */
25 int count; 25 int count;
26 spinlock_t *lock; 26 spinlock_t *lock;
27 u8 pd_bit; /* power down bit */
28 u8 lock_bit; /* pll lock flag bit */
27}; 29};
28 30
29struct clk *clk_register_zx_pll(const char *name, const char *parent_name, 31struct clk *clk_register_zx_pll(const char *name, const char *parent_name,
@@ -38,4 +40,6 @@ struct clk_zx_audio {
38struct clk *clk_register_zx_audio(const char *name, 40struct clk *clk_register_zx_audio(const char *name,
39 const char * const parent_name, 41 const char * const parent_name,
40 unsigned long flags, void __iomem *reg_base); 42 unsigned long flags, void __iomem *reg_base);
43
44extern const struct clk_ops zx_pll_ops;
41#endif 45#endif