Skip to contentSkip to conversation

clk: qcom: clk-rcg2: Introduce a cfg offset for RCGs

PATCH In review Vinod Koul 2 participants 5 messages Jan 28, 2019 – Jan 30, 2019

Subsystems (3)
lore
Share & tools
lore

Vinod Koul

author
#0 lore raw

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
index e5eca8a1abe4..f06783c20688 100644
@@ -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
index 6e3bd195d012..106848e3313f 100644
@@ -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
author
#1 lore raw

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
index 64da032bb9ed..493e055299b4 100644
@@ -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
maintainer
#2 lore raw

Re: [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
index 64da032bb9ed..493e055299b4 100644
@@ -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){
maintainer
#3 lore raw
In reply to Vinod Koul

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
index e5eca8a1abe4..f06783c20688 100644
@@ -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
index 6e3bd195d012..106848e3313f 100644

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 -1
        if (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 -0
                if (ret)
                        return ret;
        }
author
#4 lore raw
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
index e5eca8a1abe4..f06783c20688 100644
@@ -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
index 6e3bd195d012..106848e3313f 100644
@@ -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_REG as CFG_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 -1
        if (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_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.

Correct that will make it neater, will do so

Signature · 1 line
~Vinod