diff options
Diffstat (limited to 'drivers/usb/misc/sisusbvga/sisusb_con.c')
-rw-r--r-- | drivers/usb/misc/sisusbvga/sisusb_con.c | 151 |
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 |
74 | extern int sisusb_setreg(struct sisusb_usb_data *, int, u8); | ||
75 | extern int sisusb_getreg(struct sisusb_usb_data *, int, u8 *); | ||
76 | extern int sisusb_setidxreg(struct sisusb_usb_data *, int, u8, u8); | ||
77 | extern int sisusb_getidxreg(struct sisusb_usb_data *, int, u8, u8 *); | ||
78 | extern int sisusb_setidxregor(struct sisusb_usb_data *, int, u8, u8); | ||
79 | extern int sisusb_setidxregand(struct sisusb_usb_data *, int, u8, u8); | ||
80 | extern int sisusb_setidxregandor(struct sisusb_usb_data *, int, u8, u8, u8); | ||
81 | |||
82 | extern int sisusb_writeb(struct sisusb_usb_data *sisusb, u32 adr, u8 data); | ||
83 | extern int sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data); | ||
84 | extern int sisusb_writew(struct sisusb_usb_data *sisusb, u32 adr, u16 data); | ||
85 | extern int sisusb_readw(struct sisusb_usb_data *sisusb, u32 adr, u16 *data); | ||
86 | extern int sisusb_copy_memory(struct sisusb_usb_data *sisusb, char *src, | ||
87 | u32 dest, int length, size_t *bytes_written); | ||
88 | |||
89 | extern void sisusb_delete(struct kref *kref); | ||
90 | extern int sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init); | ||
91 | |||
92 | extern 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 */ |
103 | static const struct consw sisusb_con; | 86 | static const struct consw sisusb_con; |
104 | 87 | ||
105 | extern struct semaphore disconnect_sem; | ||
106 | |||
107 | static inline void | 88 | static inline void |
108 | sisusbcon_memsetw(u16 *s, u16 c, unsigned int count) | 89 | sisusbcon_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 | ||
925 | static int | 906 | static 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 | ||
1352 | font_op_error: | 1333 | font_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 | ||
1489 | const struct consw sisusb_dummy_con = { | 1470 | static 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); |