Lines Matching refs:sisusb
3 * sisusb - usb kernel driver for SiS315(E) based USB2VGA dongles
70 #include "sisusb.h"
73 /* vc_data -> sisusb conversion table */
86 sisusb_initialize(struct sisusb_usb_data *sisusb)
89 if (sisusb_setidxreg(sisusb, SISCR, 0x0c, 0x00))
91 if (sisusb_setidxreg(sisusb, SISCR, 0x0d, 0x00))
93 if (sisusb_setidxreg(sisusb, SISCR, 0x0e, 0x00))
95 sisusb_setidxreg(sisusb, SISCR, 0x0f, 0x00);
99 sisusbcon_set_start_address(struct sisusb_usb_data *sisusb, struct vc_data *c)
101 sisusb->cur_start_addr = (c->vc_visible_origin - sisusb->scrbuf) / 2;
103 sisusb_setidxreg(sisusb, SISCR, 0x0c, (sisusb->cur_start_addr >> 8));
104 sisusb_setidxreg(sisusb, SISCR, 0x0d, (sisusb->cur_start_addr & 0xff));
108 sisusb_set_cursor(struct sisusb_usb_data *sisusb, unsigned int location)
110 if (sisusb->sisusb_cursor_loc == location)
113 sisusb->sisusb_cursor_loc = location;
121 sisusb->bad_cursor_pos = 1;
123 if (sisusb_setidxregandor(sisusb, SISCR, 0x0b, 0x1f, 0x20))
125 } else if (sisusb->bad_cursor_pos) {
126 if (sisusb_setidxregand(sisusb, SISCR, 0x0b, 0x1f))
128 sisusb->bad_cursor_pos = 0;
131 if (sisusb_setidxreg(sisusb, SISCR, 0x0e, (location >> 8)))
133 sisusb_setidxreg(sisusb, SISCR, 0x0f, (location & 0xff));
143 sisusb_sisusb_valid(struct sisusb_usb_data *sisusb)
145 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev)
154 struct sisusb_usb_data *sisusb;
164 sisusb = sisusb_get_sisusb(console);
165 if (!sisusb)
168 mutex_lock(&sisusb->lock);
170 if (!sisusb_sisusb_valid(sisusb) ||
171 !sisusb->havethisconsole[console]) {
172 mutex_unlock(&sisusb->lock);
176 return sisusb;
180 sisusb_is_inactive(struct vc_data *c, struct sisusb_usb_data *sisusb)
182 if (sisusb->is_gfx ||
183 sisusb->textmodedestroyed ||
201 struct sisusb_usb_data *sisusb;
210 sisusb = sisusb_get_sisusb(c->vc_num);
211 if (!sisusb)
214 mutex_lock(&sisusb->lock);
216 if (!sisusb_sisusb_valid(sisusb)) {
217 mutex_unlock(&sisusb->lock);
225 c->vc_hi_font_mask = sisusb->current_font_512 ? 0x0800 : 0;
227 sisusb->haveconsole = 1;
229 sisusb->havethisconsole[c->vc_num] = 1;
234 c->vc_font.height = sisusb->current_font_height;
240 /* Increment usage count for our sisusb.
243 * lose our sisusb until this is undone
246 * use sisusb->lock and do a quick check
247 * of sisusb for device disconnection.
249 kref_get(&sisusb->kref);
254 mutex_unlock(&sisusb->lock);
267 struct sisusb_usb_data *sisusb;
274 sisusb = sisusb_get_sisusb(c->vc_num);
275 if (!sisusb)
278 mutex_lock(&sisusb->lock);
283 sisusb->havethisconsole[c->vc_num] = 0;
286 if (sisusb->font_backup) {
288 if (sisusb->havethisconsole[c->vc_num])
292 vfree(sisusb->font_backup);
293 sisusb->font_backup = NULL;
297 mutex_unlock(&sisusb->lock);
299 /* decrement the usage count on our sisusb */
300 kref_put(&sisusb->kref, sisusb_delete);
349 static inline void *sisusb_vaddr(const struct sisusb_usb_data *sisusb,
352 return (u16 *)c->vc_origin + y * sisusb->sisusb_num_columns + x;
355 static inline unsigned long sisusb_haddr(const struct sisusb_usb_data *sisusb,
358 unsigned long offset = c->vc_origin - sisusb->scrbuf;
361 offset += 2 * (y * sisusb->sisusb_num_columns + x);
363 return sisusb->vrambase + offset;
370 struct sisusb_usb_data *sisusb;
372 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
373 if (!sisusb)
376 /* sisusb->lock is down */
377 if (sisusb_is_inactive(c, sisusb)) {
378 mutex_unlock(&sisusb->lock);
382 sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, x, y),
383 sisusb_haddr(sisusb, c, x, y), 2);
385 mutex_unlock(&sisusb->lock);
393 struct sisusb_usb_data *sisusb;
395 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
396 if (!sisusb)
399 /* sisusb->lock is down */
405 memcpy(sisusb_vaddr(sisusb, c, x, y), s, count * 2);
407 if (sisusb_is_inactive(c, sisusb)) {
408 mutex_unlock(&sisusb->lock);
412 sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, x, y),
413 sisusb_haddr(sisusb, c, x, y), count * 2);
415 mutex_unlock(&sisusb->lock);
422 struct sisusb_usb_data *sisusb;
430 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
431 if (!sisusb)
434 /* sisusb->lock is down */
440 dest = sisusb_vaddr(sisusb, c, x, y);
442 cols = sisusb->sisusb_num_columns;
458 if (sisusb_is_inactive(c, sisusb)) {
459 mutex_unlock(&sisusb->lock);
466 sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, x, y),
467 sisusb_haddr(sisusb, c, x, y), length);
469 mutex_unlock(&sisusb->lock);
476 struct sisusb_usb_data *sisusb;
484 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
485 if (!sisusb)
488 /* sisusb->lock is down */
491 if (sisusb_is_inactive(c, sisusb)) {
492 mutex_unlock(&sisusb->lock);
501 mutex_unlock(&sisusb->lock);
502 dev_dbg(&sisusb->sisusb_dev->dev, "ASSERT ORIGIN != SCREENBUF!\n");
508 (int)(sisusb->scrbuf + sisusb->scrbuf_size - c->vc_origin));
513 sisusb_copy_memory(sisusb, (u8 *)c->vc_origin,
514 sisusb_haddr(sisusb, c, 0, 0), length);
516 mutex_unlock(&sisusb->lock);
525 struct sisusb_usb_data *sisusb;
532 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
533 if (!sisusb)
536 /* sisusb->lock is down */
538 if (sisusb_is_inactive(c, sisusb)) {
539 mutex_unlock(&sisusb->lock);
545 (int)(sisusb->scrbuf + sisusb->scrbuf_size - c->vc_origin));
550 mutex_unlock(&sisusb->lock);
557 struct sisusb_usb_data *sisusb;
565 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
566 if (!sisusb)
569 /* sisusb->lock is down */
571 if (sisusb_is_inactive(c, sisusb)) {
572 mutex_unlock(&sisusb->lock);
577 if (sisusb_setreg(sisusb, SISCOLIDX, table[i]))
579 if (sisusb_setreg(sisusb, SISCOLDATA, c->vc_palette[j++] >> 2))
581 if (sisusb_setreg(sisusb, SISCOLDATA, c->vc_palette[j++] >> 2))
583 if (sisusb_setreg(sisusb, SISCOLDATA, c->vc_palette[j++] >> 2))
587 mutex_unlock(&sisusb->lock);
594 struct sisusb_usb_data *sisusb;
598 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
599 if (!sisusb)
602 /* sisusb->lock is down */
605 sisusb->is_gfx = blank ? 1 : 0;
607 if (sisusb_is_inactive(c, sisusb)) {
608 mutex_unlock(&sisusb->lock);
619 sisusb_copy_memory(sisusb, (u8 *)c->vc_origin,
620 sisusb_haddr(sisusb, c, 0, 0),
622 sisusb->con_blanked = 1;
634 sisusb->con_blanked = 0;
655 mutex_unlock(&sisusb->lock);
659 sisusb_setidxregandor(sisusb, SISSR, 0x01, ~0x20, sr1);
660 sisusb_setidxregandor(sisusb, SISCR, 0x17, 0x7f, cr17);
661 sisusb_setidxregandor(sisusb, SISSR, 0x1f, 0x3f, pmreg);
662 sisusb_setidxregandor(sisusb, SISCR, 0x63, 0xbf, cr63);
666 mutex_unlock(&sisusb->lock);
675 struct sisusb_usb_data *sisusb;
677 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
678 if (!sisusb)
681 /* sisusb->lock is down */
683 if (sisusb_is_inactive(c, sisusb)) {
684 mutex_unlock(&sisusb->lock);
688 vc_scrolldelta_helper(c, lines, sisusb->con_rolled_over,
689 (void *)sisusb->scrbuf, sisusb->scrbuf_size);
691 sisusbcon_set_start_address(sisusb, c);
693 mutex_unlock(&sisusb->lock);
700 struct sisusb_usb_data *sisusb;
703 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
704 if (!sisusb)
707 /* sisusb->lock is down */
709 if (sisusb_is_inactive(c, sisusb)) {
710 mutex_unlock(&sisusb->lock);
716 sisusbcon_set_start_address(sisusb, c);
720 sisusb_setidxregor(sisusb, SISCR, 0x0a, 0x20);
721 sisusb->sisusb_cursor_size_to = -1;
722 mutex_unlock(&sisusb->lock);
726 sisusb_set_cursor(sisusb, (c->vc_pos - sisusb->scrbuf) / 2);
752 if (sisusb->sisusb_cursor_size_from != from ||
753 sisusb->sisusb_cursor_size_to != to) {
755 sisusb_setidxreg(sisusb, SISCR, 0x0a, from);
756 sisusb_setidxregandor(sisusb, SISCR, 0x0b, 0xe0, to);
758 sisusb->sisusb_cursor_size_from = from;
759 sisusb->sisusb_cursor_size_to = to;
762 mutex_unlock(&sisusb->lock);
766 sisusbcon_scroll_area(struct vc_data *c, struct sisusb_usb_data *sisusb,
770 int cols = sisusb->sisusb_num_columns;
774 /* sisusb->lock is down */
785 memmove(sisusb_vaddr(sisusb, c, 0, t),
786 sisusb_vaddr(sisusb, c, 0, t + lines),
788 sisusbcon_memsetw(sisusb_vaddr(sisusb, c, 0, b - lines),
793 memmove(sisusb_vaddr(sisusb, c, 0, t + lines),
794 sisusb_vaddr(sisusb, c, 0, t),
796 sisusbcon_memsetw(sisusb_vaddr(sisusb, c, 0, t), eattr,
801 sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, 0, t),
802 sisusb_haddr(sisusb, c, 0, t), length);
804 mutex_unlock(&sisusb->lock);
814 struct sisusb_usb_data *sisusb;
830 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
831 if (!sisusb)
834 /* sisusb->lock is down */
836 if (sisusb_is_inactive(c, sisusb)) {
837 mutex_unlock(&sisusb->lock);
843 return sisusbcon_scroll_area(c, sisusb, t, b, dir, lines);
847 sisusbcon_set_start_address(sisusb, c);
861 sisusb->scrbuf + sisusb->scrbuf_size) {
862 memcpy((u16 *)sisusb->scrbuf,
865 c->vc_origin = sisusb->scrbuf;
866 sisusb->con_rolled_over = oldorigin - sisusb->scrbuf;
879 if (oldorigin - delta < sisusb->scrbuf) {
880 memmove((void *)sisusb->scrbuf + sisusb->scrbuf_size -
884 c->vc_origin = sisusb->scrbuf +
885 sisusb->scrbuf_size -
887 sisusb->con_rolled_over = 0;
900 sisusb_copy_memory(sisusb,
902 sisusb_haddr(sisusb, c, 0, 0),
905 sisusb_copy_memory(sisusb,
907 sisusb_haddr(sisusb, c, 0, 0) +
911 sisusb_copy_memory(sisusb,
913 sisusb_haddr(sisusb, c, 0, 0),
919 sisusbcon_set_start_address(sisusb, c);
923 mutex_unlock(&sisusb->lock);
932 struct sisusb_usb_data *sisusb;
939 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
940 if (!sisusb)
943 /* sisusb->lock is down */
945 if (sisusb_is_inactive(c, sisusb) || sisusb->con_blanked) {
946 mutex_unlock(&sisusb->lock);
950 c->vc_origin = c->vc_visible_origin = sisusb->scrbuf;
952 sisusbcon_set_start_address(sisusb, c);
954 sisusb->con_rolled_over = 0;
956 mutex_unlock(&sisusb->lock);
966 struct sisusb_usb_data *sisusb;
969 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
970 if (!sisusb)
973 fh = sisusb->current_font_height;
975 mutex_unlock(&sisusb->lock);
991 sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot,
999 /* sisusb->lock is down */
1009 mutex_unlock(&sisusb->lock);
1014 sisusb->font_slot = slot;
1024 err |= sisusb_setidxreg(sisusb, SISSR, 0x00, 0x01); /* Reset */
1025 err |= sisusb_setidxreg(sisusb, SISSR, 0x02, 0x04); /* Write to plane 2 */
1026 err |= sisusb_setidxreg(sisusb, SISSR, 0x04, 0x07); /* Memory mode a0-bf */
1027 err |= sisusb_setidxreg(sisusb, SISSR, 0x00, 0x03); /* Reset */
1032 err |= sisusb_setidxreg(sisusb, SISGR, 0x04, 0x03); /* Select plane read 2 */
1033 err |= sisusb_setidxreg(sisusb, SISGR, 0x05, 0x00); /* Disable odd/even */
1034 err |= sisusb_setidxreg(sisusb, SISGR, 0x06, 0x00); /* Address range a0-bf */
1042 err |= sisusb_writeb(sisusb,
1043 sisusb->vrambase + offset + i,
1050 err |= sisusb_readb(sisusb,
1051 sisusb->vrambase + offset + i,
1065 err |= sisusb_writeb(sisusb,
1066 sisusb->vrambase + offset +
1074 err |= sisusb_readb(sisusb,
1075 sisusb->vrambase + offset +
1087 err |= sisusb_setidxreg(sisusb, SISSR, 0x00, 0x01); /* Reset */
1088 err |= sisusb_setidxreg(sisusb, SISSR, 0x02, 0x03); /* Write to planes 0+1 */
1089 err |= sisusb_setidxreg(sisusb, SISSR, 0x04, 0x03); /* Memory mode a0-bf */
1091 sisusb_setidxreg(sisusb, SISSR, 0x03, font_select);
1092 err |= sisusb_setidxreg(sisusb, SISSR, 0x00, 0x03); /* Reset end */
1097 err |= sisusb_setidxreg(sisusb, SISGR, 0x04, 0x00); /* Select plane read 0 */
1098 err |= sisusb_setidxreg(sisusb, SISGR, 0x05, 0x10); /* Enable odd/even */
1099 err |= sisusb_setidxreg(sisusb, SISGR, 0x06, 0x06); /* Address range b8-bf */
1104 if ((set) && (ch512 != sisusb->current_font_512)) {
1115 sisusb->current_font_512 = ch512;
1120 sisusb_getreg(sisusb, SISINPSTAT, &dummy);
1121 sisusb_setreg(sisusb, SISAR, 0x12);
1122 sisusb_setreg(sisusb, SISAR, ch512 ? 0x07 : 0x0f);
1124 sisusb_getreg(sisusb, SISINPSTAT, &dummy);
1125 sisusb_setreg(sisusb, SISAR, 0x20);
1126 sisusb_getreg(sisusb, SISINPSTAT, &dummy);
1145 /*printk(KERN_DEBUG "sisusb recalc rows %d maxscan %d fh %d sl %d\n",
1148 sisusb_getidxreg(sisusb, SISCR, 0x07, &ovr);
1153 sisusb_setidxreg(sisusb, SISCR, 0x07, ovr);
1154 sisusb_setidxreg(sisusb, SISCR, 0x12, vde);
1158 sisusb_getidxreg(sisusb, SISCR, 0x09, &fsr);
1160 sisusb_setidxreg(sisusb, SISCR, 0x09, fsr);
1161 sisusb->current_font_height = fh;
1163 sisusb->sisusb_cursor_size_from = -1;
1164 sisusb->sisusb_cursor_size_to = -1;
1169 mutex_unlock(&sisusb->lock);
1193 mutex_unlock(&sisusb->lock);
1203 struct sisusb_usb_data *sisusb;
1209 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
1210 if (!sisusb)
1213 /* sisusb->lock is down */
1219 if (sisusb->font_backup) {
1220 if (sisusb->font_backup_size < charcount) {
1221 vfree(sisusb->font_backup);
1222 sisusb->font_backup = NULL;
1226 if (!sisusb->font_backup)
1227 sisusb->font_backup = vmalloc(array_size(charcount, 32));
1229 if (sisusb->font_backup) {
1230 memcpy(sisusb->font_backup, font->data, array_size(charcount, 32));
1231 sisusb->font_backup_size = charcount;
1232 sisusb->font_backup_height = font->height;
1233 sisusb->font_backup_512 = (charcount == 512) ? 1 : 0;
1236 /* do_font_op ups sisusb->lock */
1238 return sisusbcon_do_font_op(sisusb, 1, 2, font->data,
1248 struct sisusb_usb_data *sisusb;
1250 sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
1251 if (!sisusb)
1254 /* sisusb->lock is down */
1261 mutex_unlock(&sisusb->lock);
1265 if (!sisusb->font_backup) {
1266 mutex_unlock(&sisusb->lock);
1271 memcpy(font->data, sisusb->font_backup, 256 * 32);
1273 mutex_unlock(&sisusb->lock);
1279 * The console `switch' structure for the sisusb console
1384 sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last)
1388 mutex_lock(&sisusb->lock);
1391 if (sisusb->haveconsole || !sisusb->SiS_Pr) {
1392 mutex_unlock(&sisusb->lock);
1396 sisusb->con_first = first;
1397 sisusb->con_last = last;
1402 mutex_unlock(&sisusb->lock);
1407 if (!sisusb->gfxinit || first < 1 || last < 1) {
1408 mutex_unlock(&sisusb->lock);
1412 sisusb->sisusb_cursor_loc = -1;
1413 sisusb->sisusb_cursor_size_from = -1;
1414 sisusb->sisusb_cursor_size_to = -1;
1417 if (sisusb_reset_text_mode(sisusb, 1)) {
1418 mutex_unlock(&sisusb->lock);
1419 dev_err(&sisusb->sisusb_dev->dev, "Failed to set up text mode\n");
1424 sisusb_initialize(sisusb);
1427 /* Save sisusb for our interface routines */
1428 mysisusbs[i] = sisusb;
1432 sisusb->sisusb_num_columns = 80;
1435 sisusb->scrbuf_size = 32 * 1024;
1438 if (!(sisusb->scrbuf = (unsigned long)vmalloc(sisusb->scrbuf_size))) {
1439 mutex_unlock(&sisusb->lock);
1440 dev_err(&sisusb->sisusb_dev->dev, "Failed to allocate screen buffer\n");
1444 mutex_unlock(&sisusb->lock);
1451 sisusb->haveconsole = 1;
1461 sisusb_console_exit(struct sisusb_usb_data *sisusb)
1468 * can't lose our sisusb any other way but by
1491 if (sisusb->haveconsole) {
1493 if (sisusb->havethisconsole[i]) {
1501 sisusb->haveconsole = 0;
1504 vfree((void *)sisusb->scrbuf);
1505 sisusb->scrbuf = 0;
1507 vfree(sisusb->font_backup);
1508 sisusb->font_backup = NULL;