struct device *dev = par->info->device;
        unsigned char *buf = (unsigned char *)par->info->screen_base;
        int xres = par->info->var.xres;
+       int line_length = par->info->fix.line_length;
        u16 args[4];
 
        pm_runtime_get_sync(dev);
        args[1] = y1 + 1;
        args[2] = xres;
        args[3] = y2 - y1;
-       buf += y1 * xres;
+       buf += y1 * line_length;
        auok190x_send_cmdargs_pixels(par, AUOK1900_CMD_PARTIALDISP, 4, args,
-                                    ((y2 - y1) * xres)/2, (u16 *) buf);
+                                    ((y2 - y1) * line_length)/2, (u16 *) buf);
        auok190x_send_command(par, AUOK190X_CMD_DATA_STOP);
 
        par->update_cnt++;
 
        struct device *dev = par->info->device;
        unsigned char *buf = (unsigned char *)par->info->screen_base;
        int xres = par->info->var.xres;
+       int line_length = par->info->fix.line_length;
        u16 args[5];
 
        pm_runtime_get_sync(dev);
        args[1] = y1 + 1;
        args[2] = xres;
        args[3] = y2 - y1;
-       buf += y1 * xres;
+       buf += y1 * line_length;
        auok190x_send_cmdargs_pixels_nowait(par, AUOK1901_CMD_DMA_START, 4,
-                                           args, ((y2 - y1) * xres)/2,
+                                           args, ((y2 - y1) * line_length)/2,
                                            (u16 *) buf);
        auok190x_send_command_nowait(par, AUOK190X_CMD_DATA_STOP);
 
 
 {
        struct fb_deferred_io *fbdefio = info->fbdefio;
        struct auok190xfb_par *par = info->par;
+       u16 line_length = info->fix.line_length;
        u16 yres = info->var.yres;
-       u16 xres = info->var.xres;
        u16 y1 = 0, h = 0;
        int prev_index = -1;
        struct page *cur;
        }
 
        /* height increment is fixed per page */
-       h_inc = DIV_ROUND_UP(PAGE_SIZE , xres);
+       h_inc = DIV_ROUND_UP(PAGE_SIZE , line_length);
 
        /* calculate number of pages from pixel height */
        threshold = par->consecutive_threshold / h_inc;
        list_for_each_entry(cur, &fbdefio->pagelist, lru) {
                if (prev_index < 0) {
                        /* just starting so assign first page */
-                       y1 = (cur->index << PAGE_SHIFT) / xres;
+                       y1 = (cur->index << PAGE_SHIFT) / line_length;
                        h = h_inc;
                } else if ((cur->index - prev_index) <= threshold) {
                        /* page is within our threshold for single updates */
                        par->update_partial(par, y1, y1 + h);
 
                        /* start over with our non consecutive page */
-                       y1 = (cur->index << PAGE_SHIFT) / xres;
+                       y1 = (cur->index << PAGE_SHIFT) / line_length;
                        h = h_inc;
                }
                prev_index = cur->index;
                info->var.yres = panel->w;
                info->var.xres_virtual = panel->h;
                info->var.yres_virtual = panel->w;
-               info->fix.line_length = panel->h;
+               info->fix.line_length = panel->h * info->var.bits_per_pixel / 8;
        } else {
                info->var.xres = panel->w;
                info->var.yres = panel->h;
                info->var.xres_virtual = panel->w;
                info->var.yres_virtual = panel->h;
-               info->fix.line_length = panel->w;
+               info->fix.line_length = panel->w * info->var.bits_per_pixel / 8;
        }
 
        par->resolution = board->resolution;
 
        /* videomemory handling */
 
-       videomemorysize = roundup((panel->w * panel->h), PAGE_SIZE);
+       videomemorysize = roundup((panel->w * panel->h) *
+                               info->var.bits_per_pixel / 8, PAGE_SIZE);
        videomemory = vmalloc(videomemorysize);
        if (!videomemory) {
                ret = -ENOMEM;