diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/clk/qcom/clk-rcg.h | 2 | ||||
| -rw-r--r-- | drivers/clk/qcom/clk-rcg2.c | 24 |
2 files changed, 16 insertions, 10 deletions
diff --git a/drivers/clk/qcom/clk-rcg.h b/drivers/clk/qcom/clk-rcg.h index 91336a030179..c25b57c3cbc8 100644 --- a/drivers/clk/qcom/clk-rcg.h +++ b/drivers/clk/qcom/clk-rcg.h | |||
| @@ -138,6 +138,7 @@ extern const struct clk_ops clk_dyn_rcg_ops; | |||
| 138 | * @parent_map: map from software's parent index to hardware's src_sel field | 138 | * @parent_map: map from software's parent index to hardware's src_sel field |
| 139 | * @freq_tbl: frequency table | 139 | * @freq_tbl: frequency table |
| 140 | * @clkr: regmap clock handle | 140 | * @clkr: regmap clock handle |
| 141 | * @cfg_off: defines the cfg register offset from the CMD_RCGR + CFG_REG | ||
| 141 | */ | 142 | */ |
| 142 | struct clk_rcg2 { | 143 | struct clk_rcg2 { |
| 143 | u32 cmd_rcgr; | 144 | u32 cmd_rcgr; |
| @@ -147,6 +148,7 @@ struct clk_rcg2 { | |||
| 147 | const struct parent_map *parent_map; | 148 | const struct parent_map *parent_map; |
| 148 | const struct freq_tbl *freq_tbl; | 149 | const struct freq_tbl *freq_tbl; |
| 149 | struct clk_regmap clkr; | 150 | struct clk_regmap clkr; |
| 151 | u8 cfg_off; | ||
| 150 | }; | 152 | }; |
| 151 | 153 | ||
| 152 | #define to_clk_rcg2(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg2, clkr) | 154 | #define to_clk_rcg2(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg2, clkr) |
diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c index 6e3bd195d012..8c02bffe50df 100644 --- a/drivers/clk/qcom/clk-rcg2.c +++ b/drivers/clk/qcom/clk-rcg2.c | |||
| @@ -41,6 +41,11 @@ | |||
| 41 | #define N_REG 0xc | 41 | #define N_REG 0xc |
| 42 | #define D_REG 0x10 | 42 | #define D_REG 0x10 |
| 43 | 43 | ||
| 44 | #define RCG_CFG_OFFSET(rcg) ((rcg)->cmd_rcgr + (rcg)->cfg_off + CFG_REG) | ||
| 45 | #define RCG_M_OFFSET(rcg) ((rcg)->cmd_rcgr + (rcg)->cfg_off + M_REG) | ||
| 46 | #define RCG_N_OFFSET(rcg) ((rcg)->cmd_rcgr + (rcg)->cfg_off + N_REG) | ||
| 47 | #define RCG_D_OFFSET(rcg) ((rcg)->cmd_rcgr + (rcg)->cfg_off + D_REG) | ||
| 48 | |||
| 44 | /* Dynamic Frequency Scaling */ | 49 | /* Dynamic Frequency Scaling */ |
| 45 | #define MAX_PERF_LEVEL 8 | 50 | #define MAX_PERF_LEVEL 8 |
| 46 | #define SE_CMD_DFSR_OFFSET 0x14 | 51 | #define SE_CMD_DFSR_OFFSET 0x14 |
| @@ -74,7 +79,7 @@ static u8 clk_rcg2_get_parent(struct clk_hw *hw) | |||
| 74 | u32 cfg; | 79 | u32 cfg; |
| 75 | int i, ret; | 80 | int i, ret; |
| 76 | 81 | ||
| 77 | ret = regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg); | 82 | ret = regmap_read(rcg->clkr.regmap, RCG_CFG_OFFSET(rcg), &cfg); |
| 78 | if (ret) | 83 | if (ret) |
| 79 | goto err; | 84 | goto err; |
| 80 | 85 | ||
| @@ -123,7 +128,7 @@ static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index) | |||
| 123 | int ret; | 128 | int ret; |
| 124 | u32 cfg = rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT; | 129 | u32 cfg = rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT; |
| 125 | 130 | ||
| 126 | ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, | 131 | ret = regmap_update_bits(rcg->clkr.regmap, RCG_CFG_OFFSET(rcg), |
| 127 | CFG_SRC_SEL_MASK, cfg); | 132 | CFG_SRC_SEL_MASK, cfg); |
| 128 | if (ret) | 133 | if (ret) |
| 129 | return ret; | 134 | return ret; |
| @@ -162,13 +167,13 @@ clk_rcg2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) | |||
| 162 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); | 167 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); |
| 163 | u32 cfg, hid_div, m = 0, n = 0, mode = 0, mask; | 168 | u32 cfg, hid_div, m = 0, n = 0, mode = 0, mask; |
| 164 | 169 | ||
| 165 | regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg); | 170 | regmap_read(rcg->clkr.regmap, RCG_CFG_OFFSET(rcg), &cfg); |
| 166 | 171 | ||
| 167 | if (rcg->mnd_width) { | 172 | if (rcg->mnd_width) { |
| 168 | mask = BIT(rcg->mnd_width) - 1; | 173 | mask = BIT(rcg->mnd_width) - 1; |
| 169 | regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + M_REG, &m); | 174 | regmap_read(rcg->clkr.regmap, RCG_M_OFFSET(rcg), &m); |
| 170 | m &= mask; | 175 | m &= mask; |
| 171 | regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + N_REG, &n); | 176 | regmap_read(rcg->clkr.regmap, RCG_N_OFFSET(rcg), &n); |
| 172 | n = ~n; | 177 | n = ~n; |
| 173 | n &= mask; | 178 | n &= mask; |
| 174 | n += m; | 179 | n += m; |
| @@ -263,17 +268,17 @@ static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) | |||
| 263 | if (rcg->mnd_width && f->n) { | 268 | if (rcg->mnd_width && f->n) { |
| 264 | mask = BIT(rcg->mnd_width) - 1; | 269 | mask = BIT(rcg->mnd_width) - 1; |
| 265 | ret = regmap_update_bits(rcg->clkr.regmap, | 270 | ret = regmap_update_bits(rcg->clkr.regmap, |
| 266 | rcg->cmd_rcgr + M_REG, mask, f->m); | 271 | RCG_M_OFFSET(rcg), mask, f->m); |
| 267 | if (ret) | 272 | if (ret) |
| 268 | return ret; | 273 | return ret; |
| 269 | 274 | ||
| 270 | ret = regmap_update_bits(rcg->clkr.regmap, | 275 | ret = regmap_update_bits(rcg->clkr.regmap, |
| 271 | rcg->cmd_rcgr + N_REG, mask, ~(f->n - f->m)); | 276 | RCG_N_OFFSET(rcg), mask, ~(f->n - f->m)); |
| 272 | if (ret) | 277 | if (ret) |
| 273 | return ret; | 278 | return ret; |
| 274 | 279 | ||
| 275 | ret = regmap_update_bits(rcg->clkr.regmap, | 280 | ret = regmap_update_bits(rcg->clkr.regmap, |
| 276 | rcg->cmd_rcgr + D_REG, mask, ~f->n); | 281 | RCG_D_OFFSET(rcg), mask, ~f->n); |
| 277 | if (ret) | 282 | if (ret) |
| 278 | return ret; | 283 | return ret; |
| 279 | } | 284 | } |
| @@ -284,8 +289,7 @@ static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) | |||
| 284 | cfg |= rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT; | 289 | cfg |= rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT; |
| 285 | if (rcg->mnd_width && f->n && (f->m != f->n)) | 290 | if (rcg->mnd_width && f->n && (f->m != f->n)) |
| 286 | cfg |= CFG_MODE_DUAL_EDGE; | 291 | cfg |= CFG_MODE_DUAL_EDGE; |
| 287 | 292 | return regmap_update_bits(rcg->clkr.regmap, RCG_CFG_OFFSET(rcg), | |
| 288 | return regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, | ||
| 289 | mask, cfg); | 293 | mask, cfg); |
| 290 | } | 294 | } |
| 291 | 295 | ||
