From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: Andy Gross <agross@kernel.org>,
Stephen Boyd <swboyd@chromium.org>,
Michael Turquette <mturquette@baylibre.com>,
Taniya Das <tdas@codeaurora.org>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Krzysztof Wilczy??ski <kw@linux.com>,
Bjorn Helgaas <bhelgaas@google.com>,
Prasad Malisetty <quic_pmaliset@quicinc.com>,
linux-arm-msm@vger.kernel.org, linux-clk@vger.kernel.org,
linux-pci@vger.kernel.org
Subject: Re: [RFC PATCH 1/5] clk: qcom: regmap-mux: add pipe clk implementation
Date: Sun, 13 Mar 2022 12:14:10 -0500 [thread overview]
Message-ID: <Yi4mYqEaWIIav5rg@builder.lan> (raw)
In-Reply-To: <20220313000824.229405-2-dmitry.baryshkov@linaro.org>
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
>
next prev parent reply other threads:[~2022-03-13 17:14 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
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 17:14 ` Bjorn Andersson [this message]
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
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
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
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Yi4mYqEaWIIav5rg@builder.lan \
--to=bjorn.andersson@linaro.org \
--cc=agross@kernel.org \
--cc=bhelgaas@google.com \
--cc=dmitry.baryshkov@linaro.org \
--cc=kw@linux.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=mturquette@baylibre.com \
--cc=quic_pmaliset@quicinc.com \
--cc=swboyd@chromium.org \
--cc=tdas@codeaurora.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.