]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
drm/exynos: add exception codes to exynos_drm_fbdev_create()
authorInki Dae <inki.dae@samsung.com>
Fri, 7 Dec 2012 09:06:43 +0000 (18:06 +0900)
committerInki Dae <daeinki@gmail.com>
Thu, 13 Dec 2012 14:05:45 +0000 (06:05 -0800)
This patch releases allocated resources correctly.

Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_fbdev.c

index a2232792e0c0bda1dd61c728fd715e88a2e602e5..885ef235d59ce56d278139ca92b74c325c9311c1 100644 (file)
@@ -164,7 +164,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
        exynos_gem_obj = exynos_drm_gem_create(dev, 0, size);
        if (IS_ERR(exynos_gem_obj)) {
                ret = PTR_ERR(exynos_gem_obj);
-               goto out;
+               goto err_release_framebuffer;
        }
 
        exynos_fbdev->exynos_gem_obj = exynos_gem_obj;
@@ -174,7 +174,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
        if (IS_ERR_OR_NULL(helper->fb)) {
                DRM_ERROR("failed to create drm framebuffer.\n");
                ret = PTR_ERR(helper->fb);
-               goto out;
+               goto err_destroy_gem;
        }
 
        helper->fbdev = fbi;
@@ -186,14 +186,24 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
        ret = fb_alloc_cmap(&fbi->cmap, 256, 0);
        if (ret) {
                DRM_ERROR("failed to allocate cmap.\n");
-               goto out;
+               goto err_destroy_framebuffer;
        }
 
        ret = exynos_drm_fbdev_update(helper, helper->fb);
-       if (ret < 0) {
-               fb_dealloc_cmap(&fbi->cmap);
-               goto out;
-       }
+       if (ret < 0)
+               goto err_dealloc_cmap;
+
+       mutex_unlock(&dev->struct_mutex);
+       return ret;
+
+err_dealloc_cmap:
+       fb_dealloc_cmap(&fbi->cmap);
+err_destroy_framebuffer:
+       drm_framebuffer_cleanup(helper->fb);
+err_destroy_gem:
+       exynos_drm_gem_destroy(exynos_gem_obj);
+err_release_framebuffer:
+       framebuffer_release(fbi);
 
 /*
  * if failed, all resources allocated above would be released by