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 if ((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()
352 mutex_unlock(&dec->usb_mutex); in ttusb_dec_send_command()
357 result = usb_bulk_msg(dec->udev, dec->result_pipe, b, in ttusb_dec_send_command()
363 mutex_unlock(&dec->usb_mutex); in ttusb_dec_send_command()
377 mutex_unlock(&dec->usb_mutex); in ttusb_dec_send_command()
384 static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode, in ttusb_dec_get_stb_state() argument
394 result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c); in ttusb_dec_get_stb_state()
419 struct ttusb_dec *dec = priv; in ttusb_dec_audio_pes2ts_cb() local
421 dec->audio_filter->feed->cb.ts(data, 188, NULL, 0, in ttusb_dec_audio_pes2ts_cb()
422 &dec->audio_filter->feed->feed.ts, NULL); in ttusb_dec_audio_pes2ts_cb()
429 struct ttusb_dec *dec = priv; in ttusb_dec_video_pes2ts_cb() local
431 dec->video_filter->feed->cb.ts(data, 188, NULL, 0, in ttusb_dec_video_pes2ts_cb()
432 &dec->video_filter->feed->feed.ts, NULL); in ttusb_dec_video_pes2ts_cb()
437 static void ttusb_dec_set_pids(struct ttusb_dec *dec) in ttusb_dec_set_pids() argument
443 __be16 pcr = htons(dec->pid[DMX_PES_PCR]); in ttusb_dec_set_pids()
444 __be16 audio = htons(dec->pid[DMX_PES_AUDIO]); in ttusb_dec_set_pids()
445 __be16 video = htons(dec->pid[DMX_PES_VIDEO]); in ttusb_dec_set_pids()
453 ttusb_dec_send_command(dec, 0x50, sizeof(b), b, NULL, NULL); in ttusb_dec_set_pids()
455 dvb_filter_pes2ts_init(&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO], in ttusb_dec_set_pids()
456 ttusb_dec_audio_pes2ts_cb, dec); in ttusb_dec_set_pids()
457 dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO], in ttusb_dec_set_pids()
458 ttusb_dec_video_pes2ts_cb, dec); in ttusb_dec_set_pids()
459 dec->v_pes_length = 0; in ttusb_dec_set_pids()
460 dec->v_pes_postbytes = 0; in ttusb_dec_set_pids()
463 static void ttusb_dec_process_pva(struct ttusb_dec *dec, u8 *pva, int length) in ttusb_dec_process_pva() argument
483 dec->video_filter->feed->cb.ts(pva, length, NULL, 0, in ttusb_dec_process_pva()
484 &dec->video_filter->feed->feed.ts, NULL); in ttusb_dec_process_pva()
488 if (dec->v_pes_postbytes > 0 && in ttusb_dec_process_pva()
489 dec->v_pes_postbytes == prebytes) { in ttusb_dec_process_pva()
490 memcpy(&dec->v_pes[dec->v_pes_length], in ttusb_dec_process_pva()
493 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes, in ttusb_dec_process_pva()
494 dec->v_pes_length + prebytes, 1); in ttusb_dec_process_pva()
498 dec->v_pes[7] = 0x80; in ttusb_dec_process_pva()
499 dec->v_pes[8] = 0x05; in ttusb_dec_process_pva()
501 dec->v_pes[9] = 0x21 | ((pva[8] & 0xc0) >> 5); in ttusb_dec_process_pva()
502 dec->v_pes[10] = ((pva[8] & 0x3f) << 2) | in ttusb_dec_process_pva()
504 dec->v_pes[11] = 0x01 | in ttusb_dec_process_pva()
507 dec->v_pes[12] = ((pva[10] & 0x7f) << 1) | in ttusb_dec_process_pva()
509 dec->v_pes[13] = 0x01 | ((pva[11] & 0x7f) << 1); in ttusb_dec_process_pva()
511 memcpy(&dec->v_pes[14], &pva[12 + prebytes], in ttusb_dec_process_pva()
513 dec->v_pes_length = 14 + length - 12 - prebytes; in ttusb_dec_process_pva()
515 dec->v_pes[7] = 0x00; in ttusb_dec_process_pva()
516 dec->v_pes[8] = 0x00; in ttusb_dec_process_pva()
518 memcpy(&dec->v_pes[9], &pva[8], length - 8); in ttusb_dec_process_pva()
519 dec->v_pes_length = 9 + length - 8; in ttusb_dec_process_pva()
522 dec->v_pes_postbytes = postbytes; in ttusb_dec_process_pva()
524 if (dec->v_pes[9 + dec->v_pes[8]] == 0x00 && in ttusb_dec_process_pva()
525 dec->v_pes[10 + dec->v_pes[8]] == 0x00 && in ttusb_dec_process_pva()
526 dec->v_pes[11 + dec->v_pes[8]] == 0x01) in ttusb_dec_process_pva()
527 dec->v_pes[6] = 0x84; in ttusb_dec_process_pva()
529 dec->v_pes[6] = 0x80; in ttusb_dec_process_pva()
531 v_pes_payload_length = htons(dec->v_pes_length - 6 + in ttusb_dec_process_pva()
533 memcpy(&dec->v_pes[4], &v_pes_payload_length, 2); in ttusb_dec_process_pva()
536 dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes, in ttusb_dec_process_pva()
537 dec->v_pes_length, 1); in ttusb_dec_process_pva()
544 dec->audio_filter->feed->cb.ts(pva, length, NULL, 0, in ttusb_dec_process_pva()
545 &dec->audio_filter->feed->feed.ts, NULL); in ttusb_dec_process_pva()
549 dvb_filter_pes2ts(&dec->a_pes2ts, &pva[8], length - 8, in ttusb_dec_process_pva()
560 static void ttusb_dec_process_filter(struct ttusb_dec *dec, u8 *packet, in ttusb_dec_process_filter() argument
570 spin_lock_irqsave(&dec->filter_info_list_lock, flags); in ttusb_dec_process_filter()
571 for (item = dec->filter_info_list.next; item != &dec->filter_info_list; in ttusb_dec_process_filter()
579 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags); in ttusb_dec_process_filter()
586 static void ttusb_dec_process_packet(struct ttusb_dec *dec) in ttusb_dec_process_packet() argument
592 if (dec->packet_length % 2) { in ttusb_dec_process_packet()
597 for (i = 0; i < dec->packet_length; i += 2) in ttusb_dec_process_packet()
598 csum ^= ((dec->packet[i] << 8) + dec->packet[i + 1]); in ttusb_dec_process_packet()
605 packet_id = dec->packet[dec->packet_length - 4] << 8; in ttusb_dec_process_packet()
606 packet_id += dec->packet[dec->packet_length - 3]; in ttusb_dec_process_packet()
608 if ((packet_id != dec->next_packet_id) && dec->next_packet_id) { in ttusb_dec_process_packet()
610 __func__, dec->next_packet_id - 1, packet_id); in ttusb_dec_process_packet()
614 dec->next_packet_id = 0x8000; in ttusb_dec_process_packet()
616 dec->next_packet_id = packet_id + 1; in ttusb_dec_process_packet()
618 switch (dec->packet_type) { in ttusb_dec_process_packet()
620 if (dec->pva_stream_count) in ttusb_dec_process_packet()
621 ttusb_dec_process_pva(dec, dec->packet, in ttusb_dec_process_packet()
622 dec->packet_payload_length); in ttusb_dec_process_packet()
626 if (dec->filter_stream_count) in ttusb_dec_process_packet()
627 ttusb_dec_process_filter(dec, dec->packet, in ttusb_dec_process_packet()
628 dec->packet_payload_length); in ttusb_dec_process_packet()
643 static void ttusb_dec_process_urb_frame(struct ttusb_dec *dec, u8 *b, in ttusb_dec_process_urb_frame() argument
649 switch (dec->packet_state) { in ttusb_dec_process_urb_frame()
655 dec->packet_state++; in ttusb_dec_process_urb_frame()
657 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
664 dec->packet_state++; in ttusb_dec_process_urb_frame()
665 dec->packet_length = 0; in ttusb_dec_process_urb_frame()
667 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
675 dec->packet[dec->packet_length++] = *b++; in ttusb_dec_process_urb_frame()
677 if (dec->packet_length == 2) { in ttusb_dec_process_urb_frame()
678 if (dec->packet[0] == 'A' && in ttusb_dec_process_urb_frame()
679 dec->packet[1] == 'V') { in ttusb_dec_process_urb_frame()
680 dec->packet_type = in ttusb_dec_process_urb_frame()
682 dec->packet_state++; in ttusb_dec_process_urb_frame()
683 } else if (dec->packet[0] == 'S') { in ttusb_dec_process_urb_frame()
684 dec->packet_type = in ttusb_dec_process_urb_frame()
686 dec->packet_state++; in ttusb_dec_process_urb_frame()
687 } else if (dec->packet[0] == 0x00) { in ttusb_dec_process_urb_frame()
688 dec->packet_type = in ttusb_dec_process_urb_frame()
690 dec->packet_payload_length = 2; in ttusb_dec_process_urb_frame()
691 dec->packet_state = 7; in ttusb_dec_process_urb_frame()
695 dec->packet[0], dec->packet[1]); in ttusb_dec_process_urb_frame()
696 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
704 dec->packet[dec->packet_length++] = *b++; in ttusb_dec_process_urb_frame()
706 if (dec->packet_type == TTUSB_DEC_PACKET_PVA && in ttusb_dec_process_urb_frame()
707 dec->packet_length == 8) { in ttusb_dec_process_urb_frame()
708 dec->packet_state++; in ttusb_dec_process_urb_frame()
709 dec->packet_payload_length = 8 + in ttusb_dec_process_urb_frame()
710 (dec->packet[6] << 8) + in ttusb_dec_process_urb_frame()
711 dec->packet[7]; in ttusb_dec_process_urb_frame()
712 } else if (dec->packet_type == in ttusb_dec_process_urb_frame()
714 dec->packet_length == 5) { in ttusb_dec_process_urb_frame()
715 dec->packet_state++; in ttusb_dec_process_urb_frame()
716 dec->packet_payload_length = 5 + in ttusb_dec_process_urb_frame()
717 ((dec->packet[3] & 0x0f) << 8) + in ttusb_dec_process_urb_frame()
718 dec->packet[4]; in ttusb_dec_process_urb_frame()
725 int remainder = dec->packet_payload_length - in ttusb_dec_process_urb_frame()
726 dec->packet_length; in ttusb_dec_process_urb_frame()
729 memcpy(dec->packet + dec->packet_length, in ttusb_dec_process_urb_frame()
731 dec->packet_length += remainder; in ttusb_dec_process_urb_frame()
734 dec->packet_state++; in ttusb_dec_process_urb_frame()
736 memcpy(&dec->packet[dec->packet_length], in ttusb_dec_process_urb_frame()
738 dec->packet_length += length; in ttusb_dec_process_urb_frame()
748 dec->packet[dec->packet_length++] = *b++; in ttusb_dec_process_urb_frame()
750 if (dec->packet_type == TTUSB_DEC_PACKET_SECTION && in ttusb_dec_process_urb_frame()
751 dec->packet_payload_length % 2) in ttusb_dec_process_urb_frame()
754 if (dec->packet_length == in ttusb_dec_process_urb_frame()
755 dec->packet_payload_length + tail) { in ttusb_dec_process_urb_frame()
756 ttusb_dec_process_packet(dec); in ttusb_dec_process_urb_frame()
757 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
767 dec->packet_state = 0; in ttusb_dec_process_urb_frame()
774 struct ttusb_dec *dec = from_tasklet(dec, t, urb_tasklet); in ttusb_dec_process_urb_frame_list() local
780 spin_lock_irqsave(&dec->urb_frame_list_lock, flags); in ttusb_dec_process_urb_frame_list()
781 if ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { in ttusb_dec_process_urb_frame_list()
786 spin_unlock_irqrestore(&dec->urb_frame_list_lock, in ttusb_dec_process_urb_frame_list()
790 spin_unlock_irqrestore(&dec->urb_frame_list_lock, flags); in ttusb_dec_process_urb_frame_list()
792 ttusb_dec_process_urb_frame(dec, frame->data, frame->length); in ttusb_dec_process_urb_frame_list()
799 struct ttusb_dec *dec = urb->context; in ttusb_dec_process_urb() local
821 spin_lock_irqsave(&dec->urb_frame_list_lock, in ttusb_dec_process_urb()
824 &dec->urb_frame_list); in ttusb_dec_process_urb()
825 spin_unlock_irqrestore(&dec->urb_frame_list_lock, in ttusb_dec_process_urb()
828 tasklet_schedule(&dec->urb_tasklet); in ttusb_dec_process_urb()
838 if (dec->iso_stream_count) in ttusb_dec_process_urb()
842 static void ttusb_dec_setup_urbs(struct ttusb_dec *dec) in ttusb_dec_setup_urbs() argument
850 struct urb *urb = dec->iso_urb[i]; in ttusb_dec_setup_urbs()
852 urb->dev = dec->udev; in ttusb_dec_setup_urbs()
853 urb->context = dec; in ttusb_dec_setup_urbs()
855 urb->pipe = dec->in_pipe; in ttusb_dec_setup_urbs()
861 urb->transfer_buffer = dec->iso_buffer + buffer_offset; in ttusb_dec_setup_urbs()
872 static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec) in ttusb_dec_stop_iso_xfer() argument
878 if (mutex_lock_interruptible(&dec->iso_mutex)) in ttusb_dec_stop_iso_xfer()
881 dec->iso_stream_count--; in ttusb_dec_stop_iso_xfer()
883 if (!dec->iso_stream_count) { in ttusb_dec_stop_iso_xfer()
885 usb_kill_urb(dec->iso_urb[i]); in ttusb_dec_stop_iso_xfer()
888 mutex_unlock(&dec->iso_mutex); in ttusb_dec_stop_iso_xfer()
891 /* Setting the interface of the DEC tends to take down the USB communications
895 static int ttusb_dec_set_interface(struct ttusb_dec *dec, in ttusb_dec_set_interface() argument
901 if (interface != dec->interface) { in ttusb_dec_set_interface()
904 result = usb_set_interface(dec->udev, 0, 0); in ttusb_dec_set_interface()
907 result = ttusb_dec_send_command(dec, 0x80, sizeof(b), in ttusb_dec_set_interface()
911 result = usb_set_interface(dec->udev, 0, 8); in ttusb_dec_set_interface()
914 result = usb_set_interface(dec->udev, 0, 1); in ttusb_dec_set_interface()
921 dec->interface = interface; in ttusb_dec_set_interface()
927 static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec) in ttusb_dec_start_iso_xfer() argument
933 if (mutex_lock_interruptible(&dec->iso_mutex)) in ttusb_dec_start_iso_xfer()
936 if (!dec->iso_stream_count) { in ttusb_dec_start_iso_xfer()
937 ttusb_dec_setup_urbs(dec); in ttusb_dec_start_iso_xfer()
939 dec->packet_state = 0; in ttusb_dec_start_iso_xfer()
940 dec->v_pes_postbytes = 0; in ttusb_dec_start_iso_xfer()
941 dec->next_packet_id = 0; in ttusb_dec_start_iso_xfer()
944 if ((result = usb_submit_urb(dec->iso_urb[i], in ttusb_dec_start_iso_xfer()
950 usb_kill_urb(dec->iso_urb[i - 1]); in ttusb_dec_start_iso_xfer()
954 mutex_unlock(&dec->iso_mutex); in ttusb_dec_start_iso_xfer()
960 dec->iso_stream_count++; in ttusb_dec_start_iso_xfer()
962 mutex_unlock(&dec->iso_mutex); in ttusb_dec_start_iso_xfer()
970 struct ttusb_dec *dec = dvbdmx->priv; in ttusb_dec_start_ts_feed() local
993 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
994 dec->pid[DMX_PES_VIDEO] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
995 dec->video_filter = dvbdmxfeed->filter; in ttusb_dec_start_ts_feed()
996 ttusb_dec_set_pids(dec); in ttusb_dec_start_ts_feed()
1001 dec->pid[DMX_PES_AUDIO] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
1002 dec->audio_filter = dvbdmxfeed->filter; in ttusb_dec_start_ts_feed()
1003 ttusb_dec_set_pids(dec); in ttusb_dec_start_ts_feed()
1007 dec->pid[DMX_PES_TELETEXT] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
1013 dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid; in ttusb_dec_start_ts_feed()
1014 ttusb_dec_set_pids(dec); in ttusb_dec_start_ts_feed()
1027 result = ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL); in ttusb_dec_start_ts_feed()
1031 dec->pva_stream_count++; in ttusb_dec_start_ts_feed()
1032 return ttusb_dec_start_iso_xfer(dec); in ttusb_dec_start_ts_feed()
1037 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; in ttusb_dec_start_sec_feed() local
1061 result = ttusb_dec_send_command(dec, 0x60, sizeof(b0), b0, in ttusb_dec_start_sec_feed()
1073 spin_lock_irqsave(&dec->filter_info_list_lock, flags); in ttusb_dec_start_sec_feed()
1075 &dec->filter_info_list); in ttusb_dec_start_sec_feed()
1076 spin_unlock_irqrestore(&dec->filter_info_list_lock, in ttusb_dec_start_sec_feed()
1081 dec->filter_stream_count++; in ttusb_dec_start_sec_feed()
1082 return ttusb_dec_start_iso_xfer(dec); in ttusb_dec_start_sec_feed()
1120 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; in ttusb_dec_stop_ts_feed() local
1123 ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL); in ttusb_dec_stop_ts_feed()
1125 dec->pva_stream_count--; in ttusb_dec_stop_ts_feed()
1127 ttusb_dec_stop_iso_xfer(dec); in ttusb_dec_stop_ts_feed()
1134 struct ttusb_dec *dec = dvbdmxfeed->demux->priv; in ttusb_dec_stop_sec_feed() local
1140 spin_lock_irqsave(&dec->filter_info_list_lock, flags); in ttusb_dec_stop_sec_feed()
1142 spin_unlock_irqrestore(&dec->filter_info_list_lock, flags); in ttusb_dec_stop_sec_feed()
1144 ttusb_dec_send_command(dec, 0x62, sizeof(b0), b0, NULL, NULL); in ttusb_dec_stop_sec_feed()
1146 dec->filter_stream_count--; in ttusb_dec_stop_sec_feed()
1148 ttusb_dec_stop_iso_xfer(dec); in ttusb_dec_stop_sec_feed()
1170 static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec) in ttusb_dec_free_iso_urbs() argument
1177 usb_free_urb(dec->iso_urb[i]); in ttusb_dec_free_iso_urbs()
1178 kfree(dec->iso_buffer); in ttusb_dec_free_iso_urbs()
1181 static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec) in ttusb_dec_alloc_iso_urbs() argument
1187 dec->iso_buffer = kcalloc(FRAMES_PER_ISO_BUF * ISO_BUF_COUNT, in ttusb_dec_alloc_iso_urbs()
1189 if (!dec->iso_buffer) in ttusb_dec_alloc_iso_urbs()
1196 ttusb_dec_free_iso_urbs(dec); in ttusb_dec_alloc_iso_urbs()
1200 dec->iso_urb[i] = urb; in ttusb_dec_alloc_iso_urbs()
1203 ttusb_dec_setup_urbs(dec); in ttusb_dec_alloc_iso_urbs()
1208 static void ttusb_dec_init_tasklet(struct ttusb_dec *dec) in ttusb_dec_init_tasklet() argument
1210 spin_lock_init(&dec->urb_frame_list_lock); in ttusb_dec_init_tasklet()
1211 INIT_LIST_HEAD(&dec->urb_frame_list); in ttusb_dec_init_tasklet()
1212 tasklet_setup(&dec->urb_tasklet, ttusb_dec_process_urb_frame_list); in ttusb_dec_init_tasklet()
1215 static int ttusb_init_rc( struct ttusb_dec *dec) in ttusb_init_rc() argument
1222 usb_make_path(dec->udev, dec->rc_phys, sizeof(dec->rc_phys)); in ttusb_init_rc()
1223 strlcat(dec->rc_phys, "/input0", sizeof(dec->rc_phys)); in ttusb_init_rc()
1230 input_dev->phys = dec->rc_phys; in ttusb_init_rc()
1245 dec->rc_input_dev = input_dev; in ttusb_init_rc()
1246 if (usb_submit_urb(dec->irq_urb, GFP_KERNEL)) in ttusb_init_rc()
1249 ttusb_dec_send_command(dec,0xb0,sizeof(b),b,NULL,NULL); in ttusb_init_rc()
1254 static void ttusb_dec_init_v_pes(struct ttusb_dec *dec) in ttusb_dec_init_v_pes() argument
1258 dec->v_pes[0] = 0x00; in ttusb_dec_init_v_pes()
1259 dec->v_pes[1] = 0x00; in ttusb_dec_init_v_pes()
1260 dec->v_pes[2] = 0x01; in ttusb_dec_init_v_pes()
1261 dec->v_pes[3] = 0xe0; in ttusb_dec_init_v_pes()
1264 static int ttusb_dec_init_usb(struct ttusb_dec *dec) in ttusb_dec_init_usb() argument
1270 mutex_init(&dec->usb_mutex); in ttusb_dec_init_usb()
1271 mutex_init(&dec->iso_mutex); in ttusb_dec_init_usb()
1273 dec->command_pipe = usb_sndbulkpipe(dec->udev, COMMAND_PIPE); in ttusb_dec_init_usb()
1274 dec->result_pipe = usb_rcvbulkpipe(dec->udev, RESULT_PIPE); in ttusb_dec_init_usb()
1275 dec->in_pipe = usb_rcvisocpipe(dec->udev, IN_PIPE); in ttusb_dec_init_usb()
1276 dec->out_pipe = usb_sndisocpipe(dec->udev, OUT_PIPE); in ttusb_dec_init_usb()
1277 dec->irq_pipe = usb_rcvintpipe(dec->udev, IRQ_PIPE); in ttusb_dec_init_usb()
1280 dec->irq_urb = usb_alloc_urb(0, GFP_KERNEL); in ttusb_dec_init_usb()
1281 if(!dec->irq_urb) { in ttusb_dec_init_usb()
1284 dec->irq_buffer = usb_alloc_coherent(dec->udev,IRQ_PACKET_SIZE, in ttusb_dec_init_usb()
1285 GFP_KERNEL, &dec->irq_dma_handle); in ttusb_dec_init_usb()
1286 if(!dec->irq_buffer) { in ttusb_dec_init_usb()
1287 usb_free_urb(dec->irq_urb); in ttusb_dec_init_usb()
1290 usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe, in ttusb_dec_init_usb()
1291 dec->irq_buffer, IRQ_PACKET_SIZE, in ttusb_dec_init_usb()
1292 ttusb_dec_handle_irq, dec, 1); in ttusb_dec_init_usb()
1293 dec->irq_urb->transfer_dma = dec->irq_dma_handle; in ttusb_dec_init_usb()
1294 dec->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ttusb_dec_init_usb()
1297 result = ttusb_dec_alloc_iso_urbs(dec); in ttusb_dec_init_usb()
1299 usb_free_urb(dec->irq_urb); in ttusb_dec_init_usb()
1300 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE, in ttusb_dec_init_usb()
1301 dec->irq_buffer, dec->irq_dma_handle); in ttusb_dec_init_usb()
1306 static int ttusb_dec_boot_dsp(struct ttusb_dec *dec) in ttusb_dec_boot_dsp() argument
1326 result = request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev); in ttusb_dec_boot_dsp()
1329 __func__, dec->firmware_name); in ttusb_dec_boot_dsp()
1365 result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL); in ttusb_dec_boot_dsp()
1395 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, in ttusb_dec_boot_dsp()
1400 result = usb_bulk_msg(dec->udev, dec->command_pipe, b, in ttusb_dec_boot_dsp()
1406 result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL); in ttusb_dec_boot_dsp()
1414 static int ttusb_dec_init_stb(struct ttusb_dec *dec) in ttusb_dec_init_stb() argument
1421 result = ttusb_dec_get_stb_state(dec, &mode, &model, &version); in ttusb_dec_init_stb()
1433 result = ttusb_dec_boot_dsp(dec); in ttusb_dec_init_stb()
1443 ttusb_dec_set_model(dec, TTUSB_DEC3000S); in ttusb_dec_init_stb()
1447 ttusb_dec_set_model(dec, TTUSB_DEC2000T); in ttusb_dec_init_stb()
1450 ttusb_dec_set_model(dec, TTUSB_DEC2540T); in ttusb_dec_init_stb()
1458 dec->can_playback = 1; in ttusb_dec_init_stb()
1463 static int ttusb_dec_init_dvb(struct ttusb_dec *dec) in ttusb_dec_init_dvb() argument
1469 if ((result = dvb_register_adapter(&dec->adapter, in ttusb_dec_init_dvb()
1470 dec->model_name, THIS_MODULE, in ttusb_dec_init_dvb()
1471 &dec->udev->dev, in ttusb_dec_init_dvb()
1479 dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING; in ttusb_dec_init_dvb()
1481 dec->demux.priv = (void *)dec; in ttusb_dec_init_dvb()
1482 dec->demux.filternum = 31; in ttusb_dec_init_dvb()
1483 dec->demux.feednum = 31; in ttusb_dec_init_dvb()
1484 dec->demux.start_feed = ttusb_dec_start_feed; in ttusb_dec_init_dvb()
1485 dec->demux.stop_feed = ttusb_dec_stop_feed; in ttusb_dec_init_dvb()
1486 dec->demux.write_to_decoder = NULL; in ttusb_dec_init_dvb()
1488 if ((result = dvb_dmx_init(&dec->demux)) < 0) { in ttusb_dec_init_dvb()
1492 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1497 dec->dmxdev.filternum = 32; in ttusb_dec_init_dvb()
1498 dec->dmxdev.demux = &dec->demux.dmx; in ttusb_dec_init_dvb()
1499 dec->dmxdev.capabilities = 0; in ttusb_dec_init_dvb()
1501 if ((result = dvb_dmxdev_init(&dec->dmxdev, &dec->adapter)) < 0) { in ttusb_dec_init_dvb()
1505 dvb_dmx_release(&dec->demux); in ttusb_dec_init_dvb()
1506 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1511 dec->frontend.source = DMX_FRONTEND_0; in ttusb_dec_init_dvb()
1513 if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx, in ttusb_dec_init_dvb()
1514 &dec->frontend)) < 0) { in ttusb_dec_init_dvb()
1518 dvb_dmxdev_release(&dec->dmxdev); in ttusb_dec_init_dvb()
1519 dvb_dmx_release(&dec->demux); in ttusb_dec_init_dvb()
1520 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1525 if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx, in ttusb_dec_init_dvb()
1526 &dec->frontend)) < 0) { in ttusb_dec_init_dvb()
1530 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend); in ttusb_dec_init_dvb()
1531 dvb_dmxdev_release(&dec->dmxdev); in ttusb_dec_init_dvb()
1532 dvb_dmx_release(&dec->demux); in ttusb_dec_init_dvb()
1533 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_init_dvb()
1538 dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx); in ttusb_dec_init_dvb()
1543 static void ttusb_dec_exit_dvb(struct ttusb_dec *dec) in ttusb_dec_exit_dvb() argument
1547 dvb_net_release(&dec->dvb_net); in ttusb_dec_exit_dvb()
1548 dec->demux.dmx.close(&dec->demux.dmx); in ttusb_dec_exit_dvb()
1549 dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend); in ttusb_dec_exit_dvb()
1550 dvb_dmxdev_release(&dec->dmxdev); in ttusb_dec_exit_dvb()
1551 dvb_dmx_release(&dec->demux); in ttusb_dec_exit_dvb()
1552 if (dec->fe) { in ttusb_dec_exit_dvb()
1553 dvb_unregister_frontend(dec->fe); in ttusb_dec_exit_dvb()
1554 dvb_frontend_detach(dec->fe); in ttusb_dec_exit_dvb()
1556 dvb_unregister_adapter(&dec->adapter); in ttusb_dec_exit_dvb()
1559 static void ttusb_dec_exit_rc(struct ttusb_dec *dec) in ttusb_dec_exit_rc() argument
1563 if (dec->rc_input_dev) { in ttusb_dec_exit_rc()
1564 input_unregister_device(dec->rc_input_dev); in ttusb_dec_exit_rc()
1565 dec->rc_input_dev = NULL; in ttusb_dec_exit_rc()
1570 static void ttusb_dec_exit_usb(struct ttusb_dec *dec) in ttusb_dec_exit_usb() argument
1581 if (dec->interface == TTUSB_DEC_INTERFACE_IN) in ttusb_dec_exit_usb()
1582 usb_kill_urb(dec->irq_urb); in ttusb_dec_exit_usb()
1584 usb_free_urb(dec->irq_urb); in ttusb_dec_exit_usb()
1586 usb_free_coherent(dec->udev, IRQ_PACKET_SIZE, in ttusb_dec_exit_usb()
1587 dec->irq_buffer, dec->irq_dma_handle); in ttusb_dec_exit_usb()
1590 dec->iso_stream_count = 0; in ttusb_dec_exit_usb()
1593 usb_kill_urb(dec->iso_urb[i]); in ttusb_dec_exit_usb()
1595 ttusb_dec_free_iso_urbs(dec); in ttusb_dec_exit_usb()
1598 static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec) in ttusb_dec_exit_tasklet() argument
1603 tasklet_kill(&dec->urb_tasklet); in ttusb_dec_exit_tasklet()
1605 while ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { in ttusb_dec_exit_tasklet()
1612 static void ttusb_dec_init_filters(struct ttusb_dec *dec) in ttusb_dec_init_filters() argument
1614 INIT_LIST_HEAD(&dec->filter_info_list); in ttusb_dec_init_filters()
1615 spin_lock_init(&dec->filter_info_list_lock); in ttusb_dec_init_filters()
1618 static void ttusb_dec_exit_filters(struct ttusb_dec *dec) in ttusb_dec_exit_filters() argument
1623 while ((item = dec->filter_info_list.next) != &dec->filter_info_list) { in ttusb_dec_exit_filters()
1634 struct ttusb_dec* dec = fe->dvb->priv; in fe_send_command() local
1635 return ttusb_dec_send_command(dec, command, param_length, params, result_length, cmd_result); in fe_send_command()
1646 struct ttusb_dec *dec; in ttusb_dec_probe() local
1653 if (!(dec = kzalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) { in ttusb_dec_probe()
1658 usb_set_intfdata(intf, (void *)dec); in ttusb_dec_probe()
1662 ttusb_dec_set_model(dec, TTUSB_DEC3000S); in ttusb_dec_probe()
1666 ttusb_dec_set_model(dec, TTUSB_DEC2000T); in ttusb_dec_probe()
1670 ttusb_dec_set_model(dec, TTUSB_DEC2540T); in ttusb_dec_probe()
1674 dec->udev = udev; in ttusb_dec_probe()
1676 result = ttusb_dec_init_usb(dec); in ttusb_dec_probe()
1679 result = ttusb_dec_init_stb(dec); in ttusb_dec_probe()
1682 result = ttusb_dec_init_dvb(dec); in ttusb_dec_probe()
1686 dec->adapter.priv = dec; in ttusb_dec_probe()
1689 dec->fe = ttusbdecfe_dvbs_attach(&fe_config); in ttusb_dec_probe()
1694 dec->fe = ttusbdecfe_dvbt_attach(&fe_config); in ttusb_dec_probe()
1698 if (dec->fe == NULL) { in ttusb_dec_probe()
1699 printk("dvb-ttusb-dec: A frontend driver was not found for device [%04x:%04x]\n", in ttusb_dec_probe()
1700 le16_to_cpu(dec->udev->descriptor.idVendor), in ttusb_dec_probe()
1701 le16_to_cpu(dec->udev->descriptor.idProduct)); in ttusb_dec_probe()
1703 if (dvb_register_frontend(&dec->adapter, dec->fe)) { in ttusb_dec_probe()
1705 if (dec->fe->ops.release) in ttusb_dec_probe()
1706 dec->fe->ops.release(dec->fe); in ttusb_dec_probe()
1707 dec->fe = NULL; in ttusb_dec_probe()
1711 ttusb_dec_init_v_pes(dec); in ttusb_dec_probe()
1712 ttusb_dec_init_filters(dec); in ttusb_dec_probe()
1713 ttusb_dec_init_tasklet(dec); in ttusb_dec_probe()
1715 dec->active = 1; in ttusb_dec_probe()
1717 ttusb_dec_set_interface(dec, TTUSB_DEC_INTERFACE_IN); in ttusb_dec_probe()
1720 ttusb_init_rc(dec); in ttusb_dec_probe()
1724 ttusb_dec_exit_usb(dec); in ttusb_dec_probe()
1726 kfree(dec); in ttusb_dec_probe()
1732 struct ttusb_dec *dec = usb_get_intfdata(intf); in ttusb_dec_disconnect() local
1738 if (dec->active) { in ttusb_dec_disconnect()
1739 ttusb_dec_exit_tasklet(dec); in ttusb_dec_disconnect()
1740 ttusb_dec_exit_filters(dec); in ttusb_dec_disconnect()
1742 ttusb_dec_exit_rc(dec); in ttusb_dec_disconnect()
1743 ttusb_dec_exit_usb(dec); in ttusb_dec_disconnect()
1744 ttusb_dec_exit_dvb(dec); in ttusb_dec_disconnect()
1747 kfree(dec); in ttusb_dec_disconnect()
1750 static void ttusb_dec_set_model(struct ttusb_dec *dec, in ttusb_dec_set_model() argument
1753 dec->model = model; in ttusb_dec_set_model()
1757 dec->model_name = "DEC2000-t"; in ttusb_dec_set_model()
1758 dec->firmware_name = "dvb-ttusb-dec-2000t.fw"; in ttusb_dec_set_model()
1762 dec->model_name = "DEC2540-t"; in ttusb_dec_set_model()
1763 dec->firmware_name = "dvb-ttusb-dec-2540t.fw"; in ttusb_dec_set_model()
1767 dec->model_name = "DEC3000-s"; in ttusb_dec_set_model()
1768 dec->firmware_name = "dvb-ttusb-dec-3000s.fw"; in ttusb_dec_set_model()
1782 .name = "ttusb-dec",