|
@@ -519,6 +519,12 @@ static int tvp514x_querystd(struct v4l2_subdev *sd, v4l2_std_id *std_id)
|
|
|
|
|
|
*std_id = V4L2_STD_UNKNOWN;
|
|
|
|
|
|
+ /* To query the standard the TVP514x must power on the ADCs. */
|
|
|
+ if (!decoder->streaming) {
|
|
|
+ tvp514x_s_stream(sd, 1);
|
|
|
+ msleep(LOCK_RETRY_DELAY);
|
|
|
+ }
|
|
|
+
|
|
|
/* query the current standard */
|
|
|
current_std = tvp514x_query_current_std(sd);
|
|
|
if (current_std == STD_INVALID)
|
|
@@ -625,25 +631,12 @@ static int tvp514x_s_routing(struct v4l2_subdev *sd,
|
|
|
int err;
|
|
|
enum tvp514x_input input_sel;
|
|
|
enum tvp514x_output output_sel;
|
|
|
- u8 sync_lock_status, lock_mask;
|
|
|
- int try_count = LOCK_RETRY_COUNT;
|
|
|
|
|
|
if ((input >= INPUT_INVALID) ||
|
|
|
(output >= OUTPUT_INVALID))
|
|
|
/* Index out of bound */
|
|
|
return -EINVAL;
|
|
|
|
|
|
- /*
|
|
|
- * For the sequence streamon -> streamoff and again s_input
|
|
|
- * it fails to lock the signal, since streamoff puts TVP514x
|
|
|
- * into power off state which leads to failure in sub-sequent s_input.
|
|
|
- *
|
|
|
- * So power up the TVP514x device here, since it is important to lock
|
|
|
- * the signal at this stage.
|
|
|
- */
|
|
|
- if (!decoder->streaming)
|
|
|
- tvp514x_s_stream(sd, 1);
|
|
|
-
|
|
|
input_sel = input;
|
|
|
output_sel = output;
|
|
|
|
|
@@ -660,64 +653,6 @@ static int tvp514x_s_routing(struct v4l2_subdev *sd,
|
|
|
|
|
|
decoder->tvp514x_regs[REG_INPUT_SEL].val = input_sel;
|
|
|
decoder->tvp514x_regs[REG_OUTPUT_FORMATTER1].val = output_sel;
|
|
|
-
|
|
|
- /* Clear status */
|
|
|
- msleep(LOCK_RETRY_DELAY);
|
|
|
- err =
|
|
|
- tvp514x_write_reg(sd, REG_CLEAR_LOST_LOCK, 0x01);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
-
|
|
|
- switch (input_sel) {
|
|
|
- case INPUT_CVBS_VI1A:
|
|
|
- case INPUT_CVBS_VI1B:
|
|
|
- case INPUT_CVBS_VI1C:
|
|
|
- case INPUT_CVBS_VI2A:
|
|
|
- case INPUT_CVBS_VI2B:
|
|
|
- case INPUT_CVBS_VI2C:
|
|
|
- case INPUT_CVBS_VI3A:
|
|
|
- case INPUT_CVBS_VI3B:
|
|
|
- case INPUT_CVBS_VI3C:
|
|
|
- case INPUT_CVBS_VI4A:
|
|
|
- lock_mask = STATUS_CLR_SUBCAR_LOCK_BIT |
|
|
|
- STATUS_HORZ_SYNC_LOCK_BIT |
|
|
|
- STATUS_VIRT_SYNC_LOCK_BIT;
|
|
|
- break;
|
|
|
-
|
|
|
- case INPUT_SVIDEO_VI2A_VI1A:
|
|
|
- case INPUT_SVIDEO_VI2B_VI1B:
|
|
|
- case INPUT_SVIDEO_VI2C_VI1C:
|
|
|
- case INPUT_SVIDEO_VI2A_VI3A:
|
|
|
- case INPUT_SVIDEO_VI2B_VI3B:
|
|
|
- case INPUT_SVIDEO_VI2C_VI3C:
|
|
|
- case INPUT_SVIDEO_VI4A_VI1A:
|
|
|
- case INPUT_SVIDEO_VI4A_VI1B:
|
|
|
- case INPUT_SVIDEO_VI4A_VI1C:
|
|
|
- case INPUT_SVIDEO_VI4A_VI3A:
|
|
|
- case INPUT_SVIDEO_VI4A_VI3B:
|
|
|
- case INPUT_SVIDEO_VI4A_VI3C:
|
|
|
- lock_mask = STATUS_HORZ_SYNC_LOCK_BIT |
|
|
|
- STATUS_VIRT_SYNC_LOCK_BIT;
|
|
|
- break;
|
|
|
- /* Need to add other interfaces*/
|
|
|
- default:
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
- while (try_count-- > 0) {
|
|
|
- /* Allow decoder to sync up with new input */
|
|
|
- msleep(LOCK_RETRY_DELAY);
|
|
|
-
|
|
|
- sync_lock_status = tvp514x_read_reg(sd,
|
|
|
- REG_STATUS1);
|
|
|
- if (lock_mask == (sync_lock_status & lock_mask))
|
|
|
- /* Input detected */
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (try_count < 0)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
decoder->input = input;
|
|
|
decoder->output = output;
|
|
|
|