return 0;
 }
 
-void viafb_init_accel(struct viafb_shared *shared)
+int viafb_init_engine(struct fb_info *info)
 {
-       switch (shared->chip_info.gfx_chip_name) {
+       struct viafb_par *viapar = info->par;
+       void __iomem *engine;
+       u32 vq_start_addr, vq_end_addr, vq_start_low, vq_end_low, vq_high,
+               vq_len, chip_name = viapar->shared->chip_info.gfx_chip_name;
+
+       engine = ioremap_nocache(info->fix.mmio_start, info->fix.mmio_len);
+       viapar->shared->engine_mmio = engine;
+       if (!engine) {
+               printk(KERN_WARNING "viafb_init_accel: ioremap failed, "
+                       "hardware acceleration disabled\n");
+               return -ENOMEM;
+       }
+
+       switch (chip_name) {
        case UNICHROME_CLE266:
        case UNICHROME_K400:
        case UNICHROME_K800:
        case UNICHROME_K8M890:
        case UNICHROME_P4M890:
        case UNICHROME_P4M900:
-               shared->hw_bitblt = hw_bitblt_1;
+               viapar->shared->hw_bitblt = hw_bitblt_1;
                break;
        case UNICHROME_VX800:
-               shared->hw_bitblt = hw_bitblt_2;
+               viapar->shared->hw_bitblt = hw_bitblt_2;
                break;
        default:
-               shared->hw_bitblt = NULL;
+               viapar->shared->hw_bitblt = NULL;
        }
 
-       viaparinfo->fbmem_free -= CURSOR_SIZE;
-       shared->cursor_vram_addr = viaparinfo->fbmem_free;
-       viaparinfo->fbmem_used += CURSOR_SIZE;
+       viapar->fbmem_free -= CURSOR_SIZE;
+       viapar->shared->cursor_vram_addr = viapar->fbmem_free;
+       viapar->fbmem_used += CURSOR_SIZE;
 
-       /* Reverse 8*1024 memory space for cursor image */
-       viaparinfo->fbmem_free -= (CURSOR_SIZE + VQ_SIZE);
-       viaparinfo->VQ_start = viaparinfo->fbmem_free;
-       viaparinfo->VQ_end = viaparinfo->VQ_start + VQ_SIZE - 1;
-       viaparinfo->fbmem_used += (CURSOR_SIZE + VQ_SIZE);
-}
-
-void viafb_init_2d_engine(void)
-{
-       u32 dwVQStartAddr, dwVQEndAddr;
-       u32 dwVQLen, dwVQStartL, dwVQEndL, dwVQStartEndH;
+       viapar->fbmem_free -= VQ_SIZE;
+       viapar->shared->vq_vram_addr = viapar->fbmem_free;
+       viapar->fbmem_used += VQ_SIZE;
 
        /* Init AGP and VQ regs */
-       switch (viaparinfo->chip_info->gfx_chip_name) {
+       switch (chip_name) {
        case UNICHROME_K8M890:
        case UNICHROME_P4M900:
-               writel(0x00100000, viaparinfo->io_virt + VIA_REG_CR_TRANSET);
-               writel(0x680A0000, viaparinfo->io_virt + VIA_REG_CR_TRANSPACE);
-               writel(0x02000000, viaparinfo->io_virt + VIA_REG_CR_TRANSPACE);
+               writel(0x00100000, engine + VIA_REG_CR_TRANSET);
+               writel(0x680A0000, engine + VIA_REG_CR_TRANSPACE);
+               writel(0x02000000, engine + VIA_REG_CR_TRANSPACE);
                break;
 
        default:
-               writel(0x00100000, viaparinfo->io_virt + VIA_REG_TRANSET);
-               writel(0x00000000, viaparinfo->io_virt + VIA_REG_TRANSPACE);
-               writel(0x00333004, viaparinfo->io_virt + VIA_REG_TRANSPACE);
-               writel(0x60000000, viaparinfo->io_virt + VIA_REG_TRANSPACE);
-               writel(0x61000000, viaparinfo->io_virt + VIA_REG_TRANSPACE);
-               writel(0x62000000, viaparinfo->io_virt + VIA_REG_TRANSPACE);
-               writel(0x63000000, viaparinfo->io_virt + VIA_REG_TRANSPACE);
-               writel(0x64000000, viaparinfo->io_virt + VIA_REG_TRANSPACE);
-               writel(0x7D000000, viaparinfo->io_virt + VIA_REG_TRANSPACE);
-
-               writel(0xFE020000, viaparinfo->io_virt + VIA_REG_TRANSET);
-               writel(0x00000000, viaparinfo->io_virt + VIA_REG_TRANSPACE);
+               writel(0x00100000, engine + VIA_REG_TRANSET);
+               writel(0x00000000, engine + VIA_REG_TRANSPACE);
+               writel(0x00333004, engine + VIA_REG_TRANSPACE);
+               writel(0x60000000, engine + VIA_REG_TRANSPACE);
+               writel(0x61000000, engine + VIA_REG_TRANSPACE);
+               writel(0x62000000, engine + VIA_REG_TRANSPACE);
+               writel(0x63000000, engine + VIA_REG_TRANSPACE);
+               writel(0x64000000, engine + VIA_REG_TRANSPACE);
+               writel(0x7D000000, engine + VIA_REG_TRANSPACE);
+
+               writel(0xFE020000, engine + VIA_REG_TRANSET);
+               writel(0x00000000, engine + VIA_REG_TRANSPACE);
                break;
        }
-       if (viaparinfo->VQ_start != 0) {
-               /* Enable VQ */
-               dwVQStartAddr = viaparinfo->VQ_start;
-               dwVQEndAddr = viaparinfo->VQ_end;
-
-               dwVQStartL = 0x50000000 | (dwVQStartAddr & 0xFFFFFF);
-               dwVQEndL = 0x51000000 | (dwVQEndAddr & 0xFFFFFF);
-               dwVQStartEndH = 0x52000000 |
-                       ((dwVQStartAddr & 0xFF000000) >> 24) |
-                       ((dwVQEndAddr & 0xFF000000) >> 16);
-               dwVQLen = 0x53000000 | (VQ_SIZE >> 3);
-               switch (viaparinfo->chip_info->gfx_chip_name) {
-               case UNICHROME_K8M890:
-               case UNICHROME_P4M900:
-                       dwVQStartL |= 0x20000000;
-                       dwVQEndL |= 0x20000000;
-                       dwVQStartEndH |= 0x20000000;
-                       dwVQLen |= 0x20000000;
-                       break;
-               default:
-                       break;
-               }
 
-               switch (viaparinfo->chip_info->gfx_chip_name) {
-               case UNICHROME_K8M890:
-               case UNICHROME_P4M900:
-                       writel(0x00100000,
-                               viaparinfo->io_virt + VIA_REG_CR_TRANSET);
-                       writel(dwVQStartEndH,
-                               viaparinfo->io_virt + VIA_REG_CR_TRANSPACE);
-                       writel(dwVQStartL,
-                               viaparinfo->io_virt + VIA_REG_CR_TRANSPACE);
-                       writel(dwVQEndL,
-                               viaparinfo->io_virt + VIA_REG_CR_TRANSPACE);
-                       writel(dwVQLen,
-                               viaparinfo->io_virt + VIA_REG_CR_TRANSPACE);
-                       writel(0x74301001,
-                               viaparinfo->io_virt + VIA_REG_CR_TRANSPACE);
-                       writel(0x00000000,
-                               viaparinfo->io_virt + VIA_REG_CR_TRANSPACE);
-                       break;
-               default:
-                       writel(0x00FE0000,
-                               viaparinfo->io_virt + VIA_REG_TRANSET);
-                       writel(0x080003FE,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x0A00027C,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x0B000260,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x0C000274,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x0D000264,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x0E000000,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x0F000020,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x1000027E,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x110002FE,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x200F0060,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-
-                       writel(0x00000006,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x40008C0F,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x44000000,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x45080C04,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x46800408,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-
-                       writel(dwVQStartEndH,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(dwVQStartL,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(dwVQEndL,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(dwVQLen,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       break;
-               }
-       } else {
-               /* Disable VQ */
-               switch (viaparinfo->chip_info->gfx_chip_name) {
-               case UNICHROME_K8M890:
-               case UNICHROME_P4M900:
-                       writel(0x00100000,
-                               viaparinfo->io_virt + VIA_REG_CR_TRANSET);
-                       writel(0x74301000,
-                               viaparinfo->io_virt + VIA_REG_CR_TRANSPACE);
-                       break;
-               default:
-                       writel(0x00FE0000,
-                               viaparinfo->io_virt + VIA_REG_TRANSET);
-                       writel(0x00000004,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x40008C0F,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x44000000,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x45080C04,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       writel(0x46800408,
-                               viaparinfo->io_virt + VIA_REG_TRANSPACE);
-                       break;
-               }
+       /* Enable VQ */
+       vq_start_addr = viapar->shared->vq_vram_addr;
+       vq_end_addr = viapar->shared->vq_vram_addr + VQ_SIZE - 1;
+
+       vq_start_low = 0x50000000 | (vq_start_addr & 0xFFFFFF);
+       vq_end_low = 0x51000000 | (vq_end_addr & 0xFFFFFF);
+       vq_high = 0x52000000 | ((vq_start_addr & 0xFF000000) >> 24) |
+               ((vq_end_addr & 0xFF000000) >> 16);
+       vq_len = 0x53000000 | (VQ_SIZE >> 3);
+
+       switch (chip_name) {
+       case UNICHROME_K8M890:
+       case UNICHROME_P4M900:
+               vq_start_low |= 0x20000000;
+               vq_end_low |= 0x20000000;
+               vq_high |= 0x20000000;
+               vq_len |= 0x20000000;
+
+               writel(0x00100000, engine + VIA_REG_CR_TRANSET);
+               writel(vq_high, engine + VIA_REG_CR_TRANSPACE);
+               writel(vq_start_low, engine + VIA_REG_CR_TRANSPACE);
+               writel(vq_end_low, engine + VIA_REG_CR_TRANSPACE);
+               writel(vq_len, engine + VIA_REG_CR_TRANSPACE);
+               writel(0x74301001, engine + VIA_REG_CR_TRANSPACE);
+               writel(0x00000000, engine + VIA_REG_CR_TRANSPACE);
+               break;
+       default:
+               writel(0x00FE0000, engine + VIA_REG_TRANSET);
+               writel(0x080003FE, engine + VIA_REG_TRANSPACE);
+               writel(0x0A00027C, engine + VIA_REG_TRANSPACE);
+               writel(0x0B000260, engine + VIA_REG_TRANSPACE);
+               writel(0x0C000274, engine + VIA_REG_TRANSPACE);
+               writel(0x0D000264, engine + VIA_REG_TRANSPACE);
+               writel(0x0E000000, engine + VIA_REG_TRANSPACE);
+               writel(0x0F000020, engine + VIA_REG_TRANSPACE);
+               writel(0x1000027E, engine + VIA_REG_TRANSPACE);
+               writel(0x110002FE, engine + VIA_REG_TRANSPACE);
+               writel(0x200F0060, engine + VIA_REG_TRANSPACE);
+
+               writel(0x00000006, engine + VIA_REG_TRANSPACE);
+               writel(0x40008C0F, engine + VIA_REG_TRANSPACE);
+               writel(0x44000000, engine + VIA_REG_TRANSPACE);
+               writel(0x45080C04, engine + VIA_REG_TRANSPACE);
+               writel(0x46800408, engine + VIA_REG_TRANSPACE);
+
+               writel(vq_high, engine + VIA_REG_TRANSPACE);
+               writel(vq_start_low, engine + VIA_REG_TRANSPACE);
+               writel(vq_end_low, engine + VIA_REG_TRANSPACE);
+               writel(vq_len, engine + VIA_REG_TRANSPACE);
+               break;
        }
-}
 
-void viafb_hw_cursor_init(void)
-{
        /* Set Cursor Image Base Address */
-       writel(viaparinfo->shared->cursor_vram_addr,
-               viaparinfo->io_virt + VIA_REG_CURSOR_MODE);
-       writel(0x0, viaparinfo->io_virt + VIA_REG_CURSOR_POS);
-       writel(0x0, viaparinfo->io_virt + VIA_REG_CURSOR_ORG);
-       writel(0x0, viaparinfo->io_virt + VIA_REG_CURSOR_BG);
-       writel(0x0, viaparinfo->io_virt + VIA_REG_CURSOR_FG);
+       writel(viapar->shared->cursor_vram_addr, engine + VIA_REG_CURSOR_MODE);
+       writel(0x0, engine + VIA_REG_CURSOR_POS);
+       writel(0x0, engine + VIA_REG_CURSOR_ORG);
+       writel(0x0, engine + VIA_REG_CURSOR_BG);
+       writel(0x0, engine + VIA_REG_CURSOR_FG);
+       return 0;
 }
 
 void viafb_show_hw_cursor(struct fb_info *info, int Status)
 {
-       u32 temp;
-       u32 iga_path = ((struct viafb_par *)(info->par))->iga_path;
+       struct viafb_par *viapar = info->par;
+       u32 temp, iga_path = viapar->iga_path;
 
-       temp = readl(viaparinfo->io_virt + VIA_REG_CURSOR_MODE);
+       temp = readl(viapar->shared->engine_mmio + VIA_REG_CURSOR_MODE);
        switch (Status) {
        case HW_Cursor_ON:
                temp |= 0x1;
        default:
                temp &= 0x7FFFFFFF;
        }
-       writel(temp, viaparinfo->io_virt + VIA_REG_CURSOR_MODE);
+       writel(temp, viapar->shared->engine_mmio + VIA_REG_CURSOR_MODE);
 }
 
-int viafb_wait_engine_idle(void)
+void viafb_wait_engine_idle(struct fb_info *info)
 {
+       struct viafb_par *viapar = info->par;
        int loop = 0;
 
-       while (!(readl(viaparinfo->io_virt + VIA_REG_STATUS) &
+       while (!(readl(viapar->shared->engine_mmio + VIA_REG_STATUS) &
                        VIA_VR_QUEUE_BUSY) && (loop < MAXLOOP)) {
                loop++;
                cpu_relax();
        }
 
-       while ((readl(viaparinfo->io_virt + VIA_REG_STATUS) &
+       while ((readl(viapar->shared->engine_mmio + VIA_REG_STATUS) &
                    (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) &&
                    (loop < MAXLOOP)) {
                loop++;
                cpu_relax();
        }
 
-       return loop >= MAXLOOP;
+       if (loop >= MAXLOOP)
+               printk(KERN_ERR "viafb_wait_engine_idle: not syncing\n");
 }
 
 static char *viafb_mode = "640x480";
 static char *viafb_mode1 = "640x480";
 
+static int viafb_accel = 1;
+
 /* Added for specifying active devices.*/
 char *viafb_active_dev = "";
 
 
        /* Adjust var according to our driver's own table */
        viafb_fill_var_timing_info(var, viafb_refresh, vmode_index);
+       if (info->var.accel_flags & FB_ACCELF_TEXT &&
+               !ppar->shared->engine_mmio)
+               info->var.accel_flags = 0;
 
        return 0;
 }
 
                viafb_update_fix(info);
                viafb_bpp = info->var.bits_per_pixel;
-               /* Update viafb_accel, it is necessary to our 2D accelerate */
-               viafb_accel = info->var.accel_flags;
+               if (info->var.accel_flags & FB_ACCELF_TEXT)
+                       info->flags &= ~FBINFO_HWACCEL_DISABLED;
+               else
+                       info->flags |= FBINFO_HWACCEL_DISABLED;
        }
 
        return 0;
        const struct fb_fillrect *rect)
 {
        struct viafb_par *viapar = info->par;
+       struct viafb_shared *shared = viapar->shared;
        u32 fg_color;
        u8 rop;
 
-       if (!viapar->shared->hw_bitblt) {
+       if (info->flags & FBINFO_HWACCEL_DISABLED || !shared->hw_bitblt) {
                cfb_fillrect(info, rect);
                return;
        }
                rop = 0xF0;
 
        DEBUG_MSG(KERN_DEBUG "viafb 2D engine: fillrect\n");
-       if (viapar->shared->hw_bitblt(viapar->io_virt, VIA_BITBLT_FILL,
+       if (shared->hw_bitblt(shared->engine_mmio, VIA_BITBLT_FILL,
                rect->width, rect->height, info->var.bits_per_pixel,
                viapar->vram_addr, info->fix.line_length, rect->dx, rect->dy,
                NULL, 0, 0, 0, 0, fg_color, 0, rop))
        const struct fb_copyarea *area)
 {
        struct viafb_par *viapar = info->par;
+       struct viafb_shared *shared = viapar->shared;
 
-       if (!viapar->shared->hw_bitblt) {
+       if (info->flags & FBINFO_HWACCEL_DISABLED || !shared->hw_bitblt) {
                cfb_copyarea(info, area);
                return;
        }
                return;
 
        DEBUG_MSG(KERN_DEBUG "viafb 2D engine: copyarea\n");
-       if (viapar->shared->hw_bitblt(viapar->io_virt, VIA_BITBLT_COLOR,
+       if (shared->hw_bitblt(shared->engine_mmio, VIA_BITBLT_COLOR,
                area->width, area->height, info->var.bits_per_pixel,
                viapar->vram_addr, info->fix.line_length, area->dx, area->dy,
                NULL, viapar->vram_addr, info->fix.line_length,
        const struct fb_image *image)
 {
        struct viafb_par *viapar = info->par;
+       struct viafb_shared *shared = viapar->shared;
        u32 fg_color = 0, bg_color = 0;
        u8 op;
 
-       if (!viapar->shared->hw_bitblt ||
+       if (info->flags & FBINFO_HWACCEL_DISABLED || !shared->hw_bitblt ||
                (image->depth != 1 && image->depth != viapar->depth)) {
                cfb_imageblit(info, image);
                return;
                op = VIA_BITBLT_COLOR;
 
        DEBUG_MSG(KERN_DEBUG "viafb 2D engine: imageblit\n");
-       if (viapar->shared->hw_bitblt(viapar->io_virt, op,
+       if (shared->hw_bitblt(shared->engine_mmio, op,
                image->width, image->height, info->var.bits_per_pixel,
                viapar->vram_addr, info->fix.line_length, image->dx, image->dy,
                (u32 *)image->data, 0, 0, 0, 0, fg_color, bg_color, 0))
 static int viafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
 {
        struct viafb_par *viapar = info->par;
+       void __iomem *engine = viapar->shared->engine_mmio;
        u32 temp, xx, yy, bg_color = 0, fg_color = 0,
                chip_name = viapar->shared->chip_info.gfx_chip_name;
        int i, j = 0, cur_size = 64;
 
        if (cursor->set & FB_CUR_SETHOT) {
                temp = (cursor->hot.x << 16) + cursor->hot.y;
-               writel(temp, viapar->io_virt + VIA_REG_CURSOR_ORG);
+               writel(temp, engine + VIA_REG_CURSOR_ORG);
        }
 
        if (cursor->set & FB_CUR_SETPOS) {
                xx = cursor->image.dx - info->var.xoffset;
                temp = yy & 0xFFFF;
                temp |= (xx << 16);
-               writel(temp, viapar->io_virt + VIA_REG_CURSOR_POS);
+               writel(temp, engine + VIA_REG_CURSOR_POS);
        }
 
        if (cursor->image.width <= 32 && cursor->image.height <= 32)
        }
 
        if (cursor->set & FB_CUR_SETSIZE) {
-               temp = readl(viapar->io_virt + VIA_REG_CURSOR_MODE);
+               temp = readl(engine + VIA_REG_CURSOR_MODE);
                if (cur_size == 32)
                        temp |= 0x2;
                else
                        temp &= ~0x2;
 
-               writel(temp, viapar->io_virt + VIA_REG_CURSOR_MODE);
+               writel(temp, engine + VIA_REG_CURSOR_MODE);
        }
 
        if (cursor->set & FB_CUR_SETCMAP) {
                                ((info->cmap.blue[bg_color] & 0xFF00) >> 8);
                }
 
-               writel(bg_color, viapar->io_virt + VIA_REG_CURSOR_BG);
-               writel(fg_color, viapar->io_virt + VIA_REG_CURSOR_FG);
+               writel(bg_color, engine + VIA_REG_CURSOR_BG);
+               writel(fg_color, engine + VIA_REG_CURSOR_FG);
        }
 
        if (cursor->set & FB_CUR_SETSHAPE) {
 
 static int viafb_sync(struct fb_info *info)
 {
-       if (viafb_accel)
-               viafb_wait_engine_idle();
+       if (!(info->flags & FBINFO_HWACCEL_DISABLED))
+               viafb_wait_engine_idle(info);
        return 0;
 }
 
 
        viafb_get_mmio_info(&viafbinfo->fix.mmio_start,
                &viafbinfo->fix.mmio_len);
-       viaparinfo->io_virt = ioremap_nocache(viafbinfo->fix.mmio_start,
-               viafbinfo->fix.mmio_len);
-       if (!viaparinfo->io_virt) {
-               printk(KERN_WARNING "ioremap failed: hardware acceleration disabled\n");
-               viafb_accel = 0;
-       }
-
        viafbinfo->node = 0;
        viafbinfo->fbops = &viafb_ops;
        viafbinfo->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
 
        viafbinfo->pseudo_palette = pseudo_pal;
-       if (viafb_accel) {
-               viafb_init_accel(viaparinfo->shared);
-               viafb_init_2d_engine();
-               viafb_hw_cursor_init();
+       if (viafb_accel && !viafb_init_engine(viafbinfo)) {
+               viafbinfo->flags |= FBINFO_HWACCEL_COPYAREA |
+                       FBINFO_HWACCEL_FILLRECT |  FBINFO_HWACCEL_IMAGEBLIT;
+               default_var.accel_flags = FB_ACCELF_TEXT;
+       } else {
+               viafbinfo->flags |= FBINFO_HWACCEL_DISABLED;
+               default_var.accel_flags = 0;
        }
 
        if (viafb_second_size && (viafb_second_size < 8)) {
        default_var.lower_margin = 4;
        default_var.hsync_len = default_var.left_margin;
        default_var.vsync_len = 4;
-       default_var.accel_flags = 0;
-
-       if (viafb_accel) {
-               viafbinfo->flags |=
-                   (FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT |
-                    FBINFO_HWACCEL_IMAGEBLIT);
-               default_var.accel_flags |= FB_ACCELF_TEXT;
-       } else
-               viafbinfo->flags |= FBINFO_HWACCEL_DISABLED;
 
        if (viafb_dual_fb) {
                viafbinfo1 = framebuffer_alloc(viafb_par_length, NULL);
                        viaparinfo1->fbmem_used;
                viaparinfo->fbmem_free = viaparinfo->memsize;
                viaparinfo->fbmem_used = 0;
-               if (viafb_accel) {
-                       viaparinfo1->VQ_start = viaparinfo->VQ_start -
-                               viafb_second_offset;
-                       viaparinfo1->VQ_end = viaparinfo->VQ_end -
-                               viafb_second_offset;
-               }
 
                viaparinfo->iga_path = IGA1;
                viaparinfo1->iga_path = IGA2;
        if (viafb_dual_fb)
                unregister_framebuffer(viafbinfo1);
        iounmap((void *)viafbinfo->screen_base);
-       iounmap(viaparinfo->io_virt);
+       iounmap(viaparinfo->shared->engine_mmio);
 
        viafb_delete_i2c_buss(viaparinfo);
 
 
 module_param(viafb_accel, int, 0);
 MODULE_PARM_DESC(viafb_accel,
-       "Set 2D Hardware Acceleration.(Default = OFF)");
+       "Set 2D Hardware Acceleration: 0 = OFF, 1 = ON (default)");
 
 module_param(viafb_active_dev, charp, 0);
 MODULE_PARM_DESC(viafb_active_dev, "Specify active devices.");