diff options
Diffstat (limited to 'drivers/video/console/vgacon.c')
-rw-r--r-- | drivers/video/console/vgacon.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 5a86978537d2..61894d5bb219 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c | |||
@@ -433,17 +433,22 @@ static void vgacon_set_cursor_size(int xpos, int from, int to) | |||
433 | cursor_size_lastto = to; | 433 | cursor_size_lastto = to; |
434 | 434 | ||
435 | spin_lock_irqsave(&vga_lock, flags); | 435 | spin_lock_irqsave(&vga_lock, flags); |
436 | outb_p(0x0a, vga_video_port_reg); /* Cursor start */ | 436 | if (vga_video_type >= VIDEO_TYPE_VGAC) { |
437 | curs = inb_p(vga_video_port_val); | 437 | outb_p(VGA_CRTC_CURSOR_START, vga_video_port_reg); |
438 | outb_p(0x0b, vga_video_port_reg); /* Cursor end */ | 438 | curs = inb_p(vga_video_port_val); |
439 | cure = inb_p(vga_video_port_val); | 439 | outb_p(VGA_CRTC_CURSOR_END, vga_video_port_reg); |
440 | cure = inb_p(vga_video_port_val); | ||
441 | } else { | ||
442 | curs = 0; | ||
443 | cure = 0; | ||
444 | } | ||
440 | 445 | ||
441 | curs = (curs & 0xc0) | from; | 446 | curs = (curs & 0xc0) | from; |
442 | cure = (cure & 0xe0) | to; | 447 | cure = (cure & 0xe0) | to; |
443 | 448 | ||
444 | outb_p(0x0a, vga_video_port_reg); /* Cursor start */ | 449 | outb_p(VGA_CRTC_CURSOR_START, vga_video_port_reg); |
445 | outb_p(curs, vga_video_port_val); | 450 | outb_p(curs, vga_video_port_val); |
446 | outb_p(0x0b, vga_video_port_reg); /* Cursor end */ | 451 | outb_p(VGA_CRTC_CURSOR_END, vga_video_port_reg); |
447 | outb_p(cure, vga_video_port_val); | 452 | outb_p(cure, vga_video_port_val); |
448 | spin_unlock_irqrestore(&vga_lock, flags); | 453 | spin_unlock_irqrestore(&vga_lock, flags); |
449 | } | 454 | } |
@@ -455,7 +460,10 @@ static void vgacon_cursor(struct vc_data *c, int mode) | |||
455 | switch (mode) { | 460 | switch (mode) { |
456 | case CM_ERASE: | 461 | case CM_ERASE: |
457 | write_vga(14, (c->vc_pos - vga_vram_base) / 2); | 462 | write_vga(14, (c->vc_pos - vga_vram_base) / 2); |
458 | vgacon_set_cursor_size(c->vc_x, 31, 30); | 463 | if (vga_video_type >= VIDEO_TYPE_VGAC) |
464 | vgacon_set_cursor_size(c->vc_x, 31, 30); | ||
465 | else | ||
466 | vgacon_set_cursor_size(c->vc_x, 31, 31); | ||
459 | break; | 467 | break; |
460 | 468 | ||
461 | case CM_MOVE: | 469 | case CM_MOVE: |
@@ -493,7 +501,10 @@ static void vgacon_cursor(struct vc_data *c, int mode) | |||
493 | 10 ? 1 : 2)); | 501 | 10 ? 1 : 2)); |
494 | break; | 502 | break; |
495 | case CUR_NONE: | 503 | case CUR_NONE: |
496 | vgacon_set_cursor_size(c->vc_x, 31, 30); | 504 | if (vga_video_type >= VIDEO_TYPE_VGAC) |
505 | vgacon_set_cursor_size(c->vc_x, 31, 30); | ||
506 | else | ||
507 | vgacon_set_cursor_size(c->vc_x, 31, 31); | ||
497 | break; | 508 | break; |
498 | default: | 509 | default: |
499 | vgacon_set_cursor_size(c->vc_x, 1, | 510 | vgacon_set_cursor_size(c->vc_x, 1, |