diff options
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-streams.c')
-rw-r--r-- | drivers/media/video/ivtv/ivtv-streams.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c index 55df4190c28d..512607e0cda3 100644 --- a/drivers/media/video/ivtv/ivtv-streams.c +++ b/drivers/media/video/ivtv/ivtv-streams.c | |||
@@ -210,6 +210,7 @@ static int ivtv_prep_dev(struct ivtv *itv, int type) | |||
210 | 210 | ||
211 | s->vdev->num = num; | 211 | s->vdev->num = num; |
212 | s->vdev->v4l2_dev = &itv->v4l2_dev; | 212 | s->vdev->v4l2_dev = &itv->v4l2_dev; |
213 | s->vdev->ctrl_handler = itv->v4l2_dev.ctrl_handler; | ||
213 | s->vdev->fops = ivtv_stream_info[type].fops; | 214 | s->vdev->fops = ivtv_stream_info[type].fops; |
214 | s->vdev->release = video_device_release; | 215 | s->vdev->release = video_device_release; |
215 | s->vdev->tvnorms = V4L2_STD_ALL; | 216 | s->vdev->tvnorms = V4L2_STD_ALL; |
@@ -451,7 +452,6 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
451 | { | 452 | { |
452 | u32 data[CX2341X_MBOX_MAX_DATA]; | 453 | u32 data[CX2341X_MBOX_MAX_DATA]; |
453 | struct ivtv *itv = s->itv; | 454 | struct ivtv *itv = s->itv; |
454 | struct cx2341x_mpeg_params *p = &itv->params; | ||
455 | int captype = 0, subtype = 0; | 455 | int captype = 0, subtype = 0; |
456 | int enable_passthrough = 0; | 456 | int enable_passthrough = 0; |
457 | 457 | ||
@@ -472,7 +472,7 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
472 | } | 472 | } |
473 | itv->mpg_data_received = itv->vbi_data_inserted = 0; | 473 | itv->mpg_data_received = itv->vbi_data_inserted = 0; |
474 | itv->dualwatch_jiffies = jiffies; | 474 | itv->dualwatch_jiffies = jiffies; |
475 | itv->dualwatch_stereo_mode = p->audio_properties & 0x0300; | 475 | itv->dualwatch_stereo_mode = v4l2_ctrl_g_ctrl(itv->cxhdl.audio_mode); |
476 | itv->search_pack_header = 0; | 476 | itv->search_pack_header = 0; |
477 | break; | 477 | break; |
478 | 478 | ||
@@ -560,12 +560,12 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
560 | itv->pgm_info_offset, itv->pgm_info_num); | 560 | itv->pgm_info_offset, itv->pgm_info_num); |
561 | 561 | ||
562 | /* Setup API for Stream */ | 562 | /* Setup API for Stream */ |
563 | cx2341x_update(itv, ivtv_api_func, NULL, p); | 563 | cx2341x_handler_setup(&itv->cxhdl); |
564 | 564 | ||
565 | /* mute if capturing radio */ | 565 | /* mute if capturing radio */ |
566 | if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) | 566 | if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) |
567 | ivtv_vapi(itv, CX2341X_ENC_MUTE_VIDEO, 1, | 567 | ivtv_vapi(itv, CX2341X_ENC_MUTE_VIDEO, 1, |
568 | 1 | (p->video_mute_yuv << 8)); | 568 | 1 | (v4l2_ctrl_g_ctrl(itv->cxhdl.video_mute_yuv) << 8)); |
569 | } | 569 | } |
570 | 570 | ||
571 | /* Vsync Setup */ | 571 | /* Vsync Setup */ |
@@ -581,6 +581,8 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) | |||
581 | 581 | ||
582 | clear_bit(IVTV_F_I_EOS, &itv->i_flags); | 582 | clear_bit(IVTV_F_I_EOS, &itv->i_flags); |
583 | 583 | ||
584 | cx2341x_handler_set_busy(&itv->cxhdl, 1); | ||
585 | |||
584 | /* Initialize Digitizer for Capture */ | 586 | /* Initialize Digitizer for Capture */ |
585 | /* Avoid tinny audio problem - ensure audio clocks are going */ | 587 | /* Avoid tinny audio problem - ensure audio clocks are going */ |
586 | v4l2_subdev_call(itv->sd_audio, audio, s_stream, 1); | 588 | v4l2_subdev_call(itv->sd_audio, audio, s_stream, 1); |
@@ -617,7 +619,6 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) | |||
617 | { | 619 | { |
618 | u32 data[CX2341X_MBOX_MAX_DATA]; | 620 | u32 data[CX2341X_MBOX_MAX_DATA]; |
619 | struct ivtv *itv = s->itv; | 621 | struct ivtv *itv = s->itv; |
620 | struct cx2341x_mpeg_params *p = &itv->params; | ||
621 | int datatype; | 622 | int datatype; |
622 | u16 width; | 623 | u16 width; |
623 | u16 height; | 624 | u16 height; |
@@ -627,8 +628,8 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) | |||
627 | 628 | ||
628 | IVTV_DEBUG_INFO("Setting some initial decoder settings\n"); | 629 | IVTV_DEBUG_INFO("Setting some initial decoder settings\n"); |
629 | 630 | ||
630 | width = p->width; | 631 | width = itv->cxhdl.width; |
631 | height = p->height; | 632 | height = itv->cxhdl.height; |
632 | 633 | ||
633 | /* set audio mode to left/stereo for dual/stereo mode. */ | 634 | /* set audio mode to left/stereo for dual/stereo mode. */ |
634 | ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode); | 635 | ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode); |
@@ -668,7 +669,7 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s) | |||
668 | break; | 669 | break; |
669 | } | 670 | } |
670 | if (ivtv_vapi(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, datatype, | 671 | if (ivtv_vapi(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, datatype, |
671 | width, height, p->audio_properties)) { | 672 | width, height, itv->cxhdl.audio_properties)) { |
672 | IVTV_DEBUG_WARN("Couldn't initialize decoder source\n"); | 673 | IVTV_DEBUG_WARN("Couldn't initialize decoder source\n"); |
673 | } | 674 | } |
674 | 675 | ||
@@ -847,6 +848,8 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end) | |||
847 | return 0; | 848 | return 0; |
848 | } | 849 | } |
849 | 850 | ||
851 | cx2341x_handler_set_busy(&itv->cxhdl, 0); | ||
852 | |||
850 | /* Set the following Interrupt mask bits for capture */ | 853 | /* Set the following Interrupt mask bits for capture */ |
851 | ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE); | 854 | ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE); |
852 | del_timer(&itv->dma_timer); | 855 | del_timer(&itv->dma_timer); |
@@ -967,7 +970,8 @@ int ivtv_passthrough_mode(struct ivtv *itv, int enable) | |||
967 | 970 | ||
968 | /* Setup capture if not already done */ | 971 | /* Setup capture if not already done */ |
969 | if (atomic_read(&itv->capturing) == 0) { | 972 | if (atomic_read(&itv->capturing) == 0) { |
970 | cx2341x_update(itv, ivtv_api_func, NULL, &itv->params); | 973 | cx2341x_handler_setup(&itv->cxhdl); |
974 | cx2341x_handler_set_busy(&itv->cxhdl, 1); | ||
971 | } | 975 | } |
972 | 976 | ||
973 | /* Start Passthrough Mode */ | 977 | /* Start Passthrough Mode */ |
@@ -988,6 +992,8 @@ int ivtv_passthrough_mode(struct ivtv *itv, int enable) | |||
988 | clear_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags); | 992 | clear_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags); |
989 | clear_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags); | 993 | clear_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags); |
990 | itv->output_mode = OUT_NONE; | 994 | itv->output_mode = OUT_NONE; |
995 | if (atomic_read(&itv->capturing) == 0) | ||
996 | cx2341x_handler_set_busy(&itv->cxhdl, 0); | ||
991 | 997 | ||
992 | return 0; | 998 | return 0; |
993 | } | 999 | } |