aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/misc/sisusbvga/sisusb_con.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/misc/sisusbvga/sisusb_con.c')
-rw-r--r--drivers/usb/misc/sisusbvga/sisusb_con.c151
1 files changed, 66 insertions, 85 deletions
diff --git a/drivers/usb/misc/sisusbvga/sisusb_con.c b/drivers/usb/misc/sisusbvga/sisusb_con.c
index be5c1a25ae2..fb48feca835 100644
--- a/drivers/usb/misc/sisusbvga/sisusb_con.c
+++ b/drivers/usb/misc/sisusbvga/sisusb_con.c
@@ -48,6 +48,7 @@
48 */ 48 */
49 49
50#include <linux/config.h> 50#include <linux/config.h>
51#include <linux/mutex.h>
51#include <linux/module.h> 52#include <linux/module.h>
52#include <linux/kernel.h> 53#include <linux/kernel.h>
53#include <linux/signal.h> 54#include <linux/signal.h>
@@ -69,27 +70,9 @@
69#include <linux/vmalloc.h> 70#include <linux/vmalloc.h>
70 71
71#include "sisusb.h" 72#include "sisusb.h"
73#include "sisusb_init.h"
72 74
73#ifdef INCL_SISUSB_CON 75#ifdef INCL_SISUSB_CON
74extern int sisusb_setreg(struct sisusb_usb_data *, int, u8);
75extern int sisusb_getreg(struct sisusb_usb_data *, int, u8 *);
76extern int sisusb_setidxreg(struct sisusb_usb_data *, int, u8, u8);
77extern int sisusb_getidxreg(struct sisusb_usb_data *, int, u8, u8 *);
78extern int sisusb_setidxregor(struct sisusb_usb_data *, int, u8, u8);
79extern int sisusb_setidxregand(struct sisusb_usb_data *, int, u8, u8);
80extern int sisusb_setidxregandor(struct sisusb_usb_data *, int, u8, u8, u8);
81
82extern int sisusb_writeb(struct sisusb_usb_data *sisusb, u32 adr, u8 data);
83extern int sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data);
84extern int sisusb_writew(struct sisusb_usb_data *sisusb, u32 adr, u16 data);
85extern int sisusb_readw(struct sisusb_usb_data *sisusb, u32 adr, u16 *data);
86extern int sisusb_copy_memory(struct sisusb_usb_data *sisusb, char *src,
87 u32 dest, int length, size_t *bytes_written);
88
89extern void sisusb_delete(struct kref *kref);
90extern int sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init);
91
92extern int SiSUSBSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo);
93 76
94#define sisusbcon_writew(val, addr) (*(addr) = (val)) 77#define sisusbcon_writew(val, addr) (*(addr) = (val))
95#define sisusbcon_readw(addr) (*(addr)) 78#define sisusbcon_readw(addr) (*(addr))
@@ -102,8 +85,6 @@ static struct sisusb_usb_data *mysisusbs[MAX_NR_CONSOLES];
102/* Forward declaration */ 85/* Forward declaration */
103static const struct consw sisusb_con; 86static const struct consw sisusb_con;
104 87
105extern struct semaphore disconnect_sem;
106
107static inline void 88static inline void
108sisusbcon_memsetw(u16 *s, u16 c, unsigned int count) 89sisusbcon_memsetw(u16 *s, u16 c, unsigned int count)
109{ 90{
@@ -194,11 +175,11 @@ sisusb_get_sisusb_lock_and_check(unsigned short console)
194 if (!(sisusb = sisusb_get_sisusb(console))) 175 if (!(sisusb = sisusb_get_sisusb(console)))
195 return NULL; 176 return NULL;
196 177
197 down(&sisusb->lock); 178 mutex_lock(&sisusb->lock);
198 179
199 if (!sisusb_sisusb_valid(sisusb) || 180 if (!sisusb_sisusb_valid(sisusb) ||
200 !sisusb->havethisconsole[console]) { 181 !sisusb->havethisconsole[console]) {
201 up(&sisusb->lock); 182 mutex_unlock(&sisusb->lock);
202 return NULL; 183 return NULL;
203 } 184 }
204 185
@@ -236,18 +217,18 @@ sisusbcon_init(struct vc_data *c, int init)
236 * are set up/restored. 217 * are set up/restored.
237 */ 218 */
238 219
239 down(&disconnect_sem); 220 mutex_lock(&disconnect_mutex);
240 221
241 if (!(sisusb = sisusb_get_sisusb(c->vc_num))) { 222 if (!(sisusb = sisusb_get_sisusb(c->vc_num))) {
242 up(&disconnect_sem); 223 mutex_unlock(&disconnect_mutex);
243 return; 224 return;
244 } 225 }
245 226
246 down(&sisusb->lock); 227 mutex_lock(&sisusb->lock);
247 228
248 if (!sisusb_sisusb_valid(sisusb)) { 229 if (!sisusb_sisusb_valid(sisusb)) {
249 up(&sisusb->lock); 230 mutex_unlock(&sisusb->lock);
250 up(&disconnect_sem); 231 mutex_unlock(&disconnect_mutex);
251 return; 232 return;
252 } 233 }
253 234
@@ -284,9 +265,9 @@ sisusbcon_init(struct vc_data *c, int init)
284 if (!*c->vc_uni_pagedir_loc) 265 if (!*c->vc_uni_pagedir_loc)
285 con_set_default_unimap(c); 266 con_set_default_unimap(c);
286 267
287 up(&sisusb->lock); 268 mutex_unlock(&sisusb->lock);
288 269
289 up(&disconnect_sem); 270 mutex_unlock(&disconnect_mutex);
290 271
291 if (init) { 272 if (init) {
292 c->vc_cols = cols; 273 c->vc_cols = cols;
@@ -306,14 +287,14 @@ sisusbcon_deinit(struct vc_data *c)
306 * and others, ie not under our control. 287 * and others, ie not under our control.
307 */ 288 */
308 289
309 down(&disconnect_sem); 290 mutex_lock(&disconnect_mutex);
310 291
311 if (!(sisusb = sisusb_get_sisusb(c->vc_num))) { 292 if (!(sisusb = sisusb_get_sisusb(c->vc_num))) {
312 up(&disconnect_sem); 293 mutex_unlock(&disconnect_mutex);
313 return; 294 return;
314 } 295 }
315 296
316 down(&sisusb->lock); 297 mutex_lock(&sisusb->lock);
317 298
318 /* Clear ourselves in mysisusbs */ 299 /* Clear ourselves in mysisusbs */
319 mysisusbs[c->vc_num] = NULL; 300 mysisusbs[c->vc_num] = NULL;
@@ -332,12 +313,12 @@ sisusbcon_deinit(struct vc_data *c)
332 } 313 }
333 } 314 }
334 315
335 up(&sisusb->lock); 316 mutex_unlock(&sisusb->lock);
336 317
337 /* decrement the usage count on our sisusb */ 318 /* decrement the usage count on our sisusb */
338 kref_put(&sisusb->kref, sisusb_delete); 319 kref_put(&sisusb->kref, sisusb_delete);
339 320
340 up(&disconnect_sem); 321 mutex_unlock(&disconnect_mutex);
341} 322}
342 323
343/* interface routine */ 324/* interface routine */
@@ -417,7 +398,7 @@ sisusbcon_putc(struct vc_data *c, int ch, int y, int x)
417#endif 398#endif
418 399
419 if (sisusb_is_inactive(c, sisusb)) { 400 if (sisusb_is_inactive(c, sisusb)) {
420 up(&sisusb->lock); 401 mutex_unlock(&sisusb->lock);
421 return; 402 return;
422 } 403 }
423 404
@@ -425,7 +406,7 @@ sisusbcon_putc(struct vc_data *c, int ch, int y, int x)
425 sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y), 406 sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y),
426 (u32)SISUSB_HADDR(x, y), 2, &written); 407 (u32)SISUSB_HADDR(x, y), 2, &written);
427 408
428 up(&sisusb->lock); 409 mutex_unlock(&sisusb->lock);
429} 410}
430 411
431/* Interface routine */ 412/* Interface routine */
@@ -453,14 +434,14 @@ sisusbcon_putcs(struct vc_data *c, const unsigned short *s,
453 sisusbcon_writew(sisusbcon_readw(s++), dest++); 434 sisusbcon_writew(sisusbcon_readw(s++), dest++);
454 435
455 if (sisusb_is_inactive(c, sisusb)) { 436 if (sisusb_is_inactive(c, sisusb)) {
456 up(&sisusb->lock); 437 mutex_unlock(&sisusb->lock);
457 return; 438 return;
458 } 439 }
459 440
460 sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y), 441 sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y),
461 (u32)SISUSB_HADDR(x, y), count * 2, &written); 442 (u32)SISUSB_HADDR(x, y), count * 2, &written);
462 443
463 up(&sisusb->lock); 444 mutex_unlock(&sisusb->lock);
464} 445}
465 446
466/* Interface routine */ 447/* Interface routine */
@@ -504,7 +485,7 @@ sisusbcon_clear(struct vc_data *c, int y, int x, int height, int width)
504 } 485 }
505 486
506 if (sisusb_is_inactive(c, sisusb)) { 487 if (sisusb_is_inactive(c, sisusb)) {
507 up(&sisusb->lock); 488 mutex_unlock(&sisusb->lock);
508 return; 489 return;
509 } 490 }
510 491
@@ -514,7 +495,7 @@ sisusbcon_clear(struct vc_data *c, int y, int x, int height, int width)
514 sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(x, y), 495 sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(x, y),
515 (u32)SISUSB_HADDR(x, y), length, &written); 496 (u32)SISUSB_HADDR(x, y), length, &written);
516 497
517 up(&sisusb->lock); 498 mutex_unlock(&sisusb->lock);
518} 499}
519 500
520/* Interface routine */ 501/* Interface routine */
@@ -576,7 +557,7 @@ sisusbcon_bmove(struct vc_data *c, int sy, int sx,
576#endif 557#endif
577 558
578 if (sisusb_is_inactive(c, sisusb)) { 559 if (sisusb_is_inactive(c, sisusb)) {
579 up(&sisusb->lock); 560 mutex_unlock(&sisusb->lock);
580 return; 561 return;
581 } 562 }
582 563
@@ -586,7 +567,7 @@ sisusbcon_bmove(struct vc_data *c, int sy, int sx,
586 sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(dx, dy), 567 sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(dx, dy),
587 (u32)SISUSB_HADDR(dx, dy), length, &written); 568 (u32)SISUSB_HADDR(dx, dy), length, &written);
588 569
589 up(&sisusb->lock); 570 mutex_unlock(&sisusb->lock);
590} 571}
591 572
592/* interface routine */ 573/* interface routine */
@@ -609,7 +590,7 @@ sisusbcon_switch(struct vc_data *c)
609 590
610 /* Don't write to screen if in gfx mode */ 591 /* Don't write to screen if in gfx mode */
611 if (sisusb_is_inactive(c, sisusb)) { 592 if (sisusb_is_inactive(c, sisusb)) {
612 up(&sisusb->lock); 593 mutex_unlock(&sisusb->lock);
613 return 0; 594 return 0;
614 } 595 }
615 596
@@ -618,7 +599,7 @@ sisusbcon_switch(struct vc_data *c)
618 * as origin. 599 * as origin.
619 */ 600 */
620 if (c->vc_origin == (unsigned long)c->vc_screenbuf) { 601 if (c->vc_origin == (unsigned long)c->vc_screenbuf) {
621 up(&sisusb->lock); 602 mutex_unlock(&sisusb->lock);
622 printk(KERN_DEBUG "sisusb: ASSERT ORIGIN != SCREENBUF!\n"); 603 printk(KERN_DEBUG "sisusb: ASSERT ORIGIN != SCREENBUF!\n");
623 return 0; 604 return 0;
624 } 605 }
@@ -635,7 +616,7 @@ sisusbcon_switch(struct vc_data *c)
635 (u32)SISUSB_HADDR(0, 0), 616 (u32)SISUSB_HADDR(0, 0),
636 length, &written); 617 length, &written);
637 618
638 up(&sisusb->lock); 619 mutex_unlock(&sisusb->lock);
639 620
640 return 0; 621 return 0;
641} 622}
@@ -657,7 +638,7 @@ sisusbcon_save_screen(struct vc_data *c)
657 /* sisusb->lock is down */ 638 /* sisusb->lock is down */
658 639
659 if (sisusb_is_inactive(c, sisusb)) { 640 if (sisusb_is_inactive(c, sisusb)) {
660 up(&sisusb->lock); 641 mutex_unlock(&sisusb->lock);
661 return; 642 return;
662 } 643 }
663 644
@@ -669,7 +650,7 @@ sisusbcon_save_screen(struct vc_data *c)
669 sisusbcon_memcpyw((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin, 650 sisusbcon_memcpyw((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin,
670 length); 651 length);
671 652
672 up(&sisusb->lock); 653 mutex_unlock(&sisusb->lock);
673} 654}
674 655
675/* interface routine */ 656/* interface routine */
@@ -690,7 +671,7 @@ sisusbcon_set_palette(struct vc_data *c, unsigned char *table)
690 /* sisusb->lock is down */ 671 /* sisusb->lock is down */
691 672
692 if (sisusb_is_inactive(c, sisusb)) { 673 if (sisusb_is_inactive(c, sisusb)) {
693 up(&sisusb->lock); 674 mutex_unlock(&sisusb->lock);
694 return -EINVAL; 675 return -EINVAL;
695 } 676 }
696 677
@@ -705,7 +686,7 @@ sisusbcon_set_palette(struct vc_data *c, unsigned char *table)
705 break; 686 break;
706 } 687 }
707 688
708 up(&sisusb->lock); 689 mutex_unlock(&sisusb->lock);
709 690
710 return 0; 691 return 0;
711} 692}
@@ -728,7 +709,7 @@ sisusbcon_blank(struct vc_data *c, int blank, int mode_switch)
728 sisusb->is_gfx = blank ? 1 : 0; 709 sisusb->is_gfx = blank ? 1 : 0;
729 710
730 if (sisusb_is_inactive(c, sisusb)) { 711 if (sisusb_is_inactive(c, sisusb)) {
731 up(&sisusb->lock); 712 mutex_unlock(&sisusb->lock);
732 return 0; 713 return 0;
733 } 714 }
734 715
@@ -777,7 +758,7 @@ sisusbcon_blank(struct vc_data *c, int blank, int mode_switch)
777 cr63 = 0x40; 758 cr63 = 0x40;
778 break; 759 break;
779 default: 760 default:
780 up(&sisusb->lock); 761 mutex_unlock(&sisusb->lock);
781 return -EINVAL; 762 return -EINVAL;
782 } 763 }
783 764
@@ -788,7 +769,7 @@ sisusbcon_blank(struct vc_data *c, int blank, int mode_switch)
788 769
789 } 770 }
790 771
791 up(&sisusb->lock); 772 mutex_unlock(&sisusb->lock);
792 773
793 return ret; 774 return ret;
794} 775}
@@ -809,7 +790,7 @@ sisusbcon_scrolldelta(struct vc_data *c, int lines)
809 /* sisusb->lock is down */ 790 /* sisusb->lock is down */
810 791
811 if (sisusb_is_inactive(c, sisusb)) { 792 if (sisusb_is_inactive(c, sisusb)) {
812 up(&sisusb->lock); 793 mutex_unlock(&sisusb->lock);
813 return 0; 794 return 0;
814 } 795 }
815 796
@@ -849,7 +830,7 @@ sisusbcon_scrolldelta(struct vc_data *c, int lines)
849 830
850 sisusbcon_set_start_address(sisusb, c); 831 sisusbcon_set_start_address(sisusb, c);
851 832
852 up(&sisusb->lock); 833 mutex_unlock(&sisusb->lock);
853 834
854 return 1; 835 return 1;
855} 836}
@@ -867,7 +848,7 @@ sisusbcon_cursor(struct vc_data *c, int mode)
867 /* sisusb->lock is down */ 848 /* sisusb->lock is down */
868 849
869 if (sisusb_is_inactive(c, sisusb)) { 850 if (sisusb_is_inactive(c, sisusb)) {
870 up(&sisusb->lock); 851 mutex_unlock(&sisusb->lock);
871 return; 852 return;
872 } 853 }
873 854
@@ -879,7 +860,7 @@ sisusbcon_cursor(struct vc_data *c, int mode)
879 if (mode == CM_ERASE) { 860 if (mode == CM_ERASE) {
880 sisusb_setidxregor(sisusb, SISCR, 0x0a, 0x20); 861 sisusb_setidxregor(sisusb, SISCR, 0x0a, 0x20);
881 sisusb->sisusb_cursor_size_to = -1; 862 sisusb->sisusb_cursor_size_to = -1;
882 up(&sisusb->lock); 863 mutex_unlock(&sisusb->lock);
883 return; 864 return;
884 } 865 }
885 866
@@ -919,7 +900,7 @@ sisusbcon_cursor(struct vc_data *c, int mode)
919 sisusb->sisusb_cursor_size_to = to; 900 sisusb->sisusb_cursor_size_to = to;
920 } 901 }
921 902
922 up(&sisusb->lock); 903 mutex_unlock(&sisusb->lock);
923} 904}
924 905
925static int 906static int
@@ -961,7 +942,7 @@ sisusbcon_scroll_area(struct vc_data *c, struct sisusb_usb_data *sisusb,
961 sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(0, t), 942 sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(0, t),
962 (u32)SISUSB_HADDR(0, t), length, &written); 943 (u32)SISUSB_HADDR(0, t), length, &written);
963 944
964 up(&sisusb->lock); 945 mutex_unlock(&sisusb->lock);
965 946
966 return 1; 947 return 1;
967} 948}
@@ -994,7 +975,7 @@ sisusbcon_scroll(struct vc_data *c, int t, int b, int dir, int lines)
994 /* sisusb->lock is down */ 975 /* sisusb->lock is down */
995 976
996 if (sisusb_is_inactive(c, sisusb)) { 977 if (sisusb_is_inactive(c, sisusb)) {
997 up(&sisusb->lock); 978 mutex_unlock(&sisusb->lock);
998 return 0; 979 return 0;
999 } 980 }
1000 981
@@ -1084,7 +1065,7 @@ sisusbcon_scroll(struct vc_data *c, int t, int b, int dir, int lines)
1084 1065
1085 c->vc_pos = c->vc_pos - oldorigin + c->vc_origin; 1066 c->vc_pos = c->vc_pos - oldorigin + c->vc_origin;
1086 1067
1087 up(&sisusb->lock); 1068 mutex_unlock(&sisusb->lock);
1088 1069
1089 return 1; 1070 return 1;
1090} 1071}
@@ -1106,7 +1087,7 @@ sisusbcon_set_origin(struct vc_data *c)
1106 /* sisusb->lock is down */ 1087 /* sisusb->lock is down */
1107 1088
1108 if (sisusb_is_inactive(c, sisusb) || sisusb->con_blanked) { 1089 if (sisusb_is_inactive(c, sisusb) || sisusb->con_blanked) {
1109 up(&sisusb->lock); 1090 mutex_unlock(&sisusb->lock);
1110 return 0; 1091 return 0;
1111 } 1092 }
1112 1093
@@ -1116,7 +1097,7 @@ sisusbcon_set_origin(struct vc_data *c)
1116 1097
1117 sisusb->con_rolled_over = 0; 1098 sisusb->con_rolled_over = 0;
1118 1099
1119 up(&sisusb->lock); 1100 mutex_unlock(&sisusb->lock);
1120 1101
1121 return 1; 1102 return 1;
1122} 1103}
@@ -1133,7 +1114,7 @@ sisusbcon_resize(struct vc_data *c, unsigned int newcols, unsigned int newrows)
1133 1114
1134 fh = sisusb->current_font_height; 1115 fh = sisusb->current_font_height;
1135 1116
1136 up(&sisusb->lock); 1117 mutex_unlock(&sisusb->lock);
1137 1118
1138 /* We are quite unflexible as regards resizing. The vt code 1119 /* We are quite unflexible as regards resizing. The vt code
1139 * handles sizes where the line length isn't equal the pitch 1120 * handles sizes where the line length isn't equal the pitch
@@ -1167,7 +1148,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot,
1167 1148
1168 if ((slot != 0 && slot != 2) || !fh) { 1149 if ((slot != 0 && slot != 2) || !fh) {
1169 if (uplock) 1150 if (uplock)
1170 up(&sisusb->lock); 1151 mutex_unlock(&sisusb->lock);
1171 return -EINVAL; 1152 return -EINVAL;
1172 } 1153 }
1173 1154
@@ -1327,7 +1308,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot,
1327 } 1308 }
1328 1309
1329 if (uplock) 1310 if (uplock)
1330 up(&sisusb->lock); 1311 mutex_unlock(&sisusb->lock);
1331 1312
1332 if (dorecalc && c) { 1313 if (dorecalc && c) {
1333 int i, rows = c->vc_scan_lines / fh; 1314 int i, rows = c->vc_scan_lines / fh;
@@ -1351,7 +1332,7 @@ sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot,
1351 1332
1352font_op_error: 1333font_op_error:
1353 if (uplock) 1334 if (uplock)
1354 up(&sisusb->lock); 1335 mutex_unlock(&sisusb->lock);
1355 1336
1356 return -EIO; 1337 return -EIO;
1357} 1338}
@@ -1417,19 +1398,19 @@ sisusbcon_font_get(struct vc_data *c, struct console_font *font)
1417 font->charcount = 256; 1398 font->charcount = 256;
1418 1399
1419 if (!font->data) { 1400 if (!font->data) {
1420 up(&sisusb->lock); 1401 mutex_unlock(&sisusb->lock);
1421 return 0; 1402 return 0;
1422 } 1403 }
1423 1404
1424 if (!sisusb->font_backup) { 1405 if (!sisusb->font_backup) {
1425 up(&sisusb->lock); 1406 mutex_unlock(&sisusb->lock);
1426 return -ENODEV; 1407 return -ENODEV;
1427 } 1408 }
1428 1409
1429 /* Copy 256 chars only, like vgacon */ 1410 /* Copy 256 chars only, like vgacon */
1430 memcpy(font->data, sisusb->font_backup, 256 * 32); 1411 memcpy(font->data, sisusb->font_backup, 256 * 32);
1431 1412
1432 up(&sisusb->lock); 1413 mutex_unlock(&sisusb->lock);
1433 1414
1434 return 0; 1415 return 0;
1435} 1416}
@@ -1486,7 +1467,7 @@ static int sisusbdummycon_dummy(void)
1486 1467
1487#define SISUSBCONDUMMY (void *)sisusbdummycon_dummy 1468#define SISUSBCONDUMMY (void *)sisusbdummycon_dummy
1488 1469
1489const struct consw sisusb_dummy_con = { 1470static const struct consw sisusb_dummy_con = {
1490 .owner = THIS_MODULE, 1471 .owner = THIS_MODULE,
1491 .con_startup = sisusbdummycon_startup, 1472 .con_startup = sisusbdummycon_startup,
1492 .con_init = sisusbdummycon_init, 1473 .con_init = sisusbdummycon_init,
@@ -1512,14 +1493,14 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last)
1512{ 1493{
1513 int i, ret, minor = sisusb->minor; 1494 int i, ret, minor = sisusb->minor;
1514 1495
1515 down(&disconnect_sem); 1496 mutex_lock(&disconnect_mutex);
1516 1497
1517 down(&sisusb->lock); 1498 mutex_lock(&sisusb->lock);
1518 1499
1519 /* Erm.. that should not happen */ 1500 /* Erm.. that should not happen */
1520 if (sisusb->haveconsole || !sisusb->SiS_Pr) { 1501 if (sisusb->haveconsole || !sisusb->SiS_Pr) {
1521 up(&sisusb->lock); 1502 mutex_unlock(&sisusb->lock);
1522 up(&disconnect_sem); 1503 mutex_unlock(&disconnect_mutex);
1523 return 1; 1504 return 1;
1524 } 1505 }
1525 1506
@@ -1529,15 +1510,15 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last)
1529 if (first > last || 1510 if (first > last ||
1530 first > MAX_NR_CONSOLES || 1511 first > MAX_NR_CONSOLES ||
1531 last > MAX_NR_CONSOLES) { 1512 last > MAX_NR_CONSOLES) {
1532 up(&sisusb->lock); 1513 mutex_unlock(&sisusb->lock);
1533 up(&disconnect_sem); 1514 mutex_unlock(&disconnect_mutex);
1534 return 1; 1515 return 1;
1535 } 1516 }
1536 1517
1537 /* If gfxcore not initialized or no consoles given, quit graciously */ 1518 /* If gfxcore not initialized or no consoles given, quit graciously */
1538 if (!sisusb->gfxinit || first < 1 || last < 1) { 1519 if (!sisusb->gfxinit || first < 1 || last < 1) {
1539 up(&sisusb->lock); 1520 mutex_unlock(&sisusb->lock);
1540 up(&disconnect_sem); 1521 mutex_unlock(&disconnect_mutex);
1541 return 0; 1522 return 0;
1542 } 1523 }
1543 1524
@@ -1547,8 +1528,8 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last)
1547 1528
1548 /* Set up text mode (and upload default font) */ 1529 /* Set up text mode (and upload default font) */
1549 if (sisusb_reset_text_mode(sisusb, 1)) { 1530 if (sisusb_reset_text_mode(sisusb, 1)) {
1550 up(&sisusb->lock); 1531 mutex_unlock(&sisusb->lock);
1551 up(&disconnect_sem); 1532 mutex_unlock(&disconnect_mutex);
1552 printk(KERN_ERR 1533 printk(KERN_ERR
1553 "sisusbvga[%d]: Failed to set up text mode\n", 1534 "sisusbvga[%d]: Failed to set up text mode\n",
1554 minor); 1535 minor);
@@ -1571,16 +1552,16 @@ sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last)
1571 1552
1572 /* Allocate screen buffer */ 1553 /* Allocate screen buffer */
1573 if (!(sisusb->scrbuf = (unsigned long)vmalloc(sisusb->scrbuf_size))) { 1554 if (!(sisusb->scrbuf = (unsigned long)vmalloc(sisusb->scrbuf_size))) {
1574 up(&sisusb->lock); 1555 mutex_unlock(&sisusb->lock);
1575 up(&disconnect_sem); 1556 mutex_unlock(&disconnect_mutex);
1576 printk(KERN_ERR 1557 printk(KERN_ERR
1577 "sisusbvga[%d]: Failed to allocate screen buffer\n", 1558 "sisusbvga[%d]: Failed to allocate screen buffer\n",
1578 minor); 1559 minor);
1579 return 1; 1560 return 1;
1580 } 1561 }
1581 1562
1582 up(&sisusb->lock); 1563 mutex_unlock(&sisusb->lock);
1583 up(&disconnect_sem); 1564 mutex_unlock(&disconnect_mutex);
1584 1565
1585 /* Now grab the desired console(s) */ 1566 /* Now grab the desired console(s) */
1586 ret = take_over_console(&sisusb_con, first - 1, last - 1, 0); 1567 ret = take_over_console(&sisusb_con, first - 1, last - 1, 0);