Merge branch 'xen/fbdev' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen
[safe/jmp/linux-2.6] / drivers / video / amifb.c
index 4c9ec3f..82bedd7 100644 (file)
@@ -96,7 +96,7 @@
 #endif
 
 #ifdef DEBUG
-#  define DPRINTK(fmt, args...)        printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
+#  define DPRINTK(fmt, args...)        printk(KERN_DEBUG "%s: " fmt, __func__ , ## args)
 #else
 #  define DPRINTK(fmt, args...)
 #endif
@@ -1136,7 +1136,6 @@ static int amifb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg
         * Interface to the low level console driver
         */
 
-int amifb_init(void);
 static void amifb_deinit(void);
 
        /*
@@ -2048,13 +2047,16 @@ static void amifb_copyarea(struct fb_info *info,
        width = x2 - dx;
        height = y2 - dy;
 
+       if (area->sx + dx < area->dx || area->sy + dy < area->dy)
+               return;
+
        /* update sx,sy */
        sx = area->sx + (dx - area->dx);
        sy = area->sy + (dy - area->dy);
 
        /* the source must be completely inside the virtual screen */
-       if (sx < 0 || sy < 0 || (sx + width) > info->var.xres_virtual ||
-           (sy + height) > info->var.yres_virtual)
+       if (sx + width > info->var.xres_virtual ||
+                       sy + height > info->var.yres_virtual)
                return;
 
        if (dy > sy || (dy == sy && dx > sx)) {
@@ -2157,9 +2159,9 @@ static void amifb_imageblit(struct fb_info *info, const struct fb_image *image)
                        src += pitch;
                }
        } else {
-               c2p(info->screen_base, image->data, dx, dy, width, height,
-                   par->next_line, par->next_plane, image->width,
-                   info->var.bits_per_pixel);
+               c2p_planar(info->screen_base, image->data, dx, dy, width,
+                          height, par->next_line, par->next_plane,
+                          image->width, info->var.bits_per_pixel);
        }
 }
 
@@ -2245,7 +2247,7 @@ static inline void chipfree(void)
         * Initialisation
         */
 
-int __init amifb_init(void)
+static int __init amifb_init(void)
 {
        int tag, i, err = 0;
        u_long chipptr;
@@ -2261,7 +2263,7 @@ int __init amifb_init(void)
        amifb_setup(option);
 #endif
        if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_VIDEO))
-               return -ENXIO;
+               return -ENODEV;
 
        /*
         * We request all registers starting from bplpt[0]
@@ -2333,7 +2335,7 @@ default_chipset:
                        strcat(fb_info.fix.id, "Unknown");
                        goto default_chipset;
 #else /* CONFIG_FB_AMIGA_OCS */
-                       err = -ENXIO;
+                       err = -ENODEV;
                        goto amifb_error;
 #endif /* CONFIG_FB_AMIGA_OCS */
                        break;
@@ -2383,6 +2385,9 @@ default_chipset:
                goto amifb_error;
        }
 
+       fb_videomode_to_modelist(ami_modedb, NUM_TOTAL_MODES,
+                                &fb_info.modelist);
+
        round_down_bpp = 0;
        chipptr = chipalloc(fb_info.fix.smem_len+
                            SPRITEMEMSIZE+
@@ -2432,7 +2437,9 @@ default_chipset:
                goto amifb_error;
        }
 
-       fb_alloc_cmap(&fb_info.cmap, 1<<fb_info.var.bits_per_pixel, 0);
+       err = fb_alloc_cmap(&fb_info.cmap, 1<<fb_info.var.bits_per_pixel, 0);
+       if (err)
+               goto amifb_error;
 
        if (register_framebuffer(&fb_info) < 0) {
                err = -EINVAL;
@@ -2451,7 +2458,8 @@ amifb_error:
 
 static void amifb_deinit(void)
 {
-       fb_dealloc_cmap(&fb_info.cmap);
+       if (fb_info.cmap.len)
+               fb_dealloc_cmap(&fb_info.cmap);
        chipfree();
        if (videomemory)
                iounmap((void*)videomemory);
@@ -3787,16 +3795,14 @@ static void ami_rebuild_copper(void)
        }
 }
 
-
-module_init(amifb_init);
-
-#ifdef MODULE
-MODULE_LICENSE("GPL");
-
-void cleanup_module(void)
+static void __exit amifb_exit(void)
 {
        unregister_framebuffer(&fb_info);
        amifb_deinit();
        amifb_video_off();
 }
-#endif /* MODULE */
+
+module_init(amifb_init);
+module_exit(amifb_exit);
+
+MODULE_LICENSE("GPL");