Commit 72998b71 authored by Mike Isely's avatar Mike Isely Committed by Mauro Carvalho Chehab

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: default avatarMike Isely <isely@pobox.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 07b80264
...@@ -201,6 +201,7 @@ static const struct pvr2_device_desc pvr2_device_onair_creator = { ...@@ -201,6 +201,7 @@ static const struct pvr2_device_desc pvr2_device_onair_creator = {
.flag_has_analogtuner = !0, .flag_has_analogtuner = !0,
.flag_has_composite = !0, .flag_has_composite = !0,
.flag_has_svideo = !0, .flag_has_svideo = !0,
.flag_digital_requires_cx23416 = !0,
.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
.digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR, .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR,
.default_std_mask = V4L2_STD_NTSC_M, .default_std_mask = V4L2_STD_NTSC_M,
...@@ -262,6 +263,7 @@ static const struct pvr2_device_desc pvr2_device_onair_usb2 = { ...@@ -262,6 +263,7 @@ static const struct pvr2_device_desc pvr2_device_onair_usb2 = {
.flag_has_analogtuner = !0, .flag_has_analogtuner = !0,
.flag_has_composite = !0, .flag_has_composite = !0,
.flag_has_svideo = !0, .flag_has_svideo = !0,
.flag_digital_requires_cx23416 = !0,
.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
.digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR, .digital_control_scheme = PVR2_DIGITAL_SCHEME_ONAIR,
.default_std_mask = V4L2_STD_NTSC_M, .default_std_mask = V4L2_STD_NTSC_M,
......
...@@ -106,6 +106,13 @@ struct pvr2_device_desc { ...@@ -106,6 +106,13 @@ struct pvr2_device_desc {
/* If set, we don't bother trying to load cx23416 firmware. */ /* If set, we don't bother trying to load cx23416 firmware. */
int flag_skip_cx23416_firmware:1; int flag_skip_cx23416_firmware:1;
/* If set, the encoder must be healthy in order for digital mode to
work (otherwise we assume that digital streaming will work even
if we fail to locate firmware for the encoder). If the device
doesn't support digital streaming then this flag has no
effect. */
int flag_digital_requires_cx23416:1;
/* Device has a hauppauge eeprom which we can interrogate. */ /* Device has a hauppauge eeprom which we can interrogate. */
int flag_has_hauppauge_rom:1; int flag_has_hauppauge_rom:1;
......
...@@ -3502,7 +3502,12 @@ static int state_eval_encoder_ok(struct pvr2_hdw *hdw) ...@@ -3502,7 +3502,12 @@ static int state_eval_encoder_ok(struct pvr2_hdw *hdw)
if (hdw->state_encoder_config) return 0; if (hdw->state_encoder_config) return 0;
if (hdw->state_decoder_run) return 0; if (hdw->state_decoder_run) return 0;
if (hdw->state_usbstream_run) return 0; if (hdw->state_usbstream_run) return 0;
if (hdw->pathway_state != PVR2_PATHWAY_ANALOG) return 0; if (hdw->pathway_state == PVR2_PATHWAY_DIGITAL) {
if (!hdw->hdw_desc->flag_digital_requires_cx23416) return 0;
} else if (hdw->pathway_state != PVR2_PATHWAY_ANALOG) {
return 0;
}
if (pvr2_upload_firmware2(hdw) < 0) { if (pvr2_upload_firmware2(hdw) < 0) {
hdw->flag_tripped = !0; hdw->flag_tripped = !0;
trace_stbit("flag_tripped",hdw->flag_tripped); trace_stbit("flag_tripped",hdw->flag_tripped);
...@@ -3687,14 +3692,19 @@ static int state_eval_decoder_run(struct pvr2_hdw *hdw) ...@@ -3687,14 +3692,19 @@ static int state_eval_decoder_run(struct pvr2_hdw *hdw)
static int state_eval_usbstream_run(struct pvr2_hdw *hdw) static int state_eval_usbstream_run(struct pvr2_hdw *hdw)
{ {
if (hdw->state_usbstream_run) { if (hdw->state_usbstream_run) {
int fl = !0;
if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) { if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
if (hdw->state_encoder_ok && fl = (hdw->state_encoder_ok &&
hdw->state_encoder_run && hdw->state_encoder_run);
hdw->state_pathway_ok) return 0; } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
} else { (hdw->hdw_desc->flag_digital_requires_cx23416)) {
if (hdw->state_pipeline_req && fl = hdw->state_encoder_ok;
}
if (fl &&
hdw->state_pipeline_req &&
!hdw->state_pipeline_pause && !hdw->state_pipeline_pause &&
hdw->state_pathway_ok) return 0; hdw->state_pathway_ok) {
return 0;
} }
pvr2_hdw_cmd_usbstream(hdw,0); pvr2_hdw_cmd_usbstream(hdw,0);
hdw->state_usbstream_run = 0; hdw->state_usbstream_run = 0;
...@@ -3705,6 +3715,9 @@ static int state_eval_usbstream_run(struct pvr2_hdw *hdw) ...@@ -3705,6 +3715,9 @@ static int state_eval_usbstream_run(struct pvr2_hdw *hdw)
if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) { if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
if (!hdw->state_encoder_ok || if (!hdw->state_encoder_ok ||
!hdw->state_encoder_run) return 0; !hdw->state_encoder_run) return 0;
} else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
(hdw->hdw_desc->flag_digital_requires_cx23416)) {
if (!hdw->state_encoder_ok) return 0;
} }
if (pvr2_hdw_cmd_usbstream(hdw,!0) < 0) return 0; if (pvr2_hdw_cmd_usbstream(hdw,!0) < 0) return 0;
hdw->state_usbstream_run = !0; hdw->state_usbstream_run = !0;
...@@ -3943,7 +3956,9 @@ static int pvr2_hdw_state_eval(struct pvr2_hdw *hdw) ...@@ -3943,7 +3956,9 @@ static int pvr2_hdw_state_eval(struct pvr2_hdw *hdw)
st = PVR2_STATE_DEAD; st = PVR2_STATE_DEAD;
} else if (hdw->fw1_state != FW1_STATE_OK) { } else if (hdw->fw1_state != FW1_STATE_OK) {
st = PVR2_STATE_COLD; st = PVR2_STATE_COLD;
} else if (analog_mode && !hdw->state_encoder_ok) { } else if ((analog_mode ||
hdw->hdw_desc->flag_digital_requires_cx23416) &&
!hdw->state_encoder_ok) {
st = PVR2_STATE_WARM; st = PVR2_STATE_WARM;
} else if (hdw->flag_tripped || } else if (hdw->flag_tripped ||
(analog_mode && hdw->flag_decoder_missed)) { (analog_mode && hdw->flag_decoder_missed)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment