From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Vinod Koul <vkoul@kernel.org>
Cc: Kishon Vijay Abraham I <kishon@ti.com>,
Rob Herring <robh+dt@kernel.org>,
Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
abhinavk@codeaurora.org, Stephen Boyd <sboyd@kernel.org>
Subject: Re: [PATCH v3 2/2] phy: qcom: Introduce new eDP PHY driver
Date: Thu, 21 Oct 2021 11:19:36 -0700 [thread overview]
Message-ID: <YXGvOHsJ33kJVvMk@ripper> (raw)
In-Reply-To: <YXGmJFoeXwtTvl7p@matsya>
On Thu 21 Oct 10:40 PDT 2021, Vinod Koul wrote:
> On 16-10-21, 16:21, Bjorn Andersson wrote:
> > Many recent Qualcomm platforms comes with native DP and eDP support.
> > This consists of a controller in the MDSS and a QMP-like PHY.
> >
> > While similar to the well known QMP block, the eDP PHY only has TX lanes
> > and the programming sequences are slightly different. Rather than
> > continuing the trend of parameterize the QMP driver to pieces, this
> > introduces the support as a new driver.
> >
> > The registration of link and pixel clocks are borrowed from the QMP
> > driver. The non-DP link frequencies are omitted for now.
> >
> > The eDP PHY is very similar to the dedicated (non-USB) DP PHY, but only
> > the prior is supported for now.
>
> since this is QMP phy, pls add an explanation why common QMP driver
> is not used here?
>
Will do.
> > +static int qcom_edp_phy_init(struct phy *phy)
> > +{
> > + struct qcom_edp *edp = phy_get_drvdata(phy);
> > + int ret;
> > +
> > + ret = regulator_bulk_enable(ARRAY_SIZE(edp->supplies), edp->supplies);
> > + if (ret)
> > + return ret;
> > +
> > + ret = clk_bulk_prepare_enable(ARRAY_SIZE(edp->clks), edp->clks);
> > + if (ret)
> > + goto out_disable_supplies;
> > +
> > + writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
> > + DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
> > + edp->edp + DP_PHY_PD_CTL);
> > +
> > + writel(0x17, edp->pll + QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN);
>
> magic?
>
I'll see if I can figure out what this magic number represents.
> > +
> > + writel(DP_PHY_PD_CTL_PSR_PWRDN, edp->edp + DP_PHY_PD_CTL);
> > + msleep(20);
> > +
> > + writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
> > + DP_PHY_PD_CTL_LANE_0_1_PWRDN | DP_PHY_PD_CTL_LANE_2_3_PWRDN |
> > + DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
> > + edp->edp + DP_PHY_PD_CTL);
> > +
> > + writel(0x00, edp->edp + DP_PHY_AUX_CFG0);
> > + writel(0x13, edp->edp + DP_PHY_AUX_CFG1);
> > + writel(0x24, edp->edp + DP_PHY_AUX_CFG2);
> > + writel(0x00, edp->edp + DP_PHY_AUX_CFG3);
> > + writel(0x0a, edp->edp + DP_PHY_AUX_CFG4);
> > + writel(0x26, edp->edp + DP_PHY_AUX_CFG5);
> > + writel(0x0a, edp->edp + DP_PHY_AUX_CFG6);
> > + writel(0x03, edp->edp + DP_PHY_AUX_CFG7);
> > + writel(0x37, edp->edp + DP_PHY_AUX_CFG8);
> > + writel(0x03, edp->edp + DP_PHY_AUX_CFG9);
>
> In qmp phy we use a table for this, that looks very elegant and I am
> sure next rev will have different magic numbers, so should we go the
> table approach here on as well..?
>
Yes, these numbers are different for DP, so that makes sense.
> > +
> > + writel(0x1f, edp->edp + 0x58);
>
> the register offset should be defined
>
Yes.
> > +
> > + msleep(20);
> > +
> > + return 0;
> > +
[..]
> > +static int qcom_edp_configure_ssc(const struct qcom_edp *edp)
> > +{
> > + const struct phy_configure_opts_dp *dp_opts = &edp->dp_opts;
> > + u32 step1;
> > + u32 step2;
> > +
> > + switch (dp_opts->link_rate) {
> > + case 1620:
> > + case 2700:
> > + case 8100:
> > + step1 = 0x45;
> > + step2 = 0x06;
> > + break;
>
> line after each break please (here & few other places)
>
You mean an empty line between the break and the next case? That doesn't
seem standard?
> > + case 5400:
> > + step1 = 0x5c;
> > + step2 = 0x08;
> > + break;
> > + default:
> > + /* Other link rates aren't supported */
> > + return -EINVAL;
[..]
> > +static int qcom_edp_dp_pixel_clk_determine_rate(struct clk_hw *hw,
> > + struct clk_rate_request *req)
> > +{
> > + switch (req->rate) {
> > + case 1620000000UL / 2:
> > + case 2700000000UL / 2:
> > + /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */
>
> above rates are 1.62 and 2.7, where is 5.4 and 8.1... what am i missing?
>
As the comments says 2.7, 5.4 and 8.1 all has req->rate of 1350000000,
with different dividers. But we're not allowed to "document" that by
listing 2.7/2, 5.4/4 and 8.1/6 in the switch statement.
> > + return 0;
> > + default:
> > + return -EINVAL;
> > + }
> > +}
[..]
> > +static const struct clk_ops qcom_edp_dp_pixel_clk_ops = {
> > + .determine_rate = qcom_edp_dp_pixel_clk_determine_rate,
> > + .recalc_rate = qcom_edp_dp_pixel_clk_recalc_rate,
> > +};
> > +
> > +static int qcom_edp_dp_link_clk_determine_rate(struct clk_hw *hw,
> > + struct clk_rate_request *req)
>
> maybe is rate_valid/supported be better name for this?
>
It's named per the clk_ops.
[..]
> > +static const struct clk_ops qcom_edp_dp_link_clk_ops = {
> > + .determine_rate = qcom_edp_dp_link_clk_determine_rate,
> > + .recalc_rate = qcom_edp_dp_link_clk_recalc_rate,
> > +};
[..]
Thanks,
Bjorn
WARNING: multiple messages have this Message-ID (diff)
From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Vinod Koul <vkoul@kernel.org>
Cc: Kishon Vijay Abraham I <kishon@ti.com>,
Rob Herring <robh+dt@kernel.org>,
Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
abhinavk@codeaurora.org, Stephen Boyd <sboyd@kernel.org>
Subject: Re: [PATCH v3 2/2] phy: qcom: Introduce new eDP PHY driver
Date: Thu, 21 Oct 2021 11:19:36 -0700 [thread overview]
Message-ID: <YXGvOHsJ33kJVvMk@ripper> (raw)
In-Reply-To: <YXGmJFoeXwtTvl7p@matsya>
On Thu 21 Oct 10:40 PDT 2021, Vinod Koul wrote:
> On 16-10-21, 16:21, Bjorn Andersson wrote:
> > Many recent Qualcomm platforms comes with native DP and eDP support.
> > This consists of a controller in the MDSS and a QMP-like PHY.
> >
> > While similar to the well known QMP block, the eDP PHY only has TX lanes
> > and the programming sequences are slightly different. Rather than
> > continuing the trend of parameterize the QMP driver to pieces, this
> > introduces the support as a new driver.
> >
> > The registration of link and pixel clocks are borrowed from the QMP
> > driver. The non-DP link frequencies are omitted for now.
> >
> > The eDP PHY is very similar to the dedicated (non-USB) DP PHY, but only
> > the prior is supported for now.
>
> since this is QMP phy, pls add an explanation why common QMP driver
> is not used here?
>
Will do.
> > +static int qcom_edp_phy_init(struct phy *phy)
> > +{
> > + struct qcom_edp *edp = phy_get_drvdata(phy);
> > + int ret;
> > +
> > + ret = regulator_bulk_enable(ARRAY_SIZE(edp->supplies), edp->supplies);
> > + if (ret)
> > + return ret;
> > +
> > + ret = clk_bulk_prepare_enable(ARRAY_SIZE(edp->clks), edp->clks);
> > + if (ret)
> > + goto out_disable_supplies;
> > +
> > + writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
> > + DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
> > + edp->edp + DP_PHY_PD_CTL);
> > +
> > + writel(0x17, edp->pll + QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN);
>
> magic?
>
I'll see if I can figure out what this magic number represents.
> > +
> > + writel(DP_PHY_PD_CTL_PSR_PWRDN, edp->edp + DP_PHY_PD_CTL);
> > + msleep(20);
> > +
> > + writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
> > + DP_PHY_PD_CTL_LANE_0_1_PWRDN | DP_PHY_PD_CTL_LANE_2_3_PWRDN |
> > + DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
> > + edp->edp + DP_PHY_PD_CTL);
> > +
> > + writel(0x00, edp->edp + DP_PHY_AUX_CFG0);
> > + writel(0x13, edp->edp + DP_PHY_AUX_CFG1);
> > + writel(0x24, edp->edp + DP_PHY_AUX_CFG2);
> > + writel(0x00, edp->edp + DP_PHY_AUX_CFG3);
> > + writel(0x0a, edp->edp + DP_PHY_AUX_CFG4);
> > + writel(0x26, edp->edp + DP_PHY_AUX_CFG5);
> > + writel(0x0a, edp->edp + DP_PHY_AUX_CFG6);
> > + writel(0x03, edp->edp + DP_PHY_AUX_CFG7);
> > + writel(0x37, edp->edp + DP_PHY_AUX_CFG8);
> > + writel(0x03, edp->edp + DP_PHY_AUX_CFG9);
>
> In qmp phy we use a table for this, that looks very elegant and I am
> sure next rev will have different magic numbers, so should we go the
> table approach here on as well..?
>
Yes, these numbers are different for DP, so that makes sense.
> > +
> > + writel(0x1f, edp->edp + 0x58);
>
> the register offset should be defined
>
Yes.
> > +
> > + msleep(20);
> > +
> > + return 0;
> > +
[..]
> > +static int qcom_edp_configure_ssc(const struct qcom_edp *edp)
> > +{
> > + const struct phy_configure_opts_dp *dp_opts = &edp->dp_opts;
> > + u32 step1;
> > + u32 step2;
> > +
> > + switch (dp_opts->link_rate) {
> > + case 1620:
> > + case 2700:
> > + case 8100:
> > + step1 = 0x45;
> > + step2 = 0x06;
> > + break;
>
> line after each break please (here & few other places)
>
You mean an empty line between the break and the next case? That doesn't
seem standard?
> > + case 5400:
> > + step1 = 0x5c;
> > + step2 = 0x08;
> > + break;
> > + default:
> > + /* Other link rates aren't supported */
> > + return -EINVAL;
[..]
> > +static int qcom_edp_dp_pixel_clk_determine_rate(struct clk_hw *hw,
> > + struct clk_rate_request *req)
> > +{
> > + switch (req->rate) {
> > + case 1620000000UL / 2:
> > + case 2700000000UL / 2:
> > + /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */
>
> above rates are 1.62 and 2.7, where is 5.4 and 8.1... what am i missing?
>
As the comments says 2.7, 5.4 and 8.1 all has req->rate of 1350000000,
with different dividers. But we're not allowed to "document" that by
listing 2.7/2, 5.4/4 and 8.1/6 in the switch statement.
> > + return 0;
> > + default:
> > + return -EINVAL;
> > + }
> > +}
[..]
> > +static const struct clk_ops qcom_edp_dp_pixel_clk_ops = {
> > + .determine_rate = qcom_edp_dp_pixel_clk_determine_rate,
> > + .recalc_rate = qcom_edp_dp_pixel_clk_recalc_rate,
> > +};
> > +
> > +static int qcom_edp_dp_link_clk_determine_rate(struct clk_hw *hw,
> > + struct clk_rate_request *req)
>
> maybe is rate_valid/supported be better name for this?
>
It's named per the clk_ops.
[..]
> > +static const struct clk_ops qcom_edp_dp_link_clk_ops = {
> > + .determine_rate = qcom_edp_dp_link_clk_determine_rate,
> > + .recalc_rate = qcom_edp_dp_link_clk_recalc_rate,
> > +};
[..]
Thanks,
Bjorn
--
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy
next prev parent reply other threads:[~2021-10-21 18:17 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-16 23:21 [PATCH v3 1/2] dt-bindings: phy: Introduce Qualcomm eDP/DP PHY binding Bjorn Andersson
2021-10-16 23:21 ` Bjorn Andersson
2021-10-16 23:21 ` [PATCH v3 2/2] phy: qcom: Introduce new eDP PHY driver Bjorn Andersson
2021-10-16 23:21 ` Bjorn Andersson
2021-10-21 17:40 ` Vinod Koul
2021-10-21 17:40 ` Vinod Koul
2021-10-21 18:19 ` Bjorn Andersson [this message]
2021-10-21 18:19 ` Bjorn Andersson
2021-10-22 4:31 ` Vinod Koul
2021-10-22 4:31 ` Vinod Koul
2021-10-22 17:16 ` Bjorn Andersson
2021-10-22 17:16 ` Bjorn Andersson
2021-10-25 7:10 ` Vinod Koul
2021-10-25 7:10 ` Vinod Koul
2021-10-18 19:48 ` [PATCH v3 1/2] dt-bindings: phy: Introduce Qualcomm eDP/DP PHY binding Rob Herring
2021-10-18 19:48 ` Rob Herring
2021-10-21 14:51 ` Bjorn Andersson
2021-10-21 14:51 ` 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=YXGvOHsJ33kJVvMk@ripper \
--to=bjorn.andersson@linaro.org \
--cc=abhinavk@codeaurora.org \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.baryshkov@linaro.org \
--cc=kishon@ti.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-phy@lists.infradead.org \
--cc=robh+dt@kernel.org \
--cc=sboyd@kernel.org \
--cc=vkoul@kernel.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.