• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500-V1.0.1.40_1.0.68/src/linux/linux-2.6/drivers/usb/misc/sisusbvga/

Lines Matching refs:sisusb

2  * sisusb - usb kernel driver for SiS315(E) based USB2VGA dongles
53 #include "sisusb.h"
78 sisusb_free_buffers(struct sisusb_usb_data *sisusb)
83 if (sisusb->obuf[i]) {
84 usb_buffer_free(sisusb->sisusb_dev, sisusb->obufsize,
85 sisusb->obuf[i], sisusb->transfer_dma_out[i]);
86 sisusb->obuf[i] = NULL;
89 if (sisusb->ibuf) {
90 usb_buffer_free(sisusb->sisusb_dev, sisusb->ibufsize,
91 sisusb->ibuf, sisusb->transfer_dma_in);
92 sisusb->ibuf = NULL;
97 sisusb_free_urbs(struct sisusb_usb_data *sisusb)
102 usb_free_urb(sisusb->sisurbout[i]);
103 sisusb->sisurbout[i] = NULL;
105 usb_free_urb(sisusb->sisurbin);
106 sisusb->sisurbin = NULL;
117 sisusb_all_free(struct sisusb_usb_data *sisusb)
121 for (i = 0; i < sisusb->numobufs; i++) {
123 if (sisusb->urbstatus[i] & SU_URB_BUSY)
133 sisusb_kill_all_busy(struct sisusb_usb_data *sisusb)
137 if (sisusb_all_free(sisusb))
140 for (i = 0; i < sisusb->numobufs; i++) {
142 if (sisusb->urbstatus[i] & SU_URB_BUSY)
143 usb_kill_urb(sisusb->sisurbout[i]);
150 sisusb_wait_all_out_complete(struct sisusb_usb_data *sisusb)
154 wait_event_timeout(sisusb->wait_q,
155 (i = sisusb_all_free(sisusb)),
162 sisusb_outurb_available(struct sisusb_usb_data *sisusb)
166 for (i = 0; i < sisusb->numobufs; i++) {
168 if ((sisusb->urbstatus[i] & (SU_URB_BUSY|SU_URB_ALLOC)) == 0)
177 sisusb_get_free_outbuf(struct sisusb_usb_data *sisusb)
181 wait_event_timeout(sisusb->wait_q,
182 ((i = sisusb_outurb_available(sisusb)) >= 0),
189 sisusb_alloc_outbuf(struct sisusb_usb_data *sisusb)
193 i = sisusb_outurb_available(sisusb);
196 sisusb->urbstatus[i] |= SU_URB_ALLOC;
202 sisusb_free_outbuf(struct sisusb_usb_data *sisusb, int index)
204 if ((index >= 0) && (index < sisusb->numobufs))
205 sisusb->urbstatus[index] &= ~SU_URB_ALLOC;
214 struct sisusb_usb_data *sisusb;
219 sisusb = context->sisusb;
221 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present)
229 sisusb->urbstatus[context->urbindex] &= ~SU_URB_BUSY;
230 wake_up(&sisusb->wait_q);
234 sisusb_bulkout_msg(struct sisusb_usb_data *sisusb, int index, unsigned int pipe, void *data,
238 struct urb *urb = sisusb->sisurbout[index];
244 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
245 sisusb_bulk_completeout, &sisusb->urbout_context[index]);
254 sisusb->urbout_context[index].actual_length = (timeout) ?
258 sisusb->urbstatus[index] |= SU_URB_BUSY;
265 wait_event_timeout(sisusb->wait_q,
266 (!(sisusb->urbstatus[index] & SU_URB_BUSY)),
268 if (sisusb->urbstatus[index] & SU_URB_BUSY) {
292 struct sisusb_usb_data *sisusb = urb->context;
294 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present)
297 sisusb->completein = 1;
298 wake_up(&sisusb->wait_q);
302 sisusb_bulkin_msg(struct sisusb_usb_data *sisusb, unsigned int pipe, void *data, int len,
305 struct urb *urb = sisusb->sisurbin;
310 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
311 sisusb_bulk_completein, sisusb);
319 sisusb->completein = 0;
322 wait_event_timeout(sisusb->wait_q, sisusb->completein, timeout);
323 if (!sisusb->completein) {
348 * buffer "sisusb->obuf[index]" is set up with the data to send.
356 static int sisusb_send_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len,
370 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev)
383 else if (len > sisusb->obufsize)
386 pipe = usb_sndbulkpipe(sisusb->sisusb_dev, ep);
389 passsize = thispass = (sisusb->obufsize < count) ?
390 sisusb->obufsize : count;
393 index = sisusb_get_free_outbuf(sisusb);
398 buffer = sisusb->obuf[index];
417 if (!sisusb->sisusb_dev)
420 result = sisusb_bulkout_msg(sisusb,
428 sisusb->transfer_dma_out[index]);
442 if (sisusb->transfer_dma_out) {
478 sisusb_wait_all_out_complete(sisusb);
496 static int sisusb_recv_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len,
508 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev)
511 pipe = usb_rcvbulkpipe(sisusb->sisusb_dev, ep);
512 buffer = sisusb->ibuf;
513 bufsize = sisusb->ibufsize;
518 if (!(sisusb_wait_all_out_complete(sisusb)))
524 if (!sisusb->sisusb_dev)
529 result = sisusb_bulkin_msg(sisusb,
536 sisusb->transfer_dma_in);
578 static int sisusb_send_packet(struct sisusb_usb_data *sisusb, int len,
589 if (!(sisusb_wait_all_out_complete(sisusb)))
597 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_GFX_OUT, len,
605 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_GFX_IN, 4,
614 static int sisusb_send_bridge_packet(struct sisusb_usb_data *sisusb, int len,
626 if (!(sisusb_wait_all_out_complete(sisusb)))
634 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_BRIDGE_OUT, len,
642 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_BRIDGE_IN, 4,
663 static int sisusb_write_memio_byte(struct sisusb_usb_data *sisusb, int type,
672 ret = sisusb_send_packet(sisusb, 10, &packet);
676 static int sisusb_write_memio_word(struct sisusb_usb_data *sisusb, int type,
688 ret = sisusb_send_packet(sisusb, 10, &packet);
693 ret = sisusb_send_packet(sisusb, 10, &packet);
698 ret = sisusb_send_packet(sisusb, 10, &packet);
703 ret = sisusb_send_packet(sisusb, 10, &packet);
707 ret |= sisusb_send_packet(sisusb, 10, &packet);
713 static int sisusb_write_memio_24bit(struct sisusb_usb_data *sisusb, int type,
725 ret = sisusb_send_packet(sisusb, 10, &packet);
730 ret = sisusb_send_packet(sisusb, 10, &packet);
735 ret = sisusb_send_packet(sisusb, 10, &packet);
739 ret |= sisusb_send_packet(sisusb, 10, &packet);
744 ret = sisusb_send_packet(sisusb, 10, &packet);
748 ret |= sisusb_send_packet(sisusb, 10, &packet);
754 static int sisusb_write_memio_long(struct sisusb_usb_data *sisusb, int type,
766 ret = sisusb_send_packet(sisusb, 10, &packet);
771 ret = sisusb_send_packet(sisusb, 10, &packet);
775 ret |= sisusb_send_packet(sisusb, 10, &packet);
780 ret = sisusb_send_packet(sisusb, 10, &packet);
784 ret |= sisusb_send_packet(sisusb, 10, &packet);
789 ret = sisusb_send_packet(sisusb, 10, &packet);
793 ret |= sisusb_send_packet(sisusb, 10, &packet);
806 * that the data already is in the transfer buffer "sisusb->obuf[index]".
809 static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
826 kernbuffer = sisusb->obuf[index];
843 ret = sisusb_write_memio_byte(sisusb,
859 ret = sisusb_write_memio_word(sisusb,
893 ret = sisusb_write_memio_24bit(sisusb,
910 ret = sisusb_write_memio_long(sisusb,
925 ret = sisusb_send_bridge_packet(sisusb, 10,
930 ret |= sisusb_send_bridge_packet(sisusb, 10,
935 ret |= sisusb_send_bridge_packet(sisusb, 10,
938 ret |= sisusb_send_bulk_msg(sisusb,
945 ret |= sisusb_send_bulk_msg(sisusb,
952 ret |= sisusb_send_bulk_msg(sisusb,
958 (sisusb->obufsize-1));
966 ret = sisusb_send_bridge_packet(sisusb, 10,
971 ret |= sisusb_send_bridge_packet(sisusb, 10,
973 if (sisusb->flagb0 != 0x16) {
977 ret |= sisusb_send_bridge_packet(sisusb, 10,
979 sisusb->flagb0 = 0x16;
982 ret |= sisusb_send_bulk_msg(sisusb,
989 ret |= sisusb_send_bulk_msg(sisusb,
996 ret |= sisusb_send_bulk_msg(sisusb,
1002 (sisusb->obufsize-1));
1011 sisusb->minor, *bytes_written,
1017 sisusb->minor);
1035 static int sisusb_read_memio_byte(struct sisusb_usb_data *sisusb, int type,
1044 ret = sisusb_send_packet(sisusb, 6, &packet);
1049 static int sisusb_read_memio_word(struct sisusb_usb_data *sisusb, int type,
1062 ret = sisusb_send_packet(sisusb, 6, &packet);
1067 ret = sisusb_send_packet(sisusb, 6, &packet);
1072 ret = sisusb_send_packet(sisusb, 6, &packet);
1077 ret = sisusb_send_packet(sisusb, 6, &packet);
1081 ret |= sisusb_send_packet(sisusb, 6, &packet);
1088 static int sisusb_read_memio_24bit(struct sisusb_usb_data *sisusb, int type,
1099 ret = sisusb_send_packet(sisusb, 6, &packet);
1104 ret = sisusb_send_packet(sisusb, 6, &packet);
1109 ret = sisusb_send_packet(sisusb, 6, &packet);
1113 ret |= sisusb_send_packet(sisusb, 6, &packet);
1118 ret = sisusb_send_packet(sisusb, 6, &packet);
1122 ret |= sisusb_send_packet(sisusb, 6, &packet);
1129 static int sisusb_read_memio_long(struct sisusb_usb_data *sisusb, int type,
1140 ret = sisusb_send_packet(sisusb, 6, &packet);
1145 ret = sisusb_send_packet(sisusb, 6, &packet);
1149 ret |= sisusb_send_packet(sisusb, 6, &packet);
1154 ret = sisusb_send_packet(sisusb, 6, &packet);
1158 ret |= sisusb_send_packet(sisusb, 6, &packet);
1163 ret = sisusb_send_packet(sisusb, 6, &packet);
1167 ret |= sisusb_send_packet(sisusb, 6, &packet);
1174 static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
1193 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM,
1209 ret |= sisusb_read_memio_word(sisusb, SISUSB_TYPE_MEM,
1224 ret |= sisusb_read_memio_24bit(sisusb, SISUSB_TYPE_MEM,
1249 ret |= sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM,
1279 sisusb_setreg(struct sisusb_usb_data *sisusb, int port, u8 data)
1281 return sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, data);
1285 sisusb_getreg(struct sisusb_usb_data *sisusb, int port, u8 *data)
1287 return sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port, data);
1292 sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data)
1295 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index);
1296 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data);
1301 sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data)
1304 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index);
1305 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data);
1310 sisusb_setidxregandor(struct sisusb_usb_data *sisusb, int port, u8 idx,
1316 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx);
1317 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp);
1320 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp);
1325 sisusb_setidxregmask(struct sisusb_usb_data *sisusb, int port, u8 idx,
1330 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx);
1331 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp);
1334 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp);
1339 sisusb_setidxregor(struct sisusb_usb_data *sisusb, int port, u8 index, u8 myor)
1341 return(sisusb_setidxregandor(sisusb, port, index, 0xff, myor));
1345 sisusb_setidxregand(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand)
1347 return(sisusb_setidxregandor(sisusb, port, idx, myand, 0x00));
1354 sisusb_writeb(struct sisusb_usb_data *sisusb, u32 adr, u8 data)
1356 return(sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, adr, data));
1360 sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data)
1362 return(sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, adr, data));
1367 sisusb_copy_memory(struct sisusb_usb_data *sisusb, char *src,
1370 return(sisusb_write_mem_bulk(sisusb, dest, src, length, NULL, 0, bytes_written));
1375 sisusb_read_memory(struct sisusb_usb_data *sisusb, char *dest,
1378 return(sisusb_read_mem_bulk(sisusb, src, dest, length, NULL, bytes_written));
1385 sisusb_testreadwrite(struct sisusb_usb_data *sisusb)
1392 sisusb_copy_memory(sisusb, srcbuffer, sisusb->vrambase, 7, &dummy);
1395 printk(KERN_DEBUG "sisusb: rwtest %d bytes\n", i);
1396 sisusb_read_memory(sisusb, destbuffer, sisusb->vrambase, i, &dummy);
1398 printk(KERN_DEBUG "sisusb: rwtest read[%d] = %x\n", j, destbuffer[j]);
1407 sisusb_write_pci_config(struct sisusb_usb_data *sisusb, int regnum, u32 data)
1415 ret = sisusb_send_packet(sisusb, 10, &packet);
1420 sisusb_read_pci_config(struct sisusb_usb_data *sisusb, int regnum, u32 *data)
1427 ret = sisusb_send_packet(sisusb, 6, &packet);
1435 sisusb_clear_vram(struct sisusb_usb_data *sisusb, u32 address, int length)
1440 if (address < sisusb->vrambase)
1443 if (address >= sisusb->vrambase + sisusb->vramsize)
1446 if (address + length > sisusb->vrambase + sisusb->vramsize)
1447 length = sisusb->vrambase + sisusb->vramsize - address;
1453 if ((i = sisusb_alloc_outbuf(sisusb)) < 0)
1456 memset(sisusb->obuf[i], 0, sisusb->obufsize);
1461 ret = sisusb_write_mem_bulk(sisusb, address, NULL, length, NULL, i, &j);
1464 sisusb_free_outbuf(sisusb, i);
1474 #define GETREG(r,d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1475 #define SETREG(r,d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1476 #define SETIREG(r,i,d) sisusb_setidxreg(sisusb, r, i, d)
1477 #define GETIREG(r,i,d) sisusb_getidxreg(sisusb, r, i, d)
1478 #define SETIREGOR(r,i,o) sisusb_setidxregor(sisusb, r, i, o)
1479 #define SETIREGAND(r,i,a) sisusb_setidxregand(sisusb, r, i, a)
1480 #define SETIREGANDOR(r,i,a,o) sisusb_setidxregandor(sisusb, r, i, a, o)
1481 #define READL(a,d) sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1482 #define WRITEL(a,d) sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1483 #define READB(a,d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1484 #define WRITEB(a,d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1487 sisusb_triggersr16(struct sisusb_usb_data *sisusb, u8 ramtype)
1518 sisusb_getbuswidth(struct sisusb_usb_data *sisusb, int *bw, int *chab)
1537 ret |= sisusb_triggersr16(sisusb, ramtype);
1565 ret |= sisusb_triggersr16(sisusb, ramtype);
1601 ret |= sisusb_triggersr16(sisusb, ramtype);
1631 sisusb_verify_mclk(struct sisusb_usb_data *sisusb)
1660 sisusb_set_rank(struct sisusb_usb_data *sisusb, int *iret, int index,
1684 ret |= sisusb_triggersr16(sisusb, 0); /* sic! */
1692 sisusb_check_rbc(struct sisusb_usb_data *sisusb, int *iret, u32 inc, int testn)
1700 ret |= WRITEL(sisusb->vrambase + j, j);
1705 ret |= READL(sisusb->vrambase + j, &tmp);
1715 sisusb_check_ranks(struct sisusb_usb_data *sisusb, int *iret, int rankno,
1728 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2);
1734 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 4);
1739 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2);
1748 sisusb_get_sdram_size(struct sisusb_usb_data *sisusb, int *iret, int bw,
1773 ret |= sisusb_set_rank(sisusb, &i2ret, i, j,
1778 ret |= sisusb_check_ranks(sisusb, &i2ret, j, i,
1791 sisusb_setup_screen(struct sisusb_usb_data *sisusb, int clrall, int drwfr)
1799 address = sisusb->vrambase; /* Clear video ram */
1802 length = sisusb->vramsize;
1806 ret = sisusb_clear_vram(sisusb, address, length);
1810 address = sisusb->vrambase + (i * bpp);
1811 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1814 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1818 address = sisusb->vrambase + ((i * modex) * bpp);
1819 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1822 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1831 sisusb_set_default_mode(struct sisusb_usb_data *sisusb, int touchengines)
1963 sisusb_init_gfxcore(struct sisusb_usb_data *sisusb)
2083 ret |= sisusb_read_pci_config(sisusb, 0x50, &tmp32);
2099 ret |= sisusb_set_default_mode(sisusb, 0);
2105 ret |= sisusb_triggersr16(sisusb, ramtype);
2111 ret |= sisusb_getbuswidth(sisusb, &bw, &chab);
2112 ret |= sisusb_verify_mclk(sisusb);
2115 ret |= sisusb_get_sdram_size(sisusb, &iret, bw, chab);
2120 sisusb->minor);
2127 sisusb->minor);
2160 sisusb_get_ramconfig(struct sisusb_usb_data *sisusb)
2171 sisusb_getidxreg(sisusb, SISSR, 0x14, &tmp8);
2172 sisusb_getidxreg(sisusb, SISSR, 0x15, &tmp82);
2173 sisusb_getidxreg(sisusb, SISSR, 0x3a, &ramtype);
2174 sisusb->vramsize = (1 << ((tmp8 & 0xf0) >> 4)) * 1024 * 1024;
2185 sisusb->vramsize <<= 1;
2189 sisusb->vramsize += sisusb->vramsize/2;
2193 sisusb->vramsize <<= 1;
2199 sisusb->minor, (sisusb->vramsize >> 20), ramtypetext1,
2204 sisusb_do_init_gfxdevice(struct sisusb_usb_data *sisusb)
2214 ret = sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2219 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2224 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2229 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2233 ret |= sisusb_send_bridge_packet(sisusb, 6, &packet, 0);
2235 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2238 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2239 ret |= sisusb_write_pci_config(sisusb, 0x10, 0xfffffff0);
2240 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2243 ret |= sisusb_write_pci_config(sisusb, 0x10, tmp32);
2246 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2247 ret |= sisusb_write_pci_config(sisusb, 0x14, 0xfffffff0);
2248 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2251 ret |= sisusb_write_pci_config(sisusb, 0x14, tmp32);
2254 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2255 ret |= sisusb_write_pci_config(sisusb, 0x18, 0xfffffff0);
2256 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2259 ret |= sisusb_write_pci_config(sisusb, 0x18, tmp32);
2262 ret |= sisusb_read_pci_config(sisusb, 0x04, &tmp32);
2264 ret |= sisusb_write_pci_config(sisusb, 0x04, tmp32);
2271 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2283 sisusb_init_gfxdevice(struct sisusb_usb_data *sisusb, int initscreen)
2288 if (sisusb->devinit == 1) {
2290 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2294 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2298 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2304 if ((sisusb->devinit == 0) || (test != 3)) {
2306 ret |= sisusb_do_init_gfxdevice(sisusb);
2309 sisusb->devinit = 1;
2313 if (sisusb->devinit) {
2315 if (sisusb_init_gfxcore(sisusb) == 0) {
2316 sisusb->gfxinit = 1;
2317 sisusb_get_ramconfig(sisusb);
2318 ret |= sisusb_set_default_mode(sisusb, 1);
2319 ret |= sisusb_setup_screen(sisusb, 1, initscreen);
2336 sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init)
2338 int ret = 0, slot = sisusb->font_slot, i;
2346 /* sisusb->lock is down */
2348 if (!sisusb->SiS_Pr)
2351 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30;
2352 sisusb->SiS_Pr->sisusb = (void *)sisusb;
2355 SiSUSBSetMode(sisusb->SiS_Pr, 0x03);
2367 ret = sisusbcon_do_font_op(sisusb, 1, 0, tempbuf, 8192, 0, 1, NULL, 16, 0);
2372 if (sisusb->font_backup) {
2373 ret |= sisusbcon_do_font_op(sisusb, 1, 2, sisusb->font_backup,
2374 8192, sisusb->font_backup_512, 1, NULL,
2375 sisusb->font_backup_height, 0);
2377 sisusbcon_do_font_op(sisusb, 1, 0, NULL, 0, 0, 1,
2381 if (init && !sisusb->scrbuf) {
2403 ret |= sisusb_copy_memory(sisusb, tempbuf,
2404 sisusb->vrambase, 8192, &written);
2410 } else if (sisusb->scrbuf) {
2412 ret |= sisusb_copy_memory(sisusb, (char *)sisusb->scrbuf,
2413 sisusb->vrambase, sisusb->scrbuf_size, &written);
2417 if (sisusb->sisusb_cursor_size_from >= 0 &&
2418 sisusb->sisusb_cursor_size_to >= 0) {
2419 sisusb_setidxreg(sisusb, SISCR, 0x0a,
2420 sisusb->sisusb_cursor_size_from);
2421 sisusb_setidxregandor(sisusb, SISCR, 0x0b, 0xe0,
2422 sisusb->sisusb_cursor_size_to);
2424 sisusb_setidxreg(sisusb, SISCR, 0x0a, 0x2d);
2425 sisusb_setidxreg(sisusb, SISCR, 0x0b, 0x0e);
2426 sisusb->sisusb_cursor_size_to = -1;
2429 slot = sisusb->sisusb_cursor_loc;
2432 sisusb->sisusb_cursor_loc = -1;
2433 sisusb->bad_cursor_pos = 1;
2435 sisusb_set_cursor(sisusb, slot);
2437 sisusb_setidxreg(sisusb, SISCR, 0x0c, (sisusb->cur_start_addr >> 8));
2438 sisusb_setidxreg(sisusb, SISCR, 0x0d, (sisusb->cur_start_addr & 0xff));
2440 sisusb->textmodedestroyed = 0;
2442 /* sisusb->lock is down */
2454 struct sisusb_usb_data *sisusb;
2461 printk(KERN_ERR "sisusb[%d]: Failed to find interface\n",
2467 if (!(sisusb = usb_get_intfdata(interface))) {
2472 mutex_lock(&sisusb->lock);
2474 if (!sisusb->present || !sisusb->ready) {
2475 mutex_unlock(&sisusb->lock);
2480 if (sisusb->isopen) {
2481 mutex_unlock(&sisusb->lock);
2486 if (!sisusb->devinit) {
2487 if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH) {
2488 if (sisusb_init_gfxdevice(sisusb, 0)) {
2489 mutex_unlock(&sisusb->lock);
2494 sisusb->minor);
2498 mutex_unlock(&sisusb->lock);
2503 sisusb->minor);
2508 /* Increment usage count for our sisusb */
2509 kref_get(&sisusb->kref);
2511 sisusb->isopen = 1;
2513 file->private_data = sisusb;
2515 mutex_unlock(&sisusb->lock);
2525 struct sisusb_usb_data *sisusb = to_sisusb_dev(kref);
2527 if (!sisusb)
2530 if (sisusb->sisusb_dev)
2531 usb_put_dev(sisusb->sisusb_dev);
2533 sisusb->sisusb_dev = NULL;
2534 sisusb_free_buffers(sisusb);
2535 sisusb_free_urbs(sisusb);
2537 kfree(sisusb->SiS_Pr);
2539 kfree(sisusb);
2545 struct sisusb_usb_data *sisusb;
2550 if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) {
2555 mutex_lock(&sisusb->lock);
2557 if (sisusb->present) {
2559 if (!sisusb_wait_all_out_complete(sisusb))
2560 sisusb_kill_all_busy(sisusb);
2563 myminor = sisusb->minor;
2565 sisusb->isopen = 0;
2568 mutex_unlock(&sisusb->lock);
2571 kref_put(&sisusb->kref, sisusb_delete);
2581 struct sisusb_usb_data *sisusb;
2588 if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
2591 mutex_lock(&sisusb->lock);
2594 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2595 mutex_unlock(&sisusb->lock);
2614 if (sisusb_read_memio_byte(sisusb,
2626 if (sisusb_read_memio_word(sisusb,
2638 if (sisusb_read_memio_long(sisusb,
2655 (*ppos) < SISUSB_PCI_PSEUDO_MEMBASE + sisusb->vramsize) {
2664 errno = sisusb_read_mem_bulk(sisusb, address,
2680 errno = sisusb_read_mem_bulk(sisusb, address,
2690 mutex_unlock(&sisusb->lock);
2699 if (sisusb_read_pci_config(sisusb, address, &buf32))
2714 mutex_unlock(&sisusb->lock);
2723 struct sisusb_usb_data *sisusb;
2730 if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
2733 mutex_lock(&sisusb->lock);
2736 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2737 mutex_unlock(&sisusb->lock);
2758 else if (sisusb_write_memio_byte(sisusb,
2770 else if (sisusb_write_memio_word(sisusb,
2782 else if (sisusb_write_memio_long(sisusb,
2796 (*ppos) < SISUSB_PCI_PSEUDO_MEMBASE + sisusb->vramsize) {
2808 errno = sisusb_write_mem_bulk(sisusb, address, NULL,
2826 errno = sisusb_write_mem_bulk(sisusb, address, NULL,
2836 mutex_unlock(&sisusb->lock);
2847 else if (sisusb_write_pci_config(sisusb, address, buf32))
2862 mutex_unlock(&sisusb->lock);
2870 struct sisusb_usb_data *sisusb;
2873 if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
2876 mutex_lock(&sisusb->lock);
2879 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2880 mutex_unlock(&sisusb->lock);
2900 mutex_unlock(&sisusb->lock);
2905 sisusb_handle_command(struct sisusb_usb_data *sisusb, struct sisusb_command *y,
2914 if (!sisusb->devinit)
2923 retval = sisusb_getidxreg(sisusb, port,
2933 retval = sisusb_setidxreg(sisusb, port,
2938 retval = sisusb_setidxregor(sisusb, port,
2943 retval = sisusb_setidxregand(sisusb, port,
2948 retval = sisusb_setidxregandor(sisusb, port,
2953 retval = sisusb_setidxregmask(sisusb, port,
2959 if (!sisusb->gfxinit)
2966 retval = sisusb_clear_vram(sisusb, address, length);
2973 if (!sisusb->gfxinit || !sisusb->SiS_Pr)
2978 retval = sisusb_reset_text_mode(sisusb, 0);
2981 sisusb->textmodedestroyed = 1;
2990 if (!sisusb->gfxinit || !sisusb->SiS_Pr)
2995 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30;
2996 sisusb->SiS_Pr->sisusb = (void *)sisusb;
2998 if (SiSUSBSetMode(sisusb->SiS_Pr, y->data3))
3005 if (!sisusb->gfxinit || !sisusb->SiS_Pr)
3010 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30;
3011 sisusb->SiS_Pr->sisusb = (void *)sisusb;
3013 if (SiSUSBSetVESAMode(sisusb->SiS_Pr, y->data3))
3033 struct sisusb_usb_data *sisusb;
3039 if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
3042 mutex_lock(&sisusb->lock);
3045 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
3065 x.sisusb_gfxinit = sisusb->gfxinit;
3070 x.sisusb_vramsize = sisusb->vramsize;
3071 x.sisusb_minor = sisusb->minor;
3074 x.sisusb_conactive = sisusb->haveconsole ? 1 : 0;
3089 retval = sisusb_handle_command(sisusb, &y, arg);
3099 mutex_unlock(&sisusb->lock);
3147 struct sisusb_usb_data *sisusb;
3153 printk(KERN_INFO "sisusb: USB2VGA dongle found at address %d\n",
3157 if (!(sisusb = kzalloc(sizeof(*sisusb), GFP_KERNEL))) {
3159 "sisusb: Failed to allocate memory for private data\n");
3162 kref_init(&sisusb->kref);
3164 mutex_init(&(sisusb->lock));
3169 "sisusb: Failed to get a minor for device %d\n",
3175 sisusb->sisusb_dev = dev;
3176 sisusb->minor = intf->minor;
3177 sisusb->vrambase = SISUSB_PCI_MEMBASE;
3178 sisusb->mmiobase = SISUSB_PCI_MMIOBASE;
3179 sisusb->mmiosize = SISUSB_PCI_MMIOSIZE;
3180 sisusb->ioportbase = SISUSB_PCI_IOPORTBASE;
3184 sisusb->ibufsize = SISUSB_IBUF_SIZE;
3185 if (!(sisusb->ibuf = usb_buffer_alloc(dev, SISUSB_IBUF_SIZE,
3186 GFP_KERNEL, &sisusb->transfer_dma_in))) {
3187 printk(memfail, "input", sisusb->minor);
3192 sisusb->numobufs = 0;
3193 sisusb->obufsize = SISUSB_OBUF_SIZE;
3195 if (!(sisusb->obuf[i] = usb_buffer_alloc(dev, SISUSB_OBUF_SIZE,
3197 &sisusb->transfer_dma_out[i]))) {
3199 printk(memfail, "output", sisusb->minor);
3205 sisusb->numobufs++;
3210 if (!(sisusb->sisurbin = usb_alloc_urb(0, GFP_KERNEL))) {
3213 sisusb->minor);
3217 sisusb->completein = 1;
3219 for (i = 0; i < sisusb->numobufs; i++) {
3220 if (!(sisusb->sisurbout[i] = usb_alloc_urb(0, GFP_KERNEL))) {
3223 sisusb->minor);
3227 sisusb->urbout_context[i].sisusb = (void *)sisusb;
3228 sisusb->urbout_context[i].urbindex = i;
3229 sisusb->urbstatus[i] = 0;
3233 sisusb->minor, sisusb->numobufs);
3237 if (!(sisusb->SiS_Pr = kmalloc(sizeof(struct SiS_Private), GFP_KERNEL))) {
3240 sisusb->minor);
3246 init_waitqueue_head(&sisusb->wait_q);
3248 usb_set_intfdata(intf, sisusb);
3250 usb_get_dev(sisusb->sisusb_dev);
3252 sisusb->present = 1;
3265 sisusb->minor);
3267 sisusb->ioctl32registered = 1;
3280 if (sisusb_init_gfxdevice(sisusb, initscreen))
3284 sisusb->minor);
3290 sisusb->minor);
3292 sisusb->ready = 1;
3295 printk(KERN_DEBUG "sisusb: *** RWTEST ***\n");
3296 sisusb_testreadwrite(sisusb);
3297 printk(KERN_DEBUG "sisusb: *** RWTEST END ***\n");
3301 sisusb_console_init(sisusb, sisusb_first_vc, sisusb_last_vc);
3307 sisusb_free_urbs(sisusb);
3309 sisusb_free_buffers(sisusb);
3313 kfree(sisusb);
3319 struct sisusb_usb_data *sisusb;
3323 if (!(sisusb = usb_get_intfdata(intf)))
3327 sisusb_console_exit(sisusb);
3337 mutex_lock(&sisusb->lock);
3340 if (!sisusb_wait_all_out_complete(sisusb))
3341 sisusb_kill_all_busy(sisusb);
3343 minor = sisusb->minor;
3350 if (sisusb->ioctl32registered) {
3352 sisusb->ioctl32registered = 0;
3365 sisusb->present = 0;
3366 sisusb->ready = 0;
3368 mutex_unlock(&sisusb->lock);
3371 kref_put(&sisusb->kref, sisusb_delete);
3390 .name = "sisusb",
3406 printk(KERN_INFO "sisusb: Driver version %d.%d.%d\n",
3409 "sisusb: Copyright (C) 2005 Thomas Winischhofer\n");