drm/radeon/kms: use new pre/post_xfer i2c bit algo hooks
[safe/jmp/linux-2.6] / drivers / video / amifb.c
index 05a328c..82bedd7 100644 (file)
@@ -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;
@@ -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");