fbdev: move FBIO_WAITFORVSYNC to linux/fb.h
[safe/jmp/linux-2.6] / drivers / video / tgafb.c
index 89facb7..1b3b1c7 100644 (file)
@@ -5,7 +5,7 @@
  *     Copyright (C) 1997 Geert Uytterhoeven
  *     Copyright (C) 1999,2000 Martin Lucina, Tom Zerucha
  *     Copyright (C) 2002 Richard Henderson
- *     Copyright (C) 2006 Maciej W. Rozycki
+ *     Copyright (C) 2006, 2007  Maciej W. Rozycki
  *
  *  This file is subject to the terms and conditions of the GNU General Public
  *  License. See the file COPYING in the main directory of this archive for
@@ -13,6 +13,7 @@
  */
 
 #include <linux/bitrev.h>
+#include <linux/compiler.h>
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/errno.h>
@@ -24,7 +25,6 @@
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/selection.h>
-#include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/tc.h>
 
@@ -636,15 +636,6 @@ tgafb_mono_imageblit(struct fb_info *info, const struct fb_image *image)
 
        is8bpp = info->var.bits_per_pixel == 8;
 
-       /* For copies that aren't pixel expansion, there's little we
-          can do better than the generic code.  */
-       /* ??? There is a DMA write mode; I wonder if that could be
-          made to pull the data from the image buffer...  */
-       if (image->depth > 1) {
-               cfb_imageblit(info, image);
-               return;
-       }
-
        dx = image->dx;
        dy = image->dy;
        width = image->width;
@@ -654,6 +645,9 @@ tgafb_mono_imageblit(struct fb_info *info, const struct fb_image *image)
        line_length = info->fix.line_length;
        rincr = (width + 7) / 8;
 
+       /* A shift below cannot cope with.  */
+       if (unlikely(width == 0))
+               return;
        /* Crop the image to the screen.  */
        if (dx > vxres || dy > vyres)
                return;
@@ -709,9 +703,10 @@ tgafb_mono_imageblit(struct fb_info *info, const struct fb_image *image)
                unsigned long bwidth;
 
                /* Handle common case of imaging a single character, in
-                  a font less than 32 pixels wide.  */
+                  a font less than or 32 pixels wide.  */
 
-               pixelmask = (1 << width) - 1;
+               /* Avoid a shift by 32; width > 0 implied.  */
+               pixelmask = (2ul << (width - 1)) - 1;
                pixelmask <<= shift;
                __raw_writel(pixelmask, regs_base + TGA_PIXELMASK_REG);
                wmb();
@@ -849,7 +844,7 @@ tgafb_clut_imageblit(struct fb_info *info, const struct fb_image *image)
        u32 *palette = ((u32 *)info->pseudo_palette);
        unsigned long pos, line_length, i, j;
        const unsigned char *data;
-       void *regs_base, *fb_base;
+       void __iomem *regs_base, *fb_base;
 
        dx = image->dx;
        dy = image->dy;
@@ -1667,7 +1662,7 @@ tgafb_register(struct device *dev)
        if (register_framebuffer(info) < 0) {
                printk(KERN_ERR "tgafb: Could not register framebuffer\n");
                ret = -EINVAL;
-               goto err1;
+               goto err2;
        }
 
        if (tga_bus_pci) {
@@ -1686,6 +1681,8 @@ tgafb_register(struct device *dev)
 
        return 0;
 
+ err2:
+       fb_dealloc_cmap(&info->cmap);
  err1:
        if (mem_base)
                iounmap(mem_base);