drm/exynos: Unreference fb in exynos_disable_plane()

Inki Dae inki.dae at samsung.com
Tue Nov 20 19:42:53 PST 2012


From: YoungJun Cho <yj44.cho at samsung.com>

This patch is for unreferencing the (current)fb if plane->fb is
existed in exynos_disable_plane(). In exynos_update_plane(),
the new fb reference count can be bigger than 1.
So it can't be removed for that reference count.

And this patch is based on exynos-drm-next.

Signed-off-by: YoungJun Cho <yj44.cho at samsung.com>
Signed-off-by: Inki Dae <inki.dae at samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_plane.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c
index 083fd5f..dc7e057 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_plane.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c
@@ -161,13 +161,15 @@ exynos_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
 	if (plane->fb)
 		drm_framebuffer_unreference(plane->fb);
 
+	plane->fb = fb;
+
 	/*
 	 * Take a reference to new fb.
 	 *
 	 * Taking a reference means that this plane's dma is going to access
 	 * memory region to the new fb.
 	 */
-	drm_framebuffer_reference(fb);
+	drm_framebuffer_reference(plane->fb);
 
 	plane->crtc = crtc;
 	exynos_plane_commit(plane);
@@ -180,6 +182,14 @@ static int exynos_disable_plane(struct drm_plane *plane)
 {
 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
 
+	/*
+	 * Unreference the (current)fb if plane->fb is existed.
+	 * In exynos_update_plane(), the new fb reference count can be bigger
+	 * than 1. So it can't be removed for that reference count.
+	 */
+	if (plane->fb)
+		drm_framebuffer_unreference(plane->fb);
+
 	exynos_plane_dpms(plane, DRM_MODE_DPMS_OFF);
 
 	return 0;
-- 
1.7.4.1



More information about the dri-devel mailing list