Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 243e398a authored by zain wang's avatar zain wang Committed by Heiko Stuebner
Browse files

drm/bridge: analogix_dp: Don't change psr while bridge is disabled



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: default avatarzain wang <wzz@rock-chips.com>
Signed-off-by: default avatarCaesar Wang <wxt@rock-chips.com>
[seanpaul fixed up the commit message a bit and renamed *_supported to *_enabled]
Signed-off-by: default avatarSean Paul <seanpaul@chromium.org>
Signed-off-by: default avatarThierry Escande <thierry.escande@collabora.com>
Signed-off-by: default avatarEnric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: default avatarArchit Taneja <architt@codeaurora.org>
Signed-off-by: default avatarHeiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20180309222327.18689-4-enric.balletbo@collabora.com
parent baa2f024
Loading
Loading
Loading
Loading
+8 −7
Original line number Original line Diff line number Diff line
@@ -98,18 +98,18 @@ static int analogix_dp_detect_hpd(struct analogix_dp_device *dp)
	return 0;
	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)
int analogix_dp_enable_psr(struct analogix_dp_device *dp)
{
{
	struct edp_vsc_psr psr_vsc;
	struct edp_vsc_psr psr_vsc;


	if (!dp->psr_support)
	if (!dp->psr_enable)
		return 0;
		return 0;


	/* Prepare VSC packet as per EDP 1.4 spec, Table 6.9 */
	/* 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;
	struct edp_vsc_psr psr_vsc;
	int ret;
	int ret;


	if (!dp->psr_support)
	if (!dp->psr_enable)
		return 0;
		return 0;


	/* Prepare VSC packet as per EDP 1.4 spec, Table 6.9 */
	/* 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 */
	/* Enable video */
	analogix_dp_start_video(dp);
	analogix_dp_start_video(dp);


	dp->psr_support = analogix_dp_detect_sink_psr(dp);
	dp->psr_enable = analogix_dp_detect_sink_psr(dp);
	if (dp->psr_support)
	if (dp->psr_enable)
		analogix_dp_enable_sink_psr(dp);
		analogix_dp_enable_sink_psr(dp);
}
}


@@ -1117,6 +1117,7 @@ static void analogix_dp_bridge_disable(struct drm_bridge *bridge)
	if (ret)
	if (ret)
		DRM_ERROR("failed to setup the panel ret = %d\n", ret);
		DRM_ERROR("failed to setup the panel ret = %d\n", ret);


	dp->psr_enable = false;
	dp->dpms_mode = DRM_MODE_DPMS_OFF;
	dp->dpms_mode = DRM_MODE_DPMS_OFF;
}
}


+1 −1
Original line number Original line Diff line number Diff line
@@ -170,7 +170,7 @@ struct analogix_dp_device {
	int			dpms_mode;
	int			dpms_mode;
	int			hpd_gpio;
	int			hpd_gpio;
	bool                    force_hpd;
	bool                    force_hpd;
	bool			psr_support;
	bool			psr_enable;


	struct mutex		panel_lock;
	struct mutex		panel_lock;
	bool			panel_is_modeset;
	bool			panel_is_modeset;
+1 −1
Original line number Original line Diff line number Diff line
@@ -82,7 +82,7 @@ static void analogix_dp_psr_set(struct drm_encoder *encoder, bool enabled)
	struct rockchip_dp_device *dp = to_dp(encoder);
	struct rockchip_dp_device *dp = to_dp(encoder);
	int ret;
	int ret;


	if (!analogix_dp_psr_supported(dp->adp))
	if (!analogix_dp_psr_enabled(dp->adp))
		return;
		return;


	DRM_DEV_DEBUG(dp->dev, "%s PSR...\n", enabled ? "Entry" : "Exit");
	DRM_DEV_DEBUG(dp->dev, "%s PSR...\n", enabled ? "Entry" : "Exit");
+1 −1
Original line number Original line Diff line number Diff line
@@ -41,7 +41,7 @@ struct analogix_dp_plat_data {
			 struct drm_connector *);
			 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_enable_psr(struct analogix_dp_device *dp);
int analogix_dp_disable_psr(struct analogix_dp_device *dp);
int analogix_dp_disable_psr(struct analogix_dp_device *dp);