• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/drivers/usb/misc/sisusbvga/

Lines Matching defs:sisusb

2  * sisusb - usb kernel driver for SiS315(E) based USB2VGA dongles
52 #include "sisusb.h"
75 sisusb_free_buffers(struct sisusb_usb_data *sisusb)
80 if (sisusb->obuf[i]) {
81 kfree(sisusb->obuf[i]);
82 sisusb->obuf[i] = NULL;
85 if (sisusb->ibuf) {
86 kfree(sisusb->ibuf);
87 sisusb->ibuf = NULL;
92 sisusb_free_urbs(struct sisusb_usb_data *sisusb)
97 usb_free_urb(sisusb->sisurbout[i]);
98 sisusb->sisurbout[i] = NULL;
100 usb_free_urb(sisusb->sisurbin);
101 sisusb->sisurbin = NULL;
112 sisusb_all_free(struct sisusb_usb_data *sisusb)
116 for (i = 0; i < sisusb->numobufs; i++) {
118 if (sisusb->urbstatus[i] & SU_URB_BUSY)
128 sisusb_kill_all_busy(struct sisusb_usb_data *sisusb)
132 if (sisusb_all_free(sisusb))
135 for (i = 0; i < sisusb->numobufs; i++) {
137 if (sisusb->urbstatus[i] & SU_URB_BUSY)
138 usb_kill_urb(sisusb->sisurbout[i]);
145 sisusb_wait_all_out_complete(struct sisusb_usb_data *sisusb)
149 wait_event_timeout(sisusb->wait_q,
150 (i = sisusb_all_free(sisusb)),
157 sisusb_outurb_available(struct sisusb_usb_data *sisusb)
161 for (i = 0; i < sisusb->numobufs; i++) {
163 if ((sisusb->urbstatus[i] & (SU_URB_BUSY|SU_URB_ALLOC)) == 0)
172 sisusb_get_free_outbuf(struct sisusb_usb_data *sisusb)
176 wait_event_timeout(sisusb->wait_q,
177 ((i = sisusb_outurb_available(sisusb)) >= 0),
184 sisusb_alloc_outbuf(struct sisusb_usb_data *sisusb)
188 i = sisusb_outurb_available(sisusb);
191 sisusb->urbstatus[i] |= SU_URB_ALLOC;
197 sisusb_free_outbuf(struct sisusb_usb_data *sisusb, int index)
199 if ((index >= 0) && (index < sisusb->numobufs))
200 sisusb->urbstatus[index] &= ~SU_URB_ALLOC;
209 struct sisusb_usb_data *sisusb;
214 sisusb = context->sisusb;
216 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present)
224 sisusb->urbstatus[context->urbindex] &= ~SU_URB_BUSY;
225 wake_up(&sisusb->wait_q);
229 sisusb_bulkout_msg(struct sisusb_usb_data *sisusb, int index, unsigned int pipe, void *data,
232 struct urb *urb = sisusb->sisurbout[index];
238 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
239 sisusb_bulk_completeout, &sisusb->urbout_context[index]);
245 sisusb->urbout_context[index].actual_length = (timeout) ?
249 sisusb->urbstatus[index] |= SU_URB_BUSY;
256 wait_event_timeout(sisusb->wait_q,
257 (!(sisusb->urbstatus[index] & SU_URB_BUSY)),
259 if (sisusb->urbstatus[index] & SU_URB_BUSY) {
283 struct sisusb_usb_data *sisusb = urb->context;
285 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present)
288 sisusb->completein = 1;
289 wake_up(&sisusb->wait_q);
293 sisusb_bulkin_msg(struct sisusb_usb_data *sisusb, unsigned int pipe, void *data,
296 struct urb *urb = sisusb->sisurbin;
301 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
302 sisusb_bulk_completein, sisusb);
307 sisusb->completein = 0;
310 wait_event_timeout(sisusb->wait_q, sisusb->completein, timeout);
311 if (!sisusb->completein) {
336 * buffer "sisusb->obuf[index]" is set up with the data to send.
344 static int sisusb_send_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len,
358 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev)
371 else if (len > sisusb->obufsize)
374 pipe = usb_sndbulkpipe(sisusb->sisusb_dev, ep);
377 passsize = thispass = (sisusb->obufsize < count) ?
378 sisusb->obufsize : count;
381 index = sisusb_get_free_outbuf(sisusb);
386 buffer = sisusb->obuf[index];
405 if (!sisusb->sisusb_dev)
408 result = sisusb_bulkout_msg(sisusb,
452 sisusb_wait_all_out_complete(sisusb);
470 static int sisusb_recv_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len,
482 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev)
485 pipe = usb_rcvbulkpipe(sisusb->sisusb_dev, ep);
486 buffer = sisusb->ibuf;
487 bufsize = sisusb->ibufsize;
492 if (!(sisusb_wait_all_out_complete(sisusb)))
498 if (!sisusb->sisusb_dev)
503 result = sisusb_bulkin_msg(sisusb,
551 static int sisusb_send_packet(struct sisusb_usb_data *sisusb, int len,
562 if (!(sisusb_wait_all_out_complete(sisusb)))
570 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_GFX_OUT, len,
578 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_GFX_IN, 4,
587 static int sisusb_send_bridge_packet(struct sisusb_usb_data *sisusb, int len,
599 if (!(sisusb_wait_all_out_complete(sisusb)))
607 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_BRIDGE_OUT, len,
615 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_BRIDGE_IN, 4,
636 static int sisusb_write_memio_byte(struct sisusb_usb_data *sisusb, int type,
645 ret = sisusb_send_packet(sisusb, 10, &packet);
649 static int sisusb_write_memio_word(struct sisusb_usb_data *sisusb, int type,
661 ret = sisusb_send_packet(sisusb, 10, &packet);
666 ret = sisusb_send_packet(sisusb, 10, &packet);
671 ret = sisusb_send_packet(sisusb, 10, &packet);
676 ret = sisusb_send_packet(sisusb, 10, &packet);
680 ret |= sisusb_send_packet(sisusb, 10, &packet);
686 static int sisusb_write_memio_24bit(struct sisusb_usb_data *sisusb, int type,
698 ret = sisusb_send_packet(sisusb, 10, &packet);
703 ret = sisusb_send_packet(sisusb, 10, &packet);
708 ret = sisusb_send_packet(sisusb, 10, &packet);
712 ret |= sisusb_send_packet(sisusb, 10, &packet);
717 ret = sisusb_send_packet(sisusb, 10, &packet);
721 ret |= sisusb_send_packet(sisusb, 10, &packet);
727 static int sisusb_write_memio_long(struct sisusb_usb_data *sisusb, int type,
739 ret = sisusb_send_packet(sisusb, 10, &packet);
744 ret = sisusb_send_packet(sisusb, 10, &packet);
748 ret |= sisusb_send_packet(sisusb, 10, &packet);
753 ret = sisusb_send_packet(sisusb, 10, &packet);
757 ret |= sisusb_send_packet(sisusb, 10, &packet);
762 ret = sisusb_send_packet(sisusb, 10, &packet);
766 ret |= sisusb_send_packet(sisusb, 10, &packet);
779 * that the data already is in the transfer buffer "sisusb->obuf[index]".
782 static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
799 kernbuffer = sisusb->obuf[index];
816 ret = sisusb_write_memio_byte(sisusb,
832 ret = sisusb_write_memio_word(sisusb,
866 ret = sisusb_write_memio_24bit(sisusb,
883 ret = sisusb_write_memio_long(sisusb,
898 ret = sisusb_send_bridge_packet(sisusb, 10,
903 ret |= sisusb_send_bridge_packet(sisusb, 10,
908 ret |= sisusb_send_bridge_packet(sisusb, 10,
911 ret |= sisusb_send_bulk_msg(sisusb,
918 ret |= sisusb_send_bulk_msg(sisusb,
925 ret |= sisusb_send_bulk_msg(sisusb,
931 (sisusb->obufsize-1));
939 ret = sisusb_send_bridge_packet(sisusb, 10,
944 ret |= sisusb_send_bridge_packet(sisusb, 10,
946 if (sisusb->flagb0 != 0x16) {
950 ret |= sisusb_send_bridge_packet(sisusb, 10,
952 sisusb->flagb0 = 0x16;
955 ret |= sisusb_send_bulk_msg(sisusb,
962 ret |= sisusb_send_bulk_msg(sisusb,
969 ret |= sisusb_send_bulk_msg(sisusb,
975 (sisusb->obufsize-1));
981 dev_err(&sisusb->sisusb_dev->dev, "Wrote %zd of %d bytes, error %d\n",
984 dev_err(&sisusb->sisusb_dev->dev, "Too many errors, logging stopped\n");
1002 static int sisusb_read_memio_byte(struct sisusb_usb_data *sisusb, int type,
1011 ret = sisusb_send_packet(sisusb, 6, &packet);
1016 static int sisusb_read_memio_word(struct sisusb_usb_data *sisusb, int type,
1029 ret = sisusb_send_packet(sisusb, 6, &packet);
1034 ret = sisusb_send_packet(sisusb, 6, &packet);
1039 ret = sisusb_send_packet(sisusb, 6, &packet);
1044 ret = sisusb_send_packet(sisusb, 6, &packet);
1048 ret |= sisusb_send_packet(sisusb, 6, &packet);
1055 static int sisusb_read_memio_24bit(struct sisusb_usb_data *sisusb, int type,
1066 ret = sisusb_send_packet(sisusb, 6, &packet);
1071 ret = sisusb_send_packet(sisusb, 6, &packet);
1076 ret = sisusb_send_packet(sisusb, 6, &packet);
1080 ret |= sisusb_send_packet(sisusb, 6, &packet);
1085 ret = sisusb_send_packet(sisusb, 6, &packet);
1089 ret |= sisusb_send_packet(sisusb, 6, &packet);
1096 static int sisusb_read_memio_long(struct sisusb_usb_data *sisusb, int type,
1107 ret = sisusb_send_packet(sisusb, 6, &packet);
1112 ret = sisusb_send_packet(sisusb, 6, &packet);
1116 ret |= sisusb_send_packet(sisusb, 6, &packet);
1121 ret = sisusb_send_packet(sisusb, 6, &packet);
1125 ret |= sisusb_send_packet(sisusb, 6, &packet);
1130 ret = sisusb_send_packet(sisusb, 6, &packet);
1134 ret |= sisusb_send_packet(sisusb, 6, &packet);
1141 static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
1160 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM,
1176 ret |= sisusb_read_memio_word(sisusb, SISUSB_TYPE_MEM,
1191 ret |= sisusb_read_memio_24bit(sisusb, SISUSB_TYPE_MEM,
1216 ret |= sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM,
1246 sisusb_setreg(struct sisusb_usb_data *sisusb, int port, u8 data)
1248 return sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, data);
1252 sisusb_getreg(struct sisusb_usb_data *sisusb, int port, u8 *data)
1254 return sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port, data);
1259 sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data)
1262 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index);
1263 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data);
1268 sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data)
1271 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index);
1272 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data);
1277 sisusb_setidxregandor(struct sisusb_usb_data *sisusb, int port, u8 idx,
1283 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx);
1284 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp);
1287 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp);
1292 sisusb_setidxregmask(struct sisusb_usb_data *sisusb, int port, u8 idx,
1297 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx);
1298 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp);
1301 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp);
1306 sisusb_setidxregor(struct sisusb_usb_data *sisusb, int port, u8 index, u8 myor)
1308 return(sisusb_setidxregandor(sisusb, port, index, 0xff, myor));
1312 sisusb_setidxregand(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand)
1314 return(sisusb_setidxregandor(sisusb, port, idx, myand, 0x00));
1321 sisusb_writeb(struct sisusb_usb_data *sisusb, u32 adr, u8 data)
1323 return(sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, adr, data));
1327 sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data)
1329 return(sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, adr, data));
1333 sisusb_copy_memory(struct sisusb_usb_data *sisusb, char *src,
1336 return(sisusb_write_mem_bulk(sisusb, dest, src, length, NULL, 0, bytes_written));
1341 sisusb_read_memory(struct sisusb_usb_data *sisusb, char *dest,
1344 return(sisusb_read_mem_bulk(sisusb, src, dest, length, NULL, bytes_written));
1351 sisusb_testreadwrite(struct sisusb_usb_data *sisusb)
1358 sisusb_copy_memory(sisusb, srcbuffer, sisusb->vrambase, 7, &dummy);
1361 dev_dbg(&sisusb->sisusb_dev->dev, "sisusb: rwtest %d bytes\n", i);
1362 sisusb_read_memory(sisusb, destbuffer, sisusb->vrambase, i, &dummy);
1364 dev_dbg(&sisusb->sisusb_dev->dev, "rwtest read[%d] = %x\n", j, destbuffer[j]);
1373 sisusb_write_pci_config(struct sisusb_usb_data *sisusb, int regnum, u32 data)
1381 ret = sisusb_send_packet(sisusb, 10, &packet);
1386 sisusb_read_pci_config(struct sisusb_usb_data *sisusb, int regnum, u32 *data)
1393 ret = sisusb_send_packet(sisusb, 6, &packet);
1401 sisusb_clear_vram(struct sisusb_usb_data *sisusb, u32 address, int length)
1406 if (address < sisusb->vrambase)
1409 if (address >= sisusb->vrambase + sisusb->vramsize)
1412 if (address + length > sisusb->vrambase + sisusb->vramsize)
1413 length = sisusb->vrambase + sisusb->vramsize - address;
1419 if ((i = sisusb_alloc_outbuf(sisusb)) < 0)
1422 memset(sisusb->obuf[i], 0, sisusb->obufsize);
1427 ret = sisusb_write_mem_bulk(sisusb, address, NULL, length, NULL, i, &j);
1430 sisusb_free_outbuf(sisusb, i);
1440 #define GETREG(r,d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1441 #define SETREG(r,d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1442 #define SETIREG(r,i,d) sisusb_setidxreg(sisusb, r, i, d)
1443 #define GETIREG(r,i,d) sisusb_getidxreg(sisusb, r, i, d)
1444 #define SETIREGOR(r,i,o) sisusb_setidxregor(sisusb, r, i, o)
1445 #define SETIREGAND(r,i,a) sisusb_setidxregand(sisusb, r, i, a)
1446 #define SETIREGANDOR(r,i,a,o) sisusb_setidxregandor(sisusb, r, i, a, o)
1447 #define READL(a,d) sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1448 #define WRITEL(a,d) sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1449 #define READB(a,d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1450 #define WRITEB(a,d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1453 sisusb_triggersr16(struct sisusb_usb_data *sisusb, u8 ramtype)
1484 sisusb_getbuswidth(struct sisusb_usb_data *sisusb, int *bw, int *chab)
1503 ret |= sisusb_triggersr16(sisusb, ramtype);
1531 ret |= sisusb_triggersr16(sisusb, ramtype);
1567 ret |= sisusb_triggersr16(sisusb, ramtype);
1597 sisusb_verify_mclk(struct sisusb_usb_data *sisusb)
1626 sisusb_set_rank(struct sisusb_usb_data *sisusb, int *iret, int index,
1650 ret |= sisusb_triggersr16(sisusb, 0); /* sic! */
1658 sisusb_check_rbc(struct sisusb_usb_data *sisusb, int *iret, u32 inc, int testn)
1666 ret |= WRITEL(sisusb->vrambase + j, j);
1671 ret |= READL(sisusb->vrambase + j, &tmp);
1681 sisusb_check_ranks(struct sisusb_usb_data *sisusb, int *iret, int rankno,
1694 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2);
1700 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 4);
1705 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2);
1714 sisusb_get_sdram_size(struct sisusb_usb_data *sisusb, int *iret, int bw,
1739 ret |= sisusb_set_rank(sisusb, &i2ret, i, j,
1744 ret |= sisusb_check_ranks(sisusb, &i2ret, j, i,
1757 sisusb_setup_screen(struct sisusb_usb_data *sisusb, int clrall, int drwfr)
1765 address = sisusb->vrambase; /* Clear video ram */
1768 length = sisusb->vramsize;
1772 ret = sisusb_clear_vram(sisusb, address, length);
1776 address = sisusb->vrambase + (i * bpp);
1777 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1780 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1784 address = sisusb->vrambase + ((i * modex) * bpp);
1785 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1788 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1797 sisusb_set_default_mode(struct sisusb_usb_data *sisusb, int touchengines)
1929 sisusb_init_gfxcore(struct sisusb_usb_data *sisusb)
2049 ret |= sisusb_read_pci_config(sisusb, 0x50, &tmp32);
2065 ret |= sisusb_set_default_mode(sisusb, 0);
2071 ret |= sisusb_triggersr16(sisusb, ramtype);
2077 ret |= sisusb_getbuswidth(sisusb, &bw, &chab);
2078 ret |= sisusb_verify_mclk(sisusb);
2081 ret |= sisusb_get_sdram_size(sisusb, &iret, bw, chab);
2083 dev_err(&sisusb->sisusb_dev->dev,"RAM size detection failed, assuming 8MB video RAM\n");
2088 dev_err(&sisusb->sisusb_dev->dev, "DDR RAM device found, assuming 8MB video RAM\n");
2121 sisusb_get_ramconfig(struct sisusb_usb_data *sisusb)
2132 sisusb_getidxreg(sisusb, SISSR, 0x14, &tmp8);
2133 sisusb_getidxreg(sisusb, SISSR, 0x15, &tmp82);
2134 sisusb_getidxreg(sisusb, SISSR, 0x3a, &ramtype);
2135 sisusb->vramsize = (1 << ((tmp8 & 0xf0) >> 4)) * 1024 * 1024;
2146 sisusb->vramsize <<= 1;
2150 sisusb->vramsize += sisusb->vramsize/2;
2154 sisusb->vramsize <<= 1;
2159 dev_info(&sisusb->sisusb_dev->dev, "%dMB %s %s, bus width %d\n", (sisusb->vramsize >> 20), ramtypetext1,
2164 sisusb_do_init_gfxdevice(struct sisusb_usb_data *sisusb)
2174 ret = sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2179 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2184 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2189 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2193 ret |= sisusb_send_bridge_packet(sisusb, 6, &packet, 0);
2195 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2198 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2199 ret |= sisusb_write_pci_config(sisusb, 0x10, 0xfffffff0);
2200 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2203 ret |= sisusb_write_pci_config(sisusb, 0x10, tmp32);
2206 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2207 ret |= sisusb_write_pci_config(sisusb, 0x14, 0xfffffff0);
2208 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2211 ret |= sisusb_write_pci_config(sisusb, 0x14, tmp32);
2214 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2215 ret |= sisusb_write_pci_config(sisusb, 0x18, 0xfffffff0);
2216 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2219 ret |= sisusb_write_pci_config(sisusb, 0x18, tmp32);
2222 ret |= sisusb_read_pci_config(sisusb, 0x04, &tmp32);
2224 ret |= sisusb_write_pci_config(sisusb, 0x04, tmp32);
2231 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2243 sisusb_init_gfxdevice(struct sisusb_usb_data *sisusb, int initscreen)
2248 if (sisusb->devinit == 1) {
2250 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2254 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2258 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2264 if ((sisusb->devinit == 0) || (test != 3)) {
2266 ret |= sisusb_do_init_gfxdevice(sisusb);
2269 sisusb->devinit = 1;
2273 if (sisusb->devinit) {
2275 if (sisusb_init_gfxcore(sisusb) == 0) {
2276 sisusb->gfxinit = 1;
2277 sisusb_get_ramconfig(sisusb);
2278 ret |= sisusb_set_default_mode(sisusb, 1);
2279 ret |= sisusb_setup_screen(sisusb, 1, initscreen);
2296 sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init)
2298 int ret = 0, slot = sisusb->font_slot, i;
2306 /* sisusb->lock is down */
2308 if (!sisusb->SiS_Pr)
2311 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30;
2312 sisusb->SiS_Pr->sisusb = (void *)sisusb;
2315 SiSUSBSetMode(sisusb->SiS_Pr, 0x03);
2327 ret = sisusbcon_do_font_op(sisusb, 1, 0, tempbuf, 8192, 0, 1, NULL, 16, 0);
2332 if (sisusb->font_backup) {
2333 ret |= sisusbcon_do_font_op(sisusb, 1, 2, sisusb->font_backup,
2334 8192, sisusb->font_backup_512, 1, NULL,
2335 sisusb->font_backup_height, 0);
2337 sisusbcon_do_font_op(sisusb, 1, 0, NULL, 0, 0, 1,
2341 if (init && !sisusb->scrbuf) {
2363 ret |= sisusb_copy_memory(sisusb, tempbuf,
2364 sisusb->vrambase, 8192, &written);
2370 } else if (sisusb->scrbuf) {
2372 ret |= sisusb_copy_memory(sisusb, (char *)sisusb->scrbuf,
2373 sisusb->vrambase, sisusb->scrbuf_size, &written);
2377 if (sisusb->sisusb_cursor_size_from >= 0 &&
2378 sisusb->sisusb_cursor_size_to >= 0) {
2379 sisusb_setidxreg(sisusb, SISCR, 0x0a,
2380 sisusb->sisusb_cursor_size_from);
2381 sisusb_setidxregandor(sisusb, SISCR, 0x0b, 0xe0,
2382 sisusb->sisusb_cursor_size_to);
2384 sisusb_setidxreg(sisusb, SISCR, 0x0a, 0x2d);
2385 sisusb_setidxreg(sisusb, SISCR, 0x0b, 0x0e);
2386 sisusb->sisusb_cursor_size_to = -1;
2389 slot = sisusb->sisusb_cursor_loc;
2392 sisusb->sisusb_cursor_loc = -1;
2393 sisusb->bad_cursor_pos = 1;
2395 sisusb_set_cursor(sisusb, slot);
2397 sisusb_setidxreg(sisusb, SISCR, 0x0c, (sisusb->cur_start_addr >> 8));
2398 sisusb_setidxreg(sisusb, SISCR, 0x0d, (sisusb->cur_start_addr & 0xff));
2400 sisusb->textmodedestroyed = 0;
2402 /* sisusb->lock is down */
2414 struct sisusb_usb_data *sisusb;
2422 if (!(sisusb = usb_get_intfdata(interface))) {
2426 mutex_lock(&sisusb->lock);
2428 if (!sisusb->present || !sisusb->ready) {
2429 mutex_unlock(&sisusb->lock);
2433 if (sisusb->isopen) {
2434 mutex_unlock(&sisusb->lock);
2438 if (!sisusb->devinit) {
2439 if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH ||
2440 sisusb->sisusb_dev->speed == USB_SPEED_SUPER) {
2441 if (sisusb_init_gfxdevice(sisusb, 0)) {
2442 mutex_unlock(&sisusb->lock);
2443 dev_err(&sisusb->sisusb_dev->dev, "Failed to initialize device\n");
2447 mutex_unlock(&sisusb->lock);
2448 dev_err(&sisusb->sisusb_dev->dev, "Device not attached to USB 2.0 hub\n");
2453 /* Increment usage count for our sisusb */
2454 kref_get(&sisusb->kref);
2456 sisusb->isopen = 1;
2458 file->private_data = sisusb;
2460 mutex_unlock(&sisusb->lock);
2468 struct sisusb_usb_data *sisusb = to_sisusb_dev(kref);
2470 if (!sisusb)
2473 if (sisusb->sisusb_dev)
2474 usb_put_dev(sisusb->sisusb_dev);
2476 sisusb->sisusb_dev = NULL;
2477 sisusb_free_buffers(sisusb);
2478 sisusb_free_urbs(sisusb);
2480 kfree(sisusb->SiS_Pr);
2482 kfree(sisusb);
2488 struct sisusb_usb_data *sisusb;
2490 if (!(sisusb = file->private_data))
2493 mutex_lock(&sisusb->lock);
2495 if (sisusb->present) {
2497 if (!sisusb_wait_all_out_complete(sisusb))
2498 sisusb_kill_all_busy(sisusb);
2501 sisusb->isopen = 0;
2504 mutex_unlock(&sisusb->lock);
2507 kref_put(&sisusb->kref, sisusb_delete);
2515 struct sisusb_usb_data *sisusb;
2522 if (!(sisusb = file->private_data))
2525 mutex_lock(&sisusb->lock);
2528 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2529 mutex_unlock(&sisusb->lock);
2548 if (sisusb_read_memio_byte(sisusb,
2560 if (sisusb_read_memio_word(sisusb,
2572 if (sisusb_read_memio_long(sisusb,
2589 (*ppos) < SISUSB_PCI_PSEUDO_MEMBASE + sisusb->vramsize) {
2598 errno = sisusb_read_mem_bulk(sisusb, address,
2614 errno = sisusb_read_mem_bulk(sisusb, address,
2624 mutex_unlock(&sisusb->lock);
2633 if (sisusb_read_pci_config(sisusb, address, &buf32))
2648 mutex_unlock(&sisusb->lock);
2657 struct sisusb_usb_data *sisusb;
2664 if (!(sisusb = file->private_data))
2667 mutex_lock(&sisusb->lock);
2670 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2671 mutex_unlock(&sisusb->lock);
2692 else if (sisusb_write_memio_byte(sisusb,
2704 else if (sisusb_write_memio_word(sisusb,
2716 else if (sisusb_write_memio_long(sisusb,
2730 (*ppos) < SISUSB_PCI_PSEUDO_MEMBASE + sisusb->vramsize) {
2742 errno = sisusb_write_mem_bulk(sisusb, address, NULL,
2760 errno = sisusb_write_mem_bulk(sisusb, address, NULL,
2770 mutex_unlock(&sisusb->lock);
2781 else if (sisusb_write_pci_config(sisusb, address, buf32))
2796 mutex_unlock(&sisusb->lock);
2804 struct sisusb_usb_data *sisusb;
2807 if (!(sisusb = file->private_data))
2810 mutex_lock(&sisusb->lock);
2813 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2814 mutex_unlock(&sisusb->lock);
2834 mutex_unlock(&sisusb->lock);
2839 sisusb_handle_command(struct sisusb_usb_data *sisusb, struct sisusb_command *y,
2848 if (!sisusb->devinit)
2857 retval = sisusb_getidxreg(sisusb, port,
2867 retval = sisusb_setidxreg(sisusb, port,
2872 retval = sisusb_setidxregor(sisusb, port,
2877 retval = sisusb_setidxregand(sisusb, port,
2882 retval = sisusb_setidxregandor(sisusb, port,
2887 retval = sisusb_setidxregmask(sisusb, port,
2893 if (!sisusb->gfxinit)
2900 retval = sisusb_clear_vram(sisusb, address, length);
2907 if (!sisusb->gfxinit || !sisusb->SiS_Pr)
2912 retval = sisusb_reset_text_mode(sisusb, 0);
2915 sisusb->textmodedestroyed = 1;
2924 if (!sisusb->gfxinit || !sisusb->SiS_Pr)
2929 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30;
2930 sisusb->SiS_Pr->sisusb = (void *)sisusb;
2932 if (SiSUSBSetMode(sisusb->SiS_Pr, y->data3))
2939 if (!sisusb->gfxinit || !sisusb->SiS_Pr)
2944 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30;
2945 sisusb->SiS_Pr->sisusb = (void *)sisusb;
2947 if (SiSUSBSetVESAMode(sisusb->SiS_Pr, y->data3))
2966 struct sisusb_usb_data *sisusb;
2972 if (!(sisusb = file->private_data))
2975 mutex_lock(&sisusb->lock);
2978 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2998 x.sisusb_gfxinit = sisusb->gfxinit;
3003 x.sisusb_vramsize = sisusb->vramsize;
3004 x.sisusb_minor = sisusb->minor;
3007 x.sisusb_conactive = sisusb->haveconsole ? 1 : 0;
3023 retval = sisusb_handle_command(sisusb, &y, arg);
3033 mutex_unlock(&sisusb->lock);
3079 struct sisusb_usb_data *sisusb;
3086 if (!(sisusb = kzalloc(sizeof(*sisusb), GFP_KERNEL))) {
3087 dev_err(&sisusb->sisusb_dev->dev, "Failed to allocate memory for private data\n");
3090 kref_init(&sisusb->kref);
3092 mutex_init(&(sisusb->lock));
3096 dev_err(&sisusb->sisusb_dev->dev, "Failed to get a minor for device %d\n",
3102 sisusb->sisusb_dev = dev;
3103 sisusb->minor = intf->minor;
3104 sisusb->vrambase = SISUSB_PCI_MEMBASE;
3105 sisusb->mmiobase = SISUSB_PCI_MMIOBASE;
3106 sisusb->mmiosize = SISUSB_PCI_MMIOSIZE;
3107 sisusb->ioportbase = SISUSB_PCI_IOPORTBASE;
3111 sisusb->ibufsize = SISUSB_IBUF_SIZE;
3112 if (!(sisusb->ibuf = kmalloc(SISUSB_IBUF_SIZE, GFP_KERNEL))) {
3113 dev_err(&sisusb->sisusb_dev->dev, "Failed to allocate memory for input buffer");
3118 sisusb->numobufs = 0;
3119 sisusb->obufsize = SISUSB_OBUF_SIZE;
3121 if (!(sisusb->obuf[i] = kmalloc(SISUSB_OBUF_SIZE, GFP_KERNEL))) {
3123 dev_err(&sisusb->sisusb_dev->dev, "Failed to allocate memory for output buffer\n");
3129 sisusb->numobufs++;
3134 if (!(sisusb->sisurbin = usb_alloc_urb(0, GFP_KERNEL))) {
3135 dev_err(&sisusb->sisusb_dev->dev, "Failed to allocate URBs\n");
3139 sisusb->completein = 1;
3141 for (i = 0; i < sisusb->numobufs; i++) {
3142 if (!(sisusb->sisurbout[i] = usb_alloc_urb(0, GFP_KERNEL))) {
3143 dev_err(&sisusb->sisusb_dev->dev, "Failed to allocate URBs\n");
3147 sisusb->urbout_context[i].sisusb = (void *)sisusb;
3148 sisusb->urbout_context[i].urbindex = i;
3149 sisusb->urbstatus[i] = 0;
3152 dev_info(&sisusb->sisusb_dev->dev, "Allocated %d output buffers\n", sisusb->numobufs);
3156 if (!(sisusb->SiS_Pr = kmalloc(sizeof(struct SiS_Private), GFP_KERNEL))) {
3157 dev_err(&sisusb->sisusb_dev->dev, "Failed to allocate SiS_Pr\n");
3163 init_waitqueue_head(&sisusb->wait_q);
3165 usb_set_intfdata(intf, sisusb);
3167 usb_get_dev(sisusb->sisusb_dev);
3169 sisusb->present = 1;
3180 if (sisusb_init_gfxdevice(sisusb, initscreen))
3181 dev_err(&sisusb->sisusb_dev->dev, "Failed to early initialize device\n");
3184 dev_info(&sisusb->sisusb_dev->dev, "Not attached to USB 2.0 hub, deferring init\n");
3186 sisusb->ready = 1;
3189 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST ***\n");
3190 sisusb_testreadwrite(sisusb);
3191 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST END ***\n");
3195 sisusb_console_init(sisusb, sisusb_first_vc, sisusb_last_vc);
3201 sisusb_free_urbs(sisusb);
3203 sisusb_free_buffers(sisusb);
3207 kfree(sisusb);
3213 struct sisusb_usb_data *sisusb;
3216 if (!(sisusb = usb_get_intfdata(intf)))
3220 sisusb_console_exit(sisusb);
3225 mutex_lock(&sisusb->lock);
3228 if (!sisusb_wait_all_out_complete(sisusb))
3229 sisusb_kill_all_busy(sisusb);
3233 sisusb->present = 0;
3234 sisusb->ready = 0;
3236 mutex_unlock(&sisusb->lock);
3239 kref_put(&sisusb->kref, sisusb_delete);
3258 .name = "sisusb",