aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2008-04-03 03:51:19 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-04-24 13:09:48 -0400
commit72998b71096e364002269a8cacc0524937d479c6 (patch)
treefebb32df15b0f0d085b6892e527e873b1923417b
parent07b80264c3ede47593e83189cce82b31100053f6 (diff)
V4L/DVB (7709): pvrusb2: New device attribute for encoder usage in digital mode
Some tuners seem to not work in digital mode unless the encoder is healthy. Implement a device attribute to represent this flag and modify the core state machines to enforce this requirement. Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-devattr.c2
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-devattr.h7
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw.c33
3 files changed, 33 insertions, 9 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-devattr.c b/drivers/media/video/pvrusb2/pvrusb2-devattr.c
index 64a29adcfd92..74c92a470eb6 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-devattr.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-devattr.c
@@ -201,6 +201,7 @@ static const struct pvr2_device_desc pvr2_device_onair_creator = {
201 .flag_has_analogtuner = !0, 201 .flag_has_analogtuner = !0,
202 .flag_has_composite = !0, 202 .flag_has_composite = !0,
203 .flag_has_svideo = !0, 203 .flag_has_svideo = !0,
204 .flag_digital_requires_cx23416 = !0,
204 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 205 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
205 .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR, 206 .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR,
206 .default_std_mask = V4L2_STD_NTSC_M, 207 .default_std_mask = V4L2_STD_NTSC_M,
@@ -262,6 +263,7 @@ static const struct pvr2_device_desc pvr2_device_onair_usb2 = {
262 .flag_has_analogtuner = !0, 263 .flag_has_analogtuner = !0,
263 .flag_has_composite = !0, 264 .flag_has_composite = !0,
264 .flag_has_svideo = !0, 265 .flag_has_svideo = !0,
266 .flag_digital_requires_cx23416 = !0,
265 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 267 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
266 .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR, 268 .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR,
267 .default_std_mask = V4L2_STD_NTSC_M, 269 .default_std_mask = V4L2_STD_NTSC_M,
diff --git a/drivers/media/video/pvrusb2/pvrusb2-devattr.h b/drivers/media/video/pvrusb2/pvrusb2-devattr.h
index 38913519a818..c2e2b06fe2e0 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-devattr.h
+++ b/drivers/media/video/pvrusb2/pvrusb2-devattr.h
@@ -106,6 +106,13 @@ struct pvr2_device_desc {
106 /* If set, we don't bother trying to load cx23416 firmware. */ 106 /* If set, we don't bother trying to load cx23416 firmware. */
107 int flag_skip_cx23416_firmware:1; 107 int flag_skip_cx23416_firmware:1;
108 108
109 /* If set, the encoder must be healthy in order for digital mode to
110 work (otherwise we assume that digital streaming will work even
111 if we fail to locate firmware for the encoder). If the device
112 doesn't support digital streaming then this flag has no
113 effect. */
114 int flag_digital_requires_cx23416:1;
115
109 /* Device has a hauppauge eeprom which we can interrogate. */ 116 /* Device has a hauppauge eeprom which we can interrogate. */
110 int flag_has_hauppauge_rom:1; 117 int flag_has_hauppauge_rom:1;
111 118
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index 195e974f5eb0..539fe17105e7 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -3502,7 +3502,12 @@ static int state_eval_encoder_ok(struct pvr2_hdw *hdw)
3502 if (hdw->state_encoder_config) return 0; 3502 if (hdw->state_encoder_config) return 0;
3503 if (hdw->state_decoder_run) return 0; 3503 if (hdw->state_decoder_run) return 0;
3504 if (hdw->state_usbstream_run) return 0; 3504 if (hdw->state_usbstream_run) return 0;
3505 if (hdw->pathway_state != PVR2_PATHWAY_ANALOG) return 0; 3505 if (hdw->pathway_state == PVR2_PATHWAY_DIGITAL) {
3506 if (!hdw->hdw_desc->flag_digital_requires_cx23416) return 0;
3507 } else if (hdw->pathway_state != PVR2_PATHWAY_ANALOG) {
3508 return 0;
3509 }
3510
3506 if (pvr2_upload_firmware2(hdw) < 0) { 3511 if (pvr2_upload_firmware2(hdw) < 0) {
3507 hdw->flag_tripped = !0; 3512 hdw->flag_tripped = !0;
3508 trace_stbit("flag_tripped",hdw->flag_tripped); 3513 trace_stbit("flag_tripped",hdw->flag_tripped);
@@ -3687,14 +3692,19 @@ static int state_eval_decoder_run(struct pvr2_hdw *hdw)
3687static int state_eval_usbstream_run(struct pvr2_hdw *hdw) 3692static int state_eval_usbstream_run(struct pvr2_hdw *hdw)
3688{ 3693{
3689 if (hdw->state_usbstream_run) { 3694 if (hdw->state_usbstream_run) {
3695 int fl = !0;
3690 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) { 3696 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
3691 if (hdw->state_encoder_ok && 3697 fl = (hdw->state_encoder_ok &&
3692 hdw->state_encoder_run && 3698 hdw->state_encoder_run);
3693 hdw->state_pathway_ok) return 0; 3699 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
3694 } else { 3700 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
3695 if (hdw->state_pipeline_req && 3701 fl = hdw->state_encoder_ok;
3696 !hdw->state_pipeline_pause && 3702 }
3697 hdw->state_pathway_ok) return 0; 3703 if (fl &&
3704 hdw->state_pipeline_req &&
3705 !hdw->state_pipeline_pause &&
3706 hdw->state_pathway_ok) {
3707 return 0;
3698 } 3708 }
3699 pvr2_hdw_cmd_usbstream(hdw,0); 3709 pvr2_hdw_cmd_usbstream(hdw,0);
3700 hdw->state_usbstream_run = 0; 3710 hdw->state_usbstream_run = 0;
@@ -3705,6 +3715,9 @@ static int state_eval_usbstream_run(struct pvr2_hdw *hdw)
3705 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) { 3715 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
3706 if (!hdw->state_encoder_ok || 3716 if (!hdw->state_encoder_ok ||
3707 !hdw->state_encoder_run) return 0; 3717 !hdw->state_encoder_run) return 0;
3718 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
3719 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
3720 if (!hdw->state_encoder_ok) return 0;
3708 } 3721 }
3709 if (pvr2_hdw_cmd_usbstream(hdw,!0) < 0) return 0; 3722 if (pvr2_hdw_cmd_usbstream(hdw,!0) < 0) return 0;
3710 hdw->state_usbstream_run = !0; 3723 hdw->state_usbstream_run = !0;
@@ -3943,7 +3956,9 @@ static int pvr2_hdw_state_eval(struct pvr2_hdw *hdw)
3943 st = PVR2_STATE_DEAD; 3956 st = PVR2_STATE_DEAD;
3944 } else if (hdw->fw1_state != FW1_STATE_OK) { 3957 } else if (hdw->fw1_state != FW1_STATE_OK) {
3945 st = PVR2_STATE_COLD; 3958 st = PVR2_STATE_COLD;
3946 } else if (analog_mode && !hdw->state_encoder_ok) { 3959 } else if ((analog_mode ||
3960 hdw->hdw_desc->flag_digital_requires_cx23416) &&
3961 !hdw->state_encoder_ok) {
3947 st = PVR2_STATE_WARM; 3962 st = PVR2_STATE_WARM;
3948 } else if (hdw->flag_tripped || 3963 } else if (hdw->flag_tripped ||
3949 (analog_mode && hdw->flag_decoder_missed)) { 3964 (analog_mode && hdw->flag_decoder_missed)) {