mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-14 04:41:26 +00:00
gx1fb: properly alloc cmap and plug cmap leak
We weren't properly allocating the cmap for depths greater than 8bpp, which caused pain for things like DirectFB. Also, we never freed the cmap memory upon module unload.. Signed-off-by: Andres Salomon <dilinger@debian.org> Cc: Marco La Porta <marco-laporta@tiscali.it> Cc: Jordan Crouse <jordan@cosmicpenguin.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
b14caecdbe
commit
35887b1cf7
@ -136,13 +136,10 @@ static int gx1fb_set_par(struct fb_info *info)
|
||||
{
|
||||
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);
|
||||
|
||||
@ -315,6 +312,10 @@ static struct fb_info * __init gx1fb_init_fbinfo(struct device *dev)
|
||||
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;
|
||||
}
|
||||
|
||||
@ -374,8 +375,11 @@ static int __init gx1fb_probe(struct pci_dev *pdev, const struct pci_device_id *
|
||||
release_mem_region(gx1_gx_base() + 0x8300, 0x100);
|
||||
}
|
||||
|
||||
if (info)
|
||||
if (info) {
|
||||
fb_dealloc_cmap(&info->cmap);
|
||||
framebuffer_release(info);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -395,6 +399,7 @@ static void gx1fb_remove(struct pci_dev *pdev)
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user