clk: qcom: clk-rcg2: Introduce a cfg offset for RCGs
Subsystems (3)
PATCH 1/2 clk: qcom: clk-rcg2: Introduce a cfg offset for RCGs
From: Taniya Das <[email protected]>
The RCG CFG/M/N/D register base could be at a different offset than the CMD register, so introduce a cfg_offset to identify the offset with respect to the CMD register.
--- drivers/clk/qcom/clk-rcg.h | 2 ++ drivers/clk/qcom/clk-rcg2.c | 30 +++++++++++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-)
drivers/clk/qcom/clk-rcg.h +2 -0
@@ -140,6 +140,7 @@ extern const struct clk_ops clk_dyn_rcg_ops;* @parent_map: map from software's parent index to hardware's src_sel field * @freq_tbl: frequency table * @clkr: regmap clock handle +* @cfg_off: defines the cfg register offset from the CMD_RCGR * */ struct clk_rcg2 {
@@ -150,6 +151,7 @@ struct clk_rcg2 {const struct parent_map *parent_map;const struct freq_tbl *freq_tbl;struct clk_regmap clkr; +u8 cfg_off; };#define to_clk_rcg2 (_hw) container_of(to_clk_regmap(_hw), struct clk_rcg2, clkr)
drivers/clk/qcom/clk-rcg2.c +19 -11
@@ -74,7 +74,8 @@ static u8 clk_rcg2_get_parent(struct clk_hw *hw)u32 cfg;int i, ret; - ret =regmap_read (rcg->clkr.regmap, rcg->cmd_rcgr +CFG_REG , &cfg); + ret =regmap_read (rcg->clkr.regmap, + rcg->cmd_rcgr + rcg->cfg_off +CFG_REG , &cfg);if (ret) goto err;
@@ -123,7 +124,8 @@ static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index)int ret;u32 cfg = rcg->parent_map[index].cfg <<CFG_SRC_SEL_SHIFT ; - ret =regmap_update_bits (rcg->clkr.regmap, rcg->cmd_rcgr +CFG_REG , + ret =regmap_update_bits (rcg->clkr.regmap, + rcg->cmd_rcgr + rcg->cfg_off +CFG_REG ,CFG_SRC_SEL_MASK , cfg);if (ret)return ret;
@@ -162,13 +164,16 @@ clk_rcg2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)struct clk_rcg2 *rcg =to_clk_rcg2 (hw);u32 cfg, hid_div, m =0 , n =0 , mode =0 , mask; -regmap_read (rcg->clkr.regmap, rcg->cmd_rcgr +CFG_REG , &cfg); +regmap_read (rcg->clkr.regmap, + rcg->cmd_rcgr + rcg->cfg_off +CFG_REG , &cfg);if (rcg->mnd_width) { mask =BIT (rcg->mnd_width) -1 ; -regmap_read (rcg->clkr.regmap, rcg->cmd_rcgr +M_REG , &m); +regmap_read (rcg->clkr.regmap, + rcg->cmd_rcgr + rcg->cfg_off +M_REG , &m); m &= mask; -regmap_read (rcg->clkr.regmap, rcg->cmd_rcgr +N_REG , &n); +regmap_read (rcg->clkr.regmap, + rcg->cmd_rcgr + rcg->cfg_off +N_REG , &n); n = ~n; n &= mask; n += m;
@@ -263,17 +268,20 @@ static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f)if (rcg->mnd_width && f->n) { mask =BIT (rcg->mnd_width) -1 ; ret =regmap_update_bits (rcg->clkr.regmap, - rcg->cmd_rcgr +M_REG , mask, f->m); + rcg->cmd_rcgr + rcg->cfg_off +M_REG , + mask, f->m);if (ret)return ret; ret =regmap_update_bits (rcg->clkr.regmap, - rcg->cmd_rcgr +N_REG , mask, ~(f->n - f->m)); + rcg->cmd_rcgr + rcg->cfg_off +N_REG , + mask, ~(f->n - f->m));if (ret)return ret; ret =regmap_update_bits (rcg->clkr.regmap, - rcg->cmd_rcgr +D_REG , mask, ~f->n); + rcg->cmd_rcgr + rcg->cfg_off +D_REG , + mask, ~f->n);if (ret)return ret; }
@@ -284,9 +292,9 @@ static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) cfg |= rcg->parent_map[index].cfg <<CFG_SRC_SEL_SHIFT ;if (rcg->mnd_width && f->n && (f->m != f->n)) cfg |=CFG_MODE_DUAL_EDGE ; - -return regmap_update_bits (rcg->clkr.regmap, rcg->cmd_rcgr +CFG_REG , - mask, cfg); +return regmap_update_bits (rcg->clkr.regmap, + rcg->cmd_rcgr + rcg->cfg_off +CFG_REG , + mask, cfg); }static int clk_rcg2_configure (struct clk_rcg2 *rcg,const struct freq_tbl *f)
Signature · 1 line
2.20.1
PATCH 2/2 clk: qcom: gcc-qcs404: Add cfg_offset for blsp1_uart3 clock
From: Taniya Das <[email protected]>
The CFG/M/N/D registers are at an offset of 0x20 from the CMD register for blsp1_uart3 clock, so add it.
--- drivers/clk/qcom/gcc-qcs404.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/qcom/gcc-qcs404.c +1 -0
@@ -678,6 +678,7 @@ static struct clk_rcg2 blsp1_uart3_apps_clk_src = { .cmd_rcgr = 0x4014, .mnd_width = 16, .hid_width = 5, + .cfg_off = 0x20, .parent_map = gcc_parent_map_0, .freq_tbl = ftbl_blsp1_uart0_apps_clk_src, .clkr.hw.init = &(struct clk_init_data ){
Signature · 1 line
2.20.1
Stephen Boyd
maintainerRe: [PATCH 2/2] clk: qcom: gcc-qcs404: Add cfg_offset for blsp1_uart3 clock
Quoting Vinod Koul (2019-01-28 03:53:59)
drivers/clk/qcom/gcc-qcs404.c static struct clk_rcg2 blsp1_uart3_apps_clk_src = { · line 681
Quoted 9 lines
drivers/clk/qcom/gcc-qcs404.c +1
-0@@ -678,6 +678,7 @@ static struct clk_rcg2 blsp1_uart3_apps_clk_src = { .cmd_rcgr = 0x4014, .mnd_width = 16, .hid_width = 5, + .cfg_off = 0x20,
And it's one single clk! None of the other blsp clks have this problem?
Quoted 3 lines
drivers/clk/qcom/gcc-qcs404.c +0
-0.parent_map = gcc_parent_map_0, .freq_tbl = ftbl_blsp1_uart0_apps_clk_src, .clkr.hw.init = &(struct clk_init_data ){
Stephen Boyd
maintainerQuoting Vinod Koul (2019-01-28 03:53:58)
drivers/clk/qcom/clk-rcg.h extern const struct clk_ops clk_dyn_rcg_ops; · line 144
Quoted 10 lines
drivers/clk/qcom/clk-rcg.h +1
-0@@ -140,6 +140,7 @@ extern const struct clk_ops clk_dyn_rcg_ops;* @parent_map: map from software's parent index to hardware's src_sel field * @freq_tbl: frequency table * @clkr: regmap clock handle +* @cfg_off: defines the cfg register offset from the CMD_RCGR *
Please remove this extra line here. Also, shouldn't it say offset from CMD_RCGR + CFG_REG?
Quoted 15 lines
drivers/clk/qcom/clk-rcg.h +1
-0*/ struct clk_rcg2 {@@ -150,6 +151,7 @@ struct clk_rcg2 {const struct parent_map *parent_map;const struct freq_tbl *freq_tbl;struct clk_regmap clkr; +u8 cfg_off; };#define to_clk_rcg2 (_hw) container_of(to_clk_regmap(_hw), struct clk_rcg2, clkr)drivers/clk/qcom/clk-rcg2.c +0
-0
drivers/clk/qcom/clk-rcg2.c static u8 clk_rcg2_get_parent(struct clk_hw *hw) · line 78
Quoted 6 lines
drivers/clk/qcom/clk-rcg2.c +2
-1@@ -74,7 +74,8 @@ static u8 clk_rcg2_get_parent(struct clk_hw *hw)u32 cfg;int i, ret; - ret =regmap_read (rcg->clkr.regmap, rcg->cmd_rcgr +CFG_REG , &cfg); + ret =regmap_read (rcg->clkr.regmap, + rcg->cmd_rcgr + rcg->cfg_off +CFG_REG , &cfg);
Maybe we should define CFG_REG as CFG_REG(rcg) and then do the math there?
#define CFG_REG(rcg) (rcg)->cfg_off + 0x4
Quoted 14 lines
drivers/clk/qcom/clk-rcg2.c +2
-1if (ret) goto err;@@ -263,17 +268,20 @@ static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f)if (rcg->mnd_width && f->n) { mask =BIT (rcg->mnd_width) -1 ; ret =regmap_update_bits (rcg->clkr.regmap, - rcg->cmd_rcgr +M_REG , mask, f->m); + rcg->cmd_rcgr + rcg->cfg_off +M_REG , + mask, f->m);if (ret)return ret; ret = regmap_update_bits(rcg->clkr.regmap,
drivers/clk/qcom/clk-rcg2.c static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) · line 284
Quoted 10 lines
drivers/clk/qcom/clk-rcg2.c +4
-2- rcg->cmd_rcgr + N_REG, mask, ~(f->n - f->m)); + rcg->cmd_rcgr + rcg->cfg_off +N_REG , + mask, ~(f->n - f->m));if (ret)return ret; ret =regmap_update_bits (rcg->clkr.regmap, - rcg->cmd_rcgr +D_REG , mask, ~f->n); + rcg->cmd_rcgr + rcg->cfg_off +D_REG , + mask, ~f->n);
Ah the MND registers also move. Wow that's so sad. Do a similar thing for all these too?
#define D_REG(rcg) (rcg)->cfg_off + 0x8
etc...
All just to make things fit on the same number of lines as before! We could also throw the rcg->cmd_rcgr part into the register named macros to make things even shorter. It was mostly OK when it was just adding the offset to the base, but now we have another offset so I think we can roll it all into the macro so that we can just read "regmap_read FOO_REG" and ignore the rest.
Quoted 3 lines
drivers/clk/qcom/clk-rcg2.c +0
-0if (ret)return ret; }
Quoted 14 lines · Stephen Boyd
Quoting Vinod Koul (2019-01-28 03:53:58)
drivers/clk/qcom/clk-rcg.h extern const struct clk_ops clk_dyn_rcg_ops; · line 144
Quoted 10 lines
drivers/clk/qcom/clk-rcg.h +1
-0@@ -140,6 +140,7 @@ extern const struct clk_ops clk_dyn_rcg_ops;* @parent_map: map from software's parent index to hardware's src_sel field * @freq_tbl: frequency table * @clkr: regmap clock handle +* @cfg_off: defines the cfg register offset from the CMD_RCGR * Please remove this extra line here. Also, shouldn't it say offset from
CMD_RCGR+CFG_REG?
Sure but I dont like to mix so will send that as a separate patch :)
and will update the comment too.
Quoted 20 lines
Quoted 20 lines
drivers/clk/qcom/clk-rcg.h +1
-0*/ struct clk_rcg2 {@@ -150,6 +151,7 @@ struct clk_rcg2 {const struct parent_map *parent_map;const struct freq_tbl *freq_tbl;struct clk_regmap clkr; +u8 cfg_off; };#define to_clk_rcg2 (_hw) container_of(to_clk_regmap(_hw), struct clk_rcg2, clkr)drivers/clk/qcom/clk-rcg2.c +0
-0@@ -74,7 +74,8 @@ static u8 clk_rcg2_get_parent(struct clk_hw *hw)u32 cfg;int i, ret;
Quoted 8 lines
drivers/clk/qcom/clk-rcg2.c static u8 clk_rcg2_get_parent(struct clk_hw *hw) · line 78
Quoted 3 lines
drivers/clk/qcom/clk-rcg2.c +2
-1- ret =regmap_read (rcg->clkr.regmap, rcg->cmd_rcgr +CFG_REG , &cfg); + ret =regmap_read (rcg->clkr.regmap, + rcg->cmd_rcgr + rcg->cfg_off +CFG_REG , &cfg);Maybe we should define
CFG_REGasCFG_REG(rcg)and then do the math there?#define
CFG_REG(rcg)(rcg)->cfg_off +0x4
Sure that looks better
Quoted 32 lines
Quoted 15 lines
drivers/clk/qcom/clk-rcg2.c +2
-1if (ret) goto err;@@ -263,17 +268,20 @@ static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f)if (rcg->mnd_width && f->n) { mask =BIT (rcg->mnd_width) -1 ; ret =regmap_update_bits (rcg->clkr.regmap, - rcg->cmd_rcgr +M_REG , mask, f->m); + rcg->cmd_rcgr + rcg->cfg_off +M_REG , + mask, f->m);if (ret)return ret; ret = regmap_update_bits(rcg->clkr.regmap,drivers/clk/qcom/clk-rcg2.c static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) · line 284
Quoted 10 lines
drivers/clk/qcom/clk-rcg2.c +4
-2- rcg->cmd_rcgr + N_REG, mask, ~(f->n - f->m)); + rcg->cmd_rcgr + rcg->cfg_off +N_REG , + mask, ~(f->n - f->m));if (ret)return ret; ret =regmap_update_bits (rcg->clkr.regmap, - rcg->cmd_rcgr +D_REG , mask, ~f->n); + rcg->cmd_rcgr + rcg->cfg_off +D_REG , + mask, ~f->n);Ah the MND registers also move. Wow that's so sad. Do a similar thing for all these too?
#define
D_REG(rcg)(rcg)->cfg_off +0x8
etc...
Quoted 6 lines
All just to make things fit on the same number of lines as before! We could also throw the
rcg->cmd_rcgrpart into the register named macros to make things even shorter. It was mostly OK when it was just adding the offset to the base, but now we have another offset so I think we can roll it all into the macro so that we can just read "regmap_readFOO_REG" and ignore the rest.
Correct that will make it neater, will do so
Signature · 1 line
~Vinod