You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
[media] tvp514x: s_routing should just change routing, not try to detect a signal
The s_routing function should not try to detect a signal. It is a really bad idea to try to detect a valid video signal and return an error if you can't. Changing input should do just that and nothing more. Also don't power on the ADCs on s_routing, instead do that on querystd. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Acked-by: Lad, Prabhakar <prabhakar.lad@ti.com> Tested-by: Lad, Prabhakar <prabhakar.lad@ti.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
0d4f35f3f0
commit
c389648a92
@@ -519,6 +519,12 @@ static int tvp514x_querystd(struct v4l2_subdev *sd, v4l2_std_id *std_id)
|
|||||||
|
|
||||||
*std_id = V4L2_STD_UNKNOWN;
|
*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 */
|
/* query the current standard */
|
||||||
current_std = tvp514x_query_current_std(sd);
|
current_std = tvp514x_query_current_std(sd);
|
||||||
if (current_std == STD_INVALID)
|
if (current_std == STD_INVALID)
|
||||||
@@ -625,25 +631,12 @@ static int tvp514x_s_routing(struct v4l2_subdev *sd,
|
|||||||
int err;
|
int err;
|
||||||
enum tvp514x_input input_sel;
|
enum tvp514x_input input_sel;
|
||||||
enum tvp514x_output output_sel;
|
enum tvp514x_output output_sel;
|
||||||
u8 sync_lock_status, lock_mask;
|
|
||||||
int try_count = LOCK_RETRY_COUNT;
|
|
||||||
|
|
||||||
if ((input >= INPUT_INVALID) ||
|
if ((input >= INPUT_INVALID) ||
|
||||||
(output >= OUTPUT_INVALID))
|
(output >= OUTPUT_INVALID))
|
||||||
/* Index out of bound */
|
/* Index out of bound */
|
||||||
return -EINVAL;
|
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;
|
input_sel = input;
|
||||||
output_sel = output;
|
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_INPUT_SEL].val = input_sel;
|
||||||
decoder->tvp514x_regs[REG_OUTPUT_FORMATTER1].val = output_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->input = input;
|
||||||
decoder->output = output;
|
decoder->output = output;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user