Skip to content

Commit 519a228

Browse files
Yongxing Mouvinodkoul
authored andcommitted
phy: qcom: edp: Add PHY-specific LDO config for eDP low vdiff
For eDP low vdiff, the LDO setting depends on the PHY version rather than being a simple 0x0 or 0x1 value. Introduce a PHY callback to program the correct LDO setting according to the HPG. Since SC7280/SC8180X uses different LDO settings from SA8775P/SC8280XP, introduce qcom_edp_phy_ops_v3 to keep the LDO setting correct. Cc: stable@vger.kernel.org Fixes: f199223 ("phy: qcom: Introduce new eDP PHY driver") Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> Tested-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> # SC8280XP X13s Link: https://patch.msgid.link/20260427-edp_phy-v5-5-3bb876824475@oss.qualcomm.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
1 parent bf237a9 commit 519a228

1 file changed

Lines changed: 77 additions & 11 deletions

File tree

drivers/phy/qualcomm/phy-qcom-edp.c

Lines changed: 77 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ struct phy_ver_ops {
8181
int (*com_clk_fwd_cfg)(const struct qcom_edp *edp);
8282
int (*com_configure_pll)(const struct qcom_edp *edp);
8383
int (*com_configure_ssc)(const struct qcom_edp *edp);
84+
int (*com_ldo_config)(const struct qcom_edp *edp);
8485
};
8586

8687
struct qcom_edp_phy_cfg {
@@ -352,7 +353,7 @@ static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configur
352353
const struct qcom_edp_swing_pre_emph_cfg *cfg;
353354
unsigned int v_level = 0;
354355
unsigned int p_level = 0;
355-
u8 ldo_config;
356+
int ret;
356357
u8 swing;
357358
u8 emph;
358359
int i;
@@ -378,13 +379,13 @@ static int qcom_edp_set_voltages(struct qcom_edp *edp, const struct phy_configur
378379
if (swing == 0xff || emph == 0xff)
379380
return -EINVAL;
380381

381-
ldo_config = edp->is_edp ? 0x0 : 0x1;
382+
ret = edp->cfg->ver_ops->com_ldo_config(edp);
383+
if (ret)
384+
return ret;
382385

383-
writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG);
384386
writel(swing, edp->tx0 + TXn_TX_DRV_LVL);
385387
writel(emph, edp->tx0 + TXn_TX_EMP_POST1_LVL);
386388

387-
writel(ldo_config, edp->tx1 + TXn_LDO_CONFIG);
388389
writel(swing, edp->tx1 + TXn_TX_DRV_LVL);
389390
writel(emph, edp->tx1 + TXn_TX_EMP_POST1_LVL);
390391

@@ -608,13 +609,60 @@ static int qcom_edp_com_configure_pll_v4(const struct qcom_edp *edp)
608609
return 0;
609610
}
610611

612+
static int qcom_edp_ldo_config_v3(const struct qcom_edp *edp)
613+
{
614+
const struct phy_configure_opts_dp *dp_opts = &edp->dp_opts;
615+
u32 ldo_config;
616+
617+
if (!edp->is_edp)
618+
ldo_config = 0x0;
619+
else if (dp_opts->link_rate <= 2700)
620+
ldo_config = 0x81;
621+
else
622+
ldo_config = 0x41;
623+
624+
writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG);
625+
writel(dp_opts->lanes > 2 ? ldo_config : 0x00, edp->tx1 + TXn_LDO_CONFIG);
626+
627+
return 0;
628+
}
629+
630+
static int qcom_edp_ldo_config_v4(const struct qcom_edp *edp)
631+
{
632+
const struct phy_configure_opts_dp *dp_opts = &edp->dp_opts;
633+
u32 ldo_config;
634+
635+
if (!edp->is_edp)
636+
ldo_config = 0x0;
637+
else if (dp_opts->link_rate <= 2700)
638+
ldo_config = 0xc1;
639+
else
640+
ldo_config = 0x81;
641+
642+
writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG);
643+
writel(dp_opts->lanes > 2 ? ldo_config : 0x00, edp->tx1 + TXn_LDO_CONFIG);
644+
645+
return 0;
646+
}
647+
648+
static const struct phy_ver_ops qcom_edp_phy_ops_v3 = {
649+
.com_power_on = qcom_edp_phy_power_on_v4,
650+
.com_resetsm_cntrl = qcom_edp_phy_com_resetsm_cntrl_v4,
651+
.com_bias_en_clkbuflr = qcom_edp_com_bias_en_clkbuflr_v4,
652+
.com_clk_fwd_cfg = qcom_edp_com_clk_fwd_cfg_v4,
653+
.com_configure_pll = qcom_edp_com_configure_pll_v4,
654+
.com_configure_ssc = qcom_edp_com_configure_ssc_v4,
655+
.com_ldo_config = qcom_edp_ldo_config_v3,
656+
};
657+
611658
static const struct phy_ver_ops qcom_edp_phy_ops_v4 = {
612659
.com_power_on = qcom_edp_phy_power_on_v4,
613660
.com_resetsm_cntrl = qcom_edp_phy_com_resetsm_cntrl_v4,
614661
.com_bias_en_clkbuflr = qcom_edp_com_bias_en_clkbuflr_v4,
615662
.com_clk_fwd_cfg = qcom_edp_com_clk_fwd_cfg_v4,
616663
.com_configure_pll = qcom_edp_com_configure_pll_v4,
617664
.com_configure_ssc = qcom_edp_com_configure_ssc_v4,
665+
.com_ldo_config = qcom_edp_ldo_config_v4,
618666
};
619667

