[PATCH] vgacon: fix EGA cursor resize function
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Mon, 27 Mar 2006 09:17:19 +0000 (01:17 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 27 Mar 2006 16:44:55 +0000 (08:44 -0800)
This corrects cursor resize on ega boards: registers are write-only, so we
shouldn't even try to read them.  And on ega, 31/30 produces a flat cursor.
Using 31/31 is better: except with 32 pixels high fonts, it shouldn't show
up.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/video/console/vgacon.c

index 5a86978..61894d5 100644 (file)
@@ -433,17 +433,22 @@ static void vgacon_set_cursor_size(int xpos, int from, int to)
        cursor_size_lastto = to;
 
        spin_lock_irqsave(&vga_lock, flags);
-       outb_p(0x0a, vga_video_port_reg);       /* Cursor start */
-       curs = inb_p(vga_video_port_val);
-       outb_p(0x0b, vga_video_port_reg);       /* Cursor end */
-       cure = inb_p(vga_video_port_val);
+       if (vga_video_type >= VIDEO_TYPE_VGAC) {
+               outb_p(VGA_CRTC_CURSOR_START, vga_video_port_reg);
+               curs = inb_p(vga_video_port_val);
+               outb_p(VGA_CRTC_CURSOR_END, vga_video_port_reg);
+               cure = inb_p(vga_video_port_val);
+       } else {
+               curs = 0;
+               cure = 0;
+       }
 
        curs = (curs & 0xc0) | from;
        cure = (cure & 0xe0) | to;
 
-       outb_p(0x0a, vga_video_port_reg);       /* Cursor start */
+       outb_p(VGA_CRTC_CURSOR_START, vga_video_port_reg);
        outb_p(curs, vga_video_port_val);
-       outb_p(0x0b, vga_video_port_reg);       /* Cursor end */
+       outb_p(VGA_CRTC_CURSOR_END, vga_video_port_reg);
        outb_p(cure, vga_video_port_val);
        spin_unlock_irqrestore(&vga_lock, flags);
 }
@@ -455,7 +460,10 @@ static void vgacon_cursor(struct vc_data *c, int mode)
        switch (mode) {
        case CM_ERASE:
                write_vga(14, (c->vc_pos - vga_vram_base) / 2);
-               vgacon_set_cursor_size(c->vc_x, 31, 30);
+               if (vga_video_type >= VIDEO_TYPE_VGAC)
+                       vgacon_set_cursor_size(c->vc_x, 31, 30);
+               else
+                       vgacon_set_cursor_size(c->vc_x, 31, 31);
                break;
 
        case CM_MOVE:
@@ -493,7 +501,10 @@ static void vgacon_cursor(struct vc_data *c, int mode)
                                                10 ? 1 : 2));
                        break;
                case CUR_NONE:
-                       vgacon_set_cursor_size(c->vc_x, 31, 30);
+                       if (vga_video_type >= VIDEO_TYPE_VGAC)
+                               vgacon_set_cursor_size(c->vc_x, 31, 30);
+                       else
+                               vgacon_set_cursor_size(c->vc_x, 31, 31);
                        break;
                default:
                        vgacon_set_cursor_size(c->vc_x, 1,