Lines Matching refs:dec

204 static void ttusb_dec_set_model(struct ttusb_dec *dec,
209 struct ttusb_dec * dec = urb->context; in ttusb_dec_handle_irq() local
210 char *buffer = dec->irq_buffer; in ttusb_dec_handle_irq()
241 input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 1); in ttusb_dec_handle_irq()
242 input_sync(dec->rc_input_dev); in ttusb_dec_handle_irq()
243 input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 0); in ttusb_dec_handle_irq()
244 input_sync(dec->rc_input_dev); in ttusb_dec_handle_irq()
266 static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command, in ttusb_dec_send_command() argument
279 if ((result = mutex_lock_interruptible(&dec->usb_mutex))) { in ttusb_dec_send_command()
286 b[1] = ++dec->trans_count; in ttusb_dec_send_command()
300 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, in ttusb_dec_send_command()
306 mutex_unlock(&dec->usb_mutex); in ttusb_dec_send_command()
311 result = usb_bulk_msg(dec->udev, dec->result_pipe, b, in ttusb_dec_send_command()
317 mutex_unlock(&dec->usb_mutex); in ttusb_dec_send_command()
333 mutex_unlock(&dec->usb_mutex); in ttusb_dec_send_command()
340 static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode, in ttusb_dec_get_stb_state() argument
350 result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c); in ttusb_dec_get_stb_state()
375 struct ttusb_dec *dec = priv; in ttusb_dec_audio_pes2ts_cb() local
377 dec->audio_filter->feed->cb.ts(data, 188, NULL, 0, in ttusb_dec_audio_pes2ts_cb()
378 &dec->audio_filter->feed->feed.ts, in ttusb_dec_audio_pes2ts_cb()
386 struct ttusb_dec *dec = priv; in ttusb_dec_video_pes2ts_cb() local
388 dec->video_filter->feed->cb.ts(data, 188, NULL, 0, in ttusb_dec_video_pes2ts_cb()
389 &dec->video_filter->feed->feed.ts, in ttusb_dec_video_pes2ts_cb()
395 static void ttusb_dec_set_pids(struct ttusb_dec *dec) in ttusb_dec_set_pids() argument
401 __be16 pcr = htons(dec->pid[DMX_PES_PCR]); in ttusb_dec_set_pids()
402 __be16 audio = htons(dec->pid[DMX_PES_AUDIO]); in ttusb_dec_set_pids()
403 __be16 video = htons(dec->pid[DMX_PES_VIDEO]); in ttusb_dec_set_pids()
411 ttusb_dec_send_command(dec, 0x50, sizeof(b), b, NULL, NULL); in ttusb_dec_set_pids()
413 dvb_filter_pes2ts_init(&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO], in ttusb_dec_set_pids()
414 ttusb_dec_audio_pes2ts_cb, dec); in ttusb_dec_set_pids()
415 dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO], in ttusb_dec_set_pids()
416 ttusb_dec_video_pes2ts_cb, dec); in ttusb_dec_set_pids()
417 dec->v_pes_length = 0; in ttusb_dec_set_pids()
418 dec->v_pes_postbytes = 0; in ttusb_dec_set_pids()
421 static void ttusb_dec_process_pva(struct ttusb_dec *dec, u8 *pva, int length) in ttusb_dec_process_pva() argument
441 dec->video_filter->feed->cb.ts(pva, length, NULL, 0, in ttusb_dec_process_pva()
442 &dec->video_filter->feed->feed.ts, DMX_OK); in ttusb_dec_process_pva()
446 if (dec->v_pes_postbytes > 0 && in ttusb_dec_process_pva()
447 dec->v_pes_postbytes == prebytes) { in ttusb_dec_process_pva()
448 memcpy(&dec->v_pes[dec->v_pes_length], in ttusb_dec_process_pva()
451 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes, in ttusb_dec_process_pva()
452 dec->v_pes_length + prebytes, 1); in ttusb_dec_process_pva()
456 dec->v_pes[7] = 0x80; in ttusb_dec_process_pva()
457 dec->v_pes[8] = 0x05; in ttusb_dec_process_pva()
459 dec->v_pes[9] = 0x21 | ((pva[8] & 0xc0) >> 5); in ttusb_dec_process_pva()
460 dec->v_pes[10] = ((pva[8] & 0x3f) << 2) | in ttusb_dec_process_pva()
462 dec->v_pes[11] = 0x01 | in ttusb_dec_process_pva()
465 dec->v_pes[12] = ((pva[10] & 0x7f) << 1) | in ttusb_dec_process_pva()
467 dec->v_pes[13] = 0x01 | ((pva[11] & 0x7f) << 1); in ttusb_dec_process_pva()
469 memcpy(&dec->v_pes[14], &pva[12 + prebytes], in ttusb_dec_process_pva()
471 dec->v_pes_length = 14 + length - 12 - prebytes; in ttusb_dec_process_pva()
473 dec->v_pes[7] = 0x00; in ttusb_dec_process_pva()
474 dec->v_pes[8] = 0x00; in ttusb_dec_process_pva()
476 memcpy(&dec->v_pes[9], &pva[8], length - 8); in ttusb_dec_process_pva()
477 dec->v_pes_length = 9 + length - 8; in ttusb_dec_process_pva()
480 dec->v_pes_postbytes = postbytes; in ttusb_dec_process_pva()
482 if (dec->v_pes[9 + dec->v_pes[8]] == 0x00 && in ttusb_dec_process_pva()
483 dec->v_pes[10 + dec->v_pes[8]] == 0x00 && in ttusb_dec_process_pva()
484 dec->v_pes[11 + dec->v_pes[8]] == 0x01) in ttusb_dec_process_pva()
485 dec->v_pes[6] = 0x84; in ttusb_dec_process_pva()
487 dec->v_pes[6] = 0x80; in ttusb_dec_process_pva()
489 v_pes_payload_length = htons(dec->v_pes_length - 6 + in ttusb_dec_process_pva()
491 memcpy(&dec->v_pes[4], &v_pes_payload_length, 2); in ttusb_dec_process_pva()
494 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes, in ttusb_dec_process_pva()
495 dec->v_pes_length, 1); in ttusb_dec_process_pva()
502 dec->audio_filter->feed->cb.ts(pva, length, NULL, 0, in ttusb_dec_process_pva()
503 &dec->audio_filter->feed->feed.ts, DMX_OK); in ttusb_dec_process_pva()
507 dvb_filter_pes2ts(&dec->a_pes2ts, &pva[8], length - 8, in ttusb_dec_process_pva()
518 static void ttusb_dec_process_filter(struct ttusb_dec *dec, u8 *packet, in ttusb_dec_process_filter() argument
528 spin_lock_irqsave(&dec->filter_info_list_lock, flags); in ttusb_dec_process_filter()
529 for (item = dec->filter_info_list.next; item != &dec->filter_info_list; in ttusb_dec_process_filter()
537 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags); in ttusb_dec_process_filter()
544 static void ttusb_dec_process_packet(struct ttusb_dec *dec) in ttusb_dec_process_packet() argument
550 if (dec->packet_length % 2) { in ttusb_dec_process_packet()
555 for (i = 0; i < dec->packet_length; i += 2) in ttusb_dec_process_packet()
556 csum ^= ((dec->packet[i] << 8) + dec->packet[i + 1]); in ttusb_dec_process_packet()
563 packet_id = dec->packet[dec->packet_length - 4] << 8; in ttusb_dec_process_packet()
564 packet_id += dec->packet[dec->packet_length - 3]; in ttusb_dec_process_packet()
566 if ((packet_id != dec->next_packet_id) && dec->next_packet_id) { in ttusb_dec_process_packet()
568 __func__, dec->next_packet_id - 1, packet_id); in ttusb_dec_process_packet()
572 dec->next_packet_id = 0x8000; in ttusb_dec_process_packet()
574 dec->next_packet_id = packet_id + 1; in ttusb_dec_process_packet()
576 switch (dec->packet_type) { in ttusb_dec_process_packet()
578 if (dec->pva_stream_count) in ttusb_dec_process_packet()
579 ttusb_dec_process_pva(dec, dec->packet, in ttusb_dec_process_packet()
580 dec->packet_payload_length); in ttusb_dec_process_packet()
584 if (dec->filter_stream_count) in ttusb_dec_process_packet()
585 ttusb_dec_process_filter(dec, dec->packet, in ttusb_dec_process_packet()
586 dec->packet_payload_length); in ttusb_dec_process_packet()
606 static void ttusb_dec_process_urb_frame(struct ttusb_dec *dec, u8 *b, in ttusb_dec_process_urb_frame() argument
612 switch (dec->packet_state) { in ttusb_dec_process_urb_frame()
618 dec->packet_state++; in ttusb_dec_process_urb_frame()
620 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
627 dec->packet_state++; in ttusb_dec_process_urb_frame()
628 dec->packet_length = 0; in ttusb_dec_process_urb_frame()
630 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
638 dec->packet[dec->packet_length++] = *b++; in ttusb_dec_process_urb_frame()
640 if (dec->packet_length == 2) { in ttusb_dec_process_urb_frame()
641 if (dec->packet[0] == 'A' && in ttusb_dec_process_urb_frame()
642 dec->packet[1] == 'V') { in ttusb_dec_process_urb_frame()
643 dec->packet_type = in ttusb_dec_process_urb_frame()
645 dec->packet_state++; in ttusb_dec_process_urb_frame()
646 } else if (dec->packet[0] == 'S') { in ttusb_dec_process_urb_frame()
647 dec->packet_type = in ttusb_dec_process_urb_frame()
649 dec->packet_state++; in ttusb_dec_process_urb_frame()
650 } else if (dec->packet[0] == 0x00) { in ttusb_dec_process_urb_frame()
651 dec->packet_type = in ttusb_dec_process_urb_frame()
653 dec->packet_payload_length = 2; in ttusb_dec_process_urb_frame()
654 dec->packet_state = 7; in ttusb_dec_process_urb_frame()
658 dec->packet[0], dec->packet[1]); in ttusb_dec_process_urb_frame()
659 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
667 dec->packet[dec->packet_length++] = *b++; in ttusb_dec_process_urb_frame()
669 if (dec->packet_type == TTUSB_DEC_PACKET_PVA && in ttusb_dec_process_urb_frame()
670 dec->packet_length == 8) { in ttusb_dec_process_urb_frame()
671 dec->packet_state++; in ttusb_dec_process_urb_frame()
672 dec->packet_payload_length = 8 + in ttusb_dec_process_urb_frame()
673 (dec->packet[6] << 8) + in ttusb_dec_process_urb_frame()
674 dec->packet[7]; in ttusb_dec_process_urb_frame()
675 } else if (dec->packet_type == in ttusb_dec_process_urb_frame()
677 dec->packet_length == 5) { in ttusb_dec_process_urb_frame()
678 dec->packet_state++; in ttusb_dec_process_urb_frame()
679 dec->packet_payload_length = 5 + in ttusb_dec_process_urb_frame()
680 ((dec->packet[3] & 0x0f) << 8) + in ttusb_dec_process_urb_frame()
681 dec->packet[4]; in ttusb_dec_process_urb_frame()
688 int remainder = dec->packet_payload_length - in ttusb_dec_process_urb_frame()
689 dec->packet_length; in ttusb_dec_process_urb_frame()
692 memcpy(dec->packet + dec->packet_length, in ttusb_dec_process_urb_frame()
694 dec->packet_length += remainder; in ttusb_dec_process_urb_frame()
697 dec->packet_state++; in ttusb_dec_process_urb_frame()
699 memcpy(&dec->packet[dec->packet_length], in ttusb_dec_process_urb_frame()
701 dec->packet_length += length; in ttusb_dec_process_urb_frame()
711 dec->packet[dec->packet_length++] = *b++; in ttusb_dec_process_urb_frame()
713 if (dec->packet_type == TTUSB_DEC_PACKET_SECTION && in ttusb_dec_process_urb_frame()
714 dec->packet_payload_length % 2) in ttusb_dec_process_urb_frame()
717 if (dec->packet_length == in ttusb_dec_process_urb_frame()
718 dec->packet_payload_length + tail) { in ttusb_dec_process_urb_frame()
719 ttusb_dec_process_packet(dec); in ttusb_dec_process_urb_frame()
720 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
730 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
737 struct ttusb_dec *dec = (struct ttusb_dec *)data; in ttusb_dec_process_urb_frame_list() local
743 spin_lock_irqsave(&dec->urb_frame_list_lock, flags); in ttusb_dec_process_urb_frame_list()
744 if ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { in ttusb_dec_process_urb_frame_list()
749 spin_unlock_irqrestore(&dec->urb_frame_list_lock, in ttusb_dec_process_urb_frame_list()
753 spin_unlock_irqrestore(&dec->urb_frame_list_lock, flags); in ttusb_dec_process_urb_frame_list()
755 ttusb_dec_process_urb_frame(dec, frame->data, frame->length); in ttusb_dec_process_urb_frame_list()
762 struct ttusb_dec *dec = urb->context; in ttusb_dec_process_urb() local
784 spin_lock_irqsave(&dec->urb_frame_list_lock, in ttusb_dec_process_urb()
787 &dec->urb_frame_list); in ttusb_dec_process_urb()
788 spin_unlock_irqrestore(&dec->urb_frame_list_lock, in ttusb_dec_process_urb()
791 tasklet_schedule(&dec->urb_tasklet); in ttusb_dec_process_urb()
801 if (dec->iso_stream_count) in ttusb_dec_process_urb()
805 static void ttusb_dec_setup_urbs(struct ttusb_dec *dec) in ttusb_dec_setup_urbs() argument
813 struct urb *urb = dec->iso_urb[i]; in ttusb_dec_setup_urbs()
815 urb->dev = dec->udev; in ttusb_dec_setup_urbs()
816 urb->context = dec; in ttusb_dec_setup_urbs()
818 urb->pipe = dec->in_pipe; in ttusb_dec_setup_urbs()
824 urb->transfer_buffer = dec->iso_buffer + buffer_offset; in ttusb_dec_setup_urbs()
835 static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec) in ttusb_dec_stop_iso_xfer() argument
841 if (mutex_lock_interruptible(&dec->iso_mutex)) in ttusb_dec_stop_iso_xfer()
844 dec->iso_stream_count--; in ttusb_dec_stop_iso_xfer()
846 if (!dec->iso_stream_count) { in ttusb_dec_stop_iso_xfer()
848 usb_kill_urb(dec->iso_urb[i]); in ttusb_dec_stop_iso_xfer()
851 mutex_unlock(&dec->iso_mutex); in ttusb_dec_stop_iso_xfer()
858 static int ttusb_dec_set_interface(struct ttusb_dec *dec, in ttusb_dec_set_interface() argument
864 if (interface != dec->interface) { in ttusb_dec_set_interface()
867 result = usb_set_interface(dec->udev, 0, 0); in ttusb_dec_set_interface()
870 result = ttusb_dec_send_command(dec, 0x80, sizeof(b), in ttusb_dec_set_interface()
874 result = usb_set_interface(dec->udev, 0, 8); in ttusb_dec_set_interface()
877 result = usb_set_interface(dec->udev, 0, 1); in ttusb_dec_set_interface()
884 dec->interface = interface; in ttusb_dec_set_interface()
890 static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec) in ttusb_dec_start_iso_xfer() argument
896 if (mutex_lock_interruptible(&dec->iso_mutex)) in ttusb_dec_start_iso_xfer()
899 if (!dec->iso_stream_count) { in ttusb_dec_start_iso_xfer()
900 ttusb_dec_setup_urbs(dec); in ttusb_dec_start_iso_xfer()
902 dec->packet_state = 0; in ttusb_dec_start_iso_xfer()
903 dec->v_pes_postbytes = 0; in ttusb_dec_start_iso_xfer()
904 dec->next_packet_id = 0; in ttusb_dec_start_iso_xfer()
907 if ((result = usb_submit_urb(dec->iso_urb[i], in ttusb_dec_start_iso_xfer()
913 usb_kill_urb(dec->iso_urb[i - 1]); in ttusb_dec_start_iso_xfer()
917 mutex_unlock(&dec->iso_mutex); in ttusb_dec_start_iso_xfer()
923 dec->iso_stream_count++; in ttusb_dec_start_iso_xfer()
925 mutex_unlock(&dec->iso_mutex); in ttusb_dec_start_iso_xfer()
933 struct ttusb_dec *dec = dvbdmx->priv; in ttusb_dec_start_ts_feed() local
956 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
957 dec->pid[DMX_PES_VIDEO] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
958 dec->video_filter = dvbdmxfeed->filter; in ttusb_dec_start_ts_feed()
959 ttusb_dec_set_pids(dec); in ttusb_dec_start_ts_feed()
964 dec->pid[DMX_PES_AUDIO] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
965 dec->audio_filter = dvbdmxfeed->filter; in ttusb_dec_start_ts_feed()
966 ttusb_dec_set_pids(dec); in ttusb_dec_start_ts_feed()
970 dec->pid[DMX_PES_TELETEXT] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
976 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
977 ttusb_dec_set_pids(dec); in ttusb_dec_start_ts_feed()
990 result = ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL); in ttusb_dec_start_ts_feed()
994 dec->pva_stream_count++; in ttusb_dec_start_ts_feed()
995 return ttusb_dec_start_iso_xfer(dec); in ttusb_dec_start_ts_feed()
1000 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; in ttusb_dec_start_sec_feed() local
1024 result = ttusb_dec_send_command(dec, 0x60, sizeof(b0), b0, in ttusb_dec_start_sec_feed()
1036 spin_lock_irqsave(&dec->filter_info_list_lock, flags); in ttusb_dec_start_sec_feed()
1038 &dec->filter_info_list); in ttusb_dec_start_sec_feed()
1039 spin_unlock_irqrestore(&dec->filter_info_list_lock, in ttusb_dec_start_sec_feed()
1044 dec->filter_stream_count++; in ttusb_dec_start_sec_feed()
1045 return ttusb_dec_start_iso_xfer(dec); in ttusb_dec_start_sec_feed()
1083 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; in ttusb_dec_stop_ts_feed() local
1086 ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL); in ttusb_dec_stop_ts_feed()
1088 dec->pva_stream_count--; in ttusb_dec_stop_ts_feed()
1090 ttusb_dec_stop_iso_xfer(dec); in ttusb_dec_stop_ts_feed()
1097 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; in ttusb_dec_stop_sec_feed() local
1103 spin_lock_irqsave(&dec->filter_info_list_lock, flags); in ttusb_dec_stop_sec_feed()
1105 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags); in ttusb_dec_stop_sec_feed()
1107 ttusb_dec_send_command(dec, 0x62, sizeof(b0), b0, NULL, NULL); in ttusb_dec_stop_sec_feed()
1109 dec->filter_stream_count--; in ttusb_dec_stop_sec_feed()
1111 ttusb_dec_stop_iso_xfer(dec); in ttusb_dec_stop_sec_feed()
1133 static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec) in ttusb_dec_free_iso_urbs() argument
1140 usb_free_urb(dec->iso_urb[i]); in ttusb_dec_free_iso_urbs()
1145 dec->iso_buffer, dec->iso_dma_handle); in ttusb_dec_free_iso_urbs()
1148 static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec) in ttusb_dec_alloc_iso_urbs() argument
1154 dec->iso_buffer = pci_zalloc_consistent(NULL, in ttusb_dec_alloc_iso_urbs()
1156 &dec->iso_dma_handle); in ttusb_dec_alloc_iso_urbs()
1158 if (!dec->iso_buffer) { in ttusb_dec_alloc_iso_urbs()
1168 ttusb_dec_free_iso_urbs(dec); in ttusb_dec_alloc_iso_urbs()
1172 dec->iso_urb[i] = urb; in ttusb_dec_alloc_iso_urbs()
1175 ttusb_dec_setup_urbs(dec); in ttusb_dec_alloc_iso_urbs()
1180 static void ttusb_dec_init_tasklet(struct ttusb_dec *dec) in ttusb_dec_init_tasklet() argument
1182 spin_lock_init(&dec->urb_frame_list_lock); in ttusb_dec_init_tasklet()
1183 INIT_LIST_HEAD(&dec->urb_frame_list); in ttusb_dec_init_tasklet()
1184 tasklet_init(&dec->urb_tasklet, ttusb_dec_process_urb_frame_list, in ttusb_dec_init_tasklet()
1185 (unsigned long)dec); in ttusb_dec_init_tasklet()
1188 static int ttusb_init_rc( struct ttusb_dec *dec) in ttusb_init_rc() argument
1195 usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys)); in ttusb_init_rc()
1196 strlcat(dec->rc_phys, "/input0", sizeof(dec->rc_phys)); in ttusb_init_rc()
1203 input_dev->phys = dec->rc_phys; in ttusb_init_rc()
1218 dec->rc_input_dev = input_dev; in ttusb_init_rc()
1219 if (usb_submit_urb(dec->irq_urb, GFP_KERNEL)) in ttusb_init_rc()
1222 ttusb_dec_send_command(dec,0xb0,sizeof(b),b,NULL,NULL); in ttusb_init_rc()
1227 static void ttusb_dec_init_v_pes(struct ttusb_dec *dec) in ttusb_dec_init_v_pes() argument
1231 dec->v_pes[0] = 0x00; in ttusb_dec_init_v_pes()
1232 dec->v_pes[1] = 0x00; in ttusb_dec_init_v_pes()
1233 dec->v_pes[2] = 0x01; in ttusb_dec_init_v_pes()
1234 dec->v_pes[3] = 0xe0; in ttusb_dec_init_v_pes()
1237 static int ttusb_dec_init_usb(struct ttusb_dec *dec) in ttusb_dec_init_usb() argument
1243 mutex_init(&dec->usb_mutex); in ttusb_dec_init_usb()
1244 mutex_init(&dec->iso_mutex); in ttusb_dec_init_usb()
1246 dec->command_pipe = usb_sndbulkpipe(dec->udev, COMMAND_PIPE); in ttusb_dec_init_usb()
1247 dec->result_pipe = usb_rcvbulkpipe(dec->udev, RESULT_PIPE); in ttusb_dec_init_usb()
1248 dec->in_pipe = usb_rcvisocpipe(dec->udev, IN_PIPE); in ttusb_dec_init_usb()
1249 dec->out_pipe = usb_sndisocpipe(dec->udev, OUT_PIPE); in ttusb_dec_init_usb()
1250 dec->irq_pipe = usb_rcvintpipe(dec->udev, IRQ_PIPE); in ttusb_dec_init_usb()
1253 dec->irq_urb = usb_alloc_urb(0, GFP_KERNEL); in ttusb_dec_init_usb()
1254 if(!dec->irq_urb) { in ttusb_dec_init_usb()
1257 dec->irq_buffer = usb_alloc_coherent(dec->udev,IRQ_PACKET_SIZE, in ttusb_dec_init_usb()
1258 GFP_KERNEL, &dec->irq_dma_handle); in ttusb_dec_init_usb()
1259 if(!dec->irq_buffer) { in ttusb_dec_init_usb()
1260 usb_free_urb(dec->irq_urb); in ttusb_dec_init_usb()
1263 usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe, in ttusb_dec_init_usb()
1264 dec->irq_buffer, IRQ_PACKET_SIZE, in ttusb_dec_init_usb()
1265 ttusb_dec_handle_irq, dec, 1); in ttusb_dec_init_usb()
1266 dec->irq_urb->transfer_dma = dec->irq_dma_handle; in ttusb_dec_init_usb()
1267 dec->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ttusb_dec_init_usb()
1270 result = ttusb_dec_alloc_iso_urbs(dec); in ttusb_dec_init_usb()
1272 usb_free_urb(dec->irq_urb); in ttusb_dec_init_usb()
1273 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE, in ttusb_dec_init_usb()
1274 dec->irq_buffer, dec->irq_dma_handle); in ttusb_dec_init_usb()
1279 static int ttusb_dec_boot_dsp(struct ttusb_dec *dec) in ttusb_dec_boot_dsp() argument
1299 result = request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev); in ttusb_dec_boot_dsp()
1302 __func__, dec->firmware_name); in ttusb_dec_boot_dsp()
1339 result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL); in ttusb_dec_boot_dsp()
1369 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, in ttusb_dec_boot_dsp()
1374 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, in ttusb_dec_boot_dsp()
1380 result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL); in ttusb_dec_boot_dsp()
1388 static int ttusb_dec_init_stb(struct ttusb_dec *dec) in ttusb_dec_init_stb() argument
1395 result = ttusb_dec_get_stb_state(dec, &mode, &model, &version); in ttusb_dec_init_stb()
1409 result = ttusb_dec_boot_dsp(dec); in ttusb_dec_init_stb()
1419 ttusb_dec_set_model(dec, TTUSB_DEC3000S); in ttusb_dec_init_stb()
1423 ttusb_dec_set_model(dec, TTUSB_DEC2000T); in ttusb_dec_init_stb()
1426 ttusb_dec_set_model(dec, TTUSB_DEC2540T); in ttusb_dec_init_stb()
1435 dec->can_playback = 1; in ttusb_dec_init_stb()
1440 static int ttusb_dec_init_dvb(struct ttusb_dec *dec) in ttusb_dec_init_dvb() argument
1446 if ((result = dvb_register_adapter(&dec->adapter, in ttusb_dec_init_dvb()
1447 dec->model_name, THIS_MODULE, in ttusb_dec_init_dvb()
1448 &dec->udev->dev, in ttusb_dec_init_dvb()
1456 dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING; in ttusb_dec_init_dvb()
1458 dec->demux.priv = (void *)dec; in ttusb_dec_init_dvb()
1459 dec->demux.filternum = 31; in ttusb_dec_init_dvb()
1460 dec->demux.feednum = 31; in ttusb_dec_init_dvb()
1461 dec->demux.start_feed = ttusb_dec_start_feed; in ttusb_dec_init_dvb()
1462 dec->demux.stop_feed = ttusb_dec_stop_feed; in ttusb_dec_init_dvb()
1463 dec->demux.write_to_decoder = NULL; in ttusb_dec_init_dvb()
1465 if ((result = dvb_dmx_init(&dec->demux)) < 0) { in ttusb_dec_init_dvb()
1469 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1474 dec->dmxdev.filternum = 32; in ttusb_dec_init_dvb()
1475 dec->dmxdev.demux = &dec->demux.dmx; in ttusb_dec_init_dvb()
1476 dec->dmxdev.capabilities = 0; in ttusb_dec_init_dvb()
1478 if ((result = dvb_dmxdev_init(&dec->dmxdev, &dec->adapter)) < 0) { in ttusb_dec_init_dvb()
1482 dvb_dmx_release(&dec->demux); in ttusb_dec_init_dvb()
1483 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1488 dec->frontend.source = DMX_FRONTEND_0; in ttusb_dec_init_dvb()
1490 if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx, in ttusb_dec_init_dvb()
1491 &dec->frontend)) < 0) { in ttusb_dec_init_dvb()
1495 dvb_dmxdev_release(&dec->dmxdev); in ttusb_dec_init_dvb()
1496 dvb_dmx_release(&dec->demux); in ttusb_dec_init_dvb()
1497 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1502 if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx, in ttusb_dec_init_dvb()
1503 &dec->frontend)) < 0) { in ttusb_dec_init_dvb()
1507 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend); in ttusb_dec_init_dvb()
1508 dvb_dmxdev_release(&dec->dmxdev); in ttusb_dec_init_dvb()
1509 dvb_dmx_release(&dec->demux); in ttusb_dec_init_dvb()
1510 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1515 dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx); in ttusb_dec_init_dvb()
1520 static void ttusb_dec_exit_dvb(struct ttusb_dec *dec) in ttusb_dec_exit_dvb() argument
1524 dvb_net_release(&dec->dvb_net); in ttusb_dec_exit_dvb()
1525 dec->demux.dmx.close(&dec->demux.dmx); in ttusb_dec_exit_dvb()
1526 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend); in ttusb_dec_exit_dvb()
1527 dvb_dmxdev_release(&dec->dmxdev); in ttusb_dec_exit_dvb()
1528 dvb_dmx_release(&dec->demux); in ttusb_dec_exit_dvb()
1529 if (dec->fe) { in ttusb_dec_exit_dvb()
1530 dvb_unregister_frontend(dec->fe); in ttusb_dec_exit_dvb()
1531 if (dec->fe->ops.release) in ttusb_dec_exit_dvb()
1532 dec->fe->ops.release(dec->fe); in ttusb_dec_exit_dvb()
1534 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_exit_dvb()
1537 static void ttusb_dec_exit_rc(struct ttusb_dec *dec) in ttusb_dec_exit_rc() argument
1541 if (dec->rc_input_dev) { in ttusb_dec_exit_rc()
1542 input_unregister_device(dec->rc_input_dev); in ttusb_dec_exit_rc()
1543 dec->rc_input_dev = NULL; in ttusb_dec_exit_rc()
1548 static void ttusb_dec_exit_usb(struct ttusb_dec *dec) in ttusb_dec_exit_usb() argument
1559 if (dec->interface == TTUSB_DEC_INTERFACE_IN) in ttusb_dec_exit_usb()
1560 usb_kill_urb(dec->irq_urb); in ttusb_dec_exit_usb()
1562 usb_free_urb(dec->irq_urb); in ttusb_dec_exit_usb()
1564 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE, in ttusb_dec_exit_usb()
1565 dec->irq_buffer, dec->irq_dma_handle); in ttusb_dec_exit_usb()
1568 dec->iso_stream_count = 0; in ttusb_dec_exit_usb()
1571 usb_kill_urb(dec->iso_urb[i]); in ttusb_dec_exit_usb()
1573 ttusb_dec_free_iso_urbs(dec); in ttusb_dec_exit_usb()
1576 static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec) in ttusb_dec_exit_tasklet() argument
1581 tasklet_kill(&dec->urb_tasklet); in ttusb_dec_exit_tasklet()
1583 while ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { in ttusb_dec_exit_tasklet()
1590 static void ttusb_dec_init_filters(struct ttusb_dec *dec) in ttusb_dec_init_filters() argument
1592 INIT_LIST_HEAD(&dec->filter_info_list); in ttusb_dec_init_filters()
1593 spin_lock_init(&dec->filter_info_list_lock); in ttusb_dec_init_filters()
1596 static void ttusb_dec_exit_filters(struct ttusb_dec *dec) in ttusb_dec_exit_filters() argument
1601 while ((item = dec->filter_info_list.next) != &dec->filter_info_list) { in ttusb_dec_exit_filters()
1612 struct ttusb_dec* dec = fe->dvb->priv; in fe_send_command() local
1613 return ttusb_dec_send_command(dec, command, param_length, params, result_length, cmd_result); in fe_send_command()
1624 struct ttusb_dec *dec; in ttusb_dec_probe() local
1631 if (!(dec = kzalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) { in ttusb_dec_probe()
1636 usb_set_intfdata(intf, (void *)dec); in ttusb_dec_probe()
1640 ttusb_dec_set_model(dec, TTUSB_DEC3000S); in ttusb_dec_probe()
1644 ttusb_dec_set_model(dec, TTUSB_DEC2000T); in ttusb_dec_probe()
1648 ttusb_dec_set_model(dec, TTUSB_DEC2540T); in ttusb_dec_probe()
1652 dec->udev = udev; in ttusb_dec_probe()
1654 result = ttusb_dec_init_usb(dec); in ttusb_dec_probe()
1657 result = ttusb_dec_init_stb(dec); in ttusb_dec_probe()
1660 result = ttusb_dec_init_dvb(dec); in ttusb_dec_probe()
1664 dec->adapter.priv = dec; in ttusb_dec_probe()
1667 dec->fe = ttusbdecfe_dvbs_attach(&fe_config); in ttusb_dec_probe()
1672 dec->fe = ttusbdecfe_dvbt_attach(&fe_config); in ttusb_dec_probe()
1676 if (dec->fe == NULL) { in ttusb_dec_probe()
1678 le16_to_cpu(dec->udev->descriptor.idVendor), in ttusb_dec_probe()
1679 le16_to_cpu(dec->udev->descriptor.idProduct)); in ttusb_dec_probe()
1681 if (dvb_register_frontend(&dec->adapter, dec->fe)) { in ttusb_dec_probe()
1683 if (dec->fe->ops.release) in ttusb_dec_probe()
1684 dec->fe->ops.release(dec->fe); in ttusb_dec_probe()
1685 dec->fe = NULL; in ttusb_dec_probe()
1689 ttusb_dec_init_v_pes(dec); in ttusb_dec_probe()
1690 ttusb_dec_init_filters(dec); in ttusb_dec_probe()
1691 ttusb_dec_init_tasklet(dec); in ttusb_dec_probe()
1693 dec->active = 1; in ttusb_dec_probe()
1695 ttusb_dec_set_interface(dec, TTUSB_DEC_INTERFACE_IN); in ttusb_dec_probe()
1698 ttusb_init_rc(dec); in ttusb_dec_probe()
1702 ttusb_dec_exit_usb(dec); in ttusb_dec_probe()
1704 kfree(dec); in ttusb_dec_probe()
1710 struct ttusb_dec *dec = usb_get_intfdata(intf); in ttusb_dec_disconnect() local
1716 if (dec->active) { in ttusb_dec_disconnect()
1717 ttusb_dec_exit_tasklet(dec); in ttusb_dec_disconnect()
1718 ttusb_dec_exit_filters(dec); in ttusb_dec_disconnect()
1720 ttusb_dec_exit_rc(dec); in ttusb_dec_disconnect()
1721 ttusb_dec_exit_usb(dec); in ttusb_dec_disconnect()
1722 ttusb_dec_exit_dvb(dec); in ttusb_dec_disconnect()
1725 kfree(dec); in ttusb_dec_disconnect()
1728 static void ttusb_dec_set_model(struct ttusb_dec *dec, in ttusb_dec_set_model() argument
1731 dec->model = model; in ttusb_dec_set_model()
1735 dec->model_name = "DEC2000-t"; in ttusb_dec_set_model()
1736 dec->firmware_name = "dvb-ttusb-dec-2000t.fw"; in ttusb_dec_set_model()
1740 dec->model_name = "DEC2540-t"; in ttusb_dec_set_model()
1741 dec->firmware_name = "dvb-ttusb-dec-2540t.fw"; in ttusb_dec_set_model()
1745 dec->model_name = "DEC3000-s"; in ttusb_dec_set_model()
1746 dec->firmware_name = "dvb-ttusb-dec-3000s.fw"; in ttusb_dec_set_model()