620668
static const struct qcom_edp_phy_cfg sa8775p_dp_phy_cfg = {
@@ -631,15 +679,15 @@ static const struct qcom_edp_phy_cfg sc7280_dp_phy_cfg = {
631679
.vco_div_cfg = edp_phy_vco_div_cfg_v4,
632680
.dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg,
633681
.edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v3,
634-
.ver_ops = &qcom_edp_phy_ops_v4,
682+
.ver_ops = &qcom_edp_phy_ops_v3,
635683
};
636684

637685
static const struct qcom_edp_phy_cfg sc8180x_dp_phy_cfg = {
638686
.aux_cfg = edp_phy_aux_cfg_v4,
639687
.vco_div_cfg = edp_phy_vco_div_cfg_v4,
640688
.dp_swing_pre_emph_cfg = &dp_phy_swing_pre_emph_cfg_v2,
641689
.edp_swing_pre_emph_cfg = &edp_phy_swing_pre_emph_cfg_v2,
642-
.ver_ops = &qcom_edp_phy_ops_v4,
690+
.ver_ops = &qcom_edp_phy_ops_v3,
643691
};
644692

645693
static const struct qcom_edp_phy_cfg sc8280xp_dp_phy_cfg = {
@@ -824,13 +872,32 @@ static int qcom_edp_com_configure_pll_v6(const struct qcom_edp *edp)
824872
return 0;
825873
}
826874

875+
static int qcom_edp_ldo_config_v6(const struct qcom_edp *edp)
876+
{
877+
const struct phy_configure_opts_dp *dp_opts = &edp->dp_opts;
878+
u32 ldo_config;
879+
880+
if (!edp->is_edp)
881+
ldo_config = 0x0;
882+
else if (dp_opts->link_rate <= 2700)
883+
ldo_config = 0x51;
884+
else
885+
ldo_config = 0x91;
886+
887+
writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG);
888+
writel(dp_opts->lanes > 2 ? ldo_config : 0x00, edp->tx1 + TXn_LDO_CONFIG);
889+
890+
return 0;
891+
}
892+
827893
static const struct phy_ver_ops qcom_edp_phy_ops_v6 = {
828894
.com_power_on = qcom_edp_phy_power_on_v6,
829895
.com_resetsm_cntrl = qcom_edp_phy_com_resetsm_cntrl_v6,
830896
.com_bias_en_clkbuflr = qcom_edp_com_bias_en_clkbuflr_v6,
831897
.com_clk_fwd_cfg = qcom_edp_com_clk_fwd_cfg_v4,
832898
.com_configure_pll = qcom_edp_com_configure_pll_v6,
833899
.com_configure_ssc = qcom_edp_com_configure_ssc_v6,
900+
.com_ldo_config = qcom_edp_ldo_config_v6,
834901
};
835902

836903
static struct qcom_edp_phy_cfg x1e80100_phy_cfg = {
@@ -1011,6 +1078,7 @@ static const struct phy_ver_ops qcom_edp_phy_ops_v8 = {
10111078
.com_clk_fwd_cfg = qcom_edp_com_clk_fwd_cfg_v8,
10121079
.com_configure_pll = qcom_edp_com_configure_pll_v8,
10131080
.com_configure_ssc = qcom_edp_com_configure_ssc_v8,
1081+
.com_ldo_config = qcom_edp_ldo_config_v6,
10141082
};
10151083

10161084
static struct qcom_edp_phy_cfg glymur_phy_cfg = {
@@ -1026,7 +1094,6 @@ static int qcom_edp_phy_power_on(struct phy *phy)
10261094
const struct qcom_edp *edp = phy_get_drvdata(phy);
10271095
u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
10281096
unsigned long pixel_freq;
1029-
u8 ldo_config = 0x0;
10301097
int ret;
10311098
u32 val;
10321099
u8 cfg1;
@@ -1035,11 +1102,10 @@ static int qcom_edp_phy_power_on(struct phy *phy)
10351102
if (ret)
10361103
return ret;
10371104

1038-
if (edp->cfg->edp_swing_pre_emph_cfg && !edp->is_edp)
1039-
ldo_config = 0x1;
1105+
ret = edp->cfg->ver_ops->com_ldo_config(edp);
1106+
if (ret)
1107+
return ret;
10401108

1041-
writel(ldo_config, edp->tx0 + TXn_LDO_CONFIG);
1042-
writel(ldo_config, edp->tx1 + TXn_LDO_CONFIG);
10431109
writel(0x00, edp->tx0 + TXn_LANE_MODE_1);
10441110
writel(0x00, edp->tx1 + TXn_LANE_MODE_1);
10451111

0 commit comments

Comments
 (0)