Lines Matching refs:sisusb
3 * sisusb - usb kernel driver for SiS315(E) based USB2VGA dongles
53 #include "sisusb.h"
75 static void sisusb_free_buffers(struct sisusb_usb_data *sisusb)
80 kfree(sisusb->obuf[i]);
81 sisusb->obuf[i] = NULL;
83 kfree(sisusb->ibuf);
84 sisusb->ibuf = NULL;
87 static void sisusb_free_urbs(struct sisusb_usb_data *sisusb)
92 usb_free_urb(sisusb->sisurbout[i]);
93 sisusb->sisurbout[i] = NULL;
95 usb_free_urb(sisusb->sisurbin);
96 sisusb->sisurbin = NULL;
106 static int sisusb_all_free(struct sisusb_usb_data *sisusb)
110 for (i = 0; i < sisusb->numobufs; i++) {
112 if (sisusb->urbstatus[i] & SU_URB_BUSY)
121 static void sisusb_kill_all_busy(struct sisusb_usb_data *sisusb)
125 if (sisusb_all_free(sisusb))
128 for (i = 0; i < sisusb->numobufs; i++) {
130 if (sisusb->urbstatus[i] & SU_URB_BUSY)
131 usb_kill_urb(sisusb->sisurbout[i]);
137 static int sisusb_wait_all_out_complete(struct sisusb_usb_data *sisusb)
141 wait_event_timeout(sisusb->wait_q, (i = sisusb_all_free(sisusb)),
147 static int sisusb_outurb_available(struct sisusb_usb_data *sisusb)
151 for (i = 0; i < sisusb->numobufs; i++) {
153 if ((sisusb->urbstatus[i] & (SU_URB_BUSY|SU_URB_ALLOC)) == 0)
161 static int sisusb_get_free_outbuf(struct sisusb_usb_data *sisusb)
165 wait_event_timeout(sisusb->wait_q,
166 ((i = sisusb_outurb_available(sisusb)) >= 0), timeout);
171 static int sisusb_alloc_outbuf(struct sisusb_usb_data *sisusb)
175 i = sisusb_outurb_available(sisusb);
178 sisusb->urbstatus[i] |= SU_URB_ALLOC;
183 static void sisusb_free_outbuf(struct sisusb_usb_data *sisusb, int index)
185 if ((index >= 0) && (index < sisusb->numobufs))
186 sisusb->urbstatus[index] &= ~SU_URB_ALLOC;
194 struct sisusb_usb_data *sisusb;
199 sisusb = context->sisusb;
201 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present)
209 sisusb->urbstatus[context->urbindex] &= ~SU_URB_BUSY;
210 wake_up(&sisusb->wait_q);
213 static int sisusb_bulkout_msg(struct sisusb_usb_data *sisusb, int index,
217 struct urb *urb = sisusb->sisurbout[index];
223 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
225 &sisusb->urbout_context[index]);
231 sisusb->urbout_context[index].actual_length = (timeout) ?
235 sisusb->urbstatus[index] |= SU_URB_BUSY;
242 wait_event_timeout(sisusb->wait_q,
243 (!(sisusb->urbstatus[index] & SU_URB_BUSY)),
245 if (sisusb->urbstatus[index] & SU_URB_BUSY) {
268 struct sisusb_usb_data *sisusb = urb->context;
270 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present)
273 sisusb->completein = 1;
274 wake_up(&sisusb->wait_q);
277 static int sisusb_bulkin_msg(struct sisusb_usb_data *sisusb,
281 struct urb *urb = sisusb->sisurbin;
286 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
287 sisusb_bulk_completein, sisusb);
292 sisusb->completein = 0;
295 wait_event_timeout(sisusb->wait_q, sisusb->completein, timeout);
296 if (!sisusb->completein) {
321 * buffer "sisusb->obuf[index]" is set up with the data to send.
329 static int sisusb_send_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len,
343 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev)
356 else if (len > sisusb->obufsize)
359 pipe = usb_sndbulkpipe(sisusb->sisusb_dev, ep);
362 passsize = thispass = (sisusb->obufsize < count) ?
363 sisusb->obufsize : count;
366 index = sisusb_get_free_outbuf(sisusb);
371 buffer = sisusb->obuf[index];
390 if (!sisusb->sisusb_dev)
393 result = sisusb_bulkout_msg(sisusb, index, pipe,
432 sisusb_wait_all_out_complete(sisusb);
450 static int sisusb_recv_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len,
462 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev)
465 pipe = usb_rcvbulkpipe(sisusb->sisusb_dev, ep);
466 buffer = sisusb->ibuf;
467 bufsize = sisusb->ibufsize;
472 if (!(sisusb_wait_all_out_complete(sisusb)))
478 if (!sisusb->sisusb_dev)
483 result = sisusb_bulkin_msg(sisusb, pipe, buffer, thispass,
526 static int sisusb_send_packet(struct sisusb_usb_data *sisusb, int len,
537 if (!(sisusb_wait_all_out_complete(sisusb)))
545 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_GFX_OUT, len,
553 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_GFX_IN, 4,
562 static int sisusb_send_bridge_packet(struct sisusb_usb_data *sisusb, int len,
573 if (!(sisusb_wait_all_out_complete(sisusb)))
581 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_BRIDGE_OUT, len,
589 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_BRIDGE_IN, 4,
610 static int sisusb_write_memio_byte(struct sisusb_usb_data *sisusb, int type,
618 return sisusb_send_packet(sisusb, 10, &packet);
621 static int sisusb_write_memio_word(struct sisusb_usb_data *sisusb, int type,
633 ret = sisusb_send_packet(sisusb, 10, &packet);
638 ret = sisusb_send_packet(sisusb, 10, &packet);
643 ret = sisusb_send_packet(sisusb, 10, &packet);
648 ret = sisusb_send_packet(sisusb, 10, &packet);
652 ret |= sisusb_send_packet(sisusb, 10, &packet);
658 static int sisusb_write_memio_24bit(struct sisusb_usb_data *sisusb, int type,
670 ret = sisusb_send_packet(sisusb, 10, &packet);
675 ret = sisusb_send_packet(sisusb, 10, &packet);
680 ret = sisusb_send_packet(sisusb, 10, &packet);
684 ret |= sisusb_send_packet(sisusb, 10, &packet);
689 ret = sisusb_send_packet(sisusb, 10, &packet);
693 ret |= sisusb_send_packet(sisusb, 10, &packet);
699 static int sisusb_write_memio_long(struct sisusb_usb_data *sisusb, int type,
711 ret = sisusb_send_packet(sisusb, 10, &packet);
716 ret = sisusb_send_packet(sisusb, 10, &packet);
720 ret |= sisusb_send_packet(sisusb, 10, &packet);
725 ret = sisusb_send_packet(sisusb, 10, &packet);
729 ret |= sisusb_send_packet(sisusb, 10, &packet);
734 ret = sisusb_send_packet(sisusb, 10, &packet);
738 ret |= sisusb_send_packet(sisusb, 10, &packet);
751 * that the data already is in the transfer buffer "sisusb->obuf[index]".
754 static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
770 kernbuffer = sisusb->obuf[index];
785 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM,
800 ret = sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
832 ret = sisusb_write_memio_24bit(sisusb, SISUSB_TYPE_MEM,
847 ret = sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM,
860 ret = sisusb_send_bridge_packet(sisusb, 10,
865 ret |= sisusb_send_bridge_packet(sisusb, 10,
870 ret |= sisusb_send_bridge_packet(sisusb, 10,
873 ret |= sisusb_send_bulk_msg(sisusb,
880 ret |= sisusb_send_bulk_msg(sisusb,
887 ret |= sisusb_send_bulk_msg(sisusb,
893 (sisusb->obufsize-1));
901 ret = sisusb_send_bridge_packet(sisusb, 10,
906 ret |= sisusb_send_bridge_packet(sisusb, 10,
908 if (sisusb->flagb0 != 0x16) {
912 ret |= sisusb_send_bridge_packet(sisusb,
914 sisusb->flagb0 = 0x16;
917 ret |= sisusb_send_bulk_msg(sisusb,
924 ret |= sisusb_send_bulk_msg(sisusb,
931 ret |= sisusb_send_bulk_msg(sisusb,
937 (sisusb->obufsize-1));
943 dev_err(&sisusb->sisusb_dev->dev,
948 dev_err(&sisusb->sisusb_dev->dev,
967 static int sisusb_read_memio_byte(struct sisusb_usb_data *sisusb, int type,
976 ret = sisusb_send_packet(sisusb, 6, &packet);
981 static int sisusb_read_memio_word(struct sisusb_usb_data *sisusb, int type,
994 ret = sisusb_send_packet(sisusb, 6, &packet);
999 ret = sisusb_send_packet(sisusb, 6, &packet);
1004 ret = sisusb_send_packet(sisusb, 6, &packet);
1009 ret = sisusb_send_packet(sisusb, 6, &packet);
1013 ret |= sisusb_send_packet(sisusb, 6, &packet);
1020 static int sisusb_read_memio_24bit(struct sisusb_usb_data *sisusb, int type,
1031 ret = sisusb_send_packet(sisusb, 6, &packet);
1036 ret = sisusb_send_packet(sisusb, 6, &packet);
1041 ret = sisusb_send_packet(sisusb, 6, &packet);
1045 ret |= sisusb_send_packet(sisusb, 6, &packet);
1050 ret = sisusb_send_packet(sisusb, 6, &packet);
1054 ret |= sisusb_send_packet(sisusb, 6, &packet);
1061 static int sisusb_read_memio_long(struct sisusb_usb_data *sisusb, int type,
1072 ret = sisusb_send_packet(sisusb, 6, &packet);
1077 ret = sisusb_send_packet(sisusb, 6, &packet);
1081 ret |= sisusb_send_packet(sisusb, 6, &packet);
1086 ret = sisusb_send_packet(sisusb, 6, &packet);
1090 ret |= sisusb_send_packet(sisusb, 6, &packet);
1095 ret = sisusb_send_packet(sisusb, 6, &packet);
1099 ret |= sisusb_send_packet(sisusb, 6, &packet);
1106 static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
1122 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM,
1135 ret |= sisusb_read_memio_word(sisusb, SISUSB_TYPE_MEM,
1149 ret |= sisusb_read_memio_24bit(sisusb, SISUSB_TYPE_MEM,
1175 ret |= sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM,
1202 int sisusb_setreg(struct sisusb_usb_data *sisusb, u32 port, u8 data)
1204 return sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, data);
1207 int sisusb_getreg(struct sisusb_usb_data *sisusb, u32 port, u8 *data)
1209 return sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port, data);
1213 int sisusb_setidxreg(struct sisusb_usb_data *sisusb, u32 port,
1218 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index);
1219 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data);
1223 int sisusb_getidxreg(struct sisusb_usb_data *sisusb, u32 port,
1228 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index);
1229 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data);
1233 int sisusb_setidxregandor(struct sisusb_usb_data *sisusb, u32 port, u8 idx,
1239 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx);
1240 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp);
1243 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp);
1247 static int sisusb_setidxregmask(struct sisusb_usb_data *sisusb,
1253 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx);
1254 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp);
1257 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp);
1261 int sisusb_setidxregor(struct sisusb_usb_data *sisusb, u32 port,
1264 return sisusb_setidxregandor(sisusb, port, index, 0xff, myor);
1267 int sisusb_setidxregand(struct sisusb_usb_data *sisusb, u32 port,
1270 return sisusb_setidxregandor(sisusb, port, idx, myand, 0x00);
1276 int sisusb_writeb(struct sisusb_usb_data *sisusb, u32 adr, u8 data)
1278 return sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, adr, data);
1281 int sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data)
1283 return sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, adr, data);
1286 int sisusb_copy_memory(struct sisusb_usb_data *sisusb, u8 *src,
1291 return sisusb_write_mem_bulk(sisusb, dest, src, length,
1296 static int sisusb_read_memory(struct sisusb_usb_data *sisusb, char *dest,
1301 return sisusb_read_mem_bulk(sisusb, src, dest, length,
1308 static void sisusb_testreadwrite(struct sisusb_usb_data *sisusb)
1314 sisusb_copy_memory(sisusb, srcbuffer, sisusb->vrambase, 7);
1317 dev_dbg(&sisusb->sisusb_dev->dev,
1318 "sisusb: rwtest %d bytes\n", i);
1319 sisusb_read_memory(sisusb, destbuffer, sisusb->vrambase, i);
1321 dev_dbg(&sisusb->sisusb_dev->dev,
1331 static int sisusb_write_pci_config(struct sisusb_usb_data *sisusb,
1339 return sisusb_send_packet(sisusb, 10, &packet);
1342 static int sisusb_read_pci_config(struct sisusb_usb_data *sisusb,
1350 ret = sisusb_send_packet(sisusb, 6, &packet);
1357 static int sisusb_clear_vram(struct sisusb_usb_data *sisusb,
1363 if (address < sisusb->vrambase)
1366 if (address >= sisusb->vrambase + sisusb->vramsize)
1369 if (address + length > sisusb->vrambase + sisusb->vramsize)
1370 length = sisusb->vrambase + sisusb->vramsize - address;
1376 i = sisusb_alloc_outbuf(sisusb);
1380 memset(sisusb->obuf[i], 0, sisusb->obufsize);
1385 ret = sisusb_write_mem_bulk(sisusb, address, NULL, length, NULL, i, &j);
1388 sisusb_free_outbuf(sisusb, i);
1398 #define GETREG(r, d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1399 #define SETREG(r, d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1400 #define SETIREG(r, i, d) sisusb_setidxreg(sisusb, r, i, d)
1401 #define GETIREG(r, i, d) sisusb_getidxreg(sisusb, r, i, d)
1402 #define SETIREGOR(r, i, o) sisusb_setidxregor(sisusb, r, i, o)
1403 #define SETIREGAND(r, i, a) sisusb_setidxregand(sisusb, r, i, a)
1404 #define SETIREGANDOR(r, i, a, o) sisusb_setidxregandor(sisusb, r, i, a, o)
1405 #define READL(a, d) sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1406 #define WRITEL(a, d) sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1407 #define READB(a, d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1408 #define WRITEB(a, d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1410 static int sisusb_triggersr16(struct sisusb_usb_data *sisusb, u8 ramtype)
1440 static int sisusb_getbuswidth(struct sisusb_usb_data *sisusb,
1460 ret |= sisusb_triggersr16(sisusb, ramtype);
1488 ret |= sisusb_triggersr16(sisusb, ramtype);
1524 ret |= sisusb_triggersr16(sisusb, ramtype);
1553 static int sisusb_verify_mclk(struct sisusb_usb_data *sisusb)
1581 static int sisusb_set_rank(struct sisusb_usb_data *sisusb, int *iret,
1606 ret |= sisusb_triggersr16(sisusb, 0); /* sic! */
1613 static int sisusb_check_rbc(struct sisusb_usb_data *sisusb, int *iret,
1622 ret |= WRITEL(sisusb->vrambase + j, j);
1627 ret |= READL(sisusb->vrambase + j, &tmp);
1638 static int sisusb_check_ranks(struct sisusb_usb_data *sisusb,
1649 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2);
1655 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 4);
1660 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2);
1668 static int sisusb_get_sdram_size(struct sisusb_usb_data *sisusb, int *iret,
1693 ret |= sisusb_set_rank(sisusb, &i2ret, i, j, chab,
1698 ret |= sisusb_check_ranks(sisusb, &i2ret, j, i, bw,
1710 static int sisusb_setup_screen(struct sisusb_usb_data *sisusb,
1719 address = sisusb->vrambase; /* Clear video ram */
1722 length = sisusb->vramsize;
1726 ret = sisusb_clear_vram(sisusb, address, length);
1730 address = sisusb->vrambase + (i * bpp);
1731 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1734 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1738 address = sisusb->vrambase + ((i * modex) * bpp);
1739 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1742 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1750 static void sisusb_set_default_mode(struct sisusb_usb_data *sisusb,
1878 static int sisusb_init_gfxcore(struct sisusb_usb_data *sisusb)
2003 ret |= sisusb_read_pci_config(sisusb, 0x50, &tmp32);
2020 sisusb_set_default_mode(sisusb, 0);
2026 ret |= sisusb_triggersr16(sisusb, ramtype);
2032 ret |= sisusb_getbuswidth(sisusb, &bw, &chab);
2033 ret |= sisusb_verify_mclk(sisusb);
2036 ret |= sisusb_get_sdram_size(sisusb, &iret, bw, chab);
2038 dev_err(&sisusb->sisusb_dev->dev,
2044 dev_err(&sisusb->sisusb_dev->dev,
2077 static void sisusb_get_ramconfig(struct sisusb_usb_data *sisusb)
2088 sisusb_getidxreg(sisusb, SISSR, 0x14, &tmp8);
2089 sisusb_getidxreg(sisusb, SISSR, 0x15, &tmp82);
2090 sisusb_getidxreg(sisusb, SISSR, 0x3a, &ramtype);
2091 sisusb->vramsize = (1 << ((tmp8 & 0xf0) >> 4)) * 1024 * 1024;
2104 sisusb->vramsize <<= 1;
2109 sisusb->vramsize += sisusb->vramsize/2;
2114 sisusb->vramsize <<= 1;
2119 dev_info(&sisusb->sisusb_dev->dev,
2121 sisusb->vramsize >> 20, ramtypetext1,
2125 static int sisusb_do_init_gfxdevice(struct sisusb_usb_data *sisusb)
2135 ret = sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2140 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2145 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2150 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2154 ret |= sisusb_send_bridge_packet(sisusb, 6, &packet, 0);
2156 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2159 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2160 ret |= sisusb_write_pci_config(sisusb, 0x10, 0xfffffff0);
2161 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2164 ret |= sisusb_write_pci_config(sisusb, 0x10, tmp32);
2167 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2168 ret |= sisusb_write_pci_config(sisusb, 0x14, 0xfffffff0);
2169 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2172 ret |= sisusb_write_pci_config(sisusb, 0x14, tmp32);
2175 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2176 ret |= sisusb_write_pci_config(sisusb, 0x18, 0xfffffff0);
2177 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2180 ret |= sisusb_write_pci_config(sisusb, 0x18, tmp32);
2183 ret |= sisusb_read_pci_config(sisusb, 0x04, &tmp32);
2185 ret |= sisusb_write_pci_config(sisusb, 0x04, tmp32);
2192 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2203 static int sisusb_init_gfxdevice(struct sisusb_usb_data *sisusb, int initscreen)
2208 if (sisusb->devinit == 1) {
2210 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2217 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2224 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2233 if ((sisusb->devinit == 0) || (test != 3)) {
2235 ret |= sisusb_do_init_gfxdevice(sisusb);
2238 sisusb->devinit = 1;
2242 if (sisusb->devinit) {
2244 if (sisusb_init_gfxcore(sisusb) == 0) {
2245 sisusb->gfxinit = 1;
2246 sisusb_get_ramconfig(sisusb);
2247 sisusb_set_default_mode(sisusb, 1);
2248 ret |= sisusb_setup_screen(sisusb, 1, initscreen);
2264 int sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init)
2266 int ret = 0, slot = sisusb->font_slot, i;
2274 /* sisusb->lock is down */
2276 if (!sisusb->SiS_Pr)
2279 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30;
2280 sisusb->SiS_Pr->sisusb = (void *)sisusb;
2283 SiSUSBSetMode(sisusb->SiS_Pr, 0x03);
2297 ret = sisusbcon_do_font_op(sisusb, 1, 0, tempbuf, 8192,
2303 if (sisusb->font_backup) {
2304 ret |= sisusbcon_do_font_op(sisusb, 1, 2, sisusb->font_backup,
2305 8192, sisusb->font_backup_512, 1, NULL,
2306 sisusb->font_backup_height, 0);
2308 sisusbcon_do_font_op(sisusb, 1, 0, NULL, 0, 0, 1,
2312 if (init && !sisusb->scrbuf) {
2335 ret |= sisusb_copy_memory(sisusb, tempbuf,
2336 sisusb->vrambase, 8192);
2342 } else if (sisusb->scrbuf) {
2343 ret |= sisusb_copy_memory(sisusb, (u8 *)sisusb->scrbuf,
2344 sisusb->vrambase, sisusb->scrbuf_size);
2347 if (sisusb->sisusb_cursor_size_from >= 0 &&
2348 sisusb->sisusb_cursor_size_to >= 0) {
2349 sisusb_setidxreg(sisusb, SISCR, 0x0a,
2350 sisusb->sisusb_cursor_size_from);
2351 sisusb_setidxregandor(sisusb, SISCR, 0x0b, 0xe0,
2352 sisusb->sisusb_cursor_size_to);
2354 sisusb_setidxreg(sisusb, SISCR, 0x0a, 0x2d);
2355 sisusb_setidxreg(sisusb, SISCR, 0x0b, 0x0e);
2356 sisusb->sisusb_cursor_size_to = -1;
2359 slot = sisusb->sisusb_cursor_loc;
2363 sisusb->sisusb_cursor_loc = -1;
2364 sisusb->bad_cursor_pos = 1;
2366 sisusb_set_cursor(sisusb, slot);
2368 sisusb_setidxreg(sisusb, SISCR, 0x0c, (sisusb->cur_start_addr >> 8));
2369 sisusb_setidxreg(sisusb, SISCR, 0x0d, (sisusb->cur_start_addr & 0xff));
2371 sisusb->textmodedestroyed = 0;
2373 /* sisusb->lock is down */
2384 struct sisusb_usb_data *sisusb;
2392 sisusb = usb_get_intfdata(interface);
2393 if (!sisusb)
2396 mutex_lock(&sisusb->lock);
2398 if (!sisusb->present || !sisusb->ready) {
2399 mutex_unlock(&sisusb->lock);
2403 if (sisusb->isopen) {
2404 mutex_unlock(&sisusb->lock);
2408 if (!sisusb->devinit) {
2409 if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH ||
2410 sisusb->sisusb_dev->speed >= USB_SPEED_SUPER) {
2411 if (sisusb_init_gfxdevice(sisusb, 0)) {
2412 mutex_unlock(&sisusb->lock);
2413 dev_err(&sisusb->sisusb_dev->dev,
2418 mutex_unlock(&sisusb->lock);
2419 dev_err(&sisusb->sisusb_dev->dev,
2425 /* Increment usage count for our sisusb */
2426 kref_get(&sisusb->kref);
2428 sisusb->isopen = 1;
2430 file->private_data = sisusb;
2432 mutex_unlock(&sisusb->lock);
2439 struct sisusb_usb_data *sisusb = to_sisusb_dev(kref);
2441 if (!sisusb)
2444 usb_put_dev(sisusb->sisusb_dev);
2446 sisusb->sisusb_dev = NULL;
2447 sisusb_free_buffers(sisusb);
2448 sisusb_free_urbs(sisusb);
2450 kfree(sisusb->SiS_Pr);
2452 kfree(sisusb);
2457 struct sisusb_usb_data *sisusb;
2459 sisusb = file->private_data;
2460 if (!sisusb)
2463 mutex_lock(&sisusb->lock);
2465 if (sisusb->present) {
2467 if (!sisusb_wait_all_out_complete(sisusb))
2468 sisusb_kill_all_busy(sisusb);
2471 sisusb->isopen = 0;
2474 mutex_unlock(&sisusb->lock);
2477 kref_put(&sisusb->kref, sisusb_delete);
2485 struct sisusb_usb_data *sisusb;
2492 sisusb = file->private_data;
2493 if (!sisusb)
2496 mutex_lock(&sisusb->lock);
2499 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2500 mutex_unlock(&sisusb->lock);
2517 if (sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO,
2528 if (sisusb_read_memio_word(sisusb, SISUSB_TYPE_IO,
2539 if (sisusb_read_memio_long(sisusb, SISUSB_TYPE_IO,
2555 SISUSB_PCI_PSEUDO_MEMBASE + sisusb->vramsize) {
2563 errno = sisusb_read_mem_bulk(sisusb, address,
2579 errno = sisusb_read_mem_bulk(sisusb, address,
2589 mutex_unlock(&sisusb->lock);
2598 if (sisusb_read_pci_config(sisusb, address, &buf32))
2613 mutex_unlock(&sisusb->lock);
2621 struct sisusb_usb_data *sisusb;
2628 sisusb = file->private_data;
2629 if (!sisusb)
2632 mutex_lock(&sisusb->lock);
2635 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2636 mutex_unlock(&sisusb->lock);
2655 else if (sisusb_write_memio_byte(sisusb,
2666 else if (sisusb_write_memio_word(sisusb,
2677 else if (sisusb_write_memio_long(sisusb,
2691 sisusb->vramsize) {
2702 errno = sisusb_write_mem_bulk(sisusb, address, NULL,
2720 errno = sisusb_write_mem_bulk(sisusb, address, NULL,
2731 mutex_unlock(&sisusb->lock);
2742 else if (sisusb_write_pci_config(sisusb, address, buf32))
2757 mutex_unlock(&sisusb->lock);
2764 struct sisusb_usb_data *sisusb;
2767 sisusb = file->private_data;
2768 if (!sisusb)
2771 mutex_lock(&sisusb->lock);
2774 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2775 mutex_unlock(&sisusb->lock);
2781 mutex_unlock(&sisusb->lock);
2785 static int sisusb_handle_command(struct sisusb_usb_data *sisusb,
2794 if (!sisusb->devinit)
2803 retval = sisusb_getidxreg(sisusb, port, y->data0, &y->data1);
2811 retval = sisusb_setidxreg(sisusb, port, y->data0, y->data1);
2815 retval = sisusb_setidxregor(sisusb, port, y->data0, y->data1);
2819 retval = sisusb_setidxregand(sisusb, port, y->data0, y->data1);
2823 retval = sisusb_setidxregandor(sisusb, port, y->data0,
2828 retval = sisusb_setidxregmask(sisusb, port, y->data0,
2834 if (!sisusb->gfxinit)
2840 retval = sisusb_clear_vram(sisusb, address, length);
2847 if (!sisusb->gfxinit || !sisusb->SiS_Pr)
2852 retval = sisusb_reset_text_mode(sisusb, 0);
2855 sisusb->textmodedestroyed = 1;
2864 if (!sisusb->gfxinit || !sisusb->SiS_Pr)
2869 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30;
2870 sisusb->SiS_Pr->sisusb = (void *)sisusb;
2872 if (SiSUSBSetMode(sisusb->SiS_Pr, y->data3))
2879 if (!sisusb->gfxinit || !sisusb->SiS_Pr)
2884 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30;
2885 sisusb->SiS_Pr->sisusb = (void *)sisusb;
2887 if (SiSUSBSetVESAMode(sisusb->SiS_Pr, y->data3))
2905 struct sisusb_usb_data *sisusb;
2911 sisusb = file->private_data;
2912 if (!sisusb)
2915 mutex_lock(&sisusb->lock);
2918 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2937 x.sisusb_gfxinit = sisusb->gfxinit;
2942 x.sisusb_vramsize = sisusb->vramsize;
2943 x.sisusb_minor = sisusb->minor;
2946 x.sisusb_conactive = sisusb->haveconsole ? 1 : 0;
2962 retval = sisusb_handle_command(sisusb, &y, arg);
2972 mutex_unlock(&sisusb->lock);
3015 struct sisusb_usb_data *sisusb;
3036 sisusb = kzalloc(sizeof(*sisusb), GFP_KERNEL);
3037 if (!sisusb)
3040 kref_init(&sisusb->kref);
3042 mutex_init(&(sisusb->lock));
3044 sisusb->sisusb_dev = dev;
3045 sisusb->vrambase = SISUSB_PCI_MEMBASE;
3046 sisusb->mmiobase = SISUSB_PCI_MMIOBASE;
3047 sisusb->mmiosize = SISUSB_PCI_MMIOSIZE;
3048 sisusb->ioportbase = SISUSB_PCI_IOPORTBASE;
3054 dev_err(&sisusb->sisusb_dev->dev,
3061 sisusb->minor = intf->minor;
3064 sisusb->ibufsize = SISUSB_IBUF_SIZE;
3065 sisusb->ibuf = kmalloc(SISUSB_IBUF_SIZE, GFP_KERNEL);
3066 if (!sisusb->ibuf) {
3071 sisusb->numobufs = 0;
3072 sisusb->obufsize = SISUSB_OBUF_SIZE;
3074 sisusb->obuf[i] = kmalloc(SISUSB_OBUF_SIZE, GFP_KERNEL);
3075 if (!sisusb->obuf[i]) {
3082 sisusb->numobufs++;
3086 sisusb->sisurbin = usb_alloc_urb(0, GFP_KERNEL);
3087 if (!sisusb->sisurbin) {
3091 sisusb->completein = 1;
3093 for (i = 0; i < sisusb->numobufs; i++) {
3094 sisusb->sisurbout[i] = usb_alloc_urb(0, GFP_KERNEL);
3095 if (!sisusb->sisurbout[i]) {
3099 sisusb->urbout_context[i].sisusb = (void *)sisusb;
3100 sisusb->urbout_context[i].urbindex = i;
3101 sisusb->urbstatus[i] = 0;
3104 dev_info(&sisusb->sisusb_dev->dev, "Allocated %d output buffers\n",
3105 sisusb->numobufs);
3109 sisusb->SiS_Pr = kmalloc(sizeof(struct SiS_Private), GFP_KERNEL);
3110 if (!sisusb->SiS_Pr) {
3118 init_waitqueue_head(&sisusb->wait_q);
3120 usb_set_intfdata(intf, sisusb);
3122 usb_get_dev(sisusb->sisusb_dev);
3124 sisusb->present = 1;
3134 if (sisusb_init_gfxdevice(sisusb, initscreen))
3135 dev_err(&sisusb->sisusb_dev->dev,
3139 dev_info(&sisusb->sisusb_dev->dev,
3142 sisusb->ready = 1;
3145 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST ***\n");
3146 sisusb_testreadwrite(sisusb);
3147 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST END ***\n");
3151 sisusb_console_init(sisusb, sisusb_first_vc, sisusb_last_vc);
3157 sisusb_free_urbs(sisusb);
3159 sisusb_free_buffers(sisusb);
3163 kfree(sisusb);
3169 struct sisusb_usb_data *sisusb;
3172 sisusb = usb_get_intfdata(intf);
3173 if (!sisusb)
3177 sisusb_console_exit(sisusb);
3182 mutex_lock(&sisusb->lock);
3185 if (!sisusb_wait_all_out_complete(sisusb))
3186 sisusb_kill_all_busy(sisusb);
3190 sisusb->present = 0;
3191 sisusb->ready = 0;
3193 mutex_unlock(&sisusb->lock);
3196 kref_put(&sisusb->kref, sisusb_delete);
3217 .name = "sisusb",