drm/bridge: analogix_dp: Don't change psr while bridge is disabled
authorzain wang <wzz@rock-chips.com>
Fri, 9 Mar 2018 22:22:54 +0000 (23:22 +0100)
committerHeiko Stuebner <heiko@sntech.de>
Wed, 14 Mar 2018 10:29:31 +0000 (11:29 +0100)
There is a race between AUX CH bring-up and enabling bridge which will
cause link training to fail. To avoid hitting it, don't change psr state
while enabling the bridge.

Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: Sean Paul <seanpaul@chromium.org>
Signed-off-by: zain wang <wzz@rock-chips.com>
Signed-off-by: Caesar Wang <wxt@rock-chips.com>
[seanpaul fixed up the commit message a bit and renamed *_supported to *_enabled]
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Thierry Escande <thierry.escande@collabora.com>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20180309222327.18689-4-enric.balletbo@collabora.com
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
include/drm/bridge/analogix_dp.h

index e738aa6..ee00d3d 100644 (file)
@@ -98,18 +98,18 @@ static int analogix_dp_detect_hpd(struct analogix_dp_device *dp)
        return 0;
 }
 
-int analogix_dp_psr_supported(struct analogix_dp_device *dp)
+int analogix_dp_psr_enabled(struct analogix_dp_device *dp)
 {
 
-       return dp->psr_support;
+       return dp->psr_enable;
 }
-EXPORT_SYMBOL_GPL(analogix_dp_psr_supported);
+EXPORT_SYMBOL_GPL(analogix_dp_psr_enabled);
 
 int analogix_dp_enable_psr(struct analogix_dp_device *dp)
 {
        struct edp_vsc_psr psr_vsc;
 
-       if (!dp->psr_support)
+       if (!dp->psr_enable)
                return 0;
 
        /* Prepare VSC packet as per EDP 1.4 spec, Table 6.9 */
@@ -131,7 +131,7 @@ int analogix_dp_disable_psr(struct analogix_dp_device *dp)
        struct edp_vsc_psr psr_vsc;
        int ret;
 
-       if (!dp->psr_support)
+       if (!dp->psr_enable)
                return 0;
 
        /* Prepare VSC packet as per EDP 1.4 spec, Table 6.9 */
@@ -871,8 +871,8 @@ static void analogix_dp_commit(struct analogix_dp_device *dp)
        /* Enable video */
        analogix_dp_start_video(dp);
 
-       dp->psr_support = analogix_dp_detect_sink_psr(dp);
-       if (dp->psr_support)
+       dp->psr_enable = analogix_dp_detect_sink_psr(dp);
+       if (dp->psr_enable)
                analogix_dp_enable_sink_psr(dp);
 }
 
@@ -1117,6 +1117,7 @@ static void analogix_dp_bridge_disable(struct drm_bridge *bridge)
        if (ret)
                DRM_ERROR("failed to setup the panel ret = %d\n", ret);
 
+       dp->psr_enable = false;
        dp->dpms_mode = DRM_MODE_DPMS_OFF;
 }
 
index b039b28..e135a42 100644 (file)
@@ -170,7 +170,7 @@ struct analogix_dp_device {
        int                     dpms_mode;
        int                     hpd_gpio;
        bool                    force_hpd;
-       bool                    psr_support;
+       bool                    psr_enable;
 
        struct mutex            panel_lock;
        bool                    panel_is_modeset;
index 3633483..3e8bf79 100644 (file)
@@ -82,7 +82,7 @@ static void analogix_dp_psr_set(struct drm_encoder *encoder, bool enabled)
        struct rockchip_dp_device *dp = to_dp(encoder);
        int ret;
 
-       if (!analogix_dp_psr_supported(dp->adp))
+       if (!analogix_dp_psr_enabled(dp->adp))
                return;
 
        DRM_DEV_DEBUG(dp->dev, "%s PSR...\n", enabled ? "Entry" : "Exit");
index 711fff9..e9a1116 100644 (file)
@@ -41,7 +41,7 @@ struct analogix_dp_plat_data {
                         struct drm_connector *);
 };
 
-int analogix_dp_psr_supported(struct analogix_dp_device *dp);
+int analogix_dp_psr_enabled(struct analogix_dp_device *dp);
 int analogix_dp_enable_psr(struct analogix_dp_device *dp);
 int analogix_dp_disable_psr(struct analogix_dp_device *dp);