|
@@ -1175,12 +1175,23 @@ static void adv7511_dbg_dump_edid(int lvl, int debug, struct v4l2_subdev *sd, in
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void adv7511_notify_no_edid(struct v4l2_subdev *sd)
|
|
|
+{
|
|
|
+ struct adv7511_state *state = get_adv7511_state(sd);
|
|
|
+ struct adv7511_edid_detect ed;
|
|
|
+
|
|
|
+ /* We failed to read the EDID, so send an event for this. */
|
|
|
+ ed.present = false;
|
|
|
+ ed.segment = adv7511_rd(sd, 0xc4);
|
|
|
+ v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed);
|
|
|
+ v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x0);
|
|
|
+}
|
|
|
+
|
|
|
static void adv7511_edid_handler(struct work_struct *work)
|
|
|
{
|
|
|
struct delayed_work *dwork = to_delayed_work(work);
|
|
|
struct adv7511_state *state = container_of(dwork, struct adv7511_state, edid_handler);
|
|
|
struct v4l2_subdev *sd = &state->sd;
|
|
|
- struct adv7511_edid_detect ed;
|
|
|
|
|
|
v4l2_dbg(1, debug, sd, "%s:\n", __func__);
|
|
|
|
|
@@ -1205,9 +1216,7 @@ static void adv7511_edid_handler(struct work_struct *work)
|
|
|
}
|
|
|
|
|
|
/* We failed to read the EDID, so send an event for this. */
|
|
|
- ed.present = false;
|
|
|
- ed.segment = adv7511_rd(sd, 0xc4);
|
|
|
- v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed);
|
|
|
+ adv7511_notify_no_edid(sd);
|
|
|
v4l2_dbg(1, debug, sd, "%s: no edid found\n", __func__);
|
|
|
}
|
|
|
|
|
@@ -1278,7 +1287,6 @@ static void adv7511_check_monitor_present_status(struct v4l2_subdev *sd)
|
|
|
/* update read only ctrls */
|
|
|
v4l2_ctrl_s_ctrl(state->hotplug_ctrl, adv7511_have_hotplug(sd) ? 0x1 : 0x0);
|
|
|
v4l2_ctrl_s_ctrl(state->rx_sense_ctrl, adv7511_have_rx_sense(sd) ? 0x1 : 0x0);
|
|
|
- v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0);
|
|
|
|
|
|
if ((status & MASK_ADV7511_HPD_DETECT) && ((status & MASK_ADV7511_MSEN_DETECT) || state->edid.segments)) {
|
|
|
v4l2_dbg(1, debug, sd, "%s: hotplug and (rx-sense or edid)\n", __func__);
|
|
@@ -1308,6 +1316,7 @@ static void adv7511_check_monitor_present_status(struct v4l2_subdev *sd)
|
|
|
}
|
|
|
adv7511_s_power(sd, false);
|
|
|
memset(&state->edid, 0, sizeof(struct adv7511_state_edid));
|
|
|
+ adv7511_notify_no_edid(sd);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1384,6 +1393,7 @@ static bool adv7511_check_edid_status(struct v4l2_subdev *sd)
|
|
|
}
|
|
|
/* one more segment read ok */
|
|
|
state->edid.segments = segment + 1;
|
|
|
+ v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x1);
|
|
|
if (((state->edid.data[0x7e] >> 1) + 1) > state->edid.segments) {
|
|
|
/* Request next EDID segment */
|
|
|
v4l2_dbg(1, debug, sd, "%s: request segment %d\n", __func__, state->edid.segments);
|
|
@@ -1403,7 +1413,6 @@ static bool adv7511_check_edid_status(struct v4l2_subdev *sd)
|
|
|
ed.present = true;
|
|
|
ed.segment = 0;
|
|
|
state->edid_detect_counter++;
|
|
|
- v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0);
|
|
|
v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed);
|
|
|
return ed.present;
|
|
|
}
|