Commit 8636a924 authored by Krzysztof Helt's avatar Krzysztof Helt Committed by Linus Torvalds

cirrusfb: fix interlaced modes

Fix calculations of timings for interlaced modes.
Signed-off-by: default avatarKrzysztof Helt <krzysztof.h1@wp.pl>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4242a23c
...@@ -701,45 +701,52 @@ static int cirrusfb_set_par_foo(struct fb_info *info) ...@@ -701,45 +701,52 @@ static int cirrusfb_set_par_foo(struct fb_info *info)
hsyncstart = var->xres + var->right_margin; hsyncstart = var->xres + var->right_margin;
hsyncend = hsyncstart + var->hsync_len; hsyncend = hsyncstart + var->hsync_len;
htotal = (hsyncend + var->left_margin) / 8 - 5; htotal = (hsyncend + var->left_margin) / 8;
hdispend = var->xres / 8 - 1; hdispend = var->xres / 8;
hsyncstart = hsyncstart / 8 + 1; hsyncstart = hsyncstart / 8;
hsyncend = hsyncend / 8 + 1; hsyncend = hsyncend / 8;
yres = var->yres; vdispend = var->yres;
vsyncstart = yres + var->lower_margin; vsyncstart = vdispend + var->lower_margin;
vsyncend = vsyncstart + var->vsync_len; vsyncend = vsyncstart + var->vsync_len;
vtotal = vsyncend + var->upper_margin; vtotal = vsyncend + var->upper_margin;
vdispend = yres - 1;
if (var->vmode & FB_VMODE_DOUBLE) { if (var->vmode & FB_VMODE_DOUBLE) {
yres *= 2; vdispend *= 2;
vsyncstart *= 2; vsyncstart *= 2;
vsyncend *= 2; vsyncend *= 2;
vtotal *= 2; vtotal *= 2;
} else if (var->vmode & FB_VMODE_INTERLACED) { } else if (var->vmode & FB_VMODE_INTERLACED) {
yres = (yres + 1) / 2; vdispend = (vdispend + 1) / 2;
vsyncstart = (vsyncstart + 1) / 2; vsyncstart = (vsyncstart + 1) / 2;
vsyncend = (vsyncend + 1) / 2; vsyncend = (vsyncend + 1) / 2;
vtotal = (vtotal + 1) / 2; vtotal = (vtotal + 1) / 2;
} }
yres = vdispend;
vtotal -= 2;
vsyncstart -= 1;
vsyncend -= 1;
if (yres >= 1024) { if (yres >= 1024) {
vtotal /= 2; vtotal /= 2;
vsyncstart /= 2; vsyncstart /= 2;
vsyncend /= 2; vsyncend /= 2;
vdispend /= 2; vdispend /= 2;
} }
vdispend -= 1;
vsyncstart -= 1;
vsyncend -= 1;
vtotal -= 2;
if (cinfo->multiplexing) { if (cinfo->multiplexing) {
htotal /= 2; htotal /= 2;
hsyncstart /= 2; hsyncstart /= 2;
hsyncend /= 2; hsyncend /= 2;
hdispend /= 2; hdispend /= 2;
} }
htotal -= 5;
hdispend -= 1;
hsyncstart += 1;
hsyncend += 1;
/* unlock register VGA_CRTC_H_TOTAL..CRT7 */ /* unlock register VGA_CRTC_H_TOTAL..CRT7 */
vga_wcrt(regbase, VGA_CRTC_V_SYNC_END, 0x20); /* previously: 0x00) */ vga_wcrt(regbase, VGA_CRTC_V_SYNC_END, 0x20); /* previously: 0x00) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment