{
        struct geodefb_par *par = info->par;
 
-       if (info->var.bits_per_pixel == 16) {
+       if (info->var.bits_per_pixel == 16)
                info->fix.visual = FB_VISUAL_TRUECOLOR;
-               fb_dealloc_cmap(&info->cmap);
-       } else {
+       else
                info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
-               fb_alloc_cmap(&info->cmap, 1<<info->var.bits_per_pixel, 0);
-       }
 
        info->fix.line_length = gx1_line_delta(info->var.xres, info->var.bits_per_pixel);
 
        if (!par->panel_x)
                par->enable_crt = 1; /* fall back to CRT if no panel is specified */
 
+       if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
+               framebuffer_release(info);
+               return NULL;
+       }
        return info;
 }
 
                release_mem_region(gx1_gx_base() + 0x8300, 0x100);
        }
 
-       if (info)
+       if (info) {
+               fb_dealloc_cmap(&info->cmap);
                framebuffer_release(info);
+       }
+
        return ret;
 }
 
        iounmap(par->dc_regs);
        release_mem_region(gx1_gx_base() + 0x8300, 0x100);
 
+       fb_dealloc_cmap(&info->cmap);
        pci_set_drvdata(pdev, NULL);
 
        framebuffer_release(info);