media: vivid: add HDMI (dis)connect RX emulation

Adds the following bitmask control:
-V4L2_CID_DV_RX_POWER_PRESENT

The RX_POWER_PRESENT bitmask is set based on the digital video timings
signal mode. This also removes 1/1 warnings for v4l2-compliance test on
vivid instance with HDMI input.

Signed-off-by: Johan Korsnes <johan.korsnes@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
Johan Korsnes 2019-06-18 03:37:23 -04:00 коммит произвёл Mauro Carvalho Chehab
Родитель 79a792dafa
Коммит 8a99e9faa1
2 изменённых файлов: 23 добавлений и 2 удалений

Просмотреть файл

@ -240,6 +240,8 @@ struct vivid_dev {
struct v4l2_ctrl *ctrl_tx_hotplug; struct v4l2_ctrl *ctrl_tx_hotplug;
struct v4l2_ctrl *ctrl_tx_rxsense; struct v4l2_ctrl *ctrl_tx_rxsense;
struct v4l2_ctrl *ctrl_rx_power_present;
struct v4l2_ctrl *radio_tx_rds_pi; struct v4l2_ctrl *radio_tx_rds_pi;
struct v4l2_ctrl *radio_tx_rds_pty; struct v4l2_ctrl *radio_tx_rds_pty;
struct v4l2_ctrl *radio_tx_rds_mono_stereo; struct v4l2_ctrl *radio_tx_rds_mono_stereo;
@ -323,6 +325,8 @@ struct vivid_dev {
unsigned tv_field_cap; unsigned tv_field_cap;
unsigned tv_audio_input; unsigned tv_audio_input;
u32 power_present;
/* Capture Overlay */ /* Capture Overlay */
struct v4l2_framebuffer fb_cap; struct v4l2_framebuffer fb_cap;
struct v4l2_fh *overlay_cap_owner; struct v4l2_fh *overlay_cap_owner;

Просмотреть файл

@ -358,7 +358,7 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
V4L2_COLORSPACE_470_SYSTEM_BG, V4L2_COLORSPACE_470_SYSTEM_BG,
}; };
struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_vid_cap); struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_vid_cap);
unsigned i; unsigned int i, j;
switch (ctrl->id) { switch (ctrl->id) {
case VIVID_CID_TEST_PATTERN: case VIVID_CID_TEST_PATTERN:
@ -472,6 +472,18 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
dev->ctrl_dv_timings_signal_mode->val; dev->ctrl_dv_timings_signal_mode->val;
dev->query_dv_timings[dev->input] = dev->ctrl_dv_timings->val; dev->query_dv_timings[dev->input] = dev->ctrl_dv_timings->val;
dev->power_present = 0;
for (i = 0, j = 0;
i < ARRAY_SIZE(dev->dv_timings_signal_mode);
i++)
if (dev->input_type[i] == HDMI) {
if (dev->dv_timings_signal_mode[i] != NO_SIGNAL)
dev->power_present |= (1 << j);
j++;
}
__v4l2_ctrl_s_ctrl(dev->ctrl_rx_power_present,
dev->power_present);
v4l2_ctrl_activate(dev->ctrl_dv_timings, v4l2_ctrl_activate(dev->ctrl_dv_timings,
dev->dv_timings_signal_mode[dev->input] == dev->dv_timings_signal_mode[dev->input] ==
SELECTED_DV_TIMINGS); SELECTED_DV_TIMINGS);
@ -1583,7 +1595,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
v4l2_ctrl_new_custom(hdl_vbi_cap, &vivid_ctrl_vbi_cap_interlaced, NULL); v4l2_ctrl_new_custom(hdl_vbi_cap, &vivid_ctrl_vbi_cap_interlaced, NULL);
} }
if (has_hdmi && dev->has_vid_cap) { if (dev->num_hdmi_inputs) {
dev->ctrl_dv_timings_signal_mode = v4l2_ctrl_new_custom(hdl_vid_cap, dev->ctrl_dv_timings_signal_mode = v4l2_ctrl_new_custom(hdl_vid_cap,
&vivid_ctrl_dv_timings_signal_mode, NULL); &vivid_ctrl_dv_timings_signal_mode, NULL);
@ -1603,6 +1615,11 @@ int vivid_create_controls(struct vivid_dev *dev, bool show_ccs_cap,
&vivid_vid_cap_ctrl_ops, &vivid_vid_cap_ctrl_ops,
V4L2_CID_DV_RX_RGB_RANGE, V4L2_DV_RGB_RANGE_FULL, V4L2_CID_DV_RX_RGB_RANGE, V4L2_DV_RGB_RANGE_FULL,
0, V4L2_DV_RGB_RANGE_AUTO); 0, V4L2_DV_RGB_RANGE_AUTO);
dev->ctrl_rx_power_present = v4l2_ctrl_new_std(hdl_vid_cap,
NULL, V4L2_CID_DV_RX_POWER_PRESENT, 0,
(2 << (dev->num_hdmi_inputs - 1)) - 1, 0,
(2 << (dev->num_hdmi_inputs - 1)) - 1);
} }
if (dev->num_hdmi_outputs) { if (dev->num_hdmi_outputs) {
/* /*