Lines Matching full:dec

3  * TTUSB DEC Driver
44 #define DRIVER_NAME "TechnoTrend/Hauppauge DEC USB"
245 static void ttusb_dec_set_model(struct ttusb_dec *dec,
250 struct ttusb_dec *dec = urb->context; in ttusb_dec_handle_irq() local
251 char *buffer = dec->irq_buffer; in ttusb_dec_handle_irq()
287 input_report_key(dec->rc_input_dev, rc_keys[index - 1], 1); in ttusb_dec_handle_irq()
288 input_sync(dec->rc_input_dev); in ttusb_dec_handle_irq()
289 input_report_key(dec->rc_input_dev, rc_keys[index - 1], 0); in ttusb_dec_handle_irq()
290 input_sync(dec->rc_input_dev); in ttusb_dec_handle_irq()
314 static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command, in ttusb_dec_send_command() argument
327 result = mutex_lock_interruptible(&dec->usb_mutex); in ttusb_dec_send_command()
334 b[1] = ++dec->trans_count; in ttusb_dec_send_command()
346 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, in ttusb_dec_send_command()
355 result = usb_bulk_msg(dec->udev, dec->result_pipe, b, in ttusb_dec_send_command()
375 mutex_unlock(&dec->usb_mutex); in ttusb_dec_send_command()
381 static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode, in ttusb_dec_get_stb_state() argument
391 result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c); in ttusb_dec_get_stb_state()
416 struct ttusb_dec *dec = priv; in ttusb_dec_audio_pes2ts_cb() local
418 dec->audio_filter->feed->cb.ts(data, 188, NULL, 0, in ttusb_dec_audio_pes2ts_cb()
419 &dec->audio_filter->feed->feed.ts, NULL); in ttusb_dec_audio_pes2ts_cb()
426 struct ttusb_dec *dec = priv; in ttusb_dec_video_pes2ts_cb() local
428 dec->video_filter->feed->cb.ts(data, 188, NULL, 0, in ttusb_dec_video_pes2ts_cb()
429 &dec->video_filter->feed->feed.ts, NULL); in ttusb_dec_video_pes2ts_cb()
434 static void ttusb_dec_set_pids(struct ttusb_dec *dec) in ttusb_dec_set_pids() argument
440 __be16 pcr = htons(dec->pid[DMX_PES_PCR]); in ttusb_dec_set_pids()
441 __be16 audio = htons(dec->pid[DMX_PES_AUDIO]); in ttusb_dec_set_pids()
442 __be16 video = htons(dec->pid[DMX_PES_VIDEO]); in ttusb_dec_set_pids()
450 ttusb_dec_send_command(dec, 0x50, sizeof(b), b, NULL, NULL); in ttusb_dec_set_pids()
452 dvb_filter_pes2ts_init(&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO], in ttusb_dec_set_pids()
453 ttusb_dec_audio_pes2ts_cb, dec); in ttusb_dec_set_pids()
454 dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO], in ttusb_dec_set_pids()
455 ttusb_dec_video_pes2ts_cb, dec); in ttusb_dec_set_pids()
456 dec->v_pes_length = 0; in ttusb_dec_set_pids()
457 dec->v_pes_postbytes = 0; in ttusb_dec_set_pids()
460 static void ttusb_dec_process_pva(struct ttusb_dec *dec, u8 *pva, int length) in ttusb_dec_process_pva() argument
480 dec->video_filter->feed->cb.ts(pva, length, NULL, 0, in ttusb_dec_process_pva()
481 &dec->video_filter->feed->feed.ts, NULL); in ttusb_dec_process_pva()
485 if (dec->v_pes_postbytes > 0 && in ttusb_dec_process_pva()
486 dec->v_pes_postbytes == prebytes) { in ttusb_dec_process_pva()
487 memcpy(&dec->v_pes[dec->v_pes_length], in ttusb_dec_process_pva()
490 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes, in ttusb_dec_process_pva()
491 dec->v_pes_length + prebytes, 1); in ttusb_dec_process_pva()
495 dec->v_pes[7] = 0x80; in ttusb_dec_process_pva()
496 dec->v_pes[8] = 0x05; in ttusb_dec_process_pva()
498 dec->v_pes[9] = 0x21 | ((pva[8] & 0xc0) >> 5); in ttusb_dec_process_pva()
499 dec->v_pes[10] = ((pva[8] & 0x3f) << 2) | in ttusb_dec_process_pva()
501 dec->v_pes[11] = 0x01 | in ttusb_dec_process_pva()
504 dec->v_pes[12] = ((pva[10] & 0x7f) << 1) | in ttusb_dec_process_pva()
506 dec->v_pes[13] = 0x01 | ((pva[11] & 0x7f) << 1); in ttusb_dec_process_pva()
508 memcpy(&dec->v_pes[14], &pva[12 + prebytes], in ttusb_dec_process_pva()
510 dec->v_pes_length = 14 + length - 12 - prebytes; in ttusb_dec_process_pva()
512 dec->v_pes[7] = 0x00; in ttusb_dec_process_pva()
513 dec->v_pes[8] = 0x00; in ttusb_dec_process_pva()
515 memcpy(&dec->v_pes[9], &pva[8], length - 8); in ttusb_dec_process_pva()
516 dec->v_pes_length = 9 + length - 8; in ttusb_dec_process_pva()
519 dec->v_pes_postbytes = postbytes; in ttusb_dec_process_pva()
521 if (dec->v_pes[9 + dec->v_pes[8]] == 0x00 && in ttusb_dec_process_pva()
522 dec->v_pes[10 + dec->v_pes[8]] == 0x00 && in ttusb_dec_process_pva()
523 dec->v_pes[11 + dec->v_pes[8]] == 0x01) in ttusb_dec_process_pva()
524 dec->v_pes[6] = 0x84; in ttusb_dec_process_pva()
526 dec->v_pes[6] = 0x80; in ttusb_dec_process_pva()
528 v_pes_payload_length = htons(dec->v_pes_length - 6 + in ttusb_dec_process_pva()
530 memcpy(&dec->v_pes[4], &v_pes_payload_length, 2); in ttusb_dec_process_pva()
533 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes, in ttusb_dec_process_pva()
534 dec->v_pes_length, 1); in ttusb_dec_process_pva()
541 dec->audio_filter->feed->cb.ts(pva, length, NULL, 0, in ttusb_dec_process_pva()
542 &dec->audio_filter->feed->feed.ts, NULL); in ttusb_dec_process_pva()
546 dvb_filter_pes2ts(&dec->a_pes2ts, &pva[8], length - 8, in ttusb_dec_process_pva()
557 static void ttusb_dec_process_filter(struct ttusb_dec *dec, u8 *packet, in ttusb_dec_process_filter() argument
567 spin_lock_irqsave(&dec->filter_info_list_lock, flags); in ttusb_dec_process_filter()
568 for (item = dec->filter_info_list.next; item != &dec->filter_info_list; in ttusb_dec_process_filter()
576 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags); in ttusb_dec_process_filter()
583 static void ttusb_dec_process_packet(struct ttusb_dec *dec) in ttusb_dec_process_packet() argument
589 if (dec->packet_length % 2) { in ttusb_dec_process_packet()
594 for (i = 0; i < dec->packet_length; i += 2) in ttusb_dec_process_packet()
595 csum ^= ((dec->packet[i] << 8) + dec->packet[i + 1]); in ttusb_dec_process_packet()
602 packet_id = dec->packet[dec->packet_length - 4] << 8; in ttusb_dec_process_packet()
603 packet_id += dec->packet[dec->packet_length - 3]; in ttusb_dec_process_packet()
605 if ((packet_id != dec->next_packet_id) && dec->next_packet_id) { in ttusb_dec_process_packet()
607 __func__, dec->next_packet_id - 1, packet_id); in ttusb_dec_process_packet()
611 dec->next_packet_id = 0x8000; in ttusb_dec_process_packet()
613 dec->next_packet_id = packet_id + 1; in ttusb_dec_process_packet()
615 switch (dec->packet_type) { in ttusb_dec_process_packet()
617 if (dec->pva_stream_count) in ttusb_dec_process_packet()
618 ttusb_dec_process_pva(dec, dec->packet, in ttusb_dec_process_packet()
619 dec->packet_payload_length); in ttusb_dec_process_packet()
623 if (dec->filter_stream_count) in ttusb_dec_process_packet()
624 ttusb_dec_process_filter(dec, dec->packet, in ttusb_dec_process_packet()
625 dec->packet_payload_length); in ttusb_dec_process_packet()
640 static void ttusb_dec_process_urb_frame(struct ttusb_dec *dec, u8 *b, in ttusb_dec_process_urb_frame() argument
646 switch (dec->packet_state) { in ttusb_dec_process_urb_frame()
652 dec->packet_state++; in ttusb_dec_process_urb_frame()
654 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
661 dec->packet_state++; in ttusb_dec_process_urb_frame()
662 dec->packet_length = 0; in ttusb_dec_process_urb_frame()
664 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
672 dec->packet[dec->packet_length++] = *b++; in ttusb_dec_process_urb_frame()
674 if (dec->packet_length == 2) { in ttusb_dec_process_urb_frame()
675 if (dec->packet[0] == 'A' && in ttusb_dec_process_urb_frame()
676 dec->packet[1] == 'V') { in ttusb_dec_process_urb_frame()
677 dec->packet_type = in ttusb_dec_process_urb_frame()
679 dec->packet_state++; in ttusb_dec_process_urb_frame()
680 } else if (dec->packet[0] == 'S') { in ttusb_dec_process_urb_frame()
681 dec->packet_type = in ttusb_dec_process_urb_frame()
683 dec->packet_state++; in ttusb_dec_process_urb_frame()
684 } else if (dec->packet[0] == 0x00) { in ttusb_dec_process_urb_frame()
685 dec->packet_type = in ttusb_dec_process_urb_frame()
687 dec->packet_payload_length = 2; in ttusb_dec_process_urb_frame()
688 dec->packet_state = 7; in ttusb_dec_process_urb_frame()
692 dec->packet[0], dec->packet[1]); in ttusb_dec_process_urb_frame()
693 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
701 dec->packet[dec->packet_length++] = *b++; in ttusb_dec_process_urb_frame()
703 if (dec->packet_type == TTUSB_DEC_PACKET_PVA && in ttusb_dec_process_urb_frame()
704 dec->packet_length == 8) { in ttusb_dec_process_urb_frame()
705 dec->packet_state++; in ttusb_dec_process_urb_frame()
706 dec->packet_payload_length = 8 + in ttusb_dec_process_urb_frame()
707 (dec->packet[6] << 8) + in ttusb_dec_process_urb_frame()
708 dec->packet[7]; in ttusb_dec_process_urb_frame()
709 } else if (dec->packet_type == in ttusb_dec_process_urb_frame()
711 dec->packet_length == 5) { in ttusb_dec_process_urb_frame()
712 dec->packet_state++; in ttusb_dec_process_urb_frame()
713 dec->packet_payload_length = 5 + in ttusb_dec_process_urb_frame()
714 ((dec->packet[3] & 0x0f) << 8) + in ttusb_dec_process_urb_frame()
715 dec->packet[4]; in ttusb_dec_process_urb_frame()
722 int remainder = dec->packet_payload_length - in ttusb_dec_process_urb_frame()
723 dec->packet_length; in ttusb_dec_process_urb_frame()
726 memcpy(dec->packet + dec->packet_length, in ttusb_dec_process_urb_frame()
728 dec->packet_length += remainder; in ttusb_dec_process_urb_frame()
731 dec->packet_state++; in ttusb_dec_process_urb_frame()
733 memcpy(&dec->packet[dec->packet_length], in ttusb_dec_process_urb_frame()
735 dec->packet_length += length; in ttusb_dec_process_urb_frame()
745 dec->packet[dec->packet_length++] = *b++; in ttusb_dec_process_urb_frame()
747 if (dec->packet_type == TTUSB_DEC_PACKET_SECTION && in ttusb_dec_process_urb_frame()
748 dec->packet_payload_length % 2) in ttusb_dec_process_urb_frame()
751 if (dec->packet_length == in ttusb_dec_process_urb_frame()
752 dec->packet_payload_length + tail) { in ttusb_dec_process_urb_frame()
753 ttusb_dec_process_packet(dec); in ttusb_dec_process_urb_frame()
754 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
764 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
771 struct ttusb_dec *dec = from_tasklet(dec, t, urb_tasklet); in ttusb_dec_process_urb_frame_list() local
777 spin_lock_irqsave(&dec->urb_frame_list_lock, flags); in ttusb_dec_process_urb_frame_list()
778 if ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { in ttusb_dec_process_urb_frame_list()
783 spin_unlock_irqrestore(&dec->urb_frame_list_lock, in ttusb_dec_process_urb_frame_list()
787 spin_unlock_irqrestore(&dec->urb_frame_list_lock, flags); in ttusb_dec_process_urb_frame_list()
789 ttusb_dec_process_urb_frame(dec, frame->data, frame->length); in ttusb_dec_process_urb_frame_list()
796 struct ttusb_dec *dec = urb->context; in ttusb_dec_process_urb() local
818 spin_lock_irqsave(&dec->urb_frame_list_lock, in ttusb_dec_process_urb()
821 &dec->urb_frame_list); in ttusb_dec_process_urb()
822 spin_unlock_irqrestore(&dec->urb_frame_list_lock, in ttusb_dec_process_urb()
825 tasklet_schedule(&dec->urb_tasklet); in ttusb_dec_process_urb()
835 if (dec->iso_stream_count) in ttusb_dec_process_urb()
839 static void ttusb_dec_setup_urbs(struct ttusb_dec *dec) in ttusb_dec_setup_urbs() argument
847 struct urb *urb = dec->iso_urb[i]; in ttusb_dec_setup_urbs()
849 urb->dev = dec->udev; in ttusb_dec_setup_urbs()
850 urb->context = dec; in ttusb_dec_setup_urbs()
852 urb->pipe = dec->in_pipe; in ttusb_dec_setup_urbs()
858 urb->transfer_buffer = dec->iso_buffer + buffer_offset; in ttusb_dec_setup_urbs()
869 static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec) in ttusb_dec_stop_iso_xfer() argument
875 if (mutex_lock_interruptible(&dec->iso_mutex)) in ttusb_dec_stop_iso_xfer()
878 dec->iso_stream_count--; in ttusb_dec_stop_iso_xfer()
880 if (!dec->iso_stream_count) { in ttusb_dec_stop_iso_xfer()
882 usb_kill_urb(dec->iso_urb[i]); in ttusb_dec_stop_iso_xfer()
885 mutex_unlock(&dec->iso_mutex); in ttusb_dec_stop_iso_xfer()
888 /* Setting the interface of the DEC tends to take down the USB communications
892 static int ttusb_dec_set_interface(struct ttusb_dec *dec, in ttusb_dec_set_interface() argument
898 if (interface != dec->interface) { in ttusb_dec_set_interface()
901 result = usb_set_interface(dec->udev, 0, 0); in ttusb_dec_set_interface()
904 result = ttusb_dec_send_command(dec, 0x80, sizeof(b), in ttusb_dec_set_interface()
908 result = usb_set_interface(dec->udev, 0, 8); in ttusb_dec_set_interface()
911 result = usb_set_interface(dec->udev, 0, 1); in ttusb_dec_set_interface()
918 dec->interface = interface; in ttusb_dec_set_interface()
924 static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec) in ttusb_dec_start_iso_xfer() argument
930 if (mutex_lock_interruptible(&dec->iso_mutex)) in ttusb_dec_start_iso_xfer()
933 if (!dec->iso_stream_count) { in ttusb_dec_start_iso_xfer()
934 ttusb_dec_setup_urbs(dec); in ttusb_dec_start_iso_xfer()
936 dec->packet_state = 0; in ttusb_dec_start_iso_xfer()
937 dec->v_pes_postbytes = 0; in ttusb_dec_start_iso_xfer()
938 dec->next_packet_id = 0; in ttusb_dec_start_iso_xfer()
941 if ((result = usb_submit_urb(dec->iso_urb[i], in ttusb_dec_start_iso_xfer()
947 usb_kill_urb(dec->iso_urb[i - 1]); in ttusb_dec_start_iso_xfer()
951 mutex_unlock(&dec->iso_mutex); in ttusb_dec_start_iso_xfer()
957 dec->iso_stream_count++; in ttusb_dec_start_iso_xfer()
959 mutex_unlock(&dec->iso_mutex); in ttusb_dec_start_iso_xfer()
967 struct ttusb_dec *dec = dvbdmx->priv; in ttusb_dec_start_ts_feed() local
990 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
991 dec->pid[DMX_PES_VIDEO] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
992 dec->video_filter = dvbdmxfeed->filter; in ttusb_dec_start_ts_feed()
993 ttusb_dec_set_pids(dec); in ttusb_dec_start_ts_feed()
998 dec->pid[DMX_PES_AUDIO] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
999 dec->audio_filter = dvbdmxfeed->filter; in ttusb_dec_start_ts_feed()
1000 ttusb_dec_set_pids(dec); in ttusb_dec_start_ts_feed()
1004 dec->pid[DMX_PES_TELETEXT] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
1010 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
1011 ttusb_dec_set_pids(dec); in ttusb_dec_start_ts_feed()
1024 result = ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL); in ttusb_dec_start_ts_feed()
1028 dec->pva_stream_count++; in ttusb_dec_start_ts_feed()
1029 return ttusb_dec_start_iso_xfer(dec); in ttusb_dec_start_ts_feed()
1034 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; in ttusb_dec_start_sec_feed() local
1058 result = ttusb_dec_send_command(dec, 0x60, sizeof(b0), b0, in ttusb_dec_start_sec_feed()
1070 spin_lock_irqsave(&dec->filter_info_list_lock, flags); in ttusb_dec_start_sec_feed()
1072 &dec->filter_info_list); in ttusb_dec_start_sec_feed()
1073 spin_unlock_irqrestore(&dec->filter_info_list_lock, in ttusb_dec_start_sec_feed()
1078 dec->filter_stream_count++; in ttusb_dec_start_sec_feed()
1079 return ttusb_dec_start_iso_xfer(dec); in ttusb_dec_start_sec_feed()
1115 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; in ttusb_dec_stop_ts_feed() local
1118 ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL); in ttusb_dec_stop_ts_feed()
1120 dec->pva_stream_count--; in ttusb_dec_stop_ts_feed()
1122 ttusb_dec_stop_iso_xfer(dec); in ttusb_dec_stop_ts_feed()
1129 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; in ttusb_dec_stop_sec_feed() local
1135 spin_lock_irqsave(&dec->filter_info_list_lock, flags); in ttusb_dec_stop_sec_feed()
1137 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags); in ttusb_dec_stop_sec_feed()
1139 ttusb_dec_send_command(dec, 0x62, sizeof(b0), b0, NULL, NULL); in ttusb_dec_stop_sec_feed()
1141 dec->filter_stream_count--; in ttusb_dec_stop_sec_feed()
1143 ttusb_dec_stop_iso_xfer(dec); in ttusb_dec_stop_sec_feed()
1163 static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec) in ttusb_dec_free_iso_urbs() argument
1170 usb_free_urb(dec->iso_urb[i]); in ttusb_dec_free_iso_urbs()
1171 kfree(dec->iso_buffer); in ttusb_dec_free_iso_urbs()
1174 static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec) in ttusb_dec_alloc_iso_urbs() argument
1180 dec->iso_buffer = kcalloc(FRAMES_PER_ISO_BUF * ISO_BUF_COUNT, in ttusb_dec_alloc_iso_urbs()
1182 if (!dec->iso_buffer) in ttusb_dec_alloc_iso_urbs()
1189 ttusb_dec_free_iso_urbs(dec); in ttusb_dec_alloc_iso_urbs()
1193 dec->iso_urb[i] = urb; in ttusb_dec_alloc_iso_urbs()
1196 ttusb_dec_setup_urbs(dec); in ttusb_dec_alloc_iso_urbs()
1201 static void ttusb_dec_init_tasklet(struct ttusb_dec *dec) in ttusb_dec_init_tasklet() argument
1203 spin_lock_init(&dec->urb_frame_list_lock); in ttusb_dec_init_tasklet()
1204 INIT_LIST_HEAD(&dec->urb_frame_list); in ttusb_dec_init_tasklet()
1205 tasklet_setup(&dec->urb_tasklet, ttusb_dec_process_urb_frame_list); in ttusb_dec_init_tasklet()
1208 static int ttusb_init_rc( struct ttusb_dec *dec) in ttusb_init_rc() argument
1215 usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys)); in ttusb_init_rc()
1216 strlcat(dec->rc_phys, "/input0", sizeof(dec->rc_phys)); in ttusb_init_rc()
1223 input_dev->phys = dec->rc_phys; in ttusb_init_rc()
1238 dec->rc_input_dev = input_dev; in ttusb_init_rc()
1239 if (usb_submit_urb(dec->irq_urb, GFP_KERNEL)) in ttusb_init_rc()
1242 ttusb_dec_send_command(dec,0xb0,sizeof(b),b,NULL,NULL); in ttusb_init_rc()
1247 static void ttusb_dec_init_v_pes(struct ttusb_dec *dec) in ttusb_dec_init_v_pes() argument
1251 dec->v_pes[0] = 0x00; in ttusb_dec_init_v_pes()
1252 dec->v_pes[1] = 0x00; in ttusb_dec_init_v_pes()
1253 dec->v_pes[2] = 0x01; in ttusb_dec_init_v_pes()
1254 dec->v_pes[3] = 0xe0; in ttusb_dec_init_v_pes()
1257 static int ttusb_dec_init_usb(struct ttusb_dec *dec) in ttusb_dec_init_usb() argument
1263 mutex_init(&dec->usb_mutex); in ttusb_dec_init_usb()
1264 mutex_init(&dec->iso_mutex); in ttusb_dec_init_usb()
1266 dec->command_pipe = usb_sndbulkpipe(dec->udev, COMMAND_PIPE); in ttusb_dec_init_usb()
1267 dec->result_pipe = usb_rcvbulkpipe(dec->udev, RESULT_PIPE); in ttusb_dec_init_usb()
1268 dec->in_pipe = usb_rcvisocpipe(dec->udev, IN_PIPE); in ttusb_dec_init_usb()
1269 dec->out_pipe = usb_sndisocpipe(dec->udev, OUT_PIPE); in ttusb_dec_init_usb()
1270 dec->irq_pipe = usb_rcvintpipe(dec->udev, IRQ_PIPE); in ttusb_dec_init_usb()
1273 dec->irq_urb = usb_alloc_urb(0, GFP_KERNEL); in ttusb_dec_init_usb()
1274 if(!dec->irq_urb) { in ttusb_dec_init_usb()
1277 dec->irq_buffer = usb_alloc_coherent(dec->udev,IRQ_PACKET_SIZE, in ttusb_dec_init_usb()
1278 GFP_KERNEL, &dec->irq_dma_handle); in ttusb_dec_init_usb()
1279 if(!dec->irq_buffer) { in ttusb_dec_init_usb()
1280 usb_free_urb(dec->irq_urb); in ttusb_dec_init_usb()
1283 usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe, in ttusb_dec_init_usb()
1284 dec->irq_buffer, IRQ_PACKET_SIZE, in ttusb_dec_init_usb()
1285 ttusb_dec_handle_irq, dec, 1); in ttusb_dec_init_usb()
1286 dec->irq_urb->transfer_dma = dec->irq_dma_handle; in ttusb_dec_init_usb()
1287 dec->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ttusb_dec_init_usb()
1290 result = ttusb_dec_alloc_iso_urbs(dec); in ttusb_dec_init_usb()
1292 usb_free_urb(dec->irq_urb); in ttusb_dec_init_usb()
1293 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE, in ttusb_dec_init_usb()
1294 dec->irq_buffer, dec->irq_dma_handle); in ttusb_dec_init_usb()
1299 static int ttusb_dec_boot_dsp(struct ttusb_dec *dec) in ttusb_dec_boot_dsp() argument
1319 result = request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev); in ttusb_dec_boot_dsp()
1322 __func__, dec->firmware_name); in ttusb_dec_boot_dsp()
1358 result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL); in ttusb_dec_boot_dsp()
1388 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, in ttusb_dec_boot_dsp()
1393 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, in ttusb_dec_boot_dsp()
1399 result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL); in ttusb_dec_boot_dsp()
1407 static int ttusb_dec_init_stb(struct ttusb_dec *dec) in ttusb_dec_init_stb() argument
1414 result = ttusb_dec_get_stb_state(dec, &mode, &model, &version); in ttusb_dec_init_stb()
1426 result = ttusb_dec_boot_dsp(dec); in ttusb_dec_init_stb()
1436 ttusb_dec_set_model(dec, TTUSB_DEC3000S); in ttusb_dec_init_stb()
1440 ttusb_dec_set_model(dec, TTUSB_DEC2000T); in ttusb_dec_init_stb()
1443 ttusb_dec_set_model(dec, TTUSB_DEC2540T); in ttusb_dec_init_stb()
1451 dec->can_playback = 1; in ttusb_dec_init_stb()
1456 static int ttusb_dec_init_dvb(struct ttusb_dec *dec) in ttusb_dec_init_dvb() argument
1462 if ((result = dvb_register_adapter(&dec->adapter, in ttusb_dec_init_dvb()
1463 dec->model_name, THIS_MODULE, in ttusb_dec_init_dvb()
1464 &dec->udev->dev, in ttusb_dec_init_dvb()
1472 dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING; in ttusb_dec_init_dvb()
1474 dec->demux.priv = (void *)dec; in ttusb_dec_init_dvb()
1475 dec->demux.filternum = 31; in ttusb_dec_init_dvb()
1476 dec->demux.feednum = 31; in ttusb_dec_init_dvb()
1477 dec->demux.start_feed = ttusb_dec_start_feed; in ttusb_dec_init_dvb()
1478 dec->demux.stop_feed = ttusb_dec_stop_feed; in ttusb_dec_init_dvb()
1479 dec->demux.write_to_decoder = NULL; in ttusb_dec_init_dvb()
1481 if ((result = dvb_dmx_init(&dec->demux)) < 0) { in ttusb_dec_init_dvb()
1485 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1490 dec->dmxdev.filternum = 32; in ttusb_dec_init_dvb()
1491 dec->dmxdev.demux = &dec->demux.dmx; in ttusb_dec_init_dvb()
1492 dec->dmxdev.capabilities = 0; in ttusb_dec_init_dvb()
1494 if ((result = dvb_dmxdev_init(&dec->dmxdev, &dec->adapter)) < 0) { in ttusb_dec_init_dvb()
1498 dvb_dmx_release(&dec->demux); in ttusb_dec_init_dvb()
1499 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1504 dec->frontend.source = DMX_FRONTEND_0; in ttusb_dec_init_dvb()
1506 if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx, in ttusb_dec_init_dvb()
1507 &dec->frontend)) < 0) { in ttusb_dec_init_dvb()
1511 dvb_dmxdev_release(&dec->dmxdev); in ttusb_dec_init_dvb()
1512 dvb_dmx_release(&dec->demux); in ttusb_dec_init_dvb()
1513 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1518 if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx, in ttusb_dec_init_dvb()
1519 &dec->frontend)) < 0) { in ttusb_dec_init_dvb()
1523 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend); in ttusb_dec_init_dvb()
1524 dvb_dmxdev_release(&dec->dmxdev); in ttusb_dec_init_dvb()
1525 dvb_dmx_release(&dec->demux); in ttusb_dec_init_dvb()
1526 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1531 dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx); in ttusb_dec_init_dvb()
1536 static void ttusb_dec_exit_dvb(struct ttusb_dec *dec) in ttusb_dec_exit_dvb() argument
1540 dvb_net_release(&dec->dvb_net); in ttusb_dec_exit_dvb()
1541 dec->demux.dmx.close(&dec->demux.dmx); in ttusb_dec_exit_dvb()
1542 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend); in ttusb_dec_exit_dvb()
1543 dvb_dmxdev_release(&dec->dmxdev); in ttusb_dec_exit_dvb()
1544 dvb_dmx_release(&dec->demux); in ttusb_dec_exit_dvb()
1545 if (dec->fe) { in ttusb_dec_exit_dvb()
1546 dvb_unregister_frontend(dec->fe); in ttusb_dec_exit_dvb()
1547 dvb_frontend_detach(dec->fe); in ttusb_dec_exit_dvb()
1549 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_exit_dvb()
1552 static void ttusb_dec_exit_rc(struct ttusb_dec *dec) in ttusb_dec_exit_rc() argument
1556 if (dec->rc_input_dev) { in ttusb_dec_exit_rc()
1557 input_unregister_device(dec->rc_input_dev); in ttusb_dec_exit_rc()
1558 dec->rc_input_dev = NULL; in ttusb_dec_exit_rc()
1563 static void ttusb_dec_exit_usb(struct ttusb_dec *dec) in ttusb_dec_exit_usb() argument
1574 if (dec->interface == TTUSB_DEC_INTERFACE_IN) in ttusb_dec_exit_usb()
1575 usb_kill_urb(dec->irq_urb); in ttusb_dec_exit_usb()
1577 usb_free_urb(dec->irq_urb); in ttusb_dec_exit_usb()
1579 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE, in ttusb_dec_exit_usb()
1580 dec->irq_buffer, dec->irq_dma_handle); in ttusb_dec_exit_usb()
1583 dec->iso_stream_count = 0; in ttusb_dec_exit_usb()
1586 usb_kill_urb(dec->iso_urb[i]); in ttusb_dec_exit_usb()
1588 ttusb_dec_free_iso_urbs(dec); in ttusb_dec_exit_usb()
1591 static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec) in ttusb_dec_exit_tasklet() argument
1596 tasklet_kill(&dec->urb_tasklet); in ttusb_dec_exit_tasklet()
1598 while ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { in ttusb_dec_exit_tasklet()
1605 static void ttusb_dec_init_filters(struct ttusb_dec *dec) in ttusb_dec_init_filters() argument
1607 INIT_LIST_HEAD(&dec->filter_info_list); in ttusb_dec_init_filters()
1608 spin_lock_init(&dec->filter_info_list_lock); in ttusb_dec_init_filters()
1611 static void ttusb_dec_exit_filters(struct ttusb_dec *dec) in ttusb_dec_exit_filters() argument
1616 while ((item = dec->filter_info_list.next) != &dec->filter_info_list) { in ttusb_dec_exit_filters()
1627 struct ttusb_dec* dec = fe->dvb->priv; in fe_send_command() local
1628 return ttusb_dec_send_command(dec, command, param_length, params, result_length, cmd_result); in fe_send_command()
1639 struct ttusb_dec *dec; in ttusb_dec_probe() local
1646 if (!(dec = kzalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) { in ttusb_dec_probe()
1651 usb_set_intfdata(intf, (void *)dec); in ttusb_dec_probe()
1655 ttusb_dec_set_model(dec, TTUSB_DEC3000S); in ttusb_dec_probe()
1659 ttusb_dec_set_model(dec, TTUSB_DEC2000T); in ttusb_dec_probe()
1663 ttusb_dec_set_model(dec, TTUSB_DEC2540T); in ttusb_dec_probe()
1667 dec->udev = udev; in ttusb_dec_probe()
1669 result = ttusb_dec_init_usb(dec); in ttusb_dec_probe()
1672 result = ttusb_dec_init_stb(dec); in ttusb_dec_probe()
1675 result = ttusb_dec_init_dvb(dec); in ttusb_dec_probe()
1679 dec->adapter.priv = dec; in ttusb_dec_probe()
1682 dec->fe = ttusbdecfe_dvbs_attach(&fe_config); in ttusb_dec_probe()
1687 dec->fe = ttusbdecfe_dvbt_attach(&fe_config); in ttusb_dec_probe()
1691 if (dec->fe == NULL) { in ttusb_dec_probe()
1692 printk("dvb-ttusb-dec: A frontend driver was not found for device [%04x:%04x]\n", in ttusb_dec_probe()
1693 le16_to_cpu(dec->udev->descriptor.idVendor), in ttusb_dec_probe()
1694 le16_to_cpu(dec->udev->descriptor.idProduct)); in ttusb_dec_probe()
1696 if (dvb_register_frontend(&dec->adapter, dec->fe)) { in ttusb_dec_probe()
1698 if (dec->fe->ops.release) in ttusb_dec_probe()
1699 dec->fe->ops.release(dec->fe); in ttusb_dec_probe()
1700 dec->fe = NULL; in ttusb_dec_probe()
1704 ttusb_dec_init_v_pes(dec); in ttusb_dec_probe()
1705 ttusb_dec_init_filters(dec); in ttusb_dec_probe()
1706 ttusb_dec_init_tasklet(dec); in ttusb_dec_probe()
1708 dec->active = 1; in ttusb_dec_probe()
1710 ttusb_dec_set_interface(dec, TTUSB_DEC_INTERFACE_IN); in ttusb_dec_probe()
1713 ttusb_init_rc(dec); in ttusb_dec_probe()
1717 ttusb_dec_exit_usb(dec); in ttusb_dec_probe()
1719 kfree(dec); in ttusb_dec_probe()
1725 struct ttusb_dec *dec = usb_get_intfdata(intf); in ttusb_dec_disconnect() local
1731 if (dec->active) { in ttusb_dec_disconnect()
1732 ttusb_dec_exit_tasklet(dec); in ttusb_dec_disconnect()
1733 ttusb_dec_exit_filters(dec); in ttusb_dec_disconnect()
1735 ttusb_dec_exit_rc(dec); in ttusb_dec_disconnect()
1736 ttusb_dec_exit_usb(dec); in ttusb_dec_disconnect()
1737 ttusb_dec_exit_dvb(dec); in ttusb_dec_disconnect()
1740 kfree(dec); in ttusb_dec_disconnect()
1743 static void ttusb_dec_set_model(struct ttusb_dec *dec, in ttusb_dec_set_model() argument
1746 dec->model = model; in ttusb_dec_set_model()
1750 dec->model_name = "DEC2000-t"; in ttusb_dec_set_model()
1751 dec->firmware_name = "dvb-ttusb-dec-2000t.fw"; in ttusb_dec_set_model()
1755 dec->model_name = "DEC2540-t"; in ttusb_dec_set_model()
1756 dec->firmware_name = "dvb-ttusb-dec-2540t.fw"; in ttusb_dec_set_model()
1760 dec->model_name = "DEC3000-s"; in ttusb_dec_set_model()
1761 dec->firmware_name = "dvb-ttusb-dec-3000s.fw"; in ttusb_dec_set_model()
1775 .name = "ttusb-dec",