diff options
-rw-r--r-- | drivers/video/s1d13xxxfb.c | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/drivers/video/s1d13xxxfb.c b/drivers/video/s1d13xxxfb.c index c9f91a96258a47..7c4b290317d3ff 100644 --- a/drivers/video/s1d13xxxfb.c +++ b/drivers/video/s1d13xxxfb.c @@ -410,9 +410,11 @@ s1d13xxxfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) u8 bltbit_wait_bitset(struct fb_info *info, u8 bit, int timeout) { while (!(s1d13xxxfb_readreg(info->par, S1DREG_BBLT_CTL0) & bit)) { - udelay(10); - if (!--timeout) - break; + udelay(10); + if (!--timeout) { + printk(KERN_ERR "s1d13xxxfb_bitblt : wait_bitset timeout\n"); + break; + } } return timeout; @@ -425,10 +427,12 @@ u8 bltbit_wait_bitset(struct fb_info *info, u8 bit, int timeout) */ u8 bltbit_wait_bitclear(struct fb_info *info, u8 bit, int timeout) { - while (s1d13xxxfb_readreg(info->par, S1DREG_BBLT_CTL0) & bit) { - udelay(10); - if (!--timeout) - break; + while (s1d13xxxfb_readreg(info->par, S1DREG_BBLT_CTL0) & bit) { + udelay(10); + if (!--timeout) { + printk(KERN_ERR "s1d13xxxfb_bitblt : wait_bitclear timeout\n"); + break; + } } return timeout; @@ -469,33 +473,48 @@ u8 bltbit_fifo_status(struct fb_info *info) void s1d13xxxfb_bitblt_solidfill(struct fb_info *info, const struct fb_fillrect *rect) { u32 screen_stride, dest; - - /* bits per width, what happens if this is odd number?*/ - screen_stride = (info->var.xres_virtual) * 2; + + /* bytes per width line */ + screen_stride = ((info->var.xres) * (info->var.bits_per_pixel >> 3)); + /* bits to starting point */ - dest = (rect->dy * screen_stride) + (rect->dx * 2); + dest = ((rect->dy * screen_stride) + (info->var.bits_per_pixel >> 3)); + + printk(KERN_ERR "s1d13xxxfb_bitblt : request solid_fill\n" + " dx=%d, dy=%d, stride=%d, dest=%d\n" + " rect_width=%d, rect_height=%d\n", + rect->dx, rect->dy, screen_stride, dest, + rect->width, rect->height); + + printk(KERN_ERR "s1d13xxxfb_bitblt : xres=%d, yres=%d, bpp=%d\n", + info->var.xres, info->var.yres, + info->var.bits_per_pixel); /* We split the destination into the three registers */ s1d13xxxfb_writereg(info->par, S1DREG_BBLT_DST_START0, (dest & 0x00ff)); s1d13xxxfb_writereg(info->par, S1DREG_BBLT_DST_START1, ((dest >> 8) & 0x00ff)); s1d13xxxfb_writereg(info->par, S1DREG_BBLT_DST_START2, ((dest >> 16) & 0x00ff)); - /* give information regarding our rectangel size */ + /* give information regarding rectangel width */ s1d13xxxfb_writereg(info->par, S1DREG_BBLT_WIDTH0, ((rect->width) & 0x00ff) - 1); - s1d13xxxfb_writereg(info->par, S1DREG_BBLT_WIDTH1, ((rect->width) & 0xff00) >> 8); - + s1d13xxxfb_writereg(info->par, S1DREG_BBLT_WIDTH1, (rect->width >> 8)); + + /* give information regarding rectangel height */ s1d13xxxfb_writereg(info->par, S1DREG_BBLT_HEIGHT0, ((rect->height) & 0x00ff) - 1); - s1d13xxxfb_writereg(info->par, S1DREG_BBLT_HEIGHT1, ((rect->height) & 0xff00) >> 8); - + s1d13xxxfb_writereg(info->par, S1DREG_BBLT_HEIGHT1, (rect->height >> 8)); + /* set foreground color */ s1d13xxxfb_writereg(info->par, S1DREG_BBLT_FGC0, (rect->color) && 0x00ff); - s1d13xxxfb_writereg(info->par, S1DREG_BBLT_FGC1, (rect->color) && 0xff00); + s1d13xxxfb_writereg(info->par, S1DREG_BBLT_FGC1, (rect->color >> 8)); + + /* set rectangual region of memory (rectangle and not linear) */ + s1d13xxxfb_writereg(info->par, S1DREG_BBLT_CTL0, 0x0); /* set operation mode SOLID_FILL */ s1d13xxxfb_writereg(info->par, S1DREG_BBLT_OP, BBLT_SOLID_FILL); - - /* set bits per pixel (1 = 16, 0 = 8) */ - s1d13xxxfb_writereg(info->par, S1DREG_BBLT_CTL1, (info->var.bits_per_pixel & 0x10)); + + /* set bits per pixel (1 = 16bpp, 0 = 8bpp) */ + s1d13xxxfb_writereg(info->par, S1DREG_BBLT_CTL1, (info->var.bits_per_pixel >> 4)); /* set the memory offset for the bblt in word sizes */ s1d13xxxfb_writereg_w(info->par, S1DREG_BBLT_MEM_OFF0, (screen_stride >> 1)); |