From: Johan Hovold <johan@kernel.org>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: "Andy Gross" <agross@kernel.org>,
"Bjorn Andersson" <bjorn.andersson@linaro.org>,
"Stephen Boyd" <swboyd@chromium.org>,
"Michael Turquette" <mturquette@baylibre.com>,
"Taniya Das" <quic_tdas@quicinc.com>,
"Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>,
"Krzysztof Wilczyński" <kw@linux.com>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Prasad Malisetty" <quic_pmaliset@quicinc.com>,
"Johan Hovold" <johan+linaro@kernel.org>,
linux-arm-msm@vger.kernel.org, linux-clk@vger.kernel.org,
linux-pci@vger.kernel.org
Subject: Re: [PATCH v4 2/5] clk: qcom: regmap: add pipe clk implementation
Date: Fri, 6 May 2022 14:31:04 +0200 [thread overview]
Message-ID: <YnUVCCXybHUSAYx2@hovoldconsulting.com> (raw)
In-Reply-To: <20220501192149.4128158-3-dmitry.baryshkov@linaro.org>
On Sun, May 01, 2022 at 10:21:46PM +0300, Dmitry Baryshkov wrote:
> On recent Qualcomm platforms the QMP PIPE clocks feed into a set of
> muxes which 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 by reparenting the gcc_pipe_N_clk_src
> clock. However the same code sequence should be applied in the
> pcie-qcom endpoint, 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. Suppliement the regmap-mux with
> the new regmap-pipe implementation, which hides multiplexer behind
> simple branch-like clock. This is possible since each of this
> multiplexers has just two clock sources: working (pipe) and safe
> (bi_tcxo) clock sources. If the clock is running off the external pipe
> source, report it as enable and report it as disabled otherwise.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
I think this is much better and it addresses most of my concerns with
the previous approach by keeping things simple and using a dedicated
implementation (i.e. separate from regmap-mux).
The purpose of the clock implementation can be documented in the source
and is reflected in the naming. It avoids the issues related to the
caching (locking and deferred muxing) which wasn't really needed in the
first place as these muxes are binary.
By implementing is_enabled() you also allow for inspecting the state
that the boot firmware left the mux in.
The only thing that comes to mind that wouldn't be possible is to
set the mux state using an assigned clock parent in devicetree to make
sure that XO is always selected before toggling the GDSC at probe.
But since that doesn't seem to work anyway when the boot firmware has
set things up (e.g. causes a modem here to reset) that would probably
need to be handled in the GDSC driver anyway (i.e. make sure the source
is XO before enabling the GDSC but only when it was actually disabled).
Taking that one step further would be to implement all this in the GDSC
driver from the start so that the PHY PLL is always muxed in while the
power domain is enabled (and only then)...
> ---
> drivers/clk/qcom/Makefile | 1 +
> drivers/clk/qcom/clk-regmap-pipe.c | 62 ++++++++++++++++++++++++++++++
> drivers/clk/qcom/clk-regmap-pipe.h | 24 ++++++++++++
> 3 files changed, 87 insertions(+)
> create mode 100644 drivers/clk/qcom/clk-regmap-pipe.c
> create mode 100644 drivers/clk/qcom/clk-regmap-pipe.h
>
> diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
> index 671cf5821af1..882c8ecc2e93 100644
> --- a/drivers/clk/qcom/Makefile
> +++ b/drivers/clk/qcom/Makefile
> @@ -11,6 +11,7 @@ clk-qcom-y += clk-branch.o
> clk-qcom-y += clk-regmap-divider.o
> clk-qcom-y += clk-regmap-mux.o
> clk-qcom-y += clk-regmap-mux-div.o
> +clk-qcom-y += clk-regmap-pipe.o
> clk-qcom-$(CONFIG_KRAIT_CLOCKS) += clk-krait.o
> clk-qcom-y += clk-hfpll.o
> clk-qcom-y += reset.o
> diff --git a/drivers/clk/qcom/clk-regmap-pipe.c b/drivers/clk/qcom/clk-regmap-pipe.c
> new file mode 100644
> index 000000000000..9a7c27cc644b
> --- /dev/null
> +++ b/drivers/clk/qcom/clk-regmap-pipe.c
> @@ -0,0 +1,62 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2022, Linaro Ltd.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/bitops.h>
> +#include <linux/regmap.h>
> +#include <linux/export.h>
> +
> +#include "clk-regmap-pipe.h"
> +
> +static inline struct clk_regmap_pipe *to_clk_regmap_pipe(struct clk_hw *hw)
> +{
> + return container_of(to_clk_regmap(hw), struct clk_regmap_pipe, clkr);
> +}
> +
> +static int pipe_is_enabled(struct clk_hw *hw)
> +{
> + struct clk_regmap_pipe *pipe = to_clk_regmap_pipe(hw);
Since pipe is so overloaded already can we call this "pipe_mux" or
"pipe_src" instead of just "pipe"?
And similarly for
pipe_mux_is_enabled()
struct clk_regmap_pipe_mux
struct clk_regmap_pipe_mux_ops
etc.
> + struct clk_regmap *clkr = to_clk_regmap(hw);
> + unsigned int mask = GENMASK(pipe->width + pipe->shift - 1, pipe->shift);
> + unsigned int val;
> +
> + regmap_read(clkr->regmap, pipe->reg, &val);
> + val = (val & mask) >> pipe->shift;
> +
> + WARN_ON(unlikely(val != pipe->enable_val && val != pipe->disable_val));
This is not a hot path and there's rarely a need for unlikely().
> +
> + return val == pipe->enable_val;
> +}
Johan
next prev parent reply other threads:[~2022-05-06 12:31 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-01 19:21 [PATCH v4 0/5] PCI: qcom: Rework pipe_clk/pipe_clk_src handling Dmitry Baryshkov
2022-05-01 19:21 ` [PATCH v4 1/5] PCI: qcom: Remove unnecessary pipe_clk handling Dmitry Baryshkov
2022-05-02 10:13 ` Manivannan Sadhasivam
2022-05-09 9:41 ` Johan Hovold
2022-05-01 19:21 ` [PATCH v4 2/5] clk: qcom: regmap: add pipe clk implementation Dmitry Baryshkov
2022-05-02 10:10 ` Manivannan Sadhasivam
2022-05-02 10:35 ` Dmitry Baryshkov
2022-05-02 11:10 ` Manivannan Sadhasivam
2022-05-02 11:18 ` Dmitry Baryshkov
2022-05-02 15:06 ` Manivannan Sadhasivam
2022-05-02 15:24 ` Dmitry Baryshkov
2022-05-06 12:54 ` Johan Hovold
2022-05-06 15:25 ` Manivannan Sadhasivam
2022-05-06 12:40 ` Johan Hovold
2022-05-06 13:00 ` Dmitry Baryshkov
2022-05-09 10:29 ` Johan Hovold
2022-05-11 14:17 ` Dmitry Baryshkov
2022-05-13 8:22 ` Johan Hovold
2022-05-11 14:34 ` Manivannan Sadhasivam
2022-05-06 12:31 ` Johan Hovold [this message]
2022-05-06 12:40 ` Dmitry Baryshkov
2022-05-09 10:28 ` Johan Hovold
2022-05-09 10:17 ` Johan Hovold
2022-05-01 19:21 ` [PATCH v4 3/5] clk: qcom: gcc-sm8450: use new clk_regmap_pipe_ops for PCIe pipe clocks Dmitry Baryshkov
2022-05-01 19:21 ` [PATCH v4 4/5] clk: qcom: gcc-sc7280: " Dmitry Baryshkov
2022-05-01 19:21 ` [PATCH v4 5/5] PCI: qcom: Drop manual pipe_clk_src handling Dmitry Baryshkov
2022-05-09 10:24 ` Johan Hovold
2022-05-11 13:19 ` [PATCH v4 0/5] PCI: qcom: Rework pipe_clk/pipe_clk_src handling Lorenzo Pieralisi
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=YnUVCCXybHUSAYx2@hovoldconsulting.com \
--to=johan@kernel.org \
--cc=agross@kernel.org \
--cc=bhelgaas@google.com \
--cc=bjorn.andersson@linaro.org \
--cc=dmitry.baryshkov@linaro.org \
--cc=johan+linaro@kernel.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=quic_tdas@quicinc.com \
--cc=swboyd@chromium.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox