From: Mark Yao <mark.yao@rock-chips.com>
Date: Wed, 22 Mar 2017 08:40:05 +0000 (+0800)
Subject: drm/rockchip: fixup display reference count
X-Git-Tag: firefly_0821_release~256
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=6db46c9e7e25ca20ce891a117bf5128c66c0992c;p=firefly-linux-kernel-4.4.55.git

drm/rockchip: fixup display reference count

Change-Id: I9ae0699f26e3971e1f01cf36aa7a2f64dcade8dc
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
---

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 59605f9056af..4e3ff4315e49 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -604,6 +604,19 @@ static void show_loader_logo(struct drm_device *drm_dev)
 
 	list_for_each_entry_safe(set, tmp, &mode_set_list, head) {
 		struct drm_crtc *crtc = set->crtc;
+		struct drm_connector *conn = set->connector;
+
+		if (!set->mode_changed) {
+			/*
+			 * restore connector and crtc's state, keep all the
+			 * reference fine.
+			 */
+			WARN_ON(drm_atomic_set_crtc_for_connector(conn->state,
+								  NULL));
+			WARN_ON(drm_atomic_set_mode_for_crtc(crtc->state,
+							     NULL));
+			crtc->state->active = false;
+		}
 
 		list_del(&set->head);
 		kfree(set);
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 8cb455843f16..017304927979 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -1494,6 +1494,11 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
 	u16 vact_end = vact_st + vdisplay;
 	uint32_t val;
 
+	if (vop->loader_protect) {
+		vop->loader_protect = false;
+		return;
+	}
+
 	vop_initial(crtc);
 
 	val = BIT(DCLK_INVERT);