{
        struct fb_info *fbi = win->fbinfo;
 
-       dma_free_writecombine(sfb->dev, PAGE_ALIGN(fbi->fix.smem_len),
+       if (fbi->screen_base)
+               dma_free_writecombine(sfb->dev, PAGE_ALIGN(fbi->fix.smem_len),
                              fbi->screen_base, fbi->fix.smem_start);
 }
 
 {
        if (win->fbinfo) {
                unregister_framebuffer(win->fbinfo);
-               fb_dealloc_cmap(&win->fbinfo->cmap);
+               if (win->fbinfo->cmap.len)
+                       fb_dealloc_cmap(&win->fbinfo->cmap);
                s3c_fb_free_memory(sfb, win);
                framebuffer_release(win->fbinfo);
        }
        WARN_ON(windata->win_mode.yres == 0);
 
        win = fbinfo->par;
+       *res = win;
        var = &fbinfo->var;
        win->variant = *variant;
        win->fbinfo = fbinfo;
                return ret;
        }
 
-       *res = win;
        dev_info(sfb->dev, "window %d: fb %s\n", win_no, fbinfo->fix.id);
 
        return 0;