summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/msm
diff options
context:
space:
mode:
authorKuogee Hsieh <quic_khsieh@quicinc.com>2022-09-12 09:23:50 -0700
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>2022-11-02 18:59:44 +0300
commitaf309c0c0654f4580c44d1f6db1809e9a78d079e (patch)
treec5905f750194faefd196bf037d814916de9797ad /drivers/gpu/drm/msm
parentd54c518a496f8cd6db857ec65c6c8bc68f87f16d (diff)
downloadlinux-stable-af309c0c0654f4580c44d1f6db1809e9a78d079e.tar.gz
linux-stable-af309c0c0654f4580c44d1f6db1809e9a78d079e.tar.bz2
linux-stable-af309c0c0654f4580c44d1f6db1809e9a78d079e.zip
drm/msm/dp: retry 3 times if set sink to D0 poweer state failed
Bring sink out of D3 (power down) mode into D0 (normal operation) mode by setting DP_SET_POWER_D0 bit to DP_SET_POWER dpcd register. This patch will retry 3 times if written to DP_SET_POWER register failed. Changes in v5: -- split into two patches Signed-off-by: Kuogee Hsieh <quic_khsieh@quicinc.com> Patchwork: https://patchwork.freedesktop.org/patch/502536/ Link: https://lore.kernel.org/r/1662999830-13916-4-git-send-email-quic_khsieh@quicinc.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Diffstat (limited to 'drivers/gpu/drm/msm')
-rw-r--r--drivers/gpu/drm/msm/dp/dp_link.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/gpu/drm/msm/dp/dp_link.c b/drivers/gpu/drm/msm/dp/dp_link.c
index ef35fac333f7..f1f1d646539d 100644
--- a/drivers/gpu/drm/msm/dp/dp_link.c
+++ b/drivers/gpu/drm/msm/dp/dp_link.c
@@ -50,6 +50,7 @@ static int dp_aux_link_power_up(struct drm_dp_aux *aux,
{
u8 value;
ssize_t len;
+ int i;
if (link->revision < 0x11)
return 0;
@@ -61,11 +62,13 @@ static int dp_aux_link_power_up(struct drm_dp_aux *aux,
value &= ~DP_SET_POWER_MASK;
value |= DP_SET_POWER_D0;
- len = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
- if (len < 0)
- return len;
-
- usleep_range(1000, 2000);
+ /* retry for 1ms to give the sink time to wake up */
+ for (i = 0; i < 3; i++) {
+ len = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value);
+ usleep_range(1000, 2000);
+ if (len == 1)
+ break;
+ }
return 0;
}