Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
[pandora-kernel.git] / drivers / video / svgalib.c
index 68b30d9..9c71067 100644 (file)
@@ -194,7 +194,7 @@ void svga_dump_var(struct fb_var_screeninfo *var, int node)
 void svga_settile(struct fb_info *info, struct fb_tilemap *map)
 {
        const u8 *font = map->data;
-       u8* fb = (u8 *) info->screen_base;
+       u8 __iomem *fb = (u8 __iomem *)info->screen_base;
        int i, c;
 
        if ((map->width != 8) || (map->height != 16) ||
@@ -207,7 +207,8 @@ void svga_settile(struct fb_info *info, struct fb_tilemap *map)
        fb += 2;
        for (c = 0; c < map->length; c++) {
                for (i = 0; i < map->height; i++) {
-                       fb[i * 4] = font[i];
+                       fb_writeb(font[i], fb + i * 4);
+//                     fb[i * 4] = font[i];
                }
                fb += 128;
                font += map->height;
@@ -221,8 +222,8 @@ void svga_tilecopy(struct fb_info *info, struct fb_tilearea *area)
        /*  colstride is halved in this function because u16 are used */
        int colstride = 1 << (info->fix.type_aux & FB_AUX_TEXT_SVGA_MASK);
        int rowstride = colstride * (info->var.xres_virtual / 8);
-       u16 *fb = (u16 *) info->screen_base;
-       u16 *src, *dst;
+       u16 __iomem *fb = (u16 __iomem *) info->screen_base;
+       u16 __iomem *src, *dst;
 
        if ((area->sy > area->dy) ||
            ((area->sy == area->dy) && (area->sx > area->dx))) {
@@ -239,10 +240,11 @@ void svga_tilecopy(struct fb_info *info, struct fb_tilearea *area)
            }
 
        for (dy = 0; dy < area->height; dy++) {
-               u16src2 = src;
-               u16dst2 = dst;
+               u16 __iomem *src2 = src;
+               u16 __iomem *dst2 = dst;
                for (dx = 0; dx < area->width; dx++) {
-                       *dst2 = *src2;
+                       fb_writew(fb_readw(src2), dst2);
+//                     *dst2 = *src2;
                        src2 += colstride;
                        dst2 += colstride;
                }
@@ -258,14 +260,14 @@ void svga_tilefill(struct fb_info *info, struct fb_tilerect *rect)
        int colstride = 2 << (info->fix.type_aux & FB_AUX_TEXT_SVGA_MASK);
        int rowstride = colstride * (info->var.xres_virtual / 8);
        int attr = (0x0F & rect->bg) << 4 | (0x0F & rect->fg);
-       u8  *fb = (u8 *) info->screen_base;
+       u8 __iomem *fb = (u8 __iomem *)info->screen_base;
        fb += rect->sx * colstride + rect->sy * rowstride;
 
        for (dy = 0; dy < rect->height; dy++) {
-               u8fb2 = fb;
+               u8 __iomem *fb2 = fb;
                for (dx = 0; dx < rect->width; dx++) {
-                       fb2[0] = rect->index;
-                       fb2[1] = attr;
+                       fb_writeb(rect->index, fb2);
+                       fb_writeb(attr, fb2 + 1);
                        fb2 += colstride;
                }
                fb += rowstride;
@@ -279,15 +281,15 @@ void svga_tileblit(struct fb_info *info, struct fb_tileblit *blit)
        int colstride = 2 << (info->fix.type_aux & FB_AUX_TEXT_SVGA_MASK);
        int rowstride = colstride * (info->var.xres_virtual / 8);
        int attr = (0x0F & blit->bg) << 4 | (0x0F & blit->fg);
-       u8* fb = (u8 *) info->screen_base;
+       u8 __iomem *fb = (u8 __iomem *)info->screen_base;
        fb += blit->sx * colstride + blit->sy * rowstride;
 
        i=0;
        for (dy=0; dy < blit->height; dy ++) {
-               u8fb2 = fb;
+               u8 __iomem *fb2 = fb;
                for (dx = 0; dx < blit->width; dx ++) {
-                       fb2[0] = blit->indices[i];
-                       fb2[1] = attr;
+                       fb_writeb(blit->indices[i], fb2);
+                       fb_writeb(attr, fb2 + 1);
                        fb2 += colstride;
                        i ++;
                        if (i == blit->length) return;
@@ -340,6 +342,28 @@ void svga_tilecursor(struct fb_info *info, struct fb_tilecursor *cursor)
        vga_wcrt(NULL, 0x0A, cs); /* set cursor start and enable it */
 }
 
+int svga_get_tilemax(struct fb_info *info)
+{
+       return 256;
+}
+
+/* Get capabilities of accelerator based on the mode */
+
+void svga_get_caps(struct fb_info *info, struct fb_blit_caps *caps,
+                  struct fb_var_screeninfo *var)
+{
+       if (var->bits_per_pixel == 0) {
+               /* can only support 256 8x16 bitmap */
+               caps->x = 1 << (8 - 1);
+               caps->y = 1 << (16 - 1);
+               caps->len = 256;
+       } else {
+               caps->x = (var->bits_per_pixel == 4) ? 1 << (8 - 1) : ~(u32)0;
+               caps->y = ~(u32)0;
+               caps->len = ~(u32)0;
+       }
+}
+EXPORT_SYMBOL(svga_get_caps);
 
 /* ------------------------------------------------------------------------- */
 
@@ -574,9 +598,11 @@ void svga_set_timings(const struct svga_timing_regs *tm, struct fb_var_screeninf
 /* ------------------------------------------------------------------------- */
 
 
-int svga_match_format(const struct svga_fb_format *frm, struct fb_var_screeninfo *var, struct fb_fix_screeninfo *fix)
+static inline int match_format(const struct svga_fb_format *frm,
+                              struct fb_var_screeninfo *var)
 {
        int i = 0;
+       int stored = -EINVAL;
 
        while (frm->bits_per_pixel != SVGA_FORMAT_END_VAL)
        {
@@ -585,25 +611,38 @@ int svga_match_format(const struct svga_fb_format *frm, struct fb_var_screeninfo
                    (var->green.length   <= frm->green.length)   &&
                    (var->blue.length    <= frm->blue.length)    &&
                    (var->transp.length  <= frm->transp.length)  &&
-                   (var->nonstd         == frm->nonstd)) {
-                       var->bits_per_pixel = frm->bits_per_pixel;
-                       var->red            = frm->red;
-                       var->green          = frm->green;
-                       var->blue           = frm->blue;
-                       var->transp         = frm->transp;
-                       var->nonstd         = frm->nonstd;
-                       if (fix != NULL) {
-                               fix->type      = frm->type;
-                               fix->type_aux  = frm->type_aux;
-                               fix->visual    = frm->visual;
-                               fix->xpanstep  = frm->xpanstep;
-                       }
+                   (var->nonstd         == frm->nonstd))
                        return i;
-               }
+               if (var->bits_per_pixel == frm->bits_per_pixel)
+                       stored = i;
                i++;
                frm++;
        }
-       return -EINVAL;
+       return stored;
+}
+
+int svga_match_format(const struct svga_fb_format *frm,
+                     struct fb_var_screeninfo *var,
+                     struct fb_fix_screeninfo *fix)
+{
+       int i = match_format(frm, var);
+
+       if (i >= 0) {
+               var->bits_per_pixel = frm[i].bits_per_pixel;
+               var->red            = frm[i].red;
+               var->green          = frm[i].green;
+               var->blue           = frm[i].blue;
+               var->transp         = frm[i].transp;
+               var->nonstd         = frm[i].nonstd;
+               if (fix != NULL) {
+                       fix->type      = frm[i].type;
+                       fix->type_aux  = frm[i].type_aux;
+                       fix->visual    = frm[i].visual;
+                       fix->xpanstep  = frm[i].xpanstep;
+               }
+       }
+
+       return i;
 }
 
 
@@ -621,6 +660,7 @@ EXPORT_SYMBOL(svga_tilecopy);
 EXPORT_SYMBOL(svga_tilefill);
 EXPORT_SYMBOL(svga_tileblit);
 EXPORT_SYMBOL(svga_tilecursor);
+EXPORT_SYMBOL(svga_get_tilemax);
 
 EXPORT_SYMBOL(svga_compute_pll);
 EXPORT_SYMBOL(svga_check_timings);