Lines Matching refs:sisusb

61 static void sisusb_free_buffers(struct sisusb_usb_data *sisusb)  in sisusb_free_buffers()  argument
66 kfree(sisusb->obuf[i]); in sisusb_free_buffers()
67 sisusb->obuf[i] = NULL; in sisusb_free_buffers()
69 kfree(sisusb->ibuf); in sisusb_free_buffers()
70 sisusb->ibuf = NULL; in sisusb_free_buffers()
73 static void sisusb_free_urbs(struct sisusb_usb_data *sisusb) in sisusb_free_urbs() argument
78 usb_free_urb(sisusb->sisurbout[i]); in sisusb_free_urbs()
79 sisusb->sisurbout[i] = NULL; in sisusb_free_urbs()
81 usb_free_urb(sisusb->sisurbin); in sisusb_free_urbs()
82 sisusb->sisurbin = NULL; in sisusb_free_urbs()
92 static int sisusb_all_free(struct sisusb_usb_data *sisusb) in sisusb_all_free() argument
96 for (i = 0; i < sisusb->numobufs; i++) { in sisusb_all_free()
98 if (sisusb->urbstatus[i] & SU_URB_BUSY) in sisusb_all_free()
107 static void sisusb_kill_all_busy(struct sisusb_usb_data *sisusb) in sisusb_kill_all_busy() argument
111 if (sisusb_all_free(sisusb)) in sisusb_kill_all_busy()
114 for (i = 0; i < sisusb->numobufs; i++) { in sisusb_kill_all_busy()
116 if (sisusb->urbstatus[i] & SU_URB_BUSY) in sisusb_kill_all_busy()
117 usb_kill_urb(sisusb->sisurbout[i]); in sisusb_kill_all_busy()
123 static int sisusb_wait_all_out_complete(struct sisusb_usb_data *sisusb) in sisusb_wait_all_out_complete() argument
127 wait_event_timeout(sisusb->wait_q, (i = sisusb_all_free(sisusb)), in sisusb_wait_all_out_complete()
133 static int sisusb_outurb_available(struct sisusb_usb_data *sisusb) in sisusb_outurb_available() argument
137 for (i = 0; i < sisusb->numobufs; i++) { in sisusb_outurb_available()
139 if ((sisusb->urbstatus[i] & (SU_URB_BUSY|SU_URB_ALLOC)) == 0) in sisusb_outurb_available()
147 static int sisusb_get_free_outbuf(struct sisusb_usb_data *sisusb) in sisusb_get_free_outbuf() argument
151 wait_event_timeout(sisusb->wait_q, in sisusb_get_free_outbuf()
152 ((i = sisusb_outurb_available(sisusb)) >= 0), timeout); in sisusb_get_free_outbuf()
157 static int sisusb_alloc_outbuf(struct sisusb_usb_data *sisusb) in sisusb_alloc_outbuf() argument
161 i = sisusb_outurb_available(sisusb); in sisusb_alloc_outbuf()
164 sisusb->urbstatus[i] |= SU_URB_ALLOC; in sisusb_alloc_outbuf()
169 static void sisusb_free_outbuf(struct sisusb_usb_data *sisusb, int index) in sisusb_free_outbuf() argument
171 if ((index >= 0) && (index < sisusb->numobufs)) in sisusb_free_outbuf()
172 sisusb->urbstatus[index] &= ~SU_URB_ALLOC; in sisusb_free_outbuf()
180 struct sisusb_usb_data *sisusb; in sisusb_bulk_completeout() local
185 sisusb = context->sisusb; in sisusb_bulk_completeout()
187 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present) in sisusb_bulk_completeout()
195 sisusb->urbstatus[context->urbindex] &= ~SU_URB_BUSY; in sisusb_bulk_completeout()
196 wake_up(&sisusb->wait_q); in sisusb_bulk_completeout()
199 static int sisusb_bulkout_msg(struct sisusb_usb_data *sisusb, int index, in sisusb_bulkout_msg() argument
203 struct urb *urb = sisusb->sisurbout[index]; in sisusb_bulkout_msg()
209 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, in sisusb_bulkout_msg()
211 &sisusb->urbout_context[index]); in sisusb_bulkout_msg()
217 sisusb->urbout_context[index].actual_length = (timeout) ? in sisusb_bulkout_msg()
221 sisusb->urbstatus[index] |= SU_URB_BUSY; in sisusb_bulkout_msg()
228 wait_event_timeout(sisusb->wait_q, in sisusb_bulkout_msg()
229 (!(sisusb->urbstatus[index] & SU_URB_BUSY)), in sisusb_bulkout_msg()
231 if (sisusb->urbstatus[index] & SU_URB_BUSY) { in sisusb_bulkout_msg()
254 struct sisusb_usb_data *sisusb = urb->context; in sisusb_bulk_completein() local
256 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present) in sisusb_bulk_completein()
259 sisusb->completein = 1; in sisusb_bulk_completein()
260 wake_up(&sisusb->wait_q); in sisusb_bulk_completein()
263 static int sisusb_bulkin_msg(struct sisusb_usb_data *sisusb, in sisusb_bulkin_msg() argument
267 struct urb *urb = sisusb->sisurbin; in sisusb_bulkin_msg()
272 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, in sisusb_bulkin_msg()
273 sisusb_bulk_completein, sisusb); in sisusb_bulkin_msg()
278 sisusb->completein = 0; in sisusb_bulkin_msg()
281 wait_event_timeout(sisusb->wait_q, sisusb->completein, timeout); in sisusb_bulkin_msg()
282 if (!sisusb->completein) { in sisusb_bulkin_msg()
315 static int sisusb_send_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len, in sisusb_send_bulk_msg() argument
329 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev) in sisusb_send_bulk_msg()
342 else if (len > sisusb->obufsize) in sisusb_send_bulk_msg()
345 pipe = usb_sndbulkpipe(sisusb->sisusb_dev, ep); in sisusb_send_bulk_msg()
348 passsize = thispass = (sisusb->obufsize < count) ? in sisusb_send_bulk_msg()
349 sisusb->obufsize : count; in sisusb_send_bulk_msg()
352 index = sisusb_get_free_outbuf(sisusb); in sisusb_send_bulk_msg()
357 buffer = sisusb->obuf[index]; in sisusb_send_bulk_msg()
376 if (!sisusb->sisusb_dev) in sisusb_send_bulk_msg()
379 result = sisusb_bulkout_msg(sisusb, index, pipe, in sisusb_send_bulk_msg()
418 sisusb_wait_all_out_complete(sisusb); in sisusb_send_bulk_msg()
436 static int sisusb_recv_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len, in sisusb_recv_bulk_msg() argument
448 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev) in sisusb_recv_bulk_msg()
451 pipe = usb_rcvbulkpipe(sisusb->sisusb_dev, ep); in sisusb_recv_bulk_msg()
452 buffer = sisusb->ibuf; in sisusb_recv_bulk_msg()
453 bufsize = sisusb->ibufsize; in sisusb_recv_bulk_msg()
458 if (!(sisusb_wait_all_out_complete(sisusb))) in sisusb_recv_bulk_msg()
464 if (!sisusb->sisusb_dev) in sisusb_recv_bulk_msg()
469 result = sisusb_bulkin_msg(sisusb, pipe, buffer, thispass, in sisusb_recv_bulk_msg()
512 static int sisusb_send_packet(struct sisusb_usb_data *sisusb, int len, in sisusb_send_packet() argument
523 if (!(sisusb_wait_all_out_complete(sisusb))) in sisusb_send_packet()
531 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_GFX_OUT, len, in sisusb_send_packet()
539 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_GFX_IN, 4, in sisusb_send_packet()
548 static int sisusb_send_bridge_packet(struct sisusb_usb_data *sisusb, int len, in sisusb_send_bridge_packet() argument
559 if (!(sisusb_wait_all_out_complete(sisusb))) in sisusb_send_bridge_packet()
567 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_BRIDGE_OUT, len, in sisusb_send_bridge_packet()
575 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_BRIDGE_IN, 4, in sisusb_send_bridge_packet()
596 static int sisusb_write_memio_byte(struct sisusb_usb_data *sisusb, int type, in sisusb_write_memio_byte() argument
604 return sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_byte()
607 static int sisusb_write_memio_word(struct sisusb_usb_data *sisusb, int type, in sisusb_write_memio_word() argument
619 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_word()
624 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_word()
629 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_word()
634 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_word()
638 ret |= sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_word()
644 static int sisusb_write_memio_24bit(struct sisusb_usb_data *sisusb, int type, in sisusb_write_memio_24bit() argument
656 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_24bit()
661 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_24bit()
666 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_24bit()
670 ret |= sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_24bit()
675 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_24bit()
679 ret |= sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_24bit()
685 static int sisusb_write_memio_long(struct sisusb_usb_data *sisusb, int type, in sisusb_write_memio_long() argument
697 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_long()
702 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_long()
706 ret |= sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_long()
711 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_long()
715 ret |= sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_long()
720 ret = sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_long()
724 ret |= sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_memio_long()
740 static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, in sisusb_write_mem_bulk() argument
756 kernbuffer = sisusb->obuf[index]; in sisusb_write_mem_bulk()
771 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, in sisusb_write_mem_bulk()
786 ret = sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM, in sisusb_write_mem_bulk()
818 ret = sisusb_write_memio_24bit(sisusb, SISUSB_TYPE_MEM, in sisusb_write_mem_bulk()
833 ret = sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM, in sisusb_write_mem_bulk()
846 ret = sisusb_send_bridge_packet(sisusb, 10, in sisusb_write_mem_bulk()
851 ret |= sisusb_send_bridge_packet(sisusb, 10, in sisusb_write_mem_bulk()
856 ret |= sisusb_send_bridge_packet(sisusb, 10, in sisusb_write_mem_bulk()
859 ret |= sisusb_send_bulk_msg(sisusb, in sisusb_write_mem_bulk()
866 ret |= sisusb_send_bulk_msg(sisusb, in sisusb_write_mem_bulk()
873 ret |= sisusb_send_bulk_msg(sisusb, in sisusb_write_mem_bulk()
879 (sisusb->obufsize-1)); in sisusb_write_mem_bulk()
887 ret = sisusb_send_bridge_packet(sisusb, 10, in sisusb_write_mem_bulk()
892 ret |= sisusb_send_bridge_packet(sisusb, 10, in sisusb_write_mem_bulk()
894 if (sisusb->flagb0 != 0x16) { in sisusb_write_mem_bulk()
898 ret |= sisusb_send_bridge_packet(sisusb, in sisusb_write_mem_bulk()
900 sisusb->flagb0 = 0x16; in sisusb_write_mem_bulk()
903 ret |= sisusb_send_bulk_msg(sisusb, in sisusb_write_mem_bulk()
910 ret |= sisusb_send_bulk_msg(sisusb, in sisusb_write_mem_bulk()
917 ret |= sisusb_send_bulk_msg(sisusb, in sisusb_write_mem_bulk()
923 (sisusb->obufsize-1)); in sisusb_write_mem_bulk()
929 dev_err(&sisusb->sisusb_dev->dev, in sisusb_write_mem_bulk()
934 dev_err(&sisusb->sisusb_dev->dev, in sisusb_write_mem_bulk()
953 static int sisusb_read_memio_byte(struct sisusb_usb_data *sisusb, int type, in sisusb_read_memio_byte() argument
962 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_byte()
967 static int sisusb_read_memio_word(struct sisusb_usb_data *sisusb, int type, in sisusb_read_memio_word() argument
980 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_word()
985 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_word()
990 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_word()
995 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_word()
999 ret |= sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_word()
1006 static int sisusb_read_memio_24bit(struct sisusb_usb_data *sisusb, int type, in sisusb_read_memio_24bit() argument
1017 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_24bit()
1022 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_24bit()
1027 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_24bit()
1031 ret |= sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_24bit()
1036 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_24bit()
1040 ret |= sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_24bit()
1047 static int sisusb_read_memio_long(struct sisusb_usb_data *sisusb, int type, in sisusb_read_memio_long() argument
1058 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_long()
1063 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_long()
1067 ret |= sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_long()
1072 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_long()
1076 ret |= sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_long()
1081 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_long()
1085 ret |= sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_memio_long()
1092 static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr, in sisusb_read_mem_bulk() argument
1108 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, in sisusb_read_mem_bulk()
1121 ret |= sisusb_read_memio_word(sisusb, SISUSB_TYPE_MEM, in sisusb_read_mem_bulk()
1135 ret |= sisusb_read_memio_24bit(sisusb, SISUSB_TYPE_MEM, in sisusb_read_mem_bulk()
1161 ret |= sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM, in sisusb_read_mem_bulk()
1187 static int sisusb_setidxreg(struct sisusb_usb_data *sisusb, u32 port, in sisusb_setidxreg() argument
1192 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index); in sisusb_setidxreg()
1193 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data); in sisusb_setidxreg()
1197 static int sisusb_getidxreg(struct sisusb_usb_data *sisusb, u32 port, in sisusb_getidxreg() argument
1202 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index); in sisusb_getidxreg()
1203 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data); in sisusb_getidxreg()
1207 static int sisusb_setidxregandor(struct sisusb_usb_data *sisusb, u32 port, u8 idx, in sisusb_setidxregandor() argument
1213 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx); in sisusb_setidxregandor()
1214 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp); in sisusb_setidxregandor()
1217 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp); in sisusb_setidxregandor()
1221 static int sisusb_setidxregmask(struct sisusb_usb_data *sisusb, in sisusb_setidxregmask() argument
1227 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx); in sisusb_setidxregmask()
1228 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp); in sisusb_setidxregmask()
1231 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp); in sisusb_setidxregmask()
1235 static int sisusb_setidxregor(struct sisusb_usb_data *sisusb, u32 port, in sisusb_setidxregor() argument
1238 return sisusb_setidxregandor(sisusb, port, index, 0xff, myor); in sisusb_setidxregor()
1241 static int sisusb_setidxregand(struct sisusb_usb_data *sisusb, u32 port, in sisusb_setidxregand() argument
1244 return sisusb_setidxregandor(sisusb, port, idx, myand, 0x00); in sisusb_setidxregand()
1250 static void sisusb_testreadwrite(struct sisusb_usb_data *sisusb) in sisusb_testreadwrite() argument
1256 sisusb_copy_memory(sisusb, srcbuffer, sisusb->vrambase, 7); in sisusb_testreadwrite()
1259 dev_dbg(&sisusb->sisusb_dev->dev, in sisusb_testreadwrite()
1261 sisusb_read_memory(sisusb, destbuffer, sisusb->vrambase, i); in sisusb_testreadwrite()
1263 dev_dbg(&sisusb->sisusb_dev->dev, in sisusb_testreadwrite()
1273 static int sisusb_write_pci_config(struct sisusb_usb_data *sisusb, in sisusb_write_pci_config() argument
1281 return sisusb_send_packet(sisusb, 10, &packet); in sisusb_write_pci_config()
1284 static int sisusb_read_pci_config(struct sisusb_usb_data *sisusb, in sisusb_read_pci_config() argument
1292 ret = sisusb_send_packet(sisusb, 6, &packet); in sisusb_read_pci_config()
1299 static int sisusb_clear_vram(struct sisusb_usb_data *sisusb, in sisusb_clear_vram() argument
1305 if (address < sisusb->vrambase) in sisusb_clear_vram()
1308 if (address >= sisusb->vrambase + sisusb->vramsize) in sisusb_clear_vram()
1311 if (address + length > sisusb->vrambase + sisusb->vramsize) in sisusb_clear_vram()
1312 length = sisusb->vrambase + sisusb->vramsize - address; in sisusb_clear_vram()
1318 i = sisusb_alloc_outbuf(sisusb); in sisusb_clear_vram()
1322 memset(sisusb->obuf[i], 0, sisusb->obufsize); in sisusb_clear_vram()
1327 ret = sisusb_write_mem_bulk(sisusb, address, NULL, length, NULL, i, &j); in sisusb_clear_vram()
1330 sisusb_free_outbuf(sisusb, i); in sisusb_clear_vram()
1340 #define GETREG(r, d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1341 #define SETREG(r, d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1342 #define SETIREG(r, i, d) sisusb_setidxreg(sisusb, r, i, d)
1343 #define GETIREG(r, i, d) sisusb_getidxreg(sisusb, r, i, d)
1344 #define SETIREGOR(r, i, o) sisusb_setidxregor(sisusb, r, i, o)
1345 #define SETIREGAND(r, i, a) sisusb_setidxregand(sisusb, r, i, a)
1346 #define SETIREGANDOR(r, i, a, o) sisusb_setidxregandor(sisusb, r, i, a, o)
1347 #define READL(a, d) sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1348 #define WRITEL(a, d) sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1349 #define READB(a, d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1350 #define WRITEB(a, d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1352 static int sisusb_triggersr16(struct sisusb_usb_data *sisusb, u8 ramtype) in sisusb_triggersr16() argument
1382 static int sisusb_getbuswidth(struct sisusb_usb_data *sisusb, in sisusb_getbuswidth() argument
1402 ret |= sisusb_triggersr16(sisusb, ramtype); in sisusb_getbuswidth()
1430 ret |= sisusb_triggersr16(sisusb, ramtype); in sisusb_getbuswidth()
1466 ret |= sisusb_triggersr16(sisusb, ramtype); in sisusb_getbuswidth()
1495 static int sisusb_verify_mclk(struct sisusb_usb_data *sisusb) in sisusb_verify_mclk() argument
1523 static int sisusb_set_rank(struct sisusb_usb_data *sisusb, int *iret, in sisusb_set_rank() argument
1548 ret |= sisusb_triggersr16(sisusb, 0); /* sic! */ in sisusb_set_rank()
1555 static int sisusb_check_rbc(struct sisusb_usb_data *sisusb, int *iret, in sisusb_check_rbc() argument
1564 ret |= WRITEL(sisusb->vrambase + j, j); in sisusb_check_rbc()
1569 ret |= READL(sisusb->vrambase + j, &tmp); in sisusb_check_rbc()
1580 static int sisusb_check_ranks(struct sisusb_usb_data *sisusb, in sisusb_check_ranks() argument
1591 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2); in sisusb_check_ranks()
1597 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 4); in sisusb_check_ranks()
1602 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2); in sisusb_check_ranks()
1610 static int sisusb_get_sdram_size(struct sisusb_usb_data *sisusb, int *iret, in sisusb_get_sdram_size() argument
1635 ret |= sisusb_set_rank(sisusb, &i2ret, i, j, chab, in sisusb_get_sdram_size()
1640 ret |= sisusb_check_ranks(sisusb, &i2ret, j, i, bw, in sisusb_get_sdram_size()
1652 static int sisusb_setup_screen(struct sisusb_usb_data *sisusb, in sisusb_setup_screen() argument
1661 address = sisusb->vrambase; /* Clear video ram */ in sisusb_setup_screen()
1664 length = sisusb->vramsize; in sisusb_setup_screen()
1668 ret = sisusb_clear_vram(sisusb, address, length); in sisusb_setup_screen()
1672 address = sisusb->vrambase + (i * bpp); in sisusb_setup_screen()
1673 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM, in sisusb_setup_screen()
1676 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM, in sisusb_setup_screen()
1680 address = sisusb->vrambase + ((i * modex) * bpp); in sisusb_setup_screen()
1681 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM, in sisusb_setup_screen()
1684 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM, in sisusb_setup_screen()
1692 static void sisusb_set_default_mode(struct sisusb_usb_data *sisusb, in sisusb_set_default_mode() argument
1820 static int sisusb_init_gfxcore(struct sisusb_usb_data *sisusb) in sisusb_init_gfxcore() argument
1945 ret |= sisusb_read_pci_config(sisusb, 0x50, &tmp32); in sisusb_init_gfxcore()
1962 sisusb_set_default_mode(sisusb, 0); in sisusb_init_gfxcore()
1968 ret |= sisusb_triggersr16(sisusb, ramtype); in sisusb_init_gfxcore()
1974 ret |= sisusb_getbuswidth(sisusb, &bw, &chab); in sisusb_init_gfxcore()
1975 ret |= sisusb_verify_mclk(sisusb); in sisusb_init_gfxcore()
1978 ret |= sisusb_get_sdram_size(sisusb, &iret, bw, chab); in sisusb_init_gfxcore()
1980 dev_err(&sisusb->sisusb_dev->dev, in sisusb_init_gfxcore()
1986 dev_err(&sisusb->sisusb_dev->dev, in sisusb_init_gfxcore()
2019 static void sisusb_get_ramconfig(struct sisusb_usb_data *sisusb) in sisusb_get_ramconfig() argument
2030 sisusb_getidxreg(sisusb, SISSR, 0x14, &tmp8); in sisusb_get_ramconfig()
2031 sisusb_getidxreg(sisusb, SISSR, 0x15, &tmp82); in sisusb_get_ramconfig()
2032 sisusb_getidxreg(sisusb, SISSR, 0x3a, &ramtype); in sisusb_get_ramconfig()
2033 sisusb->vramsize = (1 << ((tmp8 & 0xf0) >> 4)) * 1024 * 1024; in sisusb_get_ramconfig()
2046 sisusb->vramsize <<= 1; in sisusb_get_ramconfig()
2051 sisusb->vramsize += sisusb->vramsize/2; in sisusb_get_ramconfig()
2056 sisusb->vramsize <<= 1; in sisusb_get_ramconfig()
2061 dev_info(&sisusb->sisusb_dev->dev, in sisusb_get_ramconfig()
2063 sisusb->vramsize >> 20, ramtypetext1, in sisusb_get_ramconfig()
2067 static int sisusb_do_init_gfxdevice(struct sisusb_usb_data *sisusb) in sisusb_do_init_gfxdevice() argument
2077 ret = sisusb_send_bridge_packet(sisusb, 10, &packet, 0); in sisusb_do_init_gfxdevice()
2082 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0); in sisusb_do_init_gfxdevice()
2087 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0); in sisusb_do_init_gfxdevice()
2092 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0); in sisusb_do_init_gfxdevice()
2096 ret |= sisusb_send_bridge_packet(sisusb, 6, &packet, 0); in sisusb_do_init_gfxdevice()
2098 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0); in sisusb_do_init_gfxdevice()
2101 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32); in sisusb_do_init_gfxdevice()
2102 ret |= sisusb_write_pci_config(sisusb, 0x10, 0xfffffff0); in sisusb_do_init_gfxdevice()
2103 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32); in sisusb_do_init_gfxdevice()
2106 ret |= sisusb_write_pci_config(sisusb, 0x10, tmp32); in sisusb_do_init_gfxdevice()
2109 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32); in sisusb_do_init_gfxdevice()
2110 ret |= sisusb_write_pci_config(sisusb, 0x14, 0xfffffff0); in sisusb_do_init_gfxdevice()
2111 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32); in sisusb_do_init_gfxdevice()
2114 ret |= sisusb_write_pci_config(sisusb, 0x14, tmp32); in sisusb_do_init_gfxdevice()
2117 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32); in sisusb_do_init_gfxdevice()
2118 ret |= sisusb_write_pci_config(sisusb, 0x18, 0xfffffff0); in sisusb_do_init_gfxdevice()
2119 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32); in sisusb_do_init_gfxdevice()
2122 ret |= sisusb_write_pci_config(sisusb, 0x18, tmp32); in sisusb_do_init_gfxdevice()
2125 ret |= sisusb_read_pci_config(sisusb, 0x04, &tmp32); in sisusb_do_init_gfxdevice()
2127 ret |= sisusb_write_pci_config(sisusb, 0x04, tmp32); in sisusb_do_init_gfxdevice()
2134 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0); in sisusb_do_init_gfxdevice()
2145 static int sisusb_init_gfxdevice(struct sisusb_usb_data *sisusb, int initscreen) in sisusb_init_gfxdevice() argument
2150 if (sisusb->devinit == 1) { in sisusb_init_gfxdevice()
2152 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32); in sisusb_init_gfxdevice()
2159 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32); in sisusb_init_gfxdevice()
2166 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32); in sisusb_init_gfxdevice()
2175 if ((sisusb->devinit == 0) || (test != 3)) { in sisusb_init_gfxdevice()
2177 ret |= sisusb_do_init_gfxdevice(sisusb); in sisusb_init_gfxdevice()
2180 sisusb->devinit = 1; in sisusb_init_gfxdevice()
2184 if (sisusb->devinit) { in sisusb_init_gfxdevice()
2186 if (sisusb_init_gfxcore(sisusb) == 0) { in sisusb_init_gfxdevice()
2187 sisusb->gfxinit = 1; in sisusb_init_gfxdevice()
2188 sisusb_get_ramconfig(sisusb); in sisusb_init_gfxdevice()
2189 sisusb_set_default_mode(sisusb, 1); in sisusb_init_gfxdevice()
2190 ret |= sisusb_setup_screen(sisusb, 1, initscreen); in sisusb_init_gfxdevice()
2201 struct sisusb_usb_data *sisusb; in sisusb_open() local
2209 sisusb = usb_get_intfdata(interface); in sisusb_open()
2210 if (!sisusb) in sisusb_open()
2213 mutex_lock(&sisusb->lock); in sisusb_open()
2215 if (!sisusb->present || !sisusb->ready) { in sisusb_open()
2216 mutex_unlock(&sisusb->lock); in sisusb_open()
2220 if (sisusb->isopen) { in sisusb_open()
2221 mutex_unlock(&sisusb->lock); in sisusb_open()
2225 if (!sisusb->devinit) { in sisusb_open()
2226 if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH || in sisusb_open()
2227 sisusb->sisusb_dev->speed >= USB_SPEED_SUPER) { in sisusb_open()
2228 if (sisusb_init_gfxdevice(sisusb, 0)) { in sisusb_open()
2229 mutex_unlock(&sisusb->lock); in sisusb_open()
2230 dev_err(&sisusb->sisusb_dev->dev, in sisusb_open()
2235 mutex_unlock(&sisusb->lock); in sisusb_open()
2236 dev_err(&sisusb->sisusb_dev->dev, in sisusb_open()
2243 kref_get(&sisusb->kref); in sisusb_open()
2245 sisusb->isopen = 1; in sisusb_open()
2247 file->private_data = sisusb; in sisusb_open()
2249 mutex_unlock(&sisusb->lock); in sisusb_open()
2256 struct sisusb_usb_data *sisusb = to_sisusb_dev(kref); in sisusb_delete() local
2258 if (!sisusb) in sisusb_delete()
2261 usb_put_dev(sisusb->sisusb_dev); in sisusb_delete()
2263 sisusb->sisusb_dev = NULL; in sisusb_delete()
2264 sisusb_free_buffers(sisusb); in sisusb_delete()
2265 sisusb_free_urbs(sisusb); in sisusb_delete()
2266 kfree(sisusb); in sisusb_delete()
2271 struct sisusb_usb_data *sisusb; in sisusb_release() local
2273 sisusb = file->private_data; in sisusb_release()
2274 if (!sisusb) in sisusb_release()
2277 mutex_lock(&sisusb->lock); in sisusb_release()
2279 if (sisusb->present) { in sisusb_release()
2281 if (!sisusb_wait_all_out_complete(sisusb)) in sisusb_release()
2282 sisusb_kill_all_busy(sisusb); in sisusb_release()
2285 sisusb->isopen = 0; in sisusb_release()
2288 mutex_unlock(&sisusb->lock); in sisusb_release()
2291 kref_put(&sisusb->kref, sisusb_delete); in sisusb_release()
2299 struct sisusb_usb_data *sisusb; in sisusb_read() local
2306 sisusb = file->private_data; in sisusb_read()
2307 if (!sisusb) in sisusb_read()
2310 mutex_lock(&sisusb->lock); in sisusb_read()
2313 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { in sisusb_read()
2314 mutex_unlock(&sisusb->lock); in sisusb_read()
2331 if (sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, in sisusb_read()
2342 if (sisusb_read_memio_word(sisusb, SISUSB_TYPE_IO, in sisusb_read()
2353 if (sisusb_read_memio_long(sisusb, SISUSB_TYPE_IO, in sisusb_read()
2369 SISUSB_PCI_PSEUDO_MEMBASE + sisusb->vramsize) { in sisusb_read()
2377 errno = sisusb_read_mem_bulk(sisusb, address, in sisusb_read()
2393 errno = sisusb_read_mem_bulk(sisusb, address, in sisusb_read()
2403 mutex_unlock(&sisusb->lock); in sisusb_read()
2412 if (sisusb_read_pci_config(sisusb, address, &buf32)) in sisusb_read()
2427 mutex_unlock(&sisusb->lock); in sisusb_read()
2435 struct sisusb_usb_data *sisusb; in sisusb_write() local
2442 sisusb = file->private_data; in sisusb_write()
2443 if (!sisusb) in sisusb_write()
2446 mutex_lock(&sisusb->lock); in sisusb_write()
2449 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { in sisusb_write()
2450 mutex_unlock(&sisusb->lock); in sisusb_write()
2469 else if (sisusb_write_memio_byte(sisusb, in sisusb_write()
2480 else if (sisusb_write_memio_word(sisusb, in sisusb_write()
2491 else if (sisusb_write_memio_long(sisusb, in sisusb_write()
2505 sisusb->vramsize) { in sisusb_write()
2516 errno = sisusb_write_mem_bulk(sisusb, address, NULL, in sisusb_write()
2534 errno = sisusb_write_mem_bulk(sisusb, address, NULL, in sisusb_write()
2545 mutex_unlock(&sisusb->lock); in sisusb_write()
2556 else if (sisusb_write_pci_config(sisusb, address, buf32)) in sisusb_write()
2571 mutex_unlock(&sisusb->lock); in sisusb_write()
2578 struct sisusb_usb_data *sisusb; in sisusb_lseek() local
2581 sisusb = file->private_data; in sisusb_lseek()
2582 if (!sisusb) in sisusb_lseek()
2585 mutex_lock(&sisusb->lock); in sisusb_lseek()
2588 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { in sisusb_lseek()
2589 mutex_unlock(&sisusb->lock); in sisusb_lseek()
2595 mutex_unlock(&sisusb->lock); in sisusb_lseek()
2599 static int sisusb_handle_command(struct sisusb_usb_data *sisusb, in sisusb_handle_command() argument
2608 if (!sisusb->devinit) in sisusb_handle_command()
2617 retval = sisusb_getidxreg(sisusb, port, y->data0, &y->data1); in sisusb_handle_command()
2625 retval = sisusb_setidxreg(sisusb, port, y->data0, y->data1); in sisusb_handle_command()
2629 retval = sisusb_setidxregor(sisusb, port, y->data0, y->data1); in sisusb_handle_command()
2633 retval = sisusb_setidxregand(sisusb, port, y->data0, y->data1); in sisusb_handle_command()
2637 retval = sisusb_setidxregandor(sisusb, port, y->data0, in sisusb_handle_command()
2642 retval = sisusb_setidxregmask(sisusb, port, y->data0, in sisusb_handle_command()
2648 if (!sisusb->gfxinit) in sisusb_handle_command()
2654 retval = sisusb_clear_vram(sisusb, address, length); in sisusb_handle_command()
2673 struct sisusb_usb_data *sisusb; in sisusb_ioctl() local
2679 sisusb = file->private_data; in sisusb_ioctl()
2680 if (!sisusb) in sisusb_ioctl()
2683 mutex_lock(&sisusb->lock); in sisusb_ioctl()
2686 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { in sisusb_ioctl()
2705 x.sisusb_gfxinit = sisusb->gfxinit; in sisusb_ioctl()
2710 x.sisusb_vramsize = sisusb->vramsize; in sisusb_ioctl()
2711 x.sisusb_minor = sisusb->minor; in sisusb_ioctl()
2726 retval = sisusb_handle_command(sisusb, &y, arg); in sisusb_ioctl()
2736 mutex_unlock(&sisusb->lock); in sisusb_ioctl()
2779 struct sisusb_usb_data *sisusb; in sisusb_probe() local
2800 sisusb = kzalloc(sizeof(*sisusb), GFP_KERNEL); in sisusb_probe()
2801 if (!sisusb) in sisusb_probe()
2804 kref_init(&sisusb->kref); in sisusb_probe()
2806 mutex_init(&(sisusb->lock)); in sisusb_probe()
2808 sisusb->sisusb_dev = dev; in sisusb_probe()
2809 sisusb->vrambase = SISUSB_PCI_MEMBASE; in sisusb_probe()
2810 sisusb->mmiobase = SISUSB_PCI_MMIOBASE; in sisusb_probe()
2811 sisusb->mmiosize = SISUSB_PCI_MMIOSIZE; in sisusb_probe()
2812 sisusb->ioportbase = SISUSB_PCI_IOPORTBASE; in sisusb_probe()
2818 dev_err(&sisusb->sisusb_dev->dev, in sisusb_probe()
2825 sisusb->minor = intf->minor; in sisusb_probe()
2828 sisusb->ibufsize = SISUSB_IBUF_SIZE; in sisusb_probe()
2829 sisusb->ibuf = kmalloc(SISUSB_IBUF_SIZE, GFP_KERNEL); in sisusb_probe()
2830 if (!sisusb->ibuf) { in sisusb_probe()
2835 sisusb->numobufs = 0; in sisusb_probe()
2836 sisusb->obufsize = SISUSB_OBUF_SIZE; in sisusb_probe()
2838 sisusb->obuf[i] = kmalloc(SISUSB_OBUF_SIZE, GFP_KERNEL); in sisusb_probe()
2839 if (!sisusb->obuf[i]) { in sisusb_probe()
2846 sisusb->numobufs++; in sisusb_probe()
2850 sisusb->sisurbin = usb_alloc_urb(0, GFP_KERNEL); in sisusb_probe()
2851 if (!sisusb->sisurbin) { in sisusb_probe()
2855 sisusb->completein = 1; in sisusb_probe()
2857 for (i = 0; i < sisusb->numobufs; i++) { in sisusb_probe()
2858 sisusb->sisurbout[i] = usb_alloc_urb(0, GFP_KERNEL); in sisusb_probe()
2859 if (!sisusb->sisurbout[i]) { in sisusb_probe()
2863 sisusb->urbout_context[i].sisusb = (void *)sisusb; in sisusb_probe()
2864 sisusb->urbout_context[i].urbindex = i; in sisusb_probe()
2865 sisusb->urbstatus[i] = 0; in sisusb_probe()
2868 dev_info(&sisusb->sisusb_dev->dev, "Allocated %d output buffers\n", in sisusb_probe()
2869 sisusb->numobufs); in sisusb_probe()
2873 init_waitqueue_head(&sisusb->wait_q); in sisusb_probe()
2875 usb_set_intfdata(intf, sisusb); in sisusb_probe()
2877 usb_get_dev(sisusb->sisusb_dev); in sisusb_probe()
2879 sisusb->present = 1; in sisusb_probe()
2883 if (sisusb_init_gfxdevice(sisusb, initscreen)) in sisusb_probe()
2884 dev_err(&sisusb->sisusb_dev->dev, in sisusb_probe()
2888 dev_info(&sisusb->sisusb_dev->dev, in sisusb_probe()
2891 sisusb->ready = 1; in sisusb_probe()
2894 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST ***\n"); in sisusb_probe()
2895 sisusb_testreadwrite(sisusb); in sisusb_probe()
2896 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST END ***\n"); in sisusb_probe()
2902 sisusb_free_urbs(sisusb); in sisusb_probe()
2904 sisusb_free_buffers(sisusb); in sisusb_probe()
2908 kfree(sisusb); in sisusb_probe()
2914 struct sisusb_usb_data *sisusb; in sisusb_disconnect() local
2917 sisusb = usb_get_intfdata(intf); in sisusb_disconnect()
2918 if (!sisusb) in sisusb_disconnect()
2923 mutex_lock(&sisusb->lock); in sisusb_disconnect()
2926 if (!sisusb_wait_all_out_complete(sisusb)) in sisusb_disconnect()
2927 sisusb_kill_all_busy(sisusb); in sisusb_disconnect()
2931 sisusb->present = 0; in sisusb_disconnect()
2932 sisusb->ready = 0; in sisusb_disconnect()
2934 mutex_unlock(&sisusb->lock); in sisusb_disconnect()
2937 kref_put(&sisusb->kref, sisusb_delete); in sisusb_disconnect()