|
@@ -1263,10 +1263,19 @@ static void vga16fb_imageblit(struct fb_info *info, const struct fb_image *image
|
|
|
vga_imageblit_color(info, image);
|
|
|
}
|
|
|
|
|
|
+static void vga16fb_destroy(struct fb_info *info)
|
|
|
+{
|
|
|
+ iounmap(info->screen_base);
|
|
|
+ fb_dealloc_cmap(&info->cmap);
|
|
|
+ /* XXX unshare VGA regions */
|
|
|
+ framebuffer_release(info);
|
|
|
+}
|
|
|
+
|
|
|
static struct fb_ops vga16fb_ops = {
|
|
|
.owner = THIS_MODULE,
|
|
|
.fb_open = vga16fb_open,
|
|
|
.fb_release = vga16fb_release,
|
|
|
+ .fb_destroy = vga16fb_destroy,
|
|
|
.fb_check_var = vga16fb_check_var,
|
|
|
.fb_set_par = vga16fb_set_par,
|
|
|
.fb_setcolreg = vga16fb_setcolreg,
|
|
@@ -1306,6 +1315,11 @@ static int __devinit vga16fb_probe(struct platform_device *dev)
|
|
|
ret = -ENOMEM;
|
|
|
goto err_fb_alloc;
|
|
|
}
|
|
|
+ info->apertures = alloc_apertures(1);
|
|
|
+ if (!info->apertures) {
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto err_ioremap;
|
|
|
+ }
|
|
|
|
|
|
/* XXX share VGA_FB_PHYS and I/O region with vgacon and others */
|
|
|
info->screen_base = (void __iomem *)VGA_MAP_MEM(VGA_FB_PHYS, 0);
|
|
@@ -1335,7 +1349,7 @@ static int __devinit vga16fb_probe(struct platform_device *dev)
|
|
|
info->fix = vga16fb_fix;
|
|
|
/* supports rectangles with widths of multiples of 8 */
|
|
|
info->pixmap.blit_x = 1 << 7 | 1 << 15 | 1 << 23 | 1 << 31;
|
|
|
- info->flags = FBINFO_FLAG_DEFAULT |
|
|
|
+ info->flags = FBINFO_FLAG_DEFAULT | FBINFO_MISC_FIRMWARE |
|
|
|
FBINFO_HWACCEL_YPAN;
|
|
|
|
|
|
i = (info->var.bits_per_pixel == 8) ? 256 : 16;
|
|
@@ -1354,6 +1368,9 @@ static int __devinit vga16fb_probe(struct platform_device *dev)
|
|
|
|
|
|
vga16fb_update_fix(info);
|
|
|
|
|
|
+ info->apertures->ranges[0].base = VGA_FB_PHYS;
|
|
|
+ info->apertures->ranges[0].size = VGA_FB_PHYS_LEN;
|
|
|
+
|
|
|
if (register_framebuffer(info) < 0) {
|
|
|
printk(KERN_ERR "vga16fb: unable to register framebuffer\n");
|
|
|
ret = -EINVAL;
|
|
@@ -1380,13 +1397,8 @@ static int vga16fb_remove(struct platform_device *dev)
|
|
|
{
|
|
|
struct fb_info *info = platform_get_drvdata(dev);
|
|
|
|
|
|
- if (info) {
|
|
|
+ if (info)
|
|
|
unregister_framebuffer(info);
|
|
|
- iounmap(info->screen_base);
|
|
|
- fb_dealloc_cmap(&info->cmap);
|
|
|
- /* XXX unshare VGA regions */
|
|
|
- framebuffer_release(info);
|
|
|
- }
|
|
|
|
|
|
return 0;
|
|
|
}
|