* [RFC PATCH 1/5] clk: qcom: regmap-mux: add pipe clk implementation
2022-03-13 0:08 [RFC PATCH 0/5] PCI: qcom: rework pipe_clk/pipe_clk_src handling Dmitry Baryshkov
@ 2022-03-13 0:08 ` Dmitry Baryshkov
2022-03-13 17:14 ` Bjorn Andersson
2022-03-13 0:08 ` [RFC PATCH 2/5] clk: qcom: gcc-sm8450: use new clk_regmap_mux_safe_ops for PCIe pipe clocks Dmitry Baryshkov
` (3 subsequent siblings)
4 siblings, 1 reply; 12+ messages in thread
From: Dmitry Baryshkov @ 2022-03-13 0:08 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Stephen Boyd, Michael Turquette,
Taniya Das, Lorenzo Pieralisi, Krzysztof Wilczyński,
Bjorn Helgaas
Cc: Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
PCIe PIPE clk (and some other clocks) must be parked to the "safe"
source (bi_tcxo) when corresponding GDSC is turned off and on again.
Currently this is handcoded in the PCIe driver, reparenting the
gcc_pipe_N_clk_src clock. However the same code sequence should be
applied in the pcie-qcom-ep, USB3 and UFS drivers.
Rather than copying this sequence over and over again, follow the
example of clk_rcg2_shared_ops and implement this parking in the
enable() and disable() clock operations. As we are changing the parent
behind the back of the clock framework, also implement custom
set_parent() and get_parent() operations behaving accroding to the clock
framework expectations (cache the new parent if the clock is in disabled
state, return cached parent).
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/clk/qcom/clk-regmap-mux.c | 70 +++++++++++++++++++++++++++++++
drivers/clk/qcom/clk-regmap-mux.h | 3 ++
2 files changed, 73 insertions(+)
diff --git a/drivers/clk/qcom/clk-regmap-mux.c b/drivers/clk/qcom/clk-regmap-mux.c
index 45d9cca28064..024412b070c5 100644
--- a/drivers/clk/qcom/clk-regmap-mux.c
+++ b/drivers/clk/qcom/clk-regmap-mux.c
@@ -49,9 +49,79 @@ static int mux_set_parent(struct clk_hw *hw, u8 index)
return regmap_update_bits(clkr->regmap, mux->reg, mask, val);
}
+static u8 mux_safe_get_parent(struct clk_hw *hw)
+{
+ struct clk_regmap_mux *mux = to_clk_regmap_mux(hw);
+ unsigned int val;
+
+ if (clk_hw_is_enabled(hw))
+ return mux_get_parent(hw);
+
+ val = mux->stored_parent;
+
+ if (mux->parent_map)
+ return qcom_find_cfg_index(hw, mux->parent_map, val);
+
+ return val;
+}
+
+static int mux_safe_set_parent(struct clk_hw *hw, u8 index)
+{
+ struct clk_regmap_mux *mux = to_clk_regmap_mux(hw);
+
+ if (clk_hw_is_enabled(hw))
+ return mux_set_parent(hw, index);
+
+ if (mux->parent_map)
+ index = mux->parent_map[index].cfg;
+
+ mux->stored_parent = index;
+
+ return 0;
+}
+
+static void mux_safe_disable(struct clk_hw *hw)
+{
+ struct clk_regmap_mux *mux = to_clk_regmap_mux(hw);
+ struct clk_regmap *clkr = to_clk_regmap(hw);
+ unsigned int mask = GENMASK(mux->width + mux->shift - 1, mux->shift);
+ unsigned int val;
+
+ regmap_read(clkr->regmap, mux->reg, &val);
+
+ mux->stored_parent = (val & mask) >> mux->shift;
+
+ val = mux->safe_src_index;
+ val <<= mux->shift;
+
+ regmap_update_bits(clkr->regmap, mux->reg, mask, val);
+}
+
+static int mux_safe_enable(struct clk_hw *hw)
+{
+ struct clk_regmap_mux *mux = to_clk_regmap_mux(hw);
+ struct clk_regmap *clkr = to_clk_regmap(hw);
+ unsigned int mask = GENMASK(mux->width + mux->shift - 1, mux->shift);
+ unsigned int val;
+
+ val = mux->stored_parent;
+ val <<= mux->shift;
+
+ return regmap_update_bits(clkr->regmap, mux->reg, mask, val);
+}
+
const struct clk_ops clk_regmap_mux_closest_ops = {
.get_parent = mux_get_parent,
.set_parent = mux_set_parent,
.determine_rate = __clk_mux_determine_rate_closest,
};
EXPORT_SYMBOL_GPL(clk_regmap_mux_closest_ops);
+
+const struct clk_ops clk_regmap_mux_safe_ops = {
+ .enable = mux_safe_enable,
+ .disable = mux_safe_disable,
+ .get_parent = mux_safe_get_parent,
+ .set_parent = mux_safe_set_parent,
+ .determine_rate = __clk_mux_determine_rate_closest,
+};
+EXPORT_SYMBOL_GPL(clk_regmap_mux_safe_ops);
diff --git a/drivers/clk/qcom/clk-regmap-mux.h b/drivers/clk/qcom/clk-regmap-mux.h
index db6f4cdd9586..ab8ab25d79bd 100644
--- a/drivers/clk/qcom/clk-regmap-mux.h
+++ b/drivers/clk/qcom/clk-regmap-mux.h
@@ -14,10 +14,13 @@ struct clk_regmap_mux {
u32 reg;
u32 shift;
u32 width;
+ u8 safe_src_index;
+ u8 stored_parent;
const struct parent_map *parent_map;
struct clk_regmap clkr;
};
extern const struct clk_ops clk_regmap_mux_closest_ops;
+extern const struct clk_ops clk_regmap_mux_safe_ops;
#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 1/5] clk: qcom: regmap-mux: add pipe clk implementation
2022-03-13 0:08 ` [RFC PATCH 1/5] clk: qcom: regmap-mux: add pipe clk implementation Dmitry Baryshkov
@ 2022-03-13 17:14 ` Bjorn Andersson
0 siblings, 0 replies; 12+ messages in thread
From: Bjorn Andersson @ 2022-03-13 17:14 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Andy Gross, Stephen Boyd, Michael Turquette, Taniya Das,
Lorenzo Pieralisi, Krzysztof Wilczy??ski, Bjorn Helgaas,
Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
On Sat 12 Mar 18:08 CST 2022, Dmitry Baryshkov wrote:
> PCIe PIPE clk (and some other clocks) must be parked to the "safe"
How about changing this to:
"On recent Qualcomm platforms the QMP PIPE clocks feed into a set of
muxes which must be parked..."
To cover the fact that the design changed recently and that it relates
to (at least) USB as well.
> source (bi_tcxo) when corresponding GDSC is turned off and on again.
> Currently this is handcoded in the PCIe driver, reparenting the
> gcc_pipe_N_clk_src clock. However the same code sequence should be
> applied in the pcie-qcom-ep, USB3 and UFS drivers.
>
> Rather than copying this sequence over and over again, follow the
> example of clk_rcg2_shared_ops and implement this parking in the
> enable() and disable() clock operations. As we are changing the parent
> behind the back of the clock framework, also implement custom
> set_parent() and get_parent() operations behaving accroding to the clock
> framework expectations (cache the new parent if the clock is in disabled
> state, return cached parent).
>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Regards,
Bjorn
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/clk/qcom/clk-regmap-mux.c | 70 +++++++++++++++++++++++++++++++
> drivers/clk/qcom/clk-regmap-mux.h | 3 ++
> 2 files changed, 73 insertions(+)
>
> diff --git a/drivers/clk/qcom/clk-regmap-mux.c b/drivers/clk/qcom/clk-regmap-mux.c
> index 45d9cca28064..024412b070c5 100644
> --- a/drivers/clk/qcom/clk-regmap-mux.c
> +++ b/drivers/clk/qcom/clk-regmap-mux.c
> @@ -49,9 +49,79 @@ static int mux_set_parent(struct clk_hw *hw, u8 index)
> return regmap_update_bits(clkr->regmap, mux->reg, mask, val);
> }
>
> +static u8 mux_safe_get_parent(struct clk_hw *hw)
> +{
> + struct clk_regmap_mux *mux = to_clk_regmap_mux(hw);
> + unsigned int val;
> +
> + if (clk_hw_is_enabled(hw))
> + return mux_get_parent(hw);
> +
> + val = mux->stored_parent;
> +
> + if (mux->parent_map)
> + return qcom_find_cfg_index(hw, mux->parent_map, val);
> +
> + return val;
> +}
> +
> +static int mux_safe_set_parent(struct clk_hw *hw, u8 index)
> +{
> + struct clk_regmap_mux *mux = to_clk_regmap_mux(hw);
> +
> + if (clk_hw_is_enabled(hw))
> + return mux_set_parent(hw, index);
> +
> + if (mux->parent_map)
> + index = mux->parent_map[index].cfg;
> +
> + mux->stored_parent = index;
> +
> + return 0;
> +}
> +
> +static void mux_safe_disable(struct clk_hw *hw)
> +{
> + struct clk_regmap_mux *mux = to_clk_regmap_mux(hw);
> + struct clk_regmap *clkr = to_clk_regmap(hw);
> + unsigned int mask = GENMASK(mux->width + mux->shift - 1, mux->shift);
> + unsigned int val;
> +
> + regmap_read(clkr->regmap, mux->reg, &val);
> +
> + mux->stored_parent = (val & mask) >> mux->shift;
> +
> + val = mux->safe_src_index;
> + val <<= mux->shift;
> +
> + regmap_update_bits(clkr->regmap, mux->reg, mask, val);
> +}
> +
> +static int mux_safe_enable(struct clk_hw *hw)
> +{
> + struct clk_regmap_mux *mux = to_clk_regmap_mux(hw);
> + struct clk_regmap *clkr = to_clk_regmap(hw);
> + unsigned int mask = GENMASK(mux->width + mux->shift - 1, mux->shift);
> + unsigned int val;
> +
> + val = mux->stored_parent;
> + val <<= mux->shift;
> +
> + return regmap_update_bits(clkr->regmap, mux->reg, mask, val);
> +}
> +
> const struct clk_ops clk_regmap_mux_closest_ops = {
> .get_parent = mux_get_parent,
> .set_parent = mux_set_parent,
> .determine_rate = __clk_mux_determine_rate_closest,
> };
> EXPORT_SYMBOL_GPL(clk_regmap_mux_closest_ops);
> +
> +const struct clk_ops clk_regmap_mux_safe_ops = {
> + .enable = mux_safe_enable,
> + .disable = mux_safe_disable,
> + .get_parent = mux_safe_get_parent,
> + .set_parent = mux_safe_set_parent,
> + .determine_rate = __clk_mux_determine_rate_closest,
> +};
> +EXPORT_SYMBOL_GPL(clk_regmap_mux_safe_ops);
> diff --git a/drivers/clk/qcom/clk-regmap-mux.h b/drivers/clk/qcom/clk-regmap-mux.h
> index db6f4cdd9586..ab8ab25d79bd 100644
> --- a/drivers/clk/qcom/clk-regmap-mux.h
> +++ b/drivers/clk/qcom/clk-regmap-mux.h
> @@ -14,10 +14,13 @@ struct clk_regmap_mux {
> u32 reg;
> u32 shift;
> u32 width;
> + u8 safe_src_index;
> + u8 stored_parent;
> const struct parent_map *parent_map;
> struct clk_regmap clkr;
> };
>
> extern const struct clk_ops clk_regmap_mux_closest_ops;
> +extern const struct clk_ops clk_regmap_mux_safe_ops;
>
> #endif
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [RFC PATCH 2/5] clk: qcom: gcc-sm8450: use new clk_regmap_mux_safe_ops for PCIe pipe clocks
2022-03-13 0:08 [RFC PATCH 0/5] PCI: qcom: rework pipe_clk/pipe_clk_src handling Dmitry Baryshkov
2022-03-13 0:08 ` [RFC PATCH 1/5] clk: qcom: regmap-mux: add pipe clk implementation Dmitry Baryshkov
@ 2022-03-13 0:08 ` Dmitry Baryshkov
2022-03-13 17:08 ` Bjorn Andersson
2022-03-13 0:08 ` [RFC PATCH 3/5] clk: qcom: gcc-sc7280: " Dmitry Baryshkov
` (2 subsequent siblings)
4 siblings, 1 reply; 12+ messages in thread
From: Dmitry Baryshkov @ 2022-03-13 0:08 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Stephen Boyd, Michael Turquette,
Taniya Das, Lorenzo Pieralisi, Krzysztof Wilczyński,
Bjorn Helgaas
Cc: Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
Use newly defined clk_regmap_mux_safe_ops for PCIe pipe clocks to let
the clock framework automatically park the clock when the clock is
switched off and restore the parent when the clock is switched on.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/clk/qcom/gcc-sm8450.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/qcom/gcc-sm8450.c b/drivers/clk/qcom/gcc-sm8450.c
index 593a195467ff..a5323d20bc0d 100644
--- a/drivers/clk/qcom/gcc-sm8450.c
+++ b/drivers/clk/qcom/gcc-sm8450.c
@@ -243,13 +243,14 @@ static struct clk_regmap_mux gcc_pcie_0_pipe_clk_src = {
.reg = 0x7b060,
.shift = 0,
.width = 2,
+ .safe_src_index = 2,
.parent_map = gcc_parent_map_4,
.clkr = {
.hw.init = &(struct clk_init_data){
.name = "gcc_pcie_0_pipe_clk_src",
.parent_data = gcc_parent_data_4,
.num_parents = ARRAY_SIZE(gcc_parent_data_4),
- .ops = &clk_regmap_mux_closest_ops,
+ .ops = &clk_regmap_mux_safe_ops,
},
},
};
@@ -273,13 +274,14 @@ static struct clk_regmap_mux gcc_pcie_1_pipe_clk_src = {
.reg = 0x9d064,
.shift = 0,
.width = 2,
+ .safe_src_index = 2,
.parent_map = gcc_parent_map_6,
.clkr = {
.hw.init = &(struct clk_init_data){
.name = "gcc_pcie_1_pipe_clk_src",
.parent_data = gcc_parent_data_6,
.num_parents = ARRAY_SIZE(gcc_parent_data_6),
- .ops = &clk_regmap_mux_closest_ops,
+ .ops = &clk_regmap_mux_safe_ops,
},
},
};
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 2/5] clk: qcom: gcc-sm8450: use new clk_regmap_mux_safe_ops for PCIe pipe clocks
2022-03-13 0:08 ` [RFC PATCH 2/5] clk: qcom: gcc-sm8450: use new clk_regmap_mux_safe_ops for PCIe pipe clocks Dmitry Baryshkov
@ 2022-03-13 17:08 ` Bjorn Andersson
0 siblings, 0 replies; 12+ messages in thread
From: Bjorn Andersson @ 2022-03-13 17:08 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Andy Gross, Stephen Boyd, Michael Turquette, Taniya Das,
Lorenzo Pieralisi, Krzysztof Wilczy??ski, Bjorn Helgaas,
Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
On Sat 12 Mar 18:08 CST 2022, Dmitry Baryshkov wrote:
> Use newly defined clk_regmap_mux_safe_ops for PCIe pipe clocks to let
> the clock framework automatically park the clock when the clock is
> switched off and restore the parent when the clock is switched on.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
> ---
> drivers/clk/qcom/gcc-sm8450.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/clk/qcom/gcc-sm8450.c b/drivers/clk/qcom/gcc-sm8450.c
> index 593a195467ff..a5323d20bc0d 100644
> --- a/drivers/clk/qcom/gcc-sm8450.c
> +++ b/drivers/clk/qcom/gcc-sm8450.c
> @@ -243,13 +243,14 @@ static struct clk_regmap_mux gcc_pcie_0_pipe_clk_src = {
> .reg = 0x7b060,
> .shift = 0,
> .width = 2,
> + .safe_src_index = 2,
> .parent_map = gcc_parent_map_4,
> .clkr = {
> .hw.init = &(struct clk_init_data){
> .name = "gcc_pcie_0_pipe_clk_src",
> .parent_data = gcc_parent_data_4,
> .num_parents = ARRAY_SIZE(gcc_parent_data_4),
> - .ops = &clk_regmap_mux_closest_ops,
> + .ops = &clk_regmap_mux_safe_ops,
> },
> },
> };
> @@ -273,13 +274,14 @@ static struct clk_regmap_mux gcc_pcie_1_pipe_clk_src = {
> .reg = 0x9d064,
> .shift = 0,
> .width = 2,
> + .safe_src_index = 2,
> .parent_map = gcc_parent_map_6,
> .clkr = {
> .hw.init = &(struct clk_init_data){
> .name = "gcc_pcie_1_pipe_clk_src",
> .parent_data = gcc_parent_data_6,
> .num_parents = ARRAY_SIZE(gcc_parent_data_6),
> - .ops = &clk_regmap_mux_closest_ops,
> + .ops = &clk_regmap_mux_safe_ops,
> },
> },
> };
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [RFC PATCH 3/5] clk: qcom: gcc-sc7280: use new clk_regmap_mux_safe_ops for PCIe pipe clocks
2022-03-13 0:08 [RFC PATCH 0/5] PCI: qcom: rework pipe_clk/pipe_clk_src handling Dmitry Baryshkov
2022-03-13 0:08 ` [RFC PATCH 1/5] clk: qcom: regmap-mux: add pipe clk implementation Dmitry Baryshkov
2022-03-13 0:08 ` [RFC PATCH 2/5] clk: qcom: gcc-sm8450: use new clk_regmap_mux_safe_ops for PCIe pipe clocks Dmitry Baryshkov
@ 2022-03-13 0:08 ` Dmitry Baryshkov
2022-03-13 17:08 ` Bjorn Andersson
2022-03-16 0:07 ` Stephen Boyd
2022-03-13 0:08 ` [RFC PATCH 4/5] PCI: qcom: Remove unnecessary pipe_clk handling Dmitry Baryshkov
2022-03-13 0:08 ` [RFC PATCH 5/5] PCI: qcom: Drop manual pipe_clk_src handling Dmitry Baryshkov
4 siblings, 2 replies; 12+ messages in thread
From: Dmitry Baryshkov @ 2022-03-13 0:08 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Stephen Boyd, Michael Turquette,
Taniya Das, Lorenzo Pieralisi, Krzysztof Wilczyński,
Bjorn Helgaas
Cc: Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
Use newly defined clk_regmap_mux_safe_ops for PCIe pipe clocks to let
the clock framework automatically park the clock when the clock is
switched off and restore the parent when the clock is switched on.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/clk/qcom/gcc-sc7280.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/qcom/gcc-sc7280.c b/drivers/clk/qcom/gcc-sc7280.c
index 423627d49719..69887e45d02f 100644
--- a/drivers/clk/qcom/gcc-sc7280.c
+++ b/drivers/clk/qcom/gcc-sc7280.c
@@ -373,13 +373,14 @@ static struct clk_regmap_mux gcc_pcie_0_pipe_clk_src = {
.reg = 0x6b054,
.shift = 0,
.width = 2,
+ .safe_src_index = 2,
.parent_map = gcc_parent_map_6,
.clkr = {
.hw.init = &(struct clk_init_data){
.name = "gcc_pcie_0_pipe_clk_src",
.parent_data = gcc_parent_data_6,
.num_parents = ARRAY_SIZE(gcc_parent_data_6),
- .ops = &clk_regmap_mux_closest_ops,
+ .ops = &clk_regmap_mux_safe_ops,
},
},
};
@@ -388,13 +389,14 @@ static struct clk_regmap_mux gcc_pcie_1_pipe_clk_src = {
.reg = 0x8d054,
.shift = 0,
.width = 2,
+ .safe_src_index = 2,
.parent_map = gcc_parent_map_7,
.clkr = {
.hw.init = &(struct clk_init_data){
.name = "gcc_pcie_1_pipe_clk_src",
.parent_data = gcc_parent_data_7,
.num_parents = ARRAY_SIZE(gcc_parent_data_7),
- .ops = &clk_regmap_mux_closest_ops,
+ .ops = &clk_regmap_mux_safe_ops,
},
},
};
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 3/5] clk: qcom: gcc-sc7280: use new clk_regmap_mux_safe_ops for PCIe pipe clocks
2022-03-13 0:08 ` [RFC PATCH 3/5] clk: qcom: gcc-sc7280: " Dmitry Baryshkov
@ 2022-03-13 17:08 ` Bjorn Andersson
2022-03-16 0:07 ` Stephen Boyd
1 sibling, 0 replies; 12+ messages in thread
From: Bjorn Andersson @ 2022-03-13 17:08 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Andy Gross, Stephen Boyd, Michael Turquette, Taniya Das,
Lorenzo Pieralisi, Krzysztof Wilczy??ski, Bjorn Helgaas,
Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
On Sat 12 Mar 18:08 CST 2022, Dmitry Baryshkov wrote:
> Use newly defined clk_regmap_mux_safe_ops for PCIe pipe clocks to let
> the clock framework automatically park the clock when the clock is
> switched off and restore the parent when the clock is switched on.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Regards,
Bjorn
> ---
> drivers/clk/qcom/gcc-sc7280.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/clk/qcom/gcc-sc7280.c b/drivers/clk/qcom/gcc-sc7280.c
> index 423627d49719..69887e45d02f 100644
> --- a/drivers/clk/qcom/gcc-sc7280.c
> +++ b/drivers/clk/qcom/gcc-sc7280.c
> @@ -373,13 +373,14 @@ static struct clk_regmap_mux gcc_pcie_0_pipe_clk_src = {
> .reg = 0x6b054,
> .shift = 0,
> .width = 2,
> + .safe_src_index = 2,
> .parent_map = gcc_parent_map_6,
> .clkr = {
> .hw.init = &(struct clk_init_data){
> .name = "gcc_pcie_0_pipe_clk_src",
> .parent_data = gcc_parent_data_6,
> .num_parents = ARRAY_SIZE(gcc_parent_data_6),
> - .ops = &clk_regmap_mux_closest_ops,
> + .ops = &clk_regmap_mux_safe_ops,
> },
> },
> };
> @@ -388,13 +389,14 @@ static struct clk_regmap_mux gcc_pcie_1_pipe_clk_src = {
> .reg = 0x8d054,
> .shift = 0,
> .width = 2,
> + .safe_src_index = 2,
> .parent_map = gcc_parent_map_7,
> .clkr = {
> .hw.init = &(struct clk_init_data){
> .name = "gcc_pcie_1_pipe_clk_src",
> .parent_data = gcc_parent_data_7,
> .num_parents = ARRAY_SIZE(gcc_parent_data_7),
> - .ops = &clk_regmap_mux_closest_ops,
> + .ops = &clk_regmap_mux_safe_ops,
> },
> },
> };
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 3/5] clk: qcom: gcc-sc7280: use new clk_regmap_mux_safe_ops for PCIe pipe clocks
2022-03-13 0:08 ` [RFC PATCH 3/5] clk: qcom: gcc-sc7280: " Dmitry Baryshkov
2022-03-13 17:08 ` Bjorn Andersson
@ 2022-03-16 0:07 ` Stephen Boyd
1 sibling, 0 replies; 12+ messages in thread
From: Stephen Boyd @ 2022-03-16 0:07 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Bjorn Helgaas, Dmitry Baryshkov,
Krzysztof Wilczyński, Lorenzo Pieralisi, Michael Turquette,
Taniya Das
Cc: Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
Quoting Dmitry Baryshkov (2022-03-12 16:08:22)
> Use newly defined clk_regmap_mux_safe_ops for PCIe pipe clocks to let
> the clock framework automatically park the clock when the clock is
> switched off and restore the parent when the clock is switched on.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/clk/qcom/gcc-sc7280.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/clk/qcom/gcc-sc7280.c b/drivers/clk/qcom/gcc-sc7280.c
> index 423627d49719..69887e45d02f 100644
> --- a/drivers/clk/qcom/gcc-sc7280.c
> +++ b/drivers/clk/qcom/gcc-sc7280.c
> @@ -373,13 +373,14 @@ static struct clk_regmap_mux gcc_pcie_0_pipe_clk_src = {
> .reg = 0x6b054,
> .shift = 0,
> .width = 2,
> + .safe_src_index = 2,
Can this be
.safe_src_index = gcc_parent_map_6[1].cfg
or something that indicates that this is a value inside the parent map
and not an array index?
^ permalink raw reply [flat|nested] 12+ messages in thread
* [RFC PATCH 4/5] PCI: qcom: Remove unnecessary pipe_clk handling
2022-03-13 0:08 [RFC PATCH 0/5] PCI: qcom: rework pipe_clk/pipe_clk_src handling Dmitry Baryshkov
` (2 preceding siblings ...)
2022-03-13 0:08 ` [RFC PATCH 3/5] clk: qcom: gcc-sc7280: " Dmitry Baryshkov
@ 2022-03-13 0:08 ` Dmitry Baryshkov
2022-03-13 17:06 ` Bjorn Andersson
2022-03-13 0:08 ` [RFC PATCH 5/5] PCI: qcom: Drop manual pipe_clk_src handling Dmitry Baryshkov
4 siblings, 1 reply; 12+ messages in thread
From: Dmitry Baryshkov @ 2022-03-13 0:08 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Stephen Boyd, Michael Turquette,
Taniya Das, Lorenzo Pieralisi, Krzysztof Wilczyński,
Bjorn Helgaas
Cc: Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
QMP PHY driver already does clk_prepare_enable()/_disable() pipe_clk.
Remove extra calls to enable/disable this clock from the PCIe driver, so
that the PHY driver can manage the clock on its own.
Fixes: aa9c0df98c29 ("PCI: qcom: Switch pcie_1_pipe_clk_src after PHY init in SC7280")
Cc: Prasad Malisetty <quic_pmaliset@quicinc.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/pci/controller/dwc/pcie-qcom.c | 50 ++------------------------
1 file changed, 3 insertions(+), 47 deletions(-)
diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
index 6ab90891801d..a6becafb6a77 100644
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
@@ -128,7 +128,6 @@ struct qcom_pcie_resources_2_3_2 {
struct clk *master_clk;
struct clk *slave_clk;
struct clk *cfg_clk;
- struct clk *pipe_clk;
struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY];
};
@@ -165,7 +164,6 @@ struct qcom_pcie_resources_2_7_0 {
int num_clks;
struct regulator_bulk_data supplies[2];
struct reset_control *pci_reset;
- struct clk *pipe_clk;
struct clk *pipe_clk_src;
struct clk *phy_pipe_clk;
struct clk *ref_clk_src;
@@ -597,8 +595,7 @@ static int qcom_pcie_get_resources_2_3_2(struct qcom_pcie *pcie)
if (IS_ERR(res->slave_clk))
return PTR_ERR(res->slave_clk);
- res->pipe_clk = devm_clk_get(dev, "pipe");
- return PTR_ERR_OR_ZERO(res->pipe_clk);
+ return 0;
}
static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie)
@@ -613,13 +610,6 @@ static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie)
regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
}
-static void qcom_pcie_post_deinit_2_3_2(struct qcom_pcie *pcie)
-{
- struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
-
- clk_disable_unprepare(res->pipe_clk);
-}
-
static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie)
{
struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
@@ -694,22 +684,6 @@ static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie)
return ret;
}
-static int qcom_pcie_post_init_2_3_2(struct qcom_pcie *pcie)
-{
- struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
- struct dw_pcie *pci = pcie->pci;
- struct device *dev = pci->dev;
- int ret;
-
- ret = clk_prepare_enable(res->pipe_clk);
- if (ret) {
- dev_err(dev, "cannot prepare/enable pipe clock\n");
- return ret;
- }
-
- return 0;
-}
-
static int qcom_pcie_get_resources_2_4_0(struct qcom_pcie *pcie)
{
struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0;
@@ -1198,8 +1172,7 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie)
return PTR_ERR(res->ref_clk_src);
}
- res->pipe_clk = devm_clk_get(dev, "pipe");
- return PTR_ERR_OR_ZERO(res->pipe_clk);
+ return 0;
}
static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie)
@@ -1238,12 +1211,6 @@ static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie)
goto err_disable_clocks;
}
- ret = clk_prepare_enable(res->pipe_clk);
- if (ret) {
- dev_err(dev, "cannot prepare/enable pipe clock\n");
- goto err_disable_clocks;
- }
-
/* Wait for reset to complete, required on SM8450 */
usleep_range(1000, 1500);
@@ -1298,14 +1265,7 @@ static int qcom_pcie_post_init_2_7_0(struct qcom_pcie *pcie)
if (pcie->cfg->pipe_clk_need_muxing)
clk_set_parent(res->pipe_clk_src, res->phy_pipe_clk);
- return clk_prepare_enable(res->pipe_clk);
-}
-
-static void qcom_pcie_post_deinit_2_7_0(struct qcom_pcie *pcie)
-{
- struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0;
-
- clk_disable_unprepare(res->pipe_clk);
+ return 0;
}
static int qcom_pcie_link_up(struct dw_pcie *pci)
@@ -1455,9 +1415,7 @@ static const struct qcom_pcie_ops ops_1_0_0 = {
static const struct qcom_pcie_ops ops_2_3_2 = {
.get_resources = qcom_pcie_get_resources_2_3_2,
.init = qcom_pcie_init_2_3_2,
- .post_init = qcom_pcie_post_init_2_3_2,
.deinit = qcom_pcie_deinit_2_3_2,
- .post_deinit = qcom_pcie_post_deinit_2_3_2,
.ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
};
@@ -1484,7 +1442,6 @@ static const struct qcom_pcie_ops ops_2_7_0 = {
.deinit = qcom_pcie_deinit_2_7_0,
.ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
.post_init = qcom_pcie_post_init_2_7_0,
- .post_deinit = qcom_pcie_post_deinit_2_7_0,
};
/* Qcom IP rev.: 1.9.0 */
@@ -1494,7 +1451,6 @@ static const struct qcom_pcie_ops ops_1_9_0 = {
.deinit = qcom_pcie_deinit_2_7_0,
.ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
.post_init = qcom_pcie_post_init_2_7_0,
- .post_deinit = qcom_pcie_post_deinit_2_7_0,
.config_sid = qcom_pcie_config_sid_sm8250,
};
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 4/5] PCI: qcom: Remove unnecessary pipe_clk handling
2022-03-13 0:08 ` [RFC PATCH 4/5] PCI: qcom: Remove unnecessary pipe_clk handling Dmitry Baryshkov
@ 2022-03-13 17:06 ` Bjorn Andersson
0 siblings, 0 replies; 12+ messages in thread
From: Bjorn Andersson @ 2022-03-13 17:06 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Andy Gross, Stephen Boyd, Michael Turquette, Taniya Das,
Lorenzo Pieralisi, Krzysztof Wilczy??ski, Bjorn Helgaas,
Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
On Sat 12 Mar 18:08 CST 2022, Dmitry Baryshkov wrote:
> QMP PHY driver already does clk_prepare_enable()/_disable() pipe_clk.
> Remove extra calls to enable/disable this clock from the PCIe driver, so
> that the PHY driver can manage the clock on its own.
>
> Fixes: aa9c0df98c29 ("PCI: qcom: Switch pcie_1_pipe_clk_src after PHY init in SC7280")
> Cc: Prasad Malisetty <quic_pmaliset@quicinc.com>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Regards,
Bjorn
> ---
> drivers/pci/controller/dwc/pcie-qcom.c | 50 ++------------------------
> 1 file changed, 3 insertions(+), 47 deletions(-)
>
> diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
> index 6ab90891801d..a6becafb6a77 100644
> --- a/drivers/pci/controller/dwc/pcie-qcom.c
> +++ b/drivers/pci/controller/dwc/pcie-qcom.c
> @@ -128,7 +128,6 @@ struct qcom_pcie_resources_2_3_2 {
> struct clk *master_clk;
> struct clk *slave_clk;
> struct clk *cfg_clk;
> - struct clk *pipe_clk;
> struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY];
> };
>
> @@ -165,7 +164,6 @@ struct qcom_pcie_resources_2_7_0 {
> int num_clks;
> struct regulator_bulk_data supplies[2];
> struct reset_control *pci_reset;
> - struct clk *pipe_clk;
> struct clk *pipe_clk_src;
> struct clk *phy_pipe_clk;
> struct clk *ref_clk_src;
> @@ -597,8 +595,7 @@ static int qcom_pcie_get_resources_2_3_2(struct qcom_pcie *pcie)
> if (IS_ERR(res->slave_clk))
> return PTR_ERR(res->slave_clk);
>
> - res->pipe_clk = devm_clk_get(dev, "pipe");
> - return PTR_ERR_OR_ZERO(res->pipe_clk);
> + return 0;
> }
>
> static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie)
> @@ -613,13 +610,6 @@ static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie)
> regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
> }
>
> -static void qcom_pcie_post_deinit_2_3_2(struct qcom_pcie *pcie)
> -{
> - struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
> -
> - clk_disable_unprepare(res->pipe_clk);
> -}
> -
> static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie)
> {
> struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
> @@ -694,22 +684,6 @@ static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie)
> return ret;
> }
>
> -static int qcom_pcie_post_init_2_3_2(struct qcom_pcie *pcie)
> -{
> - struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
> - struct dw_pcie *pci = pcie->pci;
> - struct device *dev = pci->dev;
> - int ret;
> -
> - ret = clk_prepare_enable(res->pipe_clk);
> - if (ret) {
> - dev_err(dev, "cannot prepare/enable pipe clock\n");
> - return ret;
> - }
> -
> - return 0;
> -}
> -
> static int qcom_pcie_get_resources_2_4_0(struct qcom_pcie *pcie)
> {
> struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0;
> @@ -1198,8 +1172,7 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie)
> return PTR_ERR(res->ref_clk_src);
> }
>
> - res->pipe_clk = devm_clk_get(dev, "pipe");
> - return PTR_ERR_OR_ZERO(res->pipe_clk);
> + return 0;
> }
>
> static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie)
> @@ -1238,12 +1211,6 @@ static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie)
> goto err_disable_clocks;
> }
>
> - ret = clk_prepare_enable(res->pipe_clk);
> - if (ret) {
> - dev_err(dev, "cannot prepare/enable pipe clock\n");
> - goto err_disable_clocks;
> - }
> -
> /* Wait for reset to complete, required on SM8450 */
> usleep_range(1000, 1500);
>
> @@ -1298,14 +1265,7 @@ static int qcom_pcie_post_init_2_7_0(struct qcom_pcie *pcie)
> if (pcie->cfg->pipe_clk_need_muxing)
> clk_set_parent(res->pipe_clk_src, res->phy_pipe_clk);
>
> - return clk_prepare_enable(res->pipe_clk);
> -}
> -
> -static void qcom_pcie_post_deinit_2_7_0(struct qcom_pcie *pcie)
> -{
> - struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0;
> -
> - clk_disable_unprepare(res->pipe_clk);
> + return 0;
> }
>
> static int qcom_pcie_link_up(struct dw_pcie *pci)
> @@ -1455,9 +1415,7 @@ static const struct qcom_pcie_ops ops_1_0_0 = {
> static const struct qcom_pcie_ops ops_2_3_2 = {
> .get_resources = qcom_pcie_get_resources_2_3_2,
> .init = qcom_pcie_init_2_3_2,
> - .post_init = qcom_pcie_post_init_2_3_2,
> .deinit = qcom_pcie_deinit_2_3_2,
> - .post_deinit = qcom_pcie_post_deinit_2_3_2,
> .ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
> };
>
> @@ -1484,7 +1442,6 @@ static const struct qcom_pcie_ops ops_2_7_0 = {
> .deinit = qcom_pcie_deinit_2_7_0,
> .ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
> .post_init = qcom_pcie_post_init_2_7_0,
> - .post_deinit = qcom_pcie_post_deinit_2_7_0,
> };
>
> /* Qcom IP rev.: 1.9.0 */
> @@ -1494,7 +1451,6 @@ static const struct qcom_pcie_ops ops_1_9_0 = {
> .deinit = qcom_pcie_deinit_2_7_0,
> .ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
> .post_init = qcom_pcie_post_init_2_7_0,
> - .post_deinit = qcom_pcie_post_deinit_2_7_0,
> .config_sid = qcom_pcie_config_sid_sm8250,
> };
>
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [RFC PATCH 5/5] PCI: qcom: Drop manual pipe_clk_src handling
2022-03-13 0:08 [RFC PATCH 0/5] PCI: qcom: rework pipe_clk/pipe_clk_src handling Dmitry Baryshkov
` (3 preceding siblings ...)
2022-03-13 0:08 ` [RFC PATCH 4/5] PCI: qcom: Remove unnecessary pipe_clk handling Dmitry Baryshkov
@ 2022-03-13 0:08 ` Dmitry Baryshkov
2022-03-13 17:07 ` Bjorn Andersson
4 siblings, 1 reply; 12+ messages in thread
From: Dmitry Baryshkov @ 2022-03-13 0:08 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson, Stephen Boyd, Michael Turquette,
Taniya Das, Lorenzo Pieralisi, Krzysztof Wilczyński,
Bjorn Helgaas
Cc: Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
Manual reparenting of pipe_clk_src is being replaced with the parking of
the clock with clk_disable()/clk_enable(). Drop redundant code letting
the pipe clock driver park the clock to the safe bi_tcxo parent
automatically.
Cc: Prasad Malisetty <quic_pmaliset@quicinc.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/pci/controller/dwc/pcie-qcom.c | 39 +-------------------------
1 file changed, 1 insertion(+), 38 deletions(-)
diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
index a6becafb6a77..b48c899bcc97 100644
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
@@ -164,9 +164,6 @@ struct qcom_pcie_resources_2_7_0 {
int num_clks;
struct regulator_bulk_data supplies[2];
struct reset_control *pci_reset;
- struct clk *pipe_clk_src;
- struct clk *phy_pipe_clk;
- struct clk *ref_clk_src;
};
union qcom_pcie_resources {
@@ -192,7 +189,6 @@ struct qcom_pcie_ops {
struct qcom_pcie_cfg {
const struct qcom_pcie_ops *ops;
- unsigned int pipe_clk_need_muxing:1;
unsigned int has_tbu_clk:1;
unsigned int has_ddrss_sf_tbu_clk:1;
unsigned int has_aggre0_clk:1;
@@ -1158,20 +1154,6 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie)
if (ret < 0)
return ret;
- if (pcie->cfg->pipe_clk_need_muxing) {
- res->pipe_clk_src = devm_clk_get(dev, "pipe_mux");
- if (IS_ERR(res->pipe_clk_src))
- return PTR_ERR(res->pipe_clk_src);
-
- res->phy_pipe_clk = devm_clk_get(dev, "phy_pipe");
- if (IS_ERR(res->phy_pipe_clk))
- return PTR_ERR(res->phy_pipe_clk);
-
- res->ref_clk_src = devm_clk_get(dev, "ref");
- if (IS_ERR(res->ref_clk_src))
- return PTR_ERR(res->ref_clk_src);
- }
-
return 0;
}
@@ -1189,10 +1171,6 @@ static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie)
return ret;
}
- /* Set TCXO as clock source for pcie_pipe_clk_src */
- if (pcie->cfg->pipe_clk_need_muxing)
- clk_set_parent(res->pipe_clk_src, res->ref_clk_src);
-
ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
if (ret < 0)
goto err_disable_regulators;
@@ -1254,18 +1232,8 @@ static void qcom_pcie_deinit_2_7_0(struct qcom_pcie *pcie)
struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0;
clk_bulk_disable_unprepare(res->num_clks, res->clks);
- regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
-}
-static int qcom_pcie_post_init_2_7_0(struct qcom_pcie *pcie)
-{
- struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0;
-
- /* Set pipe clock as clock source for pcie_pipe_clk_src */
- if (pcie->cfg->pipe_clk_need_muxing)
- clk_set_parent(res->pipe_clk_src, res->phy_pipe_clk);
-
- return 0;
+ regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
}
static int qcom_pcie_link_up(struct dw_pcie *pci)
@@ -1441,7 +1409,6 @@ static const struct qcom_pcie_ops ops_2_7_0 = {
.init = qcom_pcie_init_2_7_0,
.deinit = qcom_pcie_deinit_2_7_0,
.ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
- .post_init = qcom_pcie_post_init_2_7_0,
};
/* Qcom IP rev.: 1.9.0 */
@@ -1450,7 +1417,6 @@ static const struct qcom_pcie_ops ops_1_9_0 = {
.init = qcom_pcie_init_2_7_0,
.deinit = qcom_pcie_deinit_2_7_0,
.ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
- .post_init = qcom_pcie_post_init_2_7_0,
.config_sid = qcom_pcie_config_sid_sm8250,
};
@@ -1488,7 +1454,6 @@ static const struct qcom_pcie_cfg sm8250_cfg = {
static const struct qcom_pcie_cfg sm8450_pcie0_cfg = {
.ops = &ops_1_9_0,
.has_ddrss_sf_tbu_clk = true,
- .pipe_clk_need_muxing = true,
.has_aggre0_clk = true,
.has_aggre1_clk = true,
};
@@ -1496,14 +1461,12 @@ static const struct qcom_pcie_cfg sm8450_pcie0_cfg = {
static const struct qcom_pcie_cfg sm8450_pcie1_cfg = {
.ops = &ops_1_9_0,
.has_ddrss_sf_tbu_clk = true,
- .pipe_clk_need_muxing = true,
.has_aggre1_clk = true,
};
static const struct qcom_pcie_cfg sc7280_cfg = {
.ops = &ops_1_9_0,
.has_tbu_clk = true,
- .pipe_clk_need_muxing = true,
};
static const struct dw_pcie_ops dw_pcie_ops = {
--
2.34.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 5/5] PCI: qcom: Drop manual pipe_clk_src handling
2022-03-13 0:08 ` [RFC PATCH 5/5] PCI: qcom: Drop manual pipe_clk_src handling Dmitry Baryshkov
@ 2022-03-13 17:07 ` Bjorn Andersson
0 siblings, 0 replies; 12+ messages in thread
From: Bjorn Andersson @ 2022-03-13 17:07 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Andy Gross, Stephen Boyd, Michael Turquette, Taniya Das,
Lorenzo Pieralisi, Krzysztof Wilczy??ski, Bjorn Helgaas,
Prasad Malisetty, linux-arm-msm, linux-clk, linux-pci
On Sat 12 Mar 18:08 CST 2022, Dmitry Baryshkov wrote:
> Manual reparenting of pipe_clk_src is being replaced with the parking of
> the clock with clk_disable()/clk_enable(). Drop redundant code letting
> the pipe clock driver park the clock to the safe bi_tcxo parent
> automatically.
>
> Cc: Prasad Malisetty <quic_pmaliset@quicinc.com>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Regards,
Bjorn
> ---
> drivers/pci/controller/dwc/pcie-qcom.c | 39 +-------------------------
> 1 file changed, 1 insertion(+), 38 deletions(-)
>
> diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
> index a6becafb6a77..b48c899bcc97 100644
> --- a/drivers/pci/controller/dwc/pcie-qcom.c
> +++ b/drivers/pci/controller/dwc/pcie-qcom.c
> @@ -164,9 +164,6 @@ struct qcom_pcie_resources_2_7_0 {
> int num_clks;
> struct regulator_bulk_data supplies[2];
> struct reset_control *pci_reset;
> - struct clk *pipe_clk_src;
> - struct clk *phy_pipe_clk;
> - struct clk *ref_clk_src;
> };
>
> union qcom_pcie_resources {
> @@ -192,7 +189,6 @@ struct qcom_pcie_ops {
>
> struct qcom_pcie_cfg {
> const struct qcom_pcie_ops *ops;
> - unsigned int pipe_clk_need_muxing:1;
> unsigned int has_tbu_clk:1;
> unsigned int has_ddrss_sf_tbu_clk:1;
> unsigned int has_aggre0_clk:1;
> @@ -1158,20 +1154,6 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie)
> if (ret < 0)
> return ret;
>
> - if (pcie->cfg->pipe_clk_need_muxing) {
> - res->pipe_clk_src = devm_clk_get(dev, "pipe_mux");
> - if (IS_ERR(res->pipe_clk_src))
> - return PTR_ERR(res->pipe_clk_src);
> -
> - res->phy_pipe_clk = devm_clk_get(dev, "phy_pipe");
> - if (IS_ERR(res->phy_pipe_clk))
> - return PTR_ERR(res->phy_pipe_clk);
> -
> - res->ref_clk_src = devm_clk_get(dev, "ref");
> - if (IS_ERR(res->ref_clk_src))
> - return PTR_ERR(res->ref_clk_src);
> - }
> -
> return 0;
> }
>
> @@ -1189,10 +1171,6 @@ static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie)
> return ret;
> }
>
> - /* Set TCXO as clock source for pcie_pipe_clk_src */
> - if (pcie->cfg->pipe_clk_need_muxing)
> - clk_set_parent(res->pipe_clk_src, res->ref_clk_src);
> -
> ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
> if (ret < 0)
> goto err_disable_regulators;
> @@ -1254,18 +1232,8 @@ static void qcom_pcie_deinit_2_7_0(struct qcom_pcie *pcie)
> struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0;
>
> clk_bulk_disable_unprepare(res->num_clks, res->clks);
> - regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
> -}
>
> -static int qcom_pcie_post_init_2_7_0(struct qcom_pcie *pcie)
> -{
> - struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0;
> -
> - /* Set pipe clock as clock source for pcie_pipe_clk_src */
> - if (pcie->cfg->pipe_clk_need_muxing)
> - clk_set_parent(res->pipe_clk_src, res->phy_pipe_clk);
> -
> - return 0;
> + regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
> }
>
> static int qcom_pcie_link_up(struct dw_pcie *pci)
> @@ -1441,7 +1409,6 @@ static const struct qcom_pcie_ops ops_2_7_0 = {
> .init = qcom_pcie_init_2_7_0,
> .deinit = qcom_pcie_deinit_2_7_0,
> .ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
> - .post_init = qcom_pcie_post_init_2_7_0,
> };
>
> /* Qcom IP rev.: 1.9.0 */
> @@ -1450,7 +1417,6 @@ static const struct qcom_pcie_ops ops_1_9_0 = {
> .init = qcom_pcie_init_2_7_0,
> .deinit = qcom_pcie_deinit_2_7_0,
> .ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
> - .post_init = qcom_pcie_post_init_2_7_0,
> .config_sid = qcom_pcie_config_sid_sm8250,
> };
>
> @@ -1488,7 +1454,6 @@ static const struct qcom_pcie_cfg sm8250_cfg = {
> static const struct qcom_pcie_cfg sm8450_pcie0_cfg = {
> .ops = &ops_1_9_0,
> .has_ddrss_sf_tbu_clk = true,
> - .pipe_clk_need_muxing = true,
> .has_aggre0_clk = true,
> .has_aggre1_clk = true,
> };
> @@ -1496,14 +1461,12 @@ static const struct qcom_pcie_cfg sm8450_pcie0_cfg = {
> static const struct qcom_pcie_cfg sm8450_pcie1_cfg = {
> .ops = &ops_1_9_0,
> .has_ddrss_sf_tbu_clk = true,
> - .pipe_clk_need_muxing = true,
> .has_aggre1_clk = true,
> };
>
> static const struct qcom_pcie_cfg sc7280_cfg = {
> .ops = &ops_1_9_0,
> .has_tbu_clk = true,
> - .pipe_clk_need_muxing = true,
> };
>
> static const struct dw_pcie_ops dw_pcie_ops = {
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 12+ messages in thread