* [PATCH v3 0/2] phy: qcom: edp: Add DP/eDP switch for phys
@ 2026-03-02 8:28 Yongxing Mou
2026-03-02 8:28 ` [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support Yongxing Mou
2026-03-02 8:28 ` [PATCH v3 2/2] phy: qcom: edp: Add per-version LDO configuration callback Yongxing Mou
0 siblings, 2 replies; 16+ messages in thread
From: Yongxing Mou @ 2026-03-02 8:28 UTC (permalink / raw)
To: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson
Cc: linux-arm-msm, linux-phy, linux-kernel, Yongxing Mou, stable
Currently the PHY selects the DP/eDP configuration tables in a fixed way,
choosing the table when enable. This driver has known issues:
1. The selected table does not match the actual platform mode.
2. It cannot support both modes at the same time.
As discussed here[1], this series:
1. Cleans up duplicated and incorrect tables based on the HPG.
2. Fixes the LDO programming error in eDP mode.
3. Adds DP/eDP mode switching support.
Note: x1e80100/sa8775p/sc7280 have been tested, while glymur/sc8280xp
have not been tested.
[1] https://lore.kernel.org/all/20260119-klm_dpphy-v2-1-52252190940b@oss.qualcomm.com/
Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com>
---
Changes in v3:
- Rebase to next-20260224.[Dmitry]
- Only enable TX1 LDO when lane counts > 2.[Konrad]
- Link to v2: https://lore.kernel.org/all/20260213-edp_phy-v2-0-43c40976435e@oss.qualcomm.com/
Changes in v2:
- Combine the third patch with the first one.[Dmitry]
- Fix code formatting issues.[Konrad][Dmitry]
- Update the commit message description.[Dmitry][Konrad]
- Fix kodiak swing/pre_emp table values.[Konrad]
---
Yongxing Mou (2):
phy: qcom: edp: Add eDP/DP mode switch support
phy: qcom: edp: Add per-version LDO configuration callback
drivers/phy/qualcomm/phy-qcom-edp.c | 176 ++++++++++++++++++++++++++----------
1 file changed, 129 insertions(+), 47 deletions(-)
---
base-commit: 3ef088b0c5772a6f75634e54aa34f5fc0a2c041c
change-id: 20260205-edp_phy-1eca3ed074c0
Best regards,
--
Yongxing Mou <yongxing.mou@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 16+ messages in thread* [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-03-02 8:28 [PATCH v3 0/2] phy: qcom: edp: Add DP/eDP switch for phys Yongxing Mou @ 2026-03-02 8:28 ` Yongxing Mou 2026-03-17 6:10 ` Yongxing Mou ` (2 more replies) 2026-03-02 8:28 ` [PATCH v3 2/2] phy: qcom: edp: Add per-version LDO configuration callback Yongxing Mou 1 sibling, 3 replies; 16+ messages in thread From: Yongxing Mou @ 2026-03-02 8:28 UTC (permalink / raw) To: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson Cc: linux-arm-msm, linux-phy, linux-kernel, Yongxing Mou, stable The eDP PHY supports both eDP&DP modes, each requires a different table. The current driver doesn't fully support every combo PHY mode and use either the eDP or DP table when enable the platform. In addition, some platforms mismatch between the mode and the table where DP mode uses the eDP table or eDP mode use the DP table. Clean up and correct the tables for currently supported platforms based on the HPG specification. Here lists the tables can be reused across current platforms. DP mode: -sa8775p/sc7280/sc8280xp/x1e80100 -glymur eDP mode(low vdiff): -glymur/sa8775p/sc8280xp/x1e80100 -sc7280 Cc: stable@vger.kernel.org Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> --- drivers/phy/qualcomm/phy-qcom-edp.c | 90 ++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 37 deletions(-) diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c index 7372de05a0b8..36998326bae6 100644 --- a/drivers/phy/qualcomm/phy-qcom-edp.c +++ b/drivers/phy/qualcomm/phy-qcom-edp.c @@ -87,7 +87,8 @@ struct qcom_edp_phy_cfg { bool is_edp; const u8 *aux_cfg; const u8 *vco_div_cfg; - const struct qcom_edp_swing_pre_emph_cfg *swing_pre_emph_cfg; + const struct qcom_edp_swing_pre_emph_cfg *dp_swing_pre_emph_cfg; + const struct qcom_edp_swing_pre_emph_cfg *edp_swing_pre_emph_cfg; const struct phy_ver_ops *ver_ops; }; @@ -116,17 +117,17 @@ struct qcom_edp { }; static const u8 dp_swing_hbr_rbr[4][4] = { - { 0x08, 0x0f, 0x16, 0x1f }, + { 0x07, 0x0f, 0x16, 0x1f }, { 0x11, 0x1e, 0x1f, 0xff }, { 0x16, 0x1f, 0xff, 0xff }, { 0x1f, 0xff, 0xff, 0xff } }; static const u8 dp_pre_emp_hbr_rbr[4][4] = { - { 0x00, 0x0d, 0x14, 0x1a }, + { 0x00, 0x0e, 0x15, 0x1a }, { 0x00, 0x0e, 0x15, 0xff }, { 0x00, 0x0e, 0xff, 0xff }, - { 0x03, 0xff, 0xff, 0xff } + { 0x04, 0xff, 0xff, 0xff } }; static const u8 dp_swing_hbr2_hbr3[4][4] = { @@ -150,6 +151,20 @@ static const struct qcom_edp_swing_pre_emph_cfg dp_phy_swing_pre_emph_cfg = { .pre_emphasis_hbr3_hbr2 = &dp_pre_emp_hbr2_hbr3, }; +static const u8 dp_pre_emp_hbr_rbr_v8[4][4] = { + { 0x00, 0x0e, 0x15, 0x1a }, + { 0x00, 0x0e, 0x15, 0xff }, + { 0x00, 0x0e, 0xff, 0xff }, + { 0x00, 0xff, 0xff, 0xff } +}; + +static const struct qcom_edp_swing_pre_emph_cfg dp_phy_swing_pre_emph_cfg_v8 = { + .swing_hbr_rbr = &dp_swing_hbr_rbr, + .swing_hbr3_hbr2 = &dp_swing_hbr2_hbr3, + .pre_emphasis_hbr_rbr = &dp_pre_emp_hbr_rbr_v8, + .pre_emphasis_hbr3_hbr2 = &dp_pre_emp_hbr2_hbr3, +}; + static const u8 edp_swing_hbr_rbr[4][4] = { { 0x07, 0x0f, 0x16, 0x1f }, { 0x0d, 0x16, 0x1e, 0xff }, @@ -158,7 +173,7 @@ static const u8 edp_swing_hbr_rbr[4][4] = { }; static const u8 edp_pre_emp_hbr_rbr[4][4] = { - { 0x05, 0x12, 0x17, 0x1d }, + { 0x05, 0x11, 0x17, 0x1d }, { 0x05, 0x11, 0x18, 0xff }, { 0x06, 0x11, 0xff, 0xff }, { 0x00, 0xff, 0xff, 0xff } @@ -172,10 +187,10 @@ static const u8 edp_swing_hbr2_hbr3[4][4] = { }; static const u8 edp_pre_emp_hbr2_hbr3[4][4] = { - { 0x08, 0x11, 0x17, 0x1b }, - { 0x00, 0x0c, 0x13, 0xff }, - { 0x05, 0x10, 0xff, 0xff }, - { 0x00, 0xff, 0xff, 0xff } + { 0x0c, 0x15, 0x19, 0x1e }, + { 0x0b, 0x15, 0x19, 0xff }, + { 0x0e, 0x14, 0xff, 0xff }, + { 0x0d, 0xff, 0xff, 0xff } }; static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg = { @@ -193,25 +208,25 @@ static const u8 edp_phy_vco_div_cfg_v4[4] = { 0x01, 0x01, 0x02, 0x00, }; -static const u8 edp_pre_emp_hbr_rbr_v5[4][4] = { - { 0x05, 0x11, 0x17, 0x1d }, - { 0x05, 0x11, 0x18, 0xff }, - { 0x06, 0x11, 0xff, 0xff }, - { 0x00, 0xff, 0xff, 0xff } +static const u8 edp_swing_hbr2_hbr3_v3[4][4] = { + { 0x06, 0x11, 0x16, 0x1b }, + { 0x0b, 0x19, 0x1f, 0xff }, + { 0x18, 0x1f, 0xff, 0xff }, + { 0x1f, 0xff, 0xff, 0xff } }; -static const u8 edp_pre_emp_hbr2_hbr3_v5[4][4] = { +static const u8 edp_pre_emp_hbr2_hbr3_v3[4][4] = { { 0x0c, 0x15, 0x19, 0x1e }, - { 0x0b, 0x15, 0x19, 0xff }, - { 0x0e, 0x14, 0xff, 0xff }, + { 0x09, 0x14, 0x19, 0xff }, + { 0x0f, 0x14, 0xff, 0xff }, { 0x0d, 0xff, 0xff, 0xff } }; -static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg_v5 = { +static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg_v3 = { .swing_hbr_rbr = &edp_swing_hbr_rbr, - .swing_hbr3_hbr2 = &edp_swing_hbr2_hbr3, - .pre_emphasis_hbr_rbr = &edp_pre_emp_hbr_rbr_v5, - .pre_emphasis_hbr3_hbr2 = &edp_pre_emp_hbr2_hbr3_v5, + .swing_hbr3_hbr2 = &edp_swing_hbr2_hbr3_v3, + .pre_emphasis_hbr_rbr = &edp_pre_emp_hbr_rbr, + .pre_emphasis_hbr3_hbr2 = &edp_pre_emp_hbr2_hbr3_v3, }; static const u8 edp_phy_aux_cfg_v5[DP_AUX_CFG_SIZE] = { @@ -262,12 +277,7 @@ static int qcom_edp_phy_init(struct phy *phy) DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, edp->edp + DP_PHY_PD_CTL); - /* - * TODO: Re-work the conditions around setting the cfg8 value - * when more information becomes available about why this is - * even needed. - */ - if (edp->cfg->swing_pre_emph_cfg && !edp->is_edp) + if (!edp->is_edp) aux_cfg[8] = 0xb7; writel(0xfc, edp->edp + DP_PHY_MODE); @@ -291,7 +301,7 @@ static int qcom_edp_phy_init(struct phy *phy) static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configure_opts_dp *dp_opts) { - const struct qcom_edp_swing_pre_emph_cfg *cfg = edp->cfg->swing_pre_emph_cfg; + const struct qcom_edp_swing_pre_emph_cfg *cfg; unsigned int v_level = 0; unsigned int p_level = 0; u8 ldo_config; @@ -299,11 +309,10 @@ static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configur u8 emph; int i; - if (!cfg) - return 0; - if (edp->is_edp) - cfg = &edp_phy_swing_pre_emph_cfg; + cfg = edp->cfg->edp_swing_pre_emph_cfg; + else + cfg = edp->cfg->dp_swing_pre_emph_cfg; for (i = 0; i < dp_opts->lanes; i++) { v_level = max(v_level, dp_opts->voltage[i]); @@ -564,20 +573,24 @@ static const struct qcom_edp_phy_cfg sa8775p_dp_phy_cfg = { .is_edp = false, .aux_cfg = edp_phy_aux_cfg_v5, .vco_div_cfg = edp_phy_vco_div_cfg_v4, - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v5, + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, .ver_ops = &qcom_edp_phy_ops_v4, }; static const struct qcom_edp_phy_cfg sc7280_dp_phy_cfg = { .aux_cfg = edp_phy_aux_cfg_v4, .vco_div_cfg = edp_phy_vco_div_cfg_v4, + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v3, .ver_ops = &qcom_edp_phy_ops_v4, }; static const struct qcom_edp_phy_cfg sc8280xp_dp_phy_cfg = { .aux_cfg = edp_phy_aux_cfg_v4, .vco_div_cfg = edp_phy_vco_div_cfg_v4, - .swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, .ver_ops = &qcom_edp_phy_ops_v4, }; @@ -585,7 +598,8 @@ static const struct qcom_edp_phy_cfg sc8280xp_edp_phy_cfg = { .is_edp = true, .aux_cfg = edp_phy_aux_cfg_v4, .vco_div_cfg = edp_phy_vco_div_cfg_v4, - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, .ver_ops = &qcom_edp_phy_ops_v4, }; @@ -766,7 +780,8 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v6 = { static struct qcom_edp_phy_cfg x1e80100_phy_cfg = { .aux_cfg = edp_phy_aux_cfg_v4, .vco_div_cfg = edp_phy_vco_div_cfg_v4, - .swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, .ver_ops = &qcom_edp_phy_ops_v6, }; @@ -945,7 +960,8 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v8 = { static struct qcom_edp_phy_cfg glymur_phy_cfg = { .aux_cfg = edp_phy_aux_cfg_v8, .vco_div_cfg = edp_phy_vco_div_cfg_v8, - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v5, + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg_v8, + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, .ver_ops = &qcom_edp_phy_ops_v8, }; -- 2.43.0 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-03-02 8:28 ` [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support Yongxing Mou @ 2026-03-17 6:10 ` Yongxing Mou 2026-03-20 6:36 ` Dmitry Baryshkov 2026-04-16 9:34 ` Konrad Dybcio 2 siblings, 0 replies; 16+ messages in thread From: Yongxing Mou @ 2026-03-17 6:10 UTC (permalink / raw) To: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson Cc: linux-arm-msm, linux-phy, linux-kernel, stable On 3/2/2026 4:28 PM, Yongxing Mou wrote: > The eDP PHY supports both eDP&DP modes, each requires a different table. > The current driver doesn't fully support every combo PHY mode and use > either the eDP or DP table when enable the platform. In addition, some > platforms mismatch between the mode and the table where DP mode uses > the eDP table or eDP mode use the DP table. > > Clean up and correct the tables for currently supported platforms based on > the HPG specification. > > Here lists the tables can be reused across current platforms. > DP mode: > -sa8775p/sc7280/sc8280xp/x1e80100 > -glymur > eDP mode(low vdiff): > -glymur/sa8775p/sc8280xp/x1e80100 > -sc7280 > > Cc: stable@vger.kernel.org > Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") > Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> > --- > drivers/phy/qualcomm/phy-qcom-edp.c | 90 ++++++++++++++++++++++--------------- > 1 file changed, 53 insertions(+), 37 deletions(-) > > diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c > index 7372de05a0b8..36998326bae6 100644 > --- a/drivers/phy/qualcomm/phy-qcom-edp.c > +++ b/drivers/phy/qualcomm/phy-qcom-edp.c > @@ -87,7 +87,8 @@ struct qcom_edp_phy_cfg { > bool is_edp; > const u8 *aux_cfg; > const u8 *vco_div_cfg; > - const struct qcom_edp_swing_pre_emph_cfg *swing_pre_emph_cfg; > + const struct qcom_edp_swing_pre_emph_cfg *dp_swing_pre_emph_cfg; > + const struct qcom_edp_swing_pre_emph_cfg *edp_swing_pre_emph_cfg; > const struct phy_ver_ops *ver_ops; > }; > > @@ -116,17 +117,17 @@ struct qcom_edp { > }; > > static const u8 dp_swing_hbr_rbr[4][4] = { > - { 0x08, 0x0f, 0x16, 0x1f }, > + { 0x07, 0x0f, 0x16, 0x1f }, > { 0x11, 0x1e, 0x1f, 0xff }, > { 0x16, 0x1f, 0xff, 0xff }, > { 0x1f, 0xff, 0xff, 0xff } > }; > > static const u8 dp_pre_emp_hbr_rbr[4][4] = { > - { 0x00, 0x0d, 0x14, 0x1a }, > + { 0x00, 0x0e, 0x15, 0x1a }, > { 0x00, 0x0e, 0x15, 0xff }, > { 0x00, 0x0e, 0xff, 0xff }, > - { 0x03, 0xff, 0xff, 0xff } > + { 0x04, 0xff, 0xff, 0xff } > }; > > static const u8 dp_swing_hbr2_hbr3[4][4] = { > @@ -150,6 +151,20 @@ static const struct qcom_edp_swing_pre_emph_cfg dp_phy_swing_pre_emph_cfg = { > .pre_emphasis_hbr3_hbr2 = &dp_pre_emp_hbr2_hbr3, > }; > > +static const u8 dp_pre_emp_hbr_rbr_v8[4][4] = { > + { 0x00, 0x0e, 0x15, 0x1a }, > + { 0x00, 0x0e, 0x15, 0xff }, > + { 0x00, 0x0e, 0xff, 0xff }, > + { 0x00, 0xff, 0xff, 0xff } > +}; > + > +static const struct qcom_edp_swing_pre_emph_cfg dp_phy_swing_pre_emph_cfg_v8 = { > + .swing_hbr_rbr = &dp_swing_hbr_rbr, > + .swing_hbr3_hbr2 = &dp_swing_hbr2_hbr3, > + .pre_emphasis_hbr_rbr = &dp_pre_emp_hbr_rbr_v8, > + .pre_emphasis_hbr3_hbr2 = &dp_pre_emp_hbr2_hbr3, > +}; > + > static const u8 edp_swing_hbr_rbr[4][4] = { > { 0x07, 0x0f, 0x16, 0x1f }, > { 0x0d, 0x16, 0x1e, 0xff }, > @@ -158,7 +173,7 @@ static const u8 edp_swing_hbr_rbr[4][4] = { > }; > > static const u8 edp_pre_emp_hbr_rbr[4][4] = { > - { 0x05, 0x12, 0x17, 0x1d }, > + { 0x05, 0x11, 0x17, 0x1d }, > { 0x05, 0x11, 0x18, 0xff }, > { 0x06, 0x11, 0xff, 0xff }, > { 0x00, 0xff, 0xff, 0xff } > @@ -172,10 +187,10 @@ static const u8 edp_swing_hbr2_hbr3[4][4] = { > }; > > static const u8 edp_pre_emp_hbr2_hbr3[4][4] = { > - { 0x08, 0x11, 0x17, 0x1b }, > - { 0x00, 0x0c, 0x13, 0xff }, > - { 0x05, 0x10, 0xff, 0xff }, > - { 0x00, 0xff, 0xff, 0xff } > + { 0x0c, 0x15, 0x19, 0x1e }, > + { 0x0b, 0x15, 0x19, 0xff }, > + { 0x0e, 0x14, 0xff, 0xff }, > + { 0x0d, 0xff, 0xff, 0xff } > }; > > static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg = { > @@ -193,25 +208,25 @@ static const u8 edp_phy_vco_div_cfg_v4[4] = { > 0x01, 0x01, 0x02, 0x00, > }; > > -static const u8 edp_pre_emp_hbr_rbr_v5[4][4] = { > - { 0x05, 0x11, 0x17, 0x1d }, > - { 0x05, 0x11, 0x18, 0xff }, > - { 0x06, 0x11, 0xff, 0xff }, > - { 0x00, 0xff, 0xff, 0xff } > +static const u8 edp_swing_hbr2_hbr3_v3[4][4] = { > + { 0x06, 0x11, 0x16, 0x1b }, > + { 0x0b, 0x19, 0x1f, 0xff }, > + { 0x18, 0x1f, 0xff, 0xff }, > + { 0x1f, 0xff, 0xff, 0xff } > }; > > -static const u8 edp_pre_emp_hbr2_hbr3_v5[4][4] = { > +static const u8 edp_pre_emp_hbr2_hbr3_v3[4][4] = { > { 0x0c, 0x15, 0x19, 0x1e }, > - { 0x0b, 0x15, 0x19, 0xff }, > - { 0x0e, 0x14, 0xff, 0xff }, > + { 0x09, 0x14, 0x19, 0xff }, > + { 0x0f, 0x14, 0xff, 0xff }, > { 0x0d, 0xff, 0xff, 0xff } > }; > > -static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg_v5 = { > +static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg_v3 = { > .swing_hbr_rbr = &edp_swing_hbr_rbr, > - .swing_hbr3_hbr2 = &edp_swing_hbr2_hbr3, > - .pre_emphasis_hbr_rbr = &edp_pre_emp_hbr_rbr_v5, > - .pre_emphasis_hbr3_hbr2 = &edp_pre_emp_hbr2_hbr3_v5, > + .swing_hbr3_hbr2 = &edp_swing_hbr2_hbr3_v3, > + .pre_emphasis_hbr_rbr = &edp_pre_emp_hbr_rbr, > + .pre_emphasis_hbr3_hbr2 = &edp_pre_emp_hbr2_hbr3_v3, > }; > > static const u8 edp_phy_aux_cfg_v5[DP_AUX_CFG_SIZE] = { > @@ -262,12 +277,7 @@ static int qcom_edp_phy_init(struct phy *phy) > DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, > edp->edp + DP_PHY_PD_CTL); > > - /* > - * TODO: Re-work the conditions around setting the cfg8 value > - * when more information becomes available about why this is > - * even needed. > - */ > - if (edp->cfg->swing_pre_emph_cfg && !edp->is_edp) > + if (!edp->is_edp) > aux_cfg[8] = 0xb7; > > writel(0xfc, edp->edp + DP_PHY_MODE); > @@ -291,7 +301,7 @@ static int qcom_edp_phy_init(struct phy *phy) > > static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configure_opts_dp *dp_opts) > { > - const struct qcom_edp_swing_pre_emph_cfg *cfg = edp->cfg->swing_pre_emph_cfg; > + const struct qcom_edp_swing_pre_emph_cfg *cfg; > unsigned int v_level = 0; > unsigned int p_level = 0; > u8 ldo_config; > @@ -299,11 +309,10 @@ static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configur > u8 emph; > int i; > > - if (!cfg) > - return 0; > - > if (edp->is_edp) > - cfg = &edp_phy_swing_pre_emph_cfg; > + cfg = edp->cfg->edp_swing_pre_emph_cfg; > + else > + cfg = edp->cfg->dp_swing_pre_emph_cfg; > > for (i = 0; i < dp_opts->lanes; i++) { > v_level = max(v_level, dp_opts->voltage[i]); > @@ -564,20 +573,24 @@ static const struct qcom_edp_phy_cfg sa8775p_dp_phy_cfg = { > .is_edp = false, > .aux_cfg = edp_phy_aux_cfg_v5, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v5, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > .ver_ops = &qcom_edp_phy_ops_v4, > }; > > static const struct qcom_edp_phy_cfg sc7280_dp_phy_cfg = { > .aux_cfg = edp_phy_aux_cfg_v4, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v3, > .ver_ops = &qcom_edp_phy_ops_v4, > }; > > static const struct qcom_edp_phy_cfg sc8280xp_dp_phy_cfg = { > .aux_cfg = edp_phy_aux_cfg_v4, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > - .swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > .ver_ops = &qcom_edp_phy_ops_v4, > }; > > @@ -585,7 +598,8 @@ static const struct qcom_edp_phy_cfg sc8280xp_edp_phy_cfg = { > .is_edp = true, > .aux_cfg = edp_phy_aux_cfg_v4, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > .ver_ops = &qcom_edp_phy_ops_v4, > }; > > @@ -766,7 +780,8 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v6 = { > static struct qcom_edp_phy_cfg x1e80100_phy_cfg = { > .aux_cfg = edp_phy_aux_cfg_v4, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > - .swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > .ver_ops = &qcom_edp_phy_ops_v6, > }; > > @@ -945,7 +960,8 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v8 = { > static struct qcom_edp_phy_cfg glymur_phy_cfg = { > .aux_cfg = edp_phy_aux_cfg_v8, > .vco_div_cfg = edp_phy_vco_div_cfg_v8, > - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v5, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg_v8, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > .ver_ops = &qcom_edp_phy_ops_v8, > }; > > Hi, maintanier, just a gentle ping on this patch in case it slipped through. Thanks! ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-03-02 8:28 ` [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support Yongxing Mou 2026-03-17 6:10 ` Yongxing Mou @ 2026-03-20 6:36 ` Dmitry Baryshkov 2026-04-20 12:47 ` Yongxing Mou 2026-04-16 9:34 ` Konrad Dybcio 2 siblings, 1 reply; 16+ messages in thread From: Dmitry Baryshkov @ 2026-03-20 6:36 UTC (permalink / raw) To: Yongxing Mou Cc: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson, linux-arm-msm, linux-phy, linux-kernel, stable On Mon, Mar 02, 2026 at 04:28:29PM +0800, Yongxing Mou wrote: > The eDP PHY supports both eDP&DP modes, each requires a different table. > The current driver doesn't fully support every combo PHY mode and use > either the eDP or DP table when enable the platform. In addition, some > platforms mismatch between the mode and the table where DP mode uses > the eDP table or eDP mode use the DP table. > > Clean up and correct the tables for currently supported platforms based on > the HPG specification. > > Here lists the tables can be reused across current platforms. > DP mode: > -sa8775p/sc7280/sc8280xp/x1e80100 > -glymur > eDP mode(low vdiff): Separate question: should we extend phy_configure_dp_opts with the low/high vdiff? Is there a point in providing the ability to toggle between low vdiff and high vdiff? > -glymur/sa8775p/sc8280xp/x1e80100 > -sc7280 I understand your wish to perform all the changes in a single patch, but there is one problem with that. Consider this patch regresses one of the platforms (I'm looking at Kodiak and SC8180X as they get the biggest set of changes). It would be almost impossible to separate, which particular change caused the regression. I'd suggest splitting this patch into a set of more atomic changes. E.g. the AUX_CFG8 is definitely a separate change. Writing swing / pre_emph tables on Kodiak and SC8180X is a separate change (or two). Switching each of the platforms to the corrected set of tables ideally also should come as a separate change, so that in case of a regression the issue would be easier to identify. > > Cc: stable@vger.kernel.org > Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") > Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> > --- > drivers/phy/qualcomm/phy-qcom-edp.c | 90 ++++++++++++++++++++++--------------- > 1 file changed, 53 insertions(+), 37 deletions(-) > > diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c > index 7372de05a0b8..36998326bae6 100644 > --- a/drivers/phy/qualcomm/phy-qcom-edp.c > +++ b/drivers/phy/qualcomm/phy-qcom-edp.c > @@ -87,7 +87,8 @@ struct qcom_edp_phy_cfg { > bool is_edp; > const u8 *aux_cfg; > const u8 *vco_div_cfg; > - const struct qcom_edp_swing_pre_emph_cfg *swing_pre_emph_cfg; > + const struct qcom_edp_swing_pre_emph_cfg *dp_swing_pre_emph_cfg; > + const struct qcom_edp_swing_pre_emph_cfg *edp_swing_pre_emph_cfg; > const struct phy_ver_ops *ver_ops; > }; > > @@ -116,17 +117,17 @@ struct qcom_edp { > }; > > static const u8 dp_swing_hbr_rbr[4][4] = { > - { 0x08, 0x0f, 0x16, 0x1f }, > + { 0x07, 0x0f, 0x16, 0x1f }, > { 0x11, 0x1e, 0x1f, 0xff }, > { 0x16, 0x1f, 0xff, 0xff }, > { 0x1f, 0xff, 0xff, 0xff } > }; > > static const u8 dp_pre_emp_hbr_rbr[4][4] = { > - { 0x00, 0x0d, 0x14, 0x1a }, > + { 0x00, 0x0e, 0x15, 0x1a }, > { 0x00, 0x0e, 0x15, 0xff }, > { 0x00, 0x0e, 0xff, 0xff }, > - { 0x03, 0xff, 0xff, 0xff } > + { 0x04, 0xff, 0xff, 0xff } > }; I've checked, at least this table doesn't match SC8180X configuration. > > static const u8 dp_swing_hbr2_hbr3[4][4] = { > @@ -150,6 +151,20 @@ static const struct qcom_edp_swing_pre_emph_cfg dp_phy_swing_pre_emph_cfg = { > .pre_emphasis_hbr3_hbr2 = &dp_pre_emp_hbr2_hbr3, > }; > > +static const u8 dp_pre_emp_hbr_rbr_v8[4][4] = { > + { 0x00, 0x0e, 0x15, 0x1a }, > + { 0x00, 0x0e, 0x15, 0xff }, > + { 0x00, 0x0e, 0xff, 0xff }, > + { 0x00, 0xff, 0xff, 0xff } > +}; > + > +static const struct qcom_edp_swing_pre_emph_cfg dp_phy_swing_pre_emph_cfg_v8 = { > + .swing_hbr_rbr = &dp_swing_hbr_rbr, > + .swing_hbr3_hbr2 = &dp_swing_hbr2_hbr3, > + .pre_emphasis_hbr_rbr = &dp_pre_emp_hbr_rbr_v8, > + .pre_emphasis_hbr3_hbr2 = &dp_pre_emp_hbr2_hbr3, > +}; > + > static const u8 edp_swing_hbr_rbr[4][4] = { > { 0x07, 0x0f, 0x16, 0x1f }, > { 0x0d, 0x16, 0x1e, 0xff }, > @@ -158,7 +173,7 @@ static const u8 edp_swing_hbr_rbr[4][4] = { > }; > > static const u8 edp_pre_emp_hbr_rbr[4][4] = { > - { 0x05, 0x12, 0x17, 0x1d }, > + { 0x05, 0x11, 0x17, 0x1d }, This was changed only for Kodiak. For SC8180X, I assume, we should be using the older table. > { 0x05, 0x11, 0x18, 0xff }, > { 0x06, 0x11, 0xff, 0xff }, > { 0x00, 0xff, 0xff, 0xff } > @@ -172,10 +187,10 @@ static const u8 edp_swing_hbr2_hbr3[4][4] = { > }; > > static const u8 edp_pre_emp_hbr2_hbr3[4][4] = { I think it becomes worth adding version to the "generic" tables. They are not that generic anyway. > - { 0x08, 0x11, 0x17, 0x1b }, > - { 0x00, 0x0c, 0x13, 0xff }, > - { 0x05, 0x10, 0xff, 0xff }, > - { 0x00, 0xff, 0xff, 0xff } > + { 0x0c, 0x15, 0x19, 0x1e }, > + { 0x0b, 0x15, 0x19, 0xff }, > + { 0x0e, 0x14, 0xff, 0xff }, > + { 0x0d, 0xff, 0xff, 0xff } Current table indeed doesn't match the swing table. Please take care about the SC8180X differences (I think, it will need separate set of tables). > }; > > static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg = { > @@ -193,25 +208,25 @@ static const u8 edp_phy_vco_div_cfg_v4[4] = { > 0x01, 0x01, 0x02, 0x00, > }; > > -static const u8 edp_pre_emp_hbr_rbr_v5[4][4] = { > - { 0x05, 0x11, 0x17, 0x1d }, > - { 0x05, 0x11, 0x18, 0xff }, > - { 0x06, 0x11, 0xff, 0xff }, > - { 0x00, 0xff, 0xff, 0xff } > +static const u8 edp_swing_hbr2_hbr3_v3[4][4] = { > + { 0x06, 0x11, 0x16, 0x1b }, > + { 0x0b, 0x19, 0x1f, 0xff }, > + { 0x18, 0x1f, 0xff, 0xff }, > + { 0x1f, 0xff, 0xff, 0xff } > }; > > -static const u8 edp_pre_emp_hbr2_hbr3_v5[4][4] = { > +static const u8 edp_pre_emp_hbr2_hbr3_v3[4][4] = { > { 0x0c, 0x15, 0x19, 0x1e }, > - { 0x0b, 0x15, 0x19, 0xff }, > - { 0x0e, 0x14, 0xff, 0xff }, > + { 0x09, 0x14, 0x19, 0xff }, > + { 0x0f, 0x14, 0xff, 0xff }, > { 0x0d, 0xff, 0xff, 0xff } > }; > > -static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg_v5 = { > +static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg_v3 = { > .swing_hbr_rbr = &edp_swing_hbr_rbr, > - .swing_hbr3_hbr2 = &edp_swing_hbr2_hbr3, > - .pre_emphasis_hbr_rbr = &edp_pre_emp_hbr_rbr_v5, > - .pre_emphasis_hbr3_hbr2 = &edp_pre_emp_hbr2_hbr3_v5, > + .swing_hbr3_hbr2 = &edp_swing_hbr2_hbr3_v3, > + .pre_emphasis_hbr_rbr = &edp_pre_emp_hbr_rbr, > + .pre_emphasis_hbr3_hbr2 = &edp_pre_emp_hbr2_hbr3_v3, > }; > > static const u8 edp_phy_aux_cfg_v5[DP_AUX_CFG_SIZE] = { > @@ -262,12 +277,7 @@ static int qcom_edp_phy_init(struct phy *phy) > DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, > edp->edp + DP_PHY_PD_CTL); > > - /* > - * TODO: Re-work the conditions around setting the cfg8 value > - * when more information becomes available about why this is > - * even needed. > - */ > - if (edp->cfg->swing_pre_emph_cfg && !edp->is_edp) > + if (!edp->is_edp) > aux_cfg[8] = 0xb7; This is a separate fix, as it changes the aux_cfg[8] value for Kodiak and SC8180X. > > writel(0xfc, edp->edp + DP_PHY_MODE); > @@ -291,7 +301,7 @@ static int qcom_edp_phy_init(struct phy *phy) > > static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configure_opts_dp *dp_opts) > { > - const struct qcom_edp_swing_pre_emph_cfg *cfg = edp->cfg->swing_pre_emph_cfg; > + const struct qcom_edp_swing_pre_emph_cfg *cfg; > unsigned int v_level = 0; > unsigned int p_level = 0; > u8 ldo_config; > @@ -299,11 +309,10 @@ static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configur > u8 emph; > int i; > > - if (!cfg) > - return 0; > - > if (edp->is_edp) > - cfg = &edp_phy_swing_pre_emph_cfg; > + cfg = edp->cfg->edp_swing_pre_emph_cfg; > + else > + cfg = edp->cfg->dp_swing_pre_emph_cfg; > > for (i = 0; i < dp_opts->lanes; i++) { > v_level = max(v_level, dp_opts->voltage[i]); > @@ -564,20 +573,24 @@ static const struct qcom_edp_phy_cfg sa8775p_dp_phy_cfg = { > .is_edp = false, > .aux_cfg = edp_phy_aux_cfg_v5, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v5, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > .ver_ops = &qcom_edp_phy_ops_v4, > }; > > static const struct qcom_edp_phy_cfg sc7280_dp_phy_cfg = { > .aux_cfg = edp_phy_aux_cfg_v4, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v3, > .ver_ops = &qcom_edp_phy_ops_v4, > }; > > static const struct qcom_edp_phy_cfg sc8280xp_dp_phy_cfg = { > .aux_cfg = edp_phy_aux_cfg_v4, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > - .swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > .ver_ops = &qcom_edp_phy_ops_v4, > }; > > @@ -585,7 +598,8 @@ static const struct qcom_edp_phy_cfg sc8280xp_edp_phy_cfg = { > .is_edp = true, > .aux_cfg = edp_phy_aux_cfg_v4, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, Ok, we are going to continue using eDP table because of is_edp = true. > .ver_ops = &qcom_edp_phy_ops_v4, > }; > > @@ -766,7 +780,8 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v6 = { > static struct qcom_edp_phy_cfg x1e80100_phy_cfg = { > .aux_cfg = edp_phy_aux_cfg_v4, > .vco_div_cfg = edp_phy_vco_div_cfg_v4, > - .swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > .ver_ops = &qcom_edp_phy_ops_v6, > }; > > @@ -945,7 +960,8 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v8 = { > static struct qcom_edp_phy_cfg glymur_phy_cfg = { > .aux_cfg = edp_phy_aux_cfg_v8, > .vco_div_cfg = edp_phy_vco_div_cfg_v8, > - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v5, > + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg_v8, > + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > .ver_ops = &qcom_edp_phy_ops_v8, > }; > > > -- > 2.43.0 > > > -- > linux-phy mailing list > linux-phy@lists.infradead.org > https://lists.infradead.org/mailman/listinfo/linux-phy -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-03-20 6:36 ` Dmitry Baryshkov @ 2026-04-20 12:47 ` Yongxing Mou 2026-04-20 18:32 ` Dmitry Baryshkov 0 siblings, 1 reply; 16+ messages in thread From: Yongxing Mou @ 2026-04-20 12:47 UTC (permalink / raw) To: Dmitry Baryshkov Cc: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson, linux-arm-msm, linux-phy, linux-kernel, stable On 3/20/2026 2:36 PM, Dmitry Baryshkov wrote: > On Mon, Mar 02, 2026 at 04:28:29PM +0800, Yongxing Mou wrote: >> The eDP PHY supports both eDP&DP modes, each requires a different table. >> The current driver doesn't fully support every combo PHY mode and use >> either the eDP or DP table when enable the platform. In addition, some >> platforms mismatch between the mode and the table where DP mode uses >> the eDP table or eDP mode use the DP table. >> >> Clean up and correct the tables for currently supported platforms based on >> the HPG specification. >> >> Here lists the tables can be reused across current platforms. >> DP mode: >> -sa8775p/sc7280/sc8280xp/x1e80100 >> -glymur >> eDP mode(low vdiff): > > Separate question: should we extend phy_configure_dp_opts with the > low/high vdiff? Is there a point in providing the ability to toggle > between low vdiff and high vdiff? > Emm ,i haven't found any platform using high vdiff so far, and I'm not clear in which cases switching between low and high vdiff would be needed. >> -glymur/sa8775p/sc8280xp/x1e80100 >> -sc7280 > > I understand your wish to perform all the changes in a single patch, but > there is one problem with that. Consider this patch regresses one of the > platforms (I'm looking at Kodiak and SC8180X as they get the biggest set > of changes). It would be almost impossible to separate, which particular > change caused the regression. I'd suggest splitting this patch into a > set of more atomic changes. E.g. the AUX_CFG8 is definitely a separate > change. Writing swing / pre_emph tables on Kodiak and SC8180X is a > separate change (or two). Switching each of the platforms to the > corrected set of tables ideally also should come as a separate change, > so that in case of a regression the issue would be easier to identify. > Thank for point this, will separate the change. I mostly overlooked SC8180X here, since I assumed it shares the same PHY as SC7280. However, they are using different PHY sub‑versions. Will add proper support for it in the next version. >> >> Cc: stable@vger.kernel.org >> Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") >> Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> >> --- >> drivers/phy/qualcomm/phy-qcom-edp.c | 90 ++++++++++++++++++++++--------------- >> 1 file changed, 53 insertions(+), 37 deletions(-) >> >> diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c >> index 7372de05a0b8..36998326bae6 100644 >> --- a/drivers/phy/qualcomm/phy-qcom-edp.c >> +++ b/drivers/phy/qualcomm/phy-qcom-edp.c >> @@ -87,7 +87,8 @@ struct qcom_edp_phy_cfg { >> bool is_edp; >> const u8 *aux_cfg; >> const u8 *vco_div_cfg; >> - const struct qcom_edp_swing_pre_emph_cfg *swing_pre_emph_cfg; >> + const struct qcom_edp_swing_pre_emph_cfg *dp_swing_pre_emph_cfg; >> + const struct qcom_edp_swing_pre_emph_cfg *edp_swing_pre_emph_cfg; >> const struct phy_ver_ops *ver_ops; >> }; >> >> @@ -116,17 +117,17 @@ struct qcom_edp { >> }; >> >> static const u8 dp_swing_hbr_rbr[4][4] = { >> - { 0x08, 0x0f, 0x16, 0x1f }, >> + { 0x07, 0x0f, 0x16, 0x1f }, >> { 0x11, 0x1e, 0x1f, 0xff }, >> { 0x16, 0x1f, 0xff, 0xff }, >> { 0x1f, 0xff, 0xff, 0xff } >> }; >> >> static const u8 dp_pre_emp_hbr_rbr[4][4] = { >> - { 0x00, 0x0d, 0x14, 0x1a }, >> + { 0x00, 0x0e, 0x15, 0x1a }, >> { 0x00, 0x0e, 0x15, 0xff }, >> { 0x00, 0x0e, 0xff, 0xff }, >> - { 0x03, 0xff, 0xff, 0xff } >> + { 0x04, 0xff, 0xff, 0xff } >> }; > > I've checked, at least this table doesn't match SC8180X configuration. > Got it. >> >> static const u8 dp_swing_hbr2_hbr3[4][4] = { >> @@ -150,6 +151,20 @@ static const struct qcom_edp_swing_pre_emph_cfg dp_phy_swing_pre_emph_cfg = { >> .pre_emphasis_hbr3_hbr2 = &dp_pre_emp_hbr2_hbr3, >> }; >> >> +static const u8 dp_pre_emp_hbr_rbr_v8[4][4] = { >> + { 0x00, 0x0e, 0x15, 0x1a }, >> + { 0x00, 0x0e, 0x15, 0xff }, >> + { 0x00, 0x0e, 0xff, 0xff }, >> + { 0x00, 0xff, 0xff, 0xff } >> +}; >> + >> +static const struct qcom_edp_swing_pre_emph_cfg dp_phy_swing_pre_emph_cfg_v8 = { >> + .swing_hbr_rbr = &dp_swing_hbr_rbr, >> + .swing_hbr3_hbr2 = &dp_swing_hbr2_hbr3, >> + .pre_emphasis_hbr_rbr = &dp_pre_emp_hbr_rbr_v8, >> + .pre_emphasis_hbr3_hbr2 = &dp_pre_emp_hbr2_hbr3, >> +}; >> + >> static const u8 edp_swing_hbr_rbr[4][4] = { >> { 0x07, 0x0f, 0x16, 0x1f }, >> { 0x0d, 0x16, 0x1e, 0xff }, >> @@ -158,7 +173,7 @@ static const u8 edp_swing_hbr_rbr[4][4] = { >> }; >> >> static const u8 edp_pre_emp_hbr_rbr[4][4] = { >> - { 0x05, 0x12, 0x17, 0x1d }, >> + { 0x05, 0x11, 0x17, 0x1d }, > > This was changed only for Kodiak. For SC8180X, I assume, we should be > using the older table. > Emm, for SC8180X, eDP low VDIFF (High HBR) only S1 (250mV) P0-0dB Emphasis Settings "0x08" different from other "generic" tables which is "0x0B". >> { 0x05, 0x11, 0x18, 0xff }, >> { 0x06, 0x11, 0xff, 0xff }, >> { 0x00, 0xff, 0xff, 0xff } >> @@ -172,10 +187,10 @@ static const u8 edp_swing_hbr2_hbr3[4][4] = { >> }; >> >> static const u8 edp_pre_emp_hbr2_hbr3[4][4] = { > > I think it becomes worth adding version to the "generic" tables. They > are not that generic anyway. > Got it. SC8180X here need a different table.. >> - { 0x08, 0x11, 0x17, 0x1b }, >> - { 0x00, 0x0c, 0x13, 0xff }, >> - { 0x05, 0x10, 0xff, 0xff }, >> - { 0x00, 0xff, 0xff, 0xff } >> + { 0x0c, 0x15, 0x19, 0x1e }, >> + { 0x0b, 0x15, 0x19, 0xff }, >> + { 0x0e, 0x14, 0xff, 0xff }, >> + { 0x0d, 0xff, 0xff, 0xff } > > Current table indeed doesn't match the swing table. Please take care > about the SC8180X differences (I think, it will need separate set of > tables). > Got it. >> }; >> >> static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg = { >> @@ -193,25 +208,25 @@ static const u8 edp_phy_vco_div_cfg_v4[4] = { >> 0x01, 0x01, 0x02, 0x00, >> }; >> >> -static const u8 edp_pre_emp_hbr_rbr_v5[4][4] = { >> - { 0x05, 0x11, 0x17, 0x1d }, >> - { 0x05, 0x11, 0x18, 0xff }, >> - { 0x06, 0x11, 0xff, 0xff }, >> - { 0x00, 0xff, 0xff, 0xff } >> +static const u8 edp_swing_hbr2_hbr3_v3[4][4] = { >> + { 0x06, 0x11, 0x16, 0x1b }, >> + { 0x0b, 0x19, 0x1f, 0xff }, >> + { 0x18, 0x1f, 0xff, 0xff }, >> + { 0x1f, 0xff, 0xff, 0xff } >> }; >> >> -static const u8 edp_pre_emp_hbr2_hbr3_v5[4][4] = { >> +static const u8 edp_pre_emp_hbr2_hbr3_v3[4][4] = { >> { 0x0c, 0x15, 0x19, 0x1e }, >> - { 0x0b, 0x15, 0x19, 0xff }, >> - { 0x0e, 0x14, 0xff, 0xff }, >> + { 0x09, 0x14, 0x19, 0xff }, >> + { 0x0f, 0x14, 0xff, 0xff }, >> { 0x0d, 0xff, 0xff, 0xff } >> }; >> >> -static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg_v5 = { >> +static const struct qcom_edp_swing_pre_emph_cfg edp_phy_swing_pre_emph_cfg_v3 = { >> .swing_hbr_rbr = &edp_swing_hbr_rbr, >> - .swing_hbr3_hbr2 = &edp_swing_hbr2_hbr3, >> - .pre_emphasis_hbr_rbr = &edp_pre_emp_hbr_rbr_v5, >> - .pre_emphasis_hbr3_hbr2 = &edp_pre_emp_hbr2_hbr3_v5, >> + .swing_hbr3_hbr2 = &edp_swing_hbr2_hbr3_v3, >> + .pre_emphasis_hbr_rbr = &edp_pre_emp_hbr_rbr, >> + .pre_emphasis_hbr3_hbr2 = &edp_pre_emp_hbr2_hbr3_v3, >> }; >> >> static const u8 edp_phy_aux_cfg_v5[DP_AUX_CFG_SIZE] = { >> @@ -262,12 +277,7 @@ static int qcom_edp_phy_init(struct phy *phy) >> DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, >> edp->edp + DP_PHY_PD_CTL); >> >> - /* >> - * TODO: Re-work the conditions around setting the cfg8 value >> - * when more information becomes available about why this is >> - * even needed. >> - */ >> - if (edp->cfg->swing_pre_emph_cfg && !edp->is_edp) >> + if (!edp->is_edp) >> aux_cfg[8] = 0xb7; > > This is a separate fix, as it changes the aux_cfg[8] value for Kodiak > and SC8180X. > Got it. >> >> writel(0xfc, edp->edp + DP_PHY_MODE); >> @@ -291,7 +301,7 @@ static int qcom_edp_phy_init(struct phy *phy) >> >> static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configure_opts_dp *dp_opts) >> { >> - const struct qcom_edp_swing_pre_emph_cfg *cfg = edp->cfg->swing_pre_emph_cfg; >> + const struct qcom_edp_swing_pre_emph_cfg *cfg; >> unsigned int v_level = 0; >> unsigned int p_level = 0; >> u8 ldo_config; >> @@ -299,11 +309,10 @@ static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configur >> u8 emph; >> int i; >> >> - if (!cfg) >> - return 0; >> - >> if (edp->is_edp) >> - cfg = &edp_phy_swing_pre_emph_cfg; >> + cfg = edp->cfg->edp_swing_pre_emph_cfg; >> + else >> + cfg = edp->cfg->dp_swing_pre_emph_cfg; >> >> for (i = 0; i < dp_opts->lanes; i++) { >> v_level = max(v_level, dp_opts->voltage[i]); >> @@ -564,20 +573,24 @@ static const struct qcom_edp_phy_cfg sa8775p_dp_phy_cfg = { >> .is_edp = false, >> .aux_cfg = edp_phy_aux_cfg_v5, >> .vco_div_cfg = edp_phy_vco_div_cfg_v4, >> - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v5, >> + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, >> + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, >> .ver_ops = &qcom_edp_phy_ops_v4, >> }; >> >> static const struct qcom_edp_phy_cfg sc7280_dp_phy_cfg = { >> .aux_cfg = edp_phy_aux_cfg_v4, >> .vco_div_cfg = edp_phy_vco_div_cfg_v4, >> + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, >> + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v3, >> .ver_ops = &qcom_edp_phy_ops_v4, >> }; >> >> static const struct qcom_edp_phy_cfg sc8280xp_dp_phy_cfg = { >> .aux_cfg = edp_phy_aux_cfg_v4, >> .vco_div_cfg = edp_phy_vco_div_cfg_v4, >> - .swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, >> + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, >> + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, >> .ver_ops = &qcom_edp_phy_ops_v4, >> }; >> >> @@ -585,7 +598,8 @@ static const struct qcom_edp_phy_cfg sc8280xp_edp_phy_cfg = { >> .is_edp = true, >> .aux_cfg = edp_phy_aux_cfg_v4, >> .vco_div_cfg = edp_phy_vco_div_cfg_v4, >> - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, >> + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, >> + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, > > Ok, we are going to continue using eDP table because of is_edp = true. > >> .ver_ops = &qcom_edp_phy_ops_v4, >> }; >> >> @@ -766,7 +780,8 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v6 = { >> static struct qcom_edp_phy_cfg x1e80100_phy_cfg = { >> .aux_cfg = edp_phy_aux_cfg_v4, >> .vco_div_cfg = edp_phy_vco_div_cfg_v4, >> - .swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, >> + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, >> + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, >> .ver_ops = &qcom_edp_phy_ops_v6, >> }; >> >> @@ -945,7 +960,8 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v8 = { >> static struct qcom_edp_phy_cfg glymur_phy_cfg = { >> .aux_cfg = edp_phy_aux_cfg_v8, >> .vco_div_cfg = edp_phy_vco_div_cfg_v8, >> - .swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v5, >> + .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg_v8, >> + .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg, >> .ver_ops = &qcom_edp_phy_ops_v8, >> }; >> >> >> -- >> 2.43.0 >> >> >> -- >> linux-phy mailing list >> linux-phy@lists.infradead.org >> https://lists.infradead.org/mailman/listinfo/linux-phy > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-04-20 12:47 ` Yongxing Mou @ 2026-04-20 18:32 ` Dmitry Baryshkov 2026-04-21 2:32 ` Yongxing Mou 0 siblings, 1 reply; 16+ messages in thread From: Dmitry Baryshkov @ 2026-04-20 18:32 UTC (permalink / raw) To: Yongxing Mou Cc: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson, linux-arm-msm, linux-phy, linux-kernel, stable On Mon, Apr 20, 2026 at 08:47:09PM +0800, Yongxing Mou wrote: > > > On 3/20/2026 2:36 PM, Dmitry Baryshkov wrote: > > On Mon, Mar 02, 2026 at 04:28:29PM +0800, Yongxing Mou wrote: > > > The eDP PHY supports both eDP&DP modes, each requires a different table. > > > The current driver doesn't fully support every combo PHY mode and use > > > either the eDP or DP table when enable the platform. In addition, some > > > platforms mismatch between the mode and the table where DP mode uses > > > the eDP table or eDP mode use the DP table. > > > > > > Clean up and correct the tables for currently supported platforms based on > > > the HPG specification. > > > > > > Here lists the tables can be reused across current platforms. > > > DP mode: > > > -sa8775p/sc7280/sc8280xp/x1e80100 > > > -glymur > > > eDP mode(low vdiff): > > > > Separate question: should we extend phy_configure_dp_opts with the > > low/high vdiff? Is there a point in providing the ability to toggle > > between low vdiff and high vdiff? > > > Emm ,i haven't found any platform using high vdiff so far, and I'm not clear > in which cases switching between low and high vdiff would be needed. From my (maybe incorrect) understanding of eDP B.3, the high vs low vdiff selection should be based on the cable length. > > > > -glymur/sa8775p/sc8280xp/x1e80100 > > > -sc7280 > > > > I understand your wish to perform all the changes in a single patch, but > > there is one problem with that. Consider this patch regresses one of the > > platforms (I'm looking at Kodiak and SC8180X as they get the biggest set > > of changes). It would be almost impossible to separate, which particular > > change caused the regression. I'd suggest splitting this patch into a > > set of more atomic changes. E.g. the AUX_CFG8 is definitely a separate > > change. Writing swing / pre_emph tables on Kodiak and SC8180X is a > > separate change (or two). Switching each of the platforms to the > > corrected set of tables ideally also should come as a separate change, > > so that in case of a regression the issue would be easier to identify. > > > Thank for point this, will separate the change. > I mostly overlooked SC8180X here, since I assumed it shares the same PHY as > SC7280. However, they are using different PHY sub‑versions. Will add proper > support for it in the next version. Thanks! > > > > > > Cc: stable@vger.kernel.org > > > Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") > > > Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> > > > --- > > > drivers/phy/qualcomm/phy-qcom-edp.c | 90 ++++++++++++++++++++++--------------- > > > 1 file changed, 53 insertions(+), 37 deletions(-) > > > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-04-20 18:32 ` Dmitry Baryshkov @ 2026-04-21 2:32 ` Yongxing Mou 2026-04-21 15:43 ` Dmitry Baryshkov 0 siblings, 1 reply; 16+ messages in thread From: Yongxing Mou @ 2026-04-21 2:32 UTC (permalink / raw) To: Dmitry Baryshkov Cc: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson, linux-arm-msm, linux-phy, linux-kernel, stable On 4/21/2026 2:32 AM, Dmitry Baryshkov wrote: > On Mon, Apr 20, 2026 at 08:47:09PM +0800, Yongxing Mou wrote: >> >> >> On 3/20/2026 2:36 PM, Dmitry Baryshkov wrote: >>> On Mon, Mar 02, 2026 at 04:28:29PM +0800, Yongxing Mou wrote: >>>> The eDP PHY supports both eDP&DP modes, each requires a different table. >>>> The current driver doesn't fully support every combo PHY mode and use >>>> either the eDP or DP table when enable the platform. In addition, some >>>> platforms mismatch between the mode and the table where DP mode uses >>>> the eDP table or eDP mode use the DP table. >>>> >>>> Clean up and correct the tables for currently supported platforms based on >>>> the HPG specification. >>>> >>>> Here lists the tables can be reused across current platforms. >>>> DP mode: >>>> -sa8775p/sc7280/sc8280xp/x1e80100 >>>> -glymur >>>> eDP mode(low vdiff): >>> >>> Separate question: should we extend phy_configure_dp_opts with the >>> low/high vdiff? Is there a point in providing the ability to toggle >>> between low vdiff and high vdiff? >>> >> Emm ,i haven't found any platform using high vdiff so far, and I'm not clear >> in which cases switching between low and high vdiff would be needed. > > From my (maybe incorrect) understanding of eDP B.3, the high vs low > vdiff selection should be based on the cable length. > Thanks for the explanation. Maybe we can add this when we really need it. >> >>>> -glymur/sa8775p/sc8280xp/x1e80100 >>>> -sc7280 >>> >>> I understand your wish to perform all the changes in a single patch, but >>> there is one problem with that. Consider this patch regresses one of the >>> platforms (I'm looking at Kodiak and SC8180X as they get the biggest set >>> of changes). It would be almost impossible to separate, which particular >>> change caused the regression. I'd suggest splitting this patch into a >>> set of more atomic changes. E.g. the AUX_CFG8 is definitely a separate >>> change. Writing swing / pre_emph tables on Kodiak and SC8180X is a >>> separate change (or two). Switching each of the platforms to the >>> corrected set of tables ideally also should come as a separate change, >>> so that in case of a regression the issue would be easier to identify. >>> >> Thank for point this, will separate the change. >> I mostly overlooked SC8180X here, since I assumed it shares the same PHY as >> SC7280. However, they are using different PHY sub‑versions. Will add proper >> support for it in the next version. > > Thanks! > Emm, one more question.. Based on Konard's comments, should I split this patch, and send a new revision, or post a new SC8180X patch on top of these two existing patches? >>>> >>>> Cc: stable@vger.kernel.org >>>> Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") >>>> Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> >>>> --- >>>> drivers/phy/qualcomm/phy-qcom-edp.c | 90 ++++++++++++++++++++++--------------- >>>> 1 file changed, 53 insertions(+), 37 deletions(-) >>>> > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-04-21 2:32 ` Yongxing Mou @ 2026-04-21 15:43 ` Dmitry Baryshkov 0 siblings, 0 replies; 16+ messages in thread From: Dmitry Baryshkov @ 2026-04-21 15:43 UTC (permalink / raw) To: Yongxing Mou Cc: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson, linux-arm-msm, linux-phy, linux-kernel, stable On Tue, Apr 21, 2026 at 10:32:49AM +0800, Yongxing Mou wrote: > > > On 4/21/2026 2:32 AM, Dmitry Baryshkov wrote: > > On Mon, Apr 20, 2026 at 08:47:09PM +0800, Yongxing Mou wrote: > > > > > > > > > On 3/20/2026 2:36 PM, Dmitry Baryshkov wrote: > > > > On Mon, Mar 02, 2026 at 04:28:29PM +0800, Yongxing Mou wrote: > > > > > The eDP PHY supports both eDP&DP modes, each requires a different table. > > > > > The current driver doesn't fully support every combo PHY mode and use > > > > > either the eDP or DP table when enable the platform. In addition, some > > > > > platforms mismatch between the mode and the table where DP mode uses > > > > > the eDP table or eDP mode use the DP table. > > > > > > > > > > Clean up and correct the tables for currently supported platforms based on > > > > > the HPG specification. > > > > > > > > > > Here lists the tables can be reused across current platforms. > > > > > DP mode: > > > > > -sa8775p/sc7280/sc8280xp/x1e80100 > > > > > -glymur > > > > > eDP mode(low vdiff): > > > > > > > > Separate question: should we extend phy_configure_dp_opts with the > > > > low/high vdiff? Is there a point in providing the ability to toggle > > > > between low vdiff and high vdiff? > > > > > > > Emm ,i haven't found any platform using high vdiff so far, and I'm not clear > > > in which cases switching between low and high vdiff would be needed. > > > > From my (maybe incorrect) understanding of eDP B.3, the high vs low > > vdiff selection should be based on the cable length. > > > Thanks for the explanation. Maybe we can add this when we really need it. > > > > > > > > -glymur/sa8775p/sc8280xp/x1e80100 > > > > > -sc7280 > > > > > > > > I understand your wish to perform all the changes in a single patch, but > > > > there is one problem with that. Consider this patch regresses one of the > > > > platforms (I'm looking at Kodiak and SC8180X as they get the biggest set > > > > of changes). It would be almost impossible to separate, which particular > > > > change caused the regression. I'd suggest splitting this patch into a > > > > set of more atomic changes. E.g. the AUX_CFG8 is definitely a separate > > > > change. Writing swing / pre_emph tables on Kodiak and SC8180X is a > > > > separate change (or two). Switching each of the platforms to the > > > > corrected set of tables ideally also should come as a separate change, > > > > so that in case of a regression the issue would be easier to identify. > > > > > > > Thank for point this, will separate the change. > > > I mostly overlooked SC8180X here, since I assumed it shares the same PHY as > > > SC7280. However, they are using different PHY sub‑versions. Will add proper > > > support for it in the next version. > > > > Thanks! > > > Emm, one more question.. Based on Konard's comments, should I split this > patch, and send a new revision, or post a new SC8180X patch on top of these > two existing patches? Please split this commit into logical chunks, as I wrote before. SC8180X would be one of those patches. > > > > > > > > > > Cc: stable@vger.kernel.org > > > > > Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") > > > > > Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> > > > > > --- > > > > > drivers/phy/qualcomm/phy-qcom-edp.c | 90 ++++++++++++++++++++++--------------- > > > > > 1 file changed, 53 insertions(+), 37 deletions(-) -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-03-02 8:28 ` [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support Yongxing Mou 2026-03-17 6:10 ` Yongxing Mou 2026-03-20 6:36 ` Dmitry Baryshkov @ 2026-04-16 9:34 ` Konrad Dybcio 2026-04-20 12:48 ` Yongxing Mou 2 siblings, 1 reply; 16+ messages in thread From: Konrad Dybcio @ 2026-04-16 9:34 UTC (permalink / raw) To: Yongxing Mou, Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson Cc: linux-arm-msm, linux-phy, linux-kernel, stable On 3/2/26 9:28 AM, Yongxing Mou wrote: > The eDP PHY supports both eDP&DP modes, each requires a different table. > The current driver doesn't fully support every combo PHY mode and use > either the eDP or DP table when enable the platform. In addition, some > platforms mismatch between the mode and the table where DP mode uses > the eDP table or eDP mode use the DP table. > > Clean up and correct the tables for currently supported platforms based on > the HPG specification. > > Here lists the tables can be reused across current platforms. > DP mode: > -sa8775p/sc7280/sc8280xp/x1e80100 > -glymur > eDP mode(low vdiff): > -glymur/sa8775p/sc8280xp/x1e80100 > -sc7280 > > Cc: stable@vger.kernel.org > Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") > Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> > --- I went through everything and all the sequences are OK. SC8180X will need changes, but it's already incorrect so this doesn't necessarily affect it Thanks! Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> Konrad ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-04-16 9:34 ` Konrad Dybcio @ 2026-04-20 12:48 ` Yongxing Mou 2026-04-20 12:49 ` Konrad Dybcio 0 siblings, 1 reply; 16+ messages in thread From: Yongxing Mou @ 2026-04-20 12:48 UTC (permalink / raw) To: Konrad Dybcio, Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson Cc: linux-arm-msm, linux-phy, linux-kernel, stable On 4/16/2026 5:34 PM, Konrad Dybcio wrote: > On 3/2/26 9:28 AM, Yongxing Mou wrote: >> The eDP PHY supports both eDP&DP modes, each requires a different table. >> The current driver doesn't fully support every combo PHY mode and use >> either the eDP or DP table when enable the platform. In addition, some >> platforms mismatch between the mode and the table where DP mode uses >> the eDP table or eDP mode use the DP table. >> >> Clean up and correct the tables for currently supported platforms based on >> the HPG specification. >> >> Here lists the tables can be reused across current platforms. >> DP mode: >> -sa8775p/sc7280/sc8280xp/x1e80100 >> -glymur >> eDP mode(low vdiff): >> -glymur/sa8775p/sc8280xp/x1e80100 >> -sc7280 >> >> Cc: stable@vger.kernel.org >> Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") >> Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> >> --- > > I went through everything and all the sequences are OK. > > SC8180X will need changes, but it's already incorrect so this > doesn't necessarily affect it > > Thanks! > > Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> > > Konrad Thanks here.. I didn’t notice before that SC8180X is different from SC7280, and will correct it in the next version. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-04-20 12:48 ` Yongxing Mou @ 2026-04-20 12:49 ` Konrad Dybcio 2026-04-21 3:54 ` Yongxing Mou 0 siblings, 1 reply; 16+ messages in thread From: Konrad Dybcio @ 2026-04-20 12:49 UTC (permalink / raw) To: Yongxing Mou, Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson Cc: linux-arm-msm, linux-phy, linux-kernel, stable On 4/20/26 2:48 PM, Yongxing Mou wrote: > > > On 4/16/2026 5:34 PM, Konrad Dybcio wrote: >> On 3/2/26 9:28 AM, Yongxing Mou wrote: >>> The eDP PHY supports both eDP&DP modes, each requires a different table. >>> The current driver doesn't fully support every combo PHY mode and use >>> either the eDP or DP table when enable the platform. In addition, some >>> platforms mismatch between the mode and the table where DP mode uses >>> the eDP table or eDP mode use the DP table. >>> >>> Clean up and correct the tables for currently supported platforms based on >>> the HPG specification. >>> >>> Here lists the tables can be reused across current platforms. >>> DP mode: >>> -sa8775p/sc7280/sc8280xp/x1e80100 >>> -glymur >>> eDP mode(low vdiff): >>> -glymur/sa8775p/sc8280xp/x1e80100 >>> -sc7280 >>> >>> Cc: stable@vger.kernel.org >>> Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") >>> Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> >>> --- >> >> I went through everything and all the sequences are OK. >> >> SC8180X will need changes, but it's already incorrect so this >> doesn't necessarily affect it >> >> Thanks! >> >> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> >> >> Konrad > Thanks here.. I didn’t notice before that SC8180X is different from SC7280, and will correct it in the next version. Please make it another patch on top of these two, so that we don't have to re-validate the existing diff Konrad ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-04-20 12:49 ` Konrad Dybcio @ 2026-04-21 3:54 ` Yongxing Mou 2026-04-21 13:00 ` Konrad Dybcio 0 siblings, 1 reply; 16+ messages in thread From: Yongxing Mou @ 2026-04-21 3:54 UTC (permalink / raw) To: Konrad Dybcio, Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson Cc: linux-arm-msm, linux-phy, linux-kernel, stable On 4/20/2026 8:49 PM, Konrad Dybcio wrote: > On 4/20/26 2:48 PM, Yongxing Mou wrote: >> >> >> On 4/16/2026 5:34 PM, Konrad Dybcio wrote: >>> On 3/2/26 9:28 AM, Yongxing Mou wrote: >>>> The eDP PHY supports both eDP&DP modes, each requires a different table. >>>> The current driver doesn't fully support every combo PHY mode and use >>>> either the eDP or DP table when enable the platform. In addition, some >>>> platforms mismatch between the mode and the table where DP mode uses >>>> the eDP table or eDP mode use the DP table. >>>> >>>> Clean up and correct the tables for currently supported platforms based on >>>> the HPG specification. >>>> >>>> Here lists the tables can be reused across current platforms. >>>> DP mode: >>>> -sa8775p/sc7280/sc8280xp/x1e80100 >>>> -glymur >>>> eDP mode(low vdiff): >>>> -glymur/sa8775p/sc8280xp/x1e80100 >>>> -sc7280 >>>> >>>> Cc: stable@vger.kernel.org >>>> Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") >>>> Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> >>>> --- >>> >>> I went through everything and all the sequences are OK. >>> >>> SC8180X will need changes, but it's already incorrect so this >>> doesn't necessarily affect it >>> >>> Thanks! >>> >>> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> >>> >>> Konrad >> Thanks here.. I didn’t notice before that SC8180X is different from SC7280, and will correct it in the next version. > > Please make it another patch on top of these two, so that we don't have > to re-validate the existing diff > > Konrad Thanks very much for the validating this patch. Could you sync with Dmitry how i post next patch?... He suggest me to splite this patch... ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support 2026-04-21 3:54 ` Yongxing Mou @ 2026-04-21 13:00 ` Konrad Dybcio 0 siblings, 0 replies; 16+ messages in thread From: Konrad Dybcio @ 2026-04-21 13:00 UTC (permalink / raw) To: Yongxing Mou, Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson Cc: linux-arm-msm, linux-phy, linux-kernel, stable On 4/21/26 5:54 AM, Yongxing Mou wrote: > > > On 4/20/2026 8:49 PM, Konrad Dybcio wrote: >> On 4/20/26 2:48 PM, Yongxing Mou wrote: >>> >>> >>> On 4/16/2026 5:34 PM, Konrad Dybcio wrote: >>>> On 3/2/26 9:28 AM, Yongxing Mou wrote: >>>>> The eDP PHY supports both eDP&DP modes, each requires a different table. >>>>> The current driver doesn't fully support every combo PHY mode and use >>>>> either the eDP or DP table when enable the platform. In addition, some >>>>> platforms mismatch between the mode and the table where DP mode uses >>>>> the eDP table or eDP mode use the DP table. >>>>> >>>>> Clean up and correct the tables for currently supported platforms based on >>>>> the HPG specification. >>>>> >>>>> Here lists the tables can be reused across current platforms. >>>>> DP mode: >>>>> -sa8775p/sc7280/sc8280xp/x1e80100 >>>>> -glymur >>>>> eDP mode(low vdiff): >>>>> -glymur/sa8775p/sc8280xp/x1e80100 >>>>> -sc7280 >>>>> >>>>> Cc: stable@vger.kernel.org >>>>> Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") >>>>> Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> >>>>> --- >>>> >>>> I went through everything and all the sequences are OK. >>>> >>>> SC8180X will need changes, but it's already incorrect so this >>>> doesn't necessarily affect it >>>> >>>> Thanks! >>>> >>>> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> >>>> >>>> Konrad >>> Thanks here.. I didn’t notice before that SC8180X is different from SC7280, and will correct it in the next version. >> >> Please make it another patch on top of these two, so that we don't have >> to re-validate the existing diff >> >> Konrad > Thanks very much for the validating this patch. Could you sync with Dmitry how i post next patch?... He suggest me to splite this patch... Eh I guess he's right.. I think the following approach should be fine: - take your current change - split it up into smaller pieces (so that the resulting diff is the same) - add a 8180 fixup on top Konrad ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 2/2] phy: qcom: edp: Add per-version LDO configuration callback 2026-03-02 8:28 [PATCH v3 0/2] phy: qcom: edp: Add DP/eDP switch for phys Yongxing Mou 2026-03-02 8:28 ` [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support Yongxing Mou @ 2026-03-02 8:28 ` Yongxing Mou 2026-03-05 11:26 ` Konrad Dybcio 2026-03-20 5:39 ` Dmitry Baryshkov 1 sibling, 2 replies; 16+ messages in thread From: Yongxing Mou @ 2026-03-02 8:28 UTC (permalink / raw) To: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson Cc: linux-arm-msm, linux-phy, linux-kernel, Yongxing Mou, stable For eDP low Vdiff, the LDO setting depends on the PHY version, instead of being a simple 0x0 or 0x01. Introduce the com_ldo_config callback to correct LDO setting accroding to the HPG. Since SC7280 uses different LDO settings than SA8775P/SC8280XP, introduce qcom_edp_phy_ops_v3 to keep the LDO setting correct. Cc: stable@vger.kernel.org Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> --- drivers/phy/qualcomm/phy-qcom-edp.c | 86 ++++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 10 deletions(-) diff --git a/drivers/phy/qualcomm/phy-qcom-edp.c b/drivers/phy/qualcomm/phy-qcom-edp.c index 36998326bae6..d29e548fce9d 100644 --- a/drivers/phy/qualcomm/phy-qcom-edp.c +++ b/drivers/phy/qualcomm/phy-qcom-edp.c @@ -81,6 +81,7 @@ struct phy_ver_ops { int (*com_clk_fwd_cfg)(const struct qcom_edp *edp); int (*com_configure_pll)(const struct qcom_edp *edp); int (*com_configure_ssc)(const struct qcom_edp *edp); + int (*com_ldo_config)(const struct qcom_edp *edp); }; struct qcom_edp_phy_cfg { @@ -304,7 +305,7 @@ static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configur const struct qcom_edp_swing_pre_emph_cfg *cfg; unsigned int v_level = 0; unsigned int p_level = 0; - u8 ldo_config; + int ret; u8 swing; u8 emph; int i; @@ -330,13 +331,13 @@ static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configur if (swing == 0xff || emph == 0xff) return -EINVAL; - ldo_config = edp->is_edp ? 0x0 : 0x1; + ret = edp->cfg->ver_ops->com_ldo_config(edp); + if (ret) + return ret; - writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG); writel(swing, edp->tx0 + TXn_TX_DRV_LVL); writel(emph, edp->tx0 + TXn_TX_EMP_POST1_LVL); - writel(ldo_config, edp->tx1 + TXn_LDO_CONFIG); writel(swing, edp->tx1 + TXn_TX_DRV_LVL); writel(emph, edp->tx1 + TXn_TX_EMP_POST1_LVL); @@ -560,6 +561,52 @@ static int qcom_edp_com_configure_pll_v4(const struct qcom_edp *edp) return 0; } +static int qcom_edp_ldo_config_v3(const struct qcom_edp *edp) +{ + const struct phy_configure_opts_dp *dp_opts = &edp->dp_opts; + u32 ldo_config; + + if (!edp->is_edp) + ldo_config = 0x0; + else if (dp_opts->link_rate <= 2700) + ldo_config = 0x81; + else + ldo_config = 0x41; + + writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG); + writel(dp_opts->lanes > 2 ? ldo_config : 0x00, edp->tx1 + TXn_LDO_CONFIG); + + return 0; +} + +static int qcom_edp_ldo_config_v4(const struct qcom_edp *edp) +{ + const struct phy_configure_opts_dp *dp_opts = &edp->dp_opts; + u32 ldo_config; + + if (!edp->is_edp) + ldo_config = 0x0; + else if (dp_opts->link_rate <= 2700) + ldo_config = 0xc1; + else + ldo_config = 0x81; + + writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG); + writel(dp_opts->lanes > 2 ? ldo_config : 0x00, edp->tx1 + TXn_LDO_CONFIG); + + return 0; +} + +static const struct phy_ver_ops qcom_edp_phy_ops_v3 = { + .com_power_on = qcom_edp_phy_power_on_v4, + .com_resetsm_cntrl = qcom_edp_phy_com_resetsm_cntrl_v4, + .com_bias_en_clkbuflr = qcom_edp_com_bias_en_clkbuflr_v4, + .com_clk_fwd_cfg = qcom_edp_com_clk_fwd_cfg_v4, + .com_configure_pll = qcom_edp_com_configure_pll_v4, + .com_configure_ssc = qcom_edp_com_configure_ssc_v4, + .com_ldo_config = qcom_edp_ldo_config_v3, +}; + static const struct phy_ver_ops qcom_edp_phy_ops_v4 = { .com_power_on = qcom_edp_phy_power_on_v4, .com_resetsm_cntrl = qcom_edp_phy_com_resetsm_cntrl_v4, @@ -567,6 +614,7 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v4 = { .com_clk_fwd_cfg = qcom_edp_com_clk_fwd_cfg_v4, .com_configure_pll = qcom_edp_com_configure_pll_v4, .com_configure_ssc = qcom_edp_com_configure_ssc_v4, + .com_ldo_config = qcom_edp_ldo_config_v4, }; static const struct qcom_edp_phy_cfg sa8775p_dp_phy_cfg = { @@ -583,7 +631,7 @@ static const struct qcom_edp_phy_cfg sc7280_dp_phy_cfg = { .vco_div_cfg = edp_phy_vco_div_cfg_v4, .dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg, .edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v3, - .ver_ops = &qcom_edp_phy_ops_v4, + .ver_ops = &qcom_edp_phy_ops_v3, }; static const struct qcom_edp_phy_cfg sc8280xp_dp_phy_cfg = { @@ -768,6 +816,24 @@ static int qcom_edp_com_configure_pll_v6(const struct qcom_edp *edp) return 0; } +static int qcom_edp_ldo_config_v6(const struct qcom_edp *edp) +{ + const struct phy_configure_opts_dp *dp_opts = &edp->dp_opts; + u32 ldo_config; + + if (!edp->is_edp) + ldo_config = 0x0; + else if (dp_opts->link_rate <= 2700) + ldo_config = 0x51; + else + ldo_config = 0x91; + + writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG); + writel(dp_opts->lanes > 2 ? ldo_config : 0x00, edp->tx1 + TXn_LDO_CONFIG); + + return 0; +} + static const struct phy_ver_ops qcom_edp_phy_ops_v6 = { .com_power_on = qcom_edp_phy_power_on_v6, .com_resetsm_cntrl = qcom_edp_phy_com_resetsm_cntrl_v6, @@ -775,6 +841,7 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v6 = { .com_clk_fwd_cfg = qcom_edp_com_clk_fwd_cfg_v4, .com_configure_pll = qcom_edp_com_configure_pll_v6, .com_configure_ssc = qcom_edp_com_configure_ssc_v6, + .com_ldo_config = qcom_edp_ldo_config_v6, }; static struct qcom_edp_phy_cfg x1e80100_phy_cfg = { @@ -955,6 +1022,7 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v8 = { .com_clk_fwd_cfg = qcom_edp_com_clk_fwd_cfg_v8, .com_configure_pll = qcom_edp_com_configure_pll_v8, .com_configure_ssc = qcom_edp_com_configure_ssc_v8, + .com_ldo_config = qcom_edp_ldo_config_v6, }; static struct qcom_edp_phy_cfg glymur_phy_cfg = { @@ -970,7 +1038,6 @@ static int qcom_edp_phy_power_on(struct phy *phy) const struct qcom_edp *edp = phy_get_drvdata(phy); u32 bias0_en, drvr0_en, bias1_en, drvr1_en; unsigned long pixel_freq; - u8 ldo_config = 0x0; int ret; u32 val; u8 cfg1; @@ -979,11 +1046,10 @@ static int qcom_edp_phy_power_on(struct phy *phy) if (ret) return ret; - if (edp->cfg->swing_pre_emph_cfg && !edp->is_edp) - ldo_config = 0x1; + ret = edp->cfg->ver_ops->com_ldo_config(edp); + if (ret) + return ret; - writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG); - writel(ldo_config, edp->tx1 + TXn_LDO_CONFIG); writel(0x00, edp->tx0 + TXn_LANE_MODE_1); writel(0x00, edp->tx1 + TXn_LANE_MODE_1); -- 2.43.0 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v3 2/2] phy: qcom: edp: Add per-version LDO configuration callback 2026-03-02 8:28 ` [PATCH v3 2/2] phy: qcom: edp: Add per-version LDO configuration callback Yongxing Mou @ 2026-03-05 11:26 ` Konrad Dybcio 2026-03-20 5:39 ` Dmitry Baryshkov 1 sibling, 0 replies; 16+ messages in thread From: Konrad Dybcio @ 2026-03-05 11:26 UTC (permalink / raw) To: Yongxing Mou, Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson Cc: linux-arm-msm, linux-phy, linux-kernel, stable On 3/2/26 9:28 AM, Yongxing Mou wrote: > For eDP low Vdiff, the LDO setting depends on the PHY version, instead of > being a simple 0x0 or 0x01. Introduce the com_ldo_config callback to > correct LDO setting accroding to the HPG. > > Since SC7280 uses different LDO settings than SA8775P/SC8280XP, introduce > qcom_edp_phy_ops_v3 to keep the LDO setting correct. > > Cc: stable@vger.kernel.org > Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") > Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> > --- Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> Tested-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> # SC8280XP X13s Konrad ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 2/2] phy: qcom: edp: Add per-version LDO configuration callback 2026-03-02 8:28 ` [PATCH v3 2/2] phy: qcom: edp: Add per-version LDO configuration callback Yongxing Mou 2026-03-05 11:26 ` Konrad Dybcio @ 2026-03-20 5:39 ` Dmitry Baryshkov 1 sibling, 0 replies; 16+ messages in thread From: Dmitry Baryshkov @ 2026-03-20 5:39 UTC (permalink / raw) To: Yongxing Mou Cc: Vinod Koul, Neil Armstrong, Stephen Boyd, Bjorn Andersson, linux-arm-msm, linux-phy, linux-kernel, stable On Mon, Mar 02, 2026 at 04:28:30PM +0800, Yongxing Mou wrote: > For eDP low Vdiff, the LDO setting depends on the PHY version, instead of > being a simple 0x0 or 0x01. Introduce the com_ldo_config callback to > correct LDO setting accroding to the HPG. > > Since SC7280 uses different LDO settings than SA8775P/SC8280XP, introduce > qcom_edp_phy_ops_v3 to keep the LDO setting correct. Please mention that this also uses low vdiff for eDP. With that in place: Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> > > Cc: stable@vger.kernel.org > Fixes: f199223cb490 ("phy: qcom: Introduce new eDP PHY driver") > Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> > --- > drivers/phy/qualcomm/phy-qcom-edp.c | 86 ++++++++++++++++++++++++++++++++----- > 1 file changed, 76 insertions(+), 10 deletions(-) -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-04-21 15:43 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-03-02 8:28 [PATCH v3 0/2] phy: qcom: edp: Add DP/eDP switch for phys Yongxing Mou 2026-03-02 8:28 ` [PATCH v3 1/2] phy: qcom: edp: Add eDP/DP mode switch support Yongxing Mou 2026-03-17 6:10 ` Yongxing Mou 2026-03-20 6:36 ` Dmitry Baryshkov 2026-04-20 12:47 ` Yongxing Mou 2026-04-20 18:32 ` Dmitry Baryshkov 2026-04-21 2:32 ` Yongxing Mou 2026-04-21 15:43 ` Dmitry Baryshkov 2026-04-16 9:34 ` Konrad Dybcio 2026-04-20 12:48 ` Yongxing Mou 2026-04-20 12:49 ` Konrad Dybcio 2026-04-21 3:54 ` Yongxing Mou 2026-04-21 13:00 ` Konrad Dybcio 2026-03-02 8:28 ` [PATCH v3 2/2] phy: qcom: edp: Add per-version LDO configuration callback Yongxing Mou 2026-03-05 11:26 ` Konrad Dybcio 2026-03-20 5:39 ` Dmitry Baryshkov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox