From nobody Tue Jun 30 01:46:09 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 06DE6C433F5 for ; Sun, 30 Jan 2022 20:16:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356117AbiA3UP7 (ORCPT ); Sun, 30 Jan 2022 15:15:59 -0500 Received: from alexa-out.qualcomm.com ([129.46.98.28]:64360 "EHLO alexa-out.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1356107AbiA3UPw (ORCPT ); Sun, 30 Jan 2022 15:15:52 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1643573752; x=1675109752; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=kr8i4200zvZNCpI++PZAwE0y7fVE6hCheytAwi+YJ94=; b=IXkOaUgZKs7jKNJ37Au5PVlTNk418nUx5sK6glMqxKJZsAgRnfjpC1TW EWfAsu4I03jWHvgAKHRhrZr1xE92HY2XFV4AZAWLY7fe6X+jyslDg9x9m +NOEmwARn/003D1LQSiBzDQEtMyzWYmIKaO6cqDQNl7qt2Bsqz/WAsj7/ I=; Received: from ironmsg09-lv.qualcomm.com ([10.47.202.153]) by alexa-out.qualcomm.com with ESMTP; 30 Jan 2022 12:15:52 -0800 X-QCInternal: smtphost Received: from ironmsg02-blr.qualcomm.com ([10.86.208.131]) by ironmsg09-lv.qualcomm.com with ESMTP/TLS/AES256-SHA; 30 Jan 2022 12:15:50 -0800 X-QCInternal: smtphost Received: from rajeevny-linux.qualcomm.com ([10.204.66.121]) by ironmsg02-blr.qualcomm.com with ESMTP; 31 Jan 2022 01:45:22 +0530 Received: by rajeevny-linux.qualcomm.com (Postfix, from userid 2363605) id 82B4221AD1; Mon, 31 Jan 2022 01:45:22 +0530 (IST) From: Rajeev Nandan To: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, devicetree@vger.kernel.org Cc: Rajeev Nandan , linux-kernel@vger.kernel.org, sean@poorly.run, robdclark@gmail.com, robh+dt@kernel.org, robh@kernel.org, quic_abhinavk@quicinc.com, quic_kalyant@quicinc.com, quic_mkrishn@quicinc.com, jonathan@marek.ca, dmitry.baryshkov@linaro.org, airlied@linux.ie, daniel@ffwll.ch, swboyd@chromium.org Subject: [v5 1/3] dt-bindings: msm/dsi: Add 10nm dsi phy tuning properties Date: Mon, 31 Jan 2022 01:45:17 +0530 Message-Id: <1643573719-32095-2-git-send-email-quic_rajeevny@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1643573719-32095-1-git-send-email-quic_rajeevny@quicinc.com> References: <1643573719-32095-1-git-send-email-quic_rajeevny@quicinc.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" In most cases, the default values of DSI PHY tuning registers should be sufficient as they are fully optimized. However, in some cases where extreme board parasitics cause the eye shape to degrade, the override bits can be used to improve the signal quality. The general guidelines for DSI PHY tuning include: - High and moderate data rates may benefit from the drive strength and drive level tuning. - Drive strength tuning will affect the output impedance and may be used for matching optimization. - Drive level tuning will affect the output levels without affecting the impedance. The clock and data lanes have a calibration circuitry feature. The drive strength tuning can be done by adjusting rescode offset for hstop/hsbot, and the drive level tuning can be done by adjusting the LDO output level for the HSTX drive. Signed-off-by: Rajeev Nandan Reviewed-by: Rob Herring --- Changes in v2: - More details in the commit text (Stephen Boyd) - Use human understandable values (Stephen Boyd, Dmitry Baryshkov) - Do not take values that are going to be unused (Dmitry Baryshkov) Changes in v3: - Use "qcom," prefix (Dmitry Baryshkov) - Remove encoding from phy-drive-ldo-level (Dmitry Baryshkov) - Use negative values instead of two's complement (Dmitry, Rob Herring) Changes in v4: - Fix dt_binding_check error (Rob Herring's bot) Changes in v5: - None .../bindings/display/msm/dsi-phy-10nm.yaml | 36 ++++++++++++++++++= ++++ 1 file changed, 36 insertions(+) diff --git a/Documentation/devicetree/bindings/display/msm/dsi-phy-10nm.yam= l b/Documentation/devicetree/bindings/display/msm/dsi-phy-10nm.yaml index 4399715..2d5a766 100644 --- a/Documentation/devicetree/bindings/display/msm/dsi-phy-10nm.yaml +++ b/Documentation/devicetree/bindings/display/msm/dsi-phy-10nm.yaml @@ -35,6 +35,38 @@ properties: Connected to DSI0_MIPI_DSI_PLL_VDDA0P9 pin for sc7180 target and connected to VDDA_MIPI_DSI_0_PLL_0P9 pin for sdm845 target =20 + qcom,phy-rescode-offset-top: + $ref: /schemas/types.yaml#/definitions/int8-array + minItems: 5 + maxItems: 5 + description: + Integer array of offset for pull-up legs rescode for all five lanes. + To offset the drive strength from the calibrated value in an increas= ing + manner, -32 is the weakest and +31 is the strongest. + items: + minimum: -32 + maximum: 31 + + qcom,phy-rescode-offset-bot: + $ref: /schemas/types.yaml#/definitions/int8-array + minItems: 5 + maxItems: 5 + description: + Integer array of offset for pull-down legs rescode for all five lane= s. + To offset the drive strength from the calibrated value in a decreasi= ng + manner, -32 is the weakest and +31 is the strongest. + items: + minimum: -32 + maximum: 31 + + qcom,phy-drive-ldo-level: + $ref: "/schemas/types.yaml#/definitions/uint32" + description: + The PHY LDO has an amplitude tuning feature to adjust the LDO output + for the HSTX drive. Use supported levels (mV) to offset the drive le= vel + from the default value. + enum: [ 375, 400, 425, 450, 475, 500 ] + required: - compatible - reg @@ -64,5 +96,9 @@ examples: clocks =3D <&dispcc DISP_CC_MDSS_AHB_CLK>, <&rpmhcc RPMH_CXO_CLK>; clock-names =3D "iface", "ref"; + + qcom,phy-rescode-offset-top =3D /bits/ 8 <0 0 0 0 0>; + qcom,phy-rescode-offset-bot =3D /bits/ 8 <0 0 0 0 0>; + qcom,phy-drive-ldo-level =3D <400>; }; ... --=20 2.7.4 From nobody Tue Jun 30 01:46:09 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8D1B3C433F5 for ; Sun, 30 Jan 2022 20:15:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356098AbiA3UPu (ORCPT ); Sun, 30 Jan 2022 15:15:50 -0500 Received: from alexa-out.qualcomm.com ([129.46.98.28]:42867 "EHLO alexa-out.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231913AbiA3UPs (ORCPT ); Sun, 30 Jan 2022 15:15:48 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1643573748; x=1675109748; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=nlceKRR9XYG+70HrS2RmpUq7A6HORpYsEV0OXmBraE8=; b=XVrSm8A+s1oeFdaS80Ym7ftzf423ubsu+2Lmg+zITtvS0asdNfPQNxXA WWEiI7/i5k5+JqxqQQEkosgAKerHgnqTIjWmX6cTyo5UFzINQ542ugWL2 JuIjfmhRcsaNFUStGWE43heikeck7GO7NMp73gnLc8AAsfoKL8dvTsWHV s=; Received: from ironmsg09-lv.qualcomm.com ([10.47.202.153]) by alexa-out.qualcomm.com with ESMTP; 30 Jan 2022 12:15:48 -0800 X-QCInternal: smtphost Received: from ironmsg02-blr.qualcomm.com ([10.86.208.131]) by ironmsg09-lv.qualcomm.com with ESMTP/TLS/AES256-SHA; 30 Jan 2022 12:15:46 -0800 X-QCInternal: smtphost Received: from rajeevny-linux.qualcomm.com ([10.204.66.121]) by ironmsg02-blr.qualcomm.com with ESMTP; 31 Jan 2022 01:45:23 +0530 Received: by rajeevny-linux.qualcomm.com (Postfix, from userid 2363605) id 709A521AD2; Mon, 31 Jan 2022 01:45:23 +0530 (IST) From: Rajeev Nandan To: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, devicetree@vger.kernel.org Cc: Rajeev Nandan , linux-kernel@vger.kernel.org, sean@poorly.run, robdclark@gmail.com, robh+dt@kernel.org, robh@kernel.org, quic_abhinavk@quicinc.com, quic_kalyant@quicinc.com, quic_mkrishn@quicinc.com, jonathan@marek.ca, dmitry.baryshkov@linaro.org, airlied@linux.ie, daniel@ffwll.ch, swboyd@chromium.org Subject: [v5 2/3] drm/msm/dsi: Add dsi phy tuning configuration support Date: Mon, 31 Jan 2022 01:45:18 +0530 Message-Id: <1643573719-32095-3-git-send-email-quic_rajeevny@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1643573719-32095-1-git-send-email-quic_rajeevny@quicinc.com> References: <1643573719-32095-1-git-send-email-quic_rajeevny@quicinc.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add support for MSM DSI PHY tuning configuration. Current design is to support drive strength and drive level/amplitude tuning for 10nm PHY version, but this can be extended to other PHY versions. Signed-off-by: Rajeev Nandan Reviewed-by: Dmitry Baryshkov --- Changes in v2: - New. - Split into generic code and 10nm-specific part (Dmitry Baryshkov) Changes in v3: - s/ops.tuning_cfg_init/ops.parse_dt_properties To parse phy version specific DT properties (Dmitry Baryshkov) - Address comments for phy tuning data structure (Dmitry Baryshkov) No change since v4 drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 6 ++++++ drivers/gpu/drm/msm/dsi/phy/dsi_phy.h | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/ds= i/phy/dsi_phy.c index 8c65ef6..fcbca76 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c @@ -739,6 +739,12 @@ static int dsi_phy_driver_probe(struct platform_device= *pdev) } } =20 + if (phy->cfg->ops.parse_dt_properties) { + ret =3D phy->cfg->ops.parse_dt_properties(phy); + if (ret) + goto fail; + } + ret =3D dsi_phy_regulator_init(phy); if (ret) goto fail; diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h b/drivers/gpu/drm/msm/ds= i/phy/dsi_phy.h index b91303a..9e08081 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h @@ -25,6 +25,7 @@ struct msm_dsi_phy_ops { void (*save_pll_state)(struct msm_dsi_phy *phy); int (*restore_pll_state)(struct msm_dsi_phy *phy); bool (*set_continuous_clock)(struct msm_dsi_phy *phy, bool enable); + int (*parse_dt_properties)(struct msm_dsi_phy *phy); }; =20 struct msm_dsi_phy_cfg { @@ -81,6 +82,8 @@ struct msm_dsi_dphy_timing { #define DSI_PIXEL_PLL_CLK 1 #define NUM_PROVIDED_CLKS 2 =20 +#define DSI_LANE_MAX 5 + struct msm_dsi_phy { struct platform_device *pdev; void __iomem *base; @@ -98,6 +101,7 @@ struct msm_dsi_phy { =20 struct msm_dsi_dphy_timing timing; const struct msm_dsi_phy_cfg *cfg; + void *tuning_cfg; =20 enum msm_dsi_phy_usecase usecase; bool regulator_ldo_mode; --=20 2.7.4 From nobody Tue Jun 30 01:46:09 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2BF26C433FE for ; Sun, 30 Jan 2022 20:15:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356108AbiA3UPw (ORCPT ); Sun, 30 Jan 2022 15:15:52 -0500 Received: from alexa-out.qualcomm.com ([129.46.98.28]:42867 "EHLO alexa-out.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1356097AbiA3UPu (ORCPT ); Sun, 30 Jan 2022 15:15:50 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1643573750; x=1675109750; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=p5aXxLCPRw2pj9jH3aEARcXm7IAACxpMBexHYu/TxcA=; b=VIh2Q4UmpaMQCdCKSNYy/WQfTOIOJi2UljxcS5OsIOa5yWZjPjyLzVVZ M0e/Uz4C2Jr61vc2W0l9EuO+mqK2mVXxJO9X3E1N6eMlFKtCwlMq3W6+A 4A+umgXfIhZmvzAy554Sel6sedhqdmpgxKXRHlGaNh0zYNCNSLJN6U2w9 w=; Received: from ironmsg09-lv.qualcomm.com ([10.47.202.153]) by alexa-out.qualcomm.com with ESMTP; 30 Jan 2022 12:15:50 -0800 X-QCInternal: smtphost Received: from ironmsg02-blr.qualcomm.com ([10.86.208.131]) by ironmsg09-lv.qualcomm.com with ESMTP/TLS/AES256-SHA; 30 Jan 2022 12:15:48 -0800 X-QCInternal: smtphost Received: from rajeevny-linux.qualcomm.com ([10.204.66.121]) by ironmsg02-blr.qualcomm.com with ESMTP; 31 Jan 2022 01:45:24 +0530 Received: by rajeevny-linux.qualcomm.com (Postfix, from userid 2363605) id 5A82221ACE; Mon, 31 Jan 2022 01:45:24 +0530 (IST) From: Rajeev Nandan To: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, devicetree@vger.kernel.org Cc: Rajeev Nandan , linux-kernel@vger.kernel.org, sean@poorly.run, robdclark@gmail.com, robh+dt@kernel.org, robh@kernel.org, quic_abhinavk@quicinc.com, quic_kalyant@quicinc.com, quic_mkrishn@quicinc.com, jonathan@marek.ca, dmitry.baryshkov@linaro.org, airlied@linux.ie, daniel@ffwll.ch, swboyd@chromium.org Subject: [v5 3/3] drm/msm/dsi: Add 10nm dsi phy tuning configuration support Date: Mon, 31 Jan 2022 01:45:19 +0530 Message-Id: <1643573719-32095-4-git-send-email-quic_rajeevny@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1643573719-32095-1-git-send-email-quic_rajeevny@quicinc.com> References: <1643573719-32095-1-git-send-email-quic_rajeevny@quicinc.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The clock and data lanes of the DSI PHY have a calibration circuitry feature. As per the MSM DSI PHY tuning guidelines, the drive strength tuning can be done by adjusting rescode offset for hstop/hsbot, and the drive level tuning can be done by adjusting the LDO output level for the HSTX drive. Signed-off-by: Rajeev Nandan Reviewed-by: Dmitry Baryshkov --- Changes in v2: - Split into generic code and 10nm-specific part (Dmitry Baryshkov) - Fix the backward compatibility (Dmitry Baryshkov) Changes in v3: - Address comments for phy tuning data structure (Dmitry Baryshkov) - Make changes as per updated dt-bindings Changes in v4: - Return error in case of out of range values (Dmitry Baryshkov) - Return error if dt property is present but parsing is failing Changes in v5: - Added missing printk arg ldo_level drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c | 118 +++++++++++++++++++++++++= ++-- 1 file changed, 112 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c b/drivers/gpu/drm/m= sm/dsi/phy/dsi_phy_10nm.c index d8128f5..86a6954 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c @@ -83,6 +83,18 @@ struct dsi_pll_10nm { =20 #define to_pll_10nm(x) container_of(x, struct dsi_pll_10nm, clk_hw) =20 +/** + * struct dsi_phy_10nm_tuning_cfg - Holds 10nm PHY tuning config parameter= s. + * @rescode_offset_top: Offset for pull-up legs rescode. + * @rescode_offset_bot: Offset for pull-down legs rescode. + * @vreg_ctrl: vreg ctrl to drive LDO level + */ +struct dsi_phy_10nm_tuning_cfg { + u8 rescode_offset_top[DSI_LANE_MAX]; + u8 rescode_offset_bot[DSI_LANE_MAX]; + u8 vreg_ctrl; +}; + /* * Global list of private DSI PLL struct pointers. We need this for bonded= DSI * mode, where the master PLL's clk_ops needs access the slave's private d= ata @@ -747,6 +759,7 @@ static void dsi_phy_hw_v3_0_lane_settings(struct msm_ds= i_phy *phy) int i; u8 tx_dctrl[] =3D { 0x00, 0x00, 0x00, 0x04, 0x01 }; void __iomem *lane_base =3D phy->lane_base; + struct dsi_phy_10nm_tuning_cfg *tuning_cfg =3D phy->tuning_cfg; =20 if (phy->cfg->quirks & DSI_PHY_10NM_QUIRK_OLD_TIMINGS) tx_dctrl[3] =3D 0x02; @@ -775,10 +788,13 @@ static void dsi_phy_hw_v3_0_lane_settings(struct msm_= dsi_phy *phy) dsi_phy_write(lane_base + REG_DSI_10nm_PHY_LN_CFG2(i), 0x0); dsi_phy_write(lane_base + REG_DSI_10nm_PHY_LN_CFG3(i), i =3D=3D 4 ? 0x80 : 0x0); - dsi_phy_write(lane_base + - REG_DSI_10nm_PHY_LN_OFFSET_TOP_CTRL(i), 0x0); - dsi_phy_write(lane_base + - REG_DSI_10nm_PHY_LN_OFFSET_BOT_CTRL(i), 0x0); + + /* platform specific dsi phy drive strength adjustment */ + dsi_phy_write(lane_base + REG_DSI_10nm_PHY_LN_OFFSET_TOP_CTRL(i), + tuning_cfg->rescode_offset_top[i]); + dsi_phy_write(lane_base + REG_DSI_10nm_PHY_LN_OFFSET_BOT_CTRL(i), + tuning_cfg->rescode_offset_bot[i]); + dsi_phy_write(lane_base + REG_DSI_10nm_PHY_LN_TX_DCTRL(i), tx_dctrl[i]); } @@ -799,6 +815,7 @@ static int dsi_10nm_phy_enable(struct msm_dsi_phy *phy, u32 const timeout_us =3D 1000; struct msm_dsi_dphy_timing *timing =3D &phy->timing; void __iomem *base =3D phy->base; + struct dsi_phy_10nm_tuning_cfg *tuning_cfg =3D phy->tuning_cfg; u32 data; =20 DBG(""); @@ -834,8 +851,9 @@ static int dsi_10nm_phy_enable(struct msm_dsi_phy *phy, /* Select MS1 byte-clk */ dsi_phy_write(base + REG_DSI_10nm_PHY_CMN_GLBL_CTRL, 0x10); =20 - /* Enable LDO */ - dsi_phy_write(base + REG_DSI_10nm_PHY_CMN_VREG_CTRL, 0x59); + /* Enable LDO with platform specific drive level/amplitude adjustment */ + dsi_phy_write(base + REG_DSI_10nm_PHY_CMN_VREG_CTRL, + tuning_cfg->vreg_ctrl); =20 /* Configure PHY lane swap (TODO: we need to calculate this) */ dsi_phy_write(base + REG_DSI_10nm_PHY_CMN_LANE_CFG0, 0x21); @@ -922,6 +940,92 @@ static void dsi_10nm_phy_disable(struct msm_dsi_phy *p= hy) DBG("DSI%d PHY disabled", phy->id); } =20 +static int dsi_10nm_phy_parse_dt(struct msm_dsi_phy *phy) +{ + struct device *dev =3D &phy->pdev->dev; + struct dsi_phy_10nm_tuning_cfg *tuning_cfg; + s8 offset_top[DSI_LANE_MAX] =3D { 0 }; /* No offset */ + s8 offset_bot[DSI_LANE_MAX] =3D { 0 }; /* No offset */ + u32 ldo_level =3D 400; /* 400mV */ + u8 level; + int ret, i; + + tuning_cfg =3D devm_kzalloc(dev, sizeof(*tuning_cfg), GFP_KERNEL); + if (!tuning_cfg) + return -ENOMEM; + + /* Drive strength adjustment parameters */ + ret =3D of_property_read_u8_array(dev->of_node, "qcom,phy-rescode-offset-= top", + offset_top, DSI_LANE_MAX); + if (ret && ret !=3D -EINVAL) { + DRM_DEV_ERROR(dev, "failed to parse qcom,phy-rescode-offset-top, %d\n", = ret); + return ret; + } + + for (i =3D 0; i < DSI_LANE_MAX; i++) { + if (offset_top[i] < -32 || offset_top[i] > 31) { + DRM_DEV_ERROR(dev, + "qcom,phy-rescode-offset-top value %d is not in range [-32..31]\n", + offset_top[i]); + return -EINVAL; + } + tuning_cfg->rescode_offset_top[i] =3D 0x3f & offset_top[i]; + } + + ret =3D of_property_read_u8_array(dev->of_node, "qcom,phy-rescode-offset-= bot", + offset_bot, DSI_LANE_MAX); + if (ret && ret !=3D -EINVAL) { + DRM_DEV_ERROR(dev, "failed to parse qcom,phy-rescode-offset-bot, %d\n", = ret); + return ret; + } + + for (i =3D 0; i < DSI_LANE_MAX; i++) { + if (offset_bot[i] < -32 || offset_bot[i] > 31) { + DRM_DEV_ERROR(dev, + "qcom,phy-rescode-offset-bot value %d is not in range [-32..31]\n", + offset_bot[i]); + return -EINVAL; + } + tuning_cfg->rescode_offset_bot[i] =3D 0x3f & offset_bot[i]; + } + + /* Drive level/amplitude adjustment parameters */ + ret =3D of_property_read_u32(dev->of_node, "qcom,phy-drive-ldo-level", &l= do_level); + if (ret && ret !=3D -EINVAL) { + DRM_DEV_ERROR(dev, "failed to parse qcom,phy-drive-ldo-level, %d\n", ret= ); + return ret; + } + + switch (ldo_level) { + case 375: + level =3D 0; + break; + case 400: + level =3D 1; + break; + case 425: + level =3D 2; + break; + case 450: + level =3D 3; + break; + case 475: + level =3D 4; + break; + case 500: + level =3D 5; + break; + default: + DRM_DEV_ERROR(dev, "qcom,phy-drive-ldo-level %d is not supported\n", ldo= _level); + return -EINVAL; + } + tuning_cfg->vreg_ctrl =3D 0x58 | (0x7 & level); + + phy->tuning_cfg =3D tuning_cfg; + + return 0; +} + const struct msm_dsi_phy_cfg dsi_phy_10nm_cfgs =3D { .has_phy_lane =3D true, .reg_cfg =3D { @@ -936,6 +1040,7 @@ const struct msm_dsi_phy_cfg dsi_phy_10nm_cfgs =3D { .pll_init =3D dsi_pll_10nm_init, .save_pll_state =3D dsi_10nm_pll_save_state, .restore_pll_state =3D dsi_10nm_pll_restore_state, + .parse_dt_properties =3D dsi_10nm_phy_parse_dt, }, .min_pll_rate =3D 1000000000UL, .max_pll_rate =3D 3500000000UL, @@ -957,6 +1062,7 @@ const struct msm_dsi_phy_cfg dsi_phy_10nm_8998_cfgs = =3D { .pll_init =3D dsi_pll_10nm_init, .save_pll_state =3D dsi_10nm_pll_save_state, .restore_pll_state =3D dsi_10nm_pll_restore_state, + .parse_dt_properties =3D dsi_10nm_phy_parse_dt, }, .min_pll_rate =3D 1000000000UL, .max_pll_rate =3D 3500000000UL, --=20 2.7.4