Commit 9833239e authored by Mats Randgaard's avatar Mats Randgaard Committed by Mauro Carvalho Chehab

[media] adv7604: Receive CEA formats as RGB on VGA (RGB) input

If the input is ADV7604_INPUT_VGA_RGB and RGB quantization range is
set to V4L2_DV_RGB_RANGE_AUTO, video with CEA timings will be
received as RGB. For ADV7604_INPUT_VGA_COMP, automatic CSC mode
will be selected.

See table 44 on page 205 in "ADV7604 Hardware Manual, Rev. F, August 2010"
for details.
Signed-off-by: default avatarMats Randgaard <matrandg@cisco.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 1577461b
...@@ -911,25 +911,41 @@ static void set_rgb_quantization_range(struct v4l2_subdev *sd) ...@@ -911,25 +911,41 @@ static void set_rgb_quantization_range(struct v4l2_subdev *sd)
{ {
struct adv7604_state *state = to_state(sd); struct adv7604_state *state = to_state(sd);
v4l2_dbg(2, debug, sd, "%s: rgb_quantization_range = %d\n",
__func__, state->rgb_quantization_range);
switch (state->rgb_quantization_range) { switch (state->rgb_quantization_range) {
case V4L2_DV_RGB_RANGE_AUTO: case V4L2_DV_RGB_RANGE_AUTO:
/* automatic */ if (state->selected_input == ADV7604_INPUT_VGA_RGB) {
if (is_digital_input(sd) && !(hdmi_read(sd, 0x05) & 0x80)) { /* Receiving analog RGB signal
/* receiving DVI-D signal */ * Set RGB full range (0-255) */
io_write_and_or(sd, 0x02, 0x0f, 0x10);
/* ADV7604 selects RGB limited range regardless of break;
input format (CE/IT) in automatic mode */ }
if (state->timings.bt.standards & V4L2_DV_BT_STD_CEA861) {
/* RGB limited range (16-235) */ if (state->selected_input == ADV7604_INPUT_VGA_COMP) {
io_write_and_or(sd, 0x02, 0x0f, 0x00); /* Receiving analog YPbPr signal
* Set automode */
} else { io_write_and_or(sd, 0x02, 0x0f, 0xf0);
/* RGB full range (0-255) */ break;
io_write_and_or(sd, 0x02, 0x0f, 0x10); }
}
} else { if (hdmi_read(sd, 0x05) & 0x80) {
/* receiving HDMI or analog signal, set automode */ /* Receiving HDMI signal
* Set automode */
io_write_and_or(sd, 0x02, 0x0f, 0xf0); io_write_and_or(sd, 0x02, 0x0f, 0xf0);
break;
}
/* Receiving DVI-D signal
* ADV7604 selects RGB limited range regardless of
* input format (CE/IT) in automatic mode */
if (state->timings.bt.standards & V4L2_DV_BT_STD_CEA861) {
/* RGB limited range (16-235) */
io_write_and_or(sd, 0x02, 0x0f, 0x00);
} else {
/* RGB full range (0-255) */
io_write_and_or(sd, 0x02, 0x0f, 0x10);
} }
break; break;
case V4L2_DV_RGB_RANGE_LIMITED: case V4L2_DV_RGB_RANGE_LIMITED:
...@@ -1709,7 +1725,7 @@ static int adv7604_log_status(struct v4l2_subdev *sd) ...@@ -1709,7 +1725,7 @@ static int adv7604_log_status(struct v4l2_subdev *sd)
char *input_color_space_txt[16] = { char *input_color_space_txt[16] = {
"RGB limited range (16-235)", "RGB full range (0-255)", "RGB limited range (16-235)", "RGB full range (0-255)",
"YCbCr Bt.601 (16-235)", "YCbCr Bt.709 (16-235)", "YCbCr Bt.601 (16-235)", "YCbCr Bt.709 (16-235)",
"XvYCC Bt.601", "XvYCC Bt.709", "xvYCC Bt.601", "xvYCC Bt.709",
"YCbCr Bt.601 (0-255)", "YCbCr Bt.709 (0-255)", "YCbCr Bt.601 (0-255)", "YCbCr Bt.709 (0-255)",
"invalid", "invalid", "invalid", "invalid", "invalid", "invalid", "invalid", "invalid", "invalid", "invalid",
"invalid", "invalid", "automatic" "invalid", "invalid", "automatic"
......
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