static void
 nv50_crtc_destroy(struct drm_crtc *crtc)
 {
-       struct drm_device *dev;
-       struct nouveau_crtc *nv_crtc;
-
-       if (!crtc)
-               return;
-
-       dev = crtc->dev;
-       nv_crtc = nouveau_crtc(crtc);
-
-       NV_DEBUG_KMS(dev, "\n");
+       struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
 
-       drm_crtc_cleanup(&nv_crtc->base);
+       NV_DEBUG_KMS(crtc->dev, "\n");
 
        nouveau_bo_unmap(nv_crtc->lut.nvbo);
        nouveau_bo_ref(NULL, &nv_crtc->lut.nvbo);
        nouveau_bo_unmap(nv_crtc->cursor.nvbo);
        nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo);
+       drm_crtc_cleanup(&nv_crtc->base);
        kfree(nv_crtc);
 }
 
        if (!nv_crtc)
                return -ENOMEM;
 
+       nv_crtc->index = index;
+       nv_crtc->set_dither = nv50_crtc_set_dither;
+       nv_crtc->set_scale = nv50_crtc_set_scale;
+       nv_crtc->set_color_vibrance = nv50_crtc_set_color_vibrance;
        nv_crtc->color_vibrance = 50;
        nv_crtc->vibrant_hue = 0;
-
-       /* Default CLUT parameters, will be activated on the hw upon
-        * first mode set.
-        */
+       nv_crtc->lut.depth = 0;
        for (i = 0; i < 256; i++) {
                nv_crtc->lut.r[i] = i << 8;
                nv_crtc->lut.g[i] = i << 8;
                nv_crtc->lut.b[i] = i << 8;
        }
-       nv_crtc->lut.depth = 0;
+
+       drm_crtc_init(dev, &nv_crtc->base, &nv50_crtc_funcs);
+       drm_crtc_helper_add(&nv_crtc->base, &nv50_crtc_helper_funcs);
+       drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256);
 
        ret = nouveau_bo_new(dev, 4096, 0x100, TTM_PL_FLAG_VRAM,
                             0, 0x0000, NULL, &nv_crtc->lut.nvbo);
                        nouveau_bo_ref(NULL, &nv_crtc->lut.nvbo);
        }
 
-       if (ret) {
-               kfree(nv_crtc);
-               return ret;
-       }
-
-       nv_crtc->index = index;
+       if (ret)
+               goto out;
 
-       /* set function pointers */
-       nv_crtc->set_dither = nv50_crtc_set_dither;
-       nv_crtc->set_scale = nv50_crtc_set_scale;
-       nv_crtc->set_color_vibrance = nv50_crtc_set_color_vibrance;
-
-       drm_crtc_init(dev, &nv_crtc->base, &nv50_crtc_funcs);
-       drm_crtc_helper_add(&nv_crtc->base, &nv50_crtc_helper_funcs);
-       drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256);
 
        ret = nouveau_bo_new(dev, 64*64*4, 0x100, TTM_PL_FLAG_VRAM,
                             0, 0x0000, NULL, &nv_crtc->cursor.nvbo);
                        nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo);
        }
 
+       if (ret)
+               goto out;
+
        nv50_cursor_init(nv_crtc);
-       return 0;
+out:
+       if (ret)
+               nv50_crtc_destroy(&nv_crtc->base);
+       return ret;
 }