int fb_alloc_cmap(struct fb_cmap *cmap, int len, int transp) { int size = len*sizeof(u16); if (cmap->len != len) { fb_dealloc_cmap(cmap); if (!len) return 0; if (!(cmap->red = kmalloc(size, GFP_ATOMIC))) goto fail; if (!(cmap->green = kmalloc(size, GFP_ATOMIC))) goto fail; if (!(cmap->blue = kmalloc(size, GFP_ATOMIC))) goto fail; if (transp) { if (!(cmap->transp = kmalloc(size, GFP_ATOMIC))) goto fail; } else cmap->transp = NULL; } cmap->start = 0; cmap->len = len; fb_copy_cmap(fb_default_cmap(len), cmap); return 0; fail: fb_dealloc_cmap(cmap); return -ENOMEM; }
static void do_install_cmap(int con, struct fb_info *info) { if (con != currcon) return; if (fb_display[con].cmap.len) fb_set_cmap(&fb_display[con].cmap, 1, vfb_setcolreg, info); else fb_set_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel), 1, vfb_setcolreg, info); }
static int sun3fb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info) { if (con == info->currcon) /* current console? */ return fb_get_cmap(cmap, kspc, sun3fb_getcolreg, info); else if (fb_display[con].cmap.len) /* non default colormap? */ fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); else fb_copy_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel), cmap, kspc ? 0 : 2); return 0; }
void fbgen_install_cmap(int con, struct fb_info_gen *info) { struct fbgen_hwswitch *fbhw = info->fbhw; if (con != currcon) return; if (fb_display[con].cmap.len) fb_set_cmap(&fb_display[con].cmap, 1, fbhw->setcolreg, &info->info); else { int size = fb_display[con].var.bits_per_pixel == 16 ? 64 : 256; fb_set_cmap(fb_default_cmap(size), 1, fbhw->setcolreg, &info->info); } }
static void do_install_cmap(int con, struct fb_info *fb_info) { struct fb_info_iga *info = (struct fb_info_iga*) fb_info; if (con != info->currcon) return; if (fb_display[con].cmap.len) fb_set_cmap(&fb_display[con].cmap, 1, iga_setcolreg, &info->fb_info); else fb_set_cmap(fb_default_cmap(info->video_cmap_len), 1, iga_setcolreg, &info->fb_info); }
static int igafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *fb_info) { struct fb_info_iga *info = (struct fb_info_iga*) fb_info; if (con == info->currcon) /* current console? */ return fb_get_cmap(cmap, kspc, iga_getcolreg, &info->fb_info); else if (fb_display[con].cmap.len) /* non default colormap? */ fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); else fb_copy_cmap(fb_default_cmap(info->video_cmap_len), cmap, kspc ? 0 : 2); return 0; }
int fbgen_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info) { struct fb_info_gen *info2 = (struct fb_info_gen *)info; struct fbgen_hwswitch *fbhw = info2->fbhw; if (con == currcon) /* current console ? */ return fb_get_cmap(cmap, kspc, fbhw->getcolreg, info); else if (fb_display[con].cmap.len) /* non default colormap ? */ fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); else { int size = fb_display[con].var.bits_per_pixel == 16 ? 64 : 256; fb_copy_cmap(fb_default_cmap(size), cmap, kspc ? 0 : 2); } return 0; }
int fb_alloc_cmap_gfp(struct fb_cmap *cmap, int len, int transp, gfp_t flags) { int size = len * sizeof(u16); int ret = -ENOMEM; if (cmap->len != len) { fb_dealloc_cmap(cmap); if (!len) return 0; cmap->red = kmalloc(size, flags); if (!cmap->red) goto fail; cmap->green = kmalloc(size, flags); if (!cmap->green) goto fail; cmap->blue = kmalloc(size, flags); if (!cmap->blue) goto fail; if (transp) { cmap->transp = kmalloc(size, flags); if (!cmap->transp) goto fail; } else { cmap->transp = NULL; } } cmap->start = 0; cmap->len = len; ret = fb_copy_cmap(fb_default_cmap(len), cmap); if (ret) goto fail; return 0; fail: fb_dealloc_cmap(cmap); return ret; }