Commit 51af70bf authored by Martin Bugge's avatar Martin Bugge Committed by Mauro Carvalho Chehab

[media] ad9389b: remove rx-sense irq dependency

Removed dependency on rx-sense interrupt, it's a leftover from obsolete
code. Removing this simplifies the code.
Signed-off-by: default avatarMartin Bugge <marbugge@cisco.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent d3ec7de4
...@@ -66,11 +66,6 @@ MODULE_LICENSE("GPL"); ...@@ -66,11 +66,6 @@ MODULE_LICENSE("GPL");
********************************************************************** **********************************************************************
*/ */
struct i2c_reg_value {
u8 reg;
u8 value;
};
struct ad9389b_state_edid { struct ad9389b_state_edid {
/* total number of blocks */ /* total number of blocks */
u32 blocks; u32 blocks;
...@@ -143,7 +138,7 @@ static int ad9389b_wr(struct v4l2_subdev *sd, u8 reg, u8 val) ...@@ -143,7 +138,7 @@ static int ad9389b_wr(struct v4l2_subdev *sd, u8 reg, u8 val)
if (ret == 0) if (ret == 0)
return 0; return 0;
} }
v4l2_err(sd, "I2C Write Problem\n"); v4l2_err(sd, "%s: failed reg 0x%x, val 0x%x\n", __func__, reg, val);
return ret; return ret;
} }
...@@ -392,13 +387,11 @@ static int ad9389b_log_status(struct v4l2_subdev *sd) ...@@ -392,13 +387,11 @@ static int ad9389b_log_status(struct v4l2_subdev *sd)
(ad9389b_rd(sd, 0x42) & MASK_AD9389B_MSEN_DETECT) ? (ad9389b_rd(sd, 0x42) & MASK_AD9389B_MSEN_DETECT) ?
"detected" : "no", "detected" : "no",
edid->segments ? "found" : "no", edid->blocks); edid->segments ? "found" : "no", edid->blocks);
if (state->have_monitor) { v4l2_info(sd, "%s output %s\n",
v4l2_info(sd, "%s output %s\n", (ad9389b_rd(sd, 0xaf) & 0x02) ?
(ad9389b_rd(sd, 0xaf) & 0x02) ? "HDMI" : "DVI-D",
"HDMI" : "DVI-D", (ad9389b_rd(sd, 0xa1) & 0x3c) ?
(ad9389b_rd(sd, 0xa1) & 0x3c) ? "disabled" : "enabled");
"disabled" : "enabled");
}
v4l2_info(sd, "ad9389b: %s\n", (ad9389b_rd(sd, 0xb8) & 0x40) ? v4l2_info(sd, "ad9389b: %s\n", (ad9389b_rd(sd, 0xb8) & 0x40) ?
"encrypted" : "no encryption"); "encrypted" : "no encryption");
v4l2_info(sd, "state: %s, error: %s, detect count: %u, msk/irq: %02x/%02x\n", v4l2_info(sd, "state: %s, error: %s, detect count: %u, msk/irq: %02x/%02x\n",
...@@ -413,35 +406,33 @@ static int ad9389b_log_status(struct v4l2_subdev *sd) ...@@ -413,35 +406,33 @@ static int ad9389b_log_status(struct v4l2_subdev *sd)
manual_gear ? "manual" : "automatic", manual_gear ? "manual" : "automatic",
manual_gear ? ((ad9389b_rd(sd, 0x98) & 0x70) >> 4) : manual_gear ? ((ad9389b_rd(sd, 0x98) & 0x70) >> 4) :
((ad9389b_rd(sd, 0x9e) & 0x0e) >> 1)); ((ad9389b_rd(sd, 0x9e) & 0x0e) >> 1));
if (state->have_monitor) { if (ad9389b_rd(sd, 0xaf) & 0x02) {
if (ad9389b_rd(sd, 0xaf) & 0x02) { /* HDMI only */
/* HDMI only */ u8 manual_cts = ad9389b_rd(sd, 0x0a) & 0x80;
u8 manual_cts = ad9389b_rd(sd, 0x0a) & 0x80; u32 N = (ad9389b_rd(sd, 0x01) & 0xf) << 16 |
u32 N = (ad9389b_rd(sd, 0x01) & 0xf) << 16 | ad9389b_rd(sd, 0x02) << 8 |
ad9389b_rd(sd, 0x02) << 8 | ad9389b_rd(sd, 0x03);
ad9389b_rd(sd, 0x03); u8 vic_detect = ad9389b_rd(sd, 0x3e) >> 2;
u8 vic_detect = ad9389b_rd(sd, 0x3e) >> 2; u8 vic_sent = ad9389b_rd(sd, 0x3d) & 0x3f;
u8 vic_sent = ad9389b_rd(sd, 0x3d) & 0x3f; u32 CTS;
u32 CTS;
if (manual_cts)
if (manual_cts) CTS = (ad9389b_rd(sd, 0x07) & 0xf) << 16 |
CTS = (ad9389b_rd(sd, 0x07) & 0xf) << 16 | ad9389b_rd(sd, 0x08) << 8 |
ad9389b_rd(sd, 0x08) << 8 | ad9389b_rd(sd, 0x09);
ad9389b_rd(sd, 0x09); else
else CTS = (ad9389b_rd(sd, 0x04) & 0xf) << 16 |
CTS = (ad9389b_rd(sd, 0x04) & 0xf) << 16 | ad9389b_rd(sd, 0x05) << 8 |
ad9389b_rd(sd, 0x05) << 8 | ad9389b_rd(sd, 0x06);
ad9389b_rd(sd, 0x06); N = (ad9389b_rd(sd, 0x01) & 0xf) << 16 |
N = (ad9389b_rd(sd, 0x01) & 0xf) << 16 | ad9389b_rd(sd, 0x02) << 8 |
ad9389b_rd(sd, 0x02) << 8 | ad9389b_rd(sd, 0x03);
ad9389b_rd(sd, 0x03);
v4l2_info(sd, "ad9389b: CTS %s mode: N %d, CTS %d\n",
v4l2_info(sd, "ad9389b: CTS %s mode: N %d, CTS %d\n", manual_cts ? "manual" : "automatic", N, CTS);
manual_cts ? "manual" : "automatic", N, CTS);
v4l2_info(sd, "ad9389b: VIC: detected %d, sent %d\n",
v4l2_info(sd, "ad9389b: VIC: detected %d, sent %d\n", vic_detect, vic_sent);
vic_detect, vic_sent);
}
} }
if (state->dv_timings.type == V4L2_DV_BT_656_1120) if (state->dv_timings.type == V4L2_DV_BT_656_1120)
v4l2_print_dv_timings(sd->name, "timings: ", v4l2_print_dv_timings(sd->name, "timings: ",
...@@ -556,14 +547,16 @@ static int ad9389b_isr(struct v4l2_subdev *sd, u32 status, bool *handled) ...@@ -556,14 +547,16 @@ static int ad9389b_isr(struct v4l2_subdev *sd, u32 status, bool *handled)
irq_status = ad9389b_rd(sd, 0x96); irq_status = ad9389b_rd(sd, 0x96);
/* clear detected interrupts */ /* clear detected interrupts */
ad9389b_wr(sd, 0x96, irq_status); ad9389b_wr(sd, 0x96, irq_status);
/* enable interrupts */
ad9389b_set_isr(sd, true);
if (irq_status & (MASK_AD9389B_HPD_INT | MASK_AD9389B_MSEN_INT)) v4l2_dbg(1, debug, sd, "%s: irq_status 0x%x\n", __func__, irq_status);
if (irq_status & (MASK_AD9389B_HPD_INT))
ad9389b_check_monitor_present_status(sd); ad9389b_check_monitor_present_status(sd);
if (irq_status & MASK_AD9389B_EDID_RDY_INT) if (irq_status & MASK_AD9389B_EDID_RDY_INT)
ad9389b_check_edid_status(sd); ad9389b_check_edid_status(sd);
/* enable interrupts */
ad9389b_set_isr(sd, true);
*handled = true; *handled = true;
return 0; return 0;
} }
...@@ -612,8 +605,6 @@ static const struct v4l2_subdev_pad_ops ad9389b_pad_ops = { ...@@ -612,8 +605,6 @@ static const struct v4l2_subdev_pad_ops ad9389b_pad_ops = {
/* Enable/disable ad9389b output */ /* Enable/disable ad9389b output */
static int ad9389b_s_stream(struct v4l2_subdev *sd, int enable) static int ad9389b_s_stream(struct v4l2_subdev *sd, int enable)
{ {
struct ad9389b_state *state = get_ad9389b_state(sd);
v4l2_dbg(1, debug, sd, "%s: %sable\n", __func__, (enable ? "en" : "dis")); v4l2_dbg(1, debug, sd, "%s: %sable\n", __func__, (enable ? "en" : "dis"));
ad9389b_wr_and_or(sd, 0xa1, ~0x3c, (enable ? 0 : 0x3c)); ad9389b_wr_and_or(sd, 0xa1, ~0x3c, (enable ? 0 : 0x3c));
...@@ -621,7 +612,6 @@ static int ad9389b_s_stream(struct v4l2_subdev *sd, int enable) ...@@ -621,7 +612,6 @@ static int ad9389b_s_stream(struct v4l2_subdev *sd, int enable)
ad9389b_check_monitor_present_status(sd); ad9389b_check_monitor_present_status(sd);
} else { } else {
ad9389b_s_power(sd, 0); ad9389b_s_power(sd, 0);
state->have_monitor = false;
} }
return 0; return 0;
} }
...@@ -845,7 +835,6 @@ static void ad9389b_edid_handler(struct work_struct *work) ...@@ -845,7 +835,6 @@ static void ad9389b_edid_handler(struct work_struct *work)
if (state->edid.read_retries) { if (state->edid.read_retries) {
state->edid.read_retries--; state->edid.read_retries--;
v4l2_dbg(1, debug, sd, "%s: edid read failed\n", __func__); v4l2_dbg(1, debug, sd, "%s: edid read failed\n", __func__);
state->have_monitor = false;
ad9389b_s_power(sd, false); ad9389b_s_power(sd, false);
ad9389b_s_power(sd, true); ad9389b_s_power(sd, true);
queue_delayed_work(state->work_queue, queue_delayed_work(state->work_queue,
...@@ -922,42 +911,28 @@ static void ad9389b_check_monitor_present_status(struct v4l2_subdev *sd) ...@@ -922,42 +911,28 @@ static void ad9389b_check_monitor_present_status(struct v4l2_subdev *sd)
u8 status = ad9389b_rd(sd, 0x42); u8 status = ad9389b_rd(sd, 0x42);
v4l2_dbg(1, debug, sd, "%s: status: 0x%x%s%s\n", v4l2_dbg(1, debug, sd, "%s: status: 0x%x%s%s\n",
__func__, __func__,
status, status,
status & MASK_AD9389B_HPD_DETECT ? ", hotplug" : "", status & MASK_AD9389B_HPD_DETECT ? ", hotplug" : "",
status & MASK_AD9389B_MSEN_DETECT ? ", rx-sense" : ""); status & MASK_AD9389B_MSEN_DETECT ? ", rx-sense" : "");
if ((status & MASK_AD9389B_HPD_DETECT) && if (status & MASK_AD9389B_HPD_DETECT) {
((status & MASK_AD9389B_MSEN_DETECT) || state->edid.segments)) {
v4l2_dbg(1, debug, sd,
"%s: hotplug and (rx-sense or edid)\n", __func__);
if (!state->have_monitor) {
v4l2_dbg(1, debug, sd, "%s: monitor detected\n", __func__);
state->have_monitor = true;
ad9389b_set_isr(sd, true);
if (!ad9389b_s_power(sd, true)) {
v4l2_dbg(1, debug, sd,
"%s: monitor detected, powerup failed\n", __func__);
return;
}
ad9389b_setup(sd);
ad9389b_notify_monitor_detect(sd);
state->edid.read_retries = EDID_MAX_RETRIES;
queue_delayed_work(state->work_queue,
&state->edid_handler, EDID_DELAY);
}
} else if (status & MASK_AD9389B_HPD_DETECT) {
v4l2_dbg(1, debug, sd, "%s: hotplug detected\n", __func__); v4l2_dbg(1, debug, sd, "%s: hotplug detected\n", __func__);
state->have_monitor = true;
if (!ad9389b_s_power(sd, true)) {
v4l2_dbg(1, debug, sd,
"%s: monitor detected, powerup failed\n", __func__);
return;
}
ad9389b_setup(sd);
ad9389b_notify_monitor_detect(sd);
state->edid.read_retries = EDID_MAX_RETRIES; state->edid.read_retries = EDID_MAX_RETRIES;
queue_delayed_work(state->work_queue, queue_delayed_work(state->work_queue,
&state->edid_handler, EDID_DELAY); &state->edid_handler, EDID_DELAY);
} else if (!(status & MASK_AD9389B_HPD_DETECT)) { } else if (!(status & MASK_AD9389B_HPD_DETECT)) {
v4l2_dbg(1, debug, sd, "%s: hotplug not detected\n", __func__); v4l2_dbg(1, debug, sd, "%s: hotplug not detected\n", __func__);
if (state->have_monitor) { state->have_monitor = false;
v4l2_dbg(1, debug, sd, "%s: monitor not detected\n", __func__); ad9389b_notify_monitor_detect(sd);
state->have_monitor = false;
ad9389b_notify_monitor_detect(sd);
}
ad9389b_s_power(sd, false); ad9389b_s_power(sd, false);
memset(&state->edid, 0, sizeof(struct ad9389b_state_edid)); memset(&state->edid, 0, sizeof(struct ad9389b_state_edid));
} }
...@@ -966,6 +941,10 @@ static void ad9389b_check_monitor_present_status(struct v4l2_subdev *sd) ...@@ -966,6 +941,10 @@ static void ad9389b_check_monitor_present_status(struct v4l2_subdev *sd)
v4l2_ctrl_s_ctrl(state->hotplug_ctrl, ad9389b_have_hotplug(sd) ? 0x1 : 0x0); v4l2_ctrl_s_ctrl(state->hotplug_ctrl, ad9389b_have_hotplug(sd) ? 0x1 : 0x0);
v4l2_ctrl_s_ctrl(state->rx_sense_ctrl, ad9389b_have_rx_sense(sd) ? 0x1 : 0x0); v4l2_ctrl_s_ctrl(state->rx_sense_ctrl, ad9389b_have_rx_sense(sd) ? 0x1 : 0x0);
v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0); v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0);
/* update with setting from ctrls */
ad9389b_s_ctrl(state->rgb_quantization_range_ctrl);
ad9389b_s_ctrl(state->hdmi_mode_ctrl);
} }
static bool edid_block_verify_crc(u8 *edid_block) static bool edid_block_verify_crc(u8 *edid_block)
...@@ -1042,7 +1021,6 @@ static bool ad9389b_check_edid_status(struct v4l2_subdev *sd) ...@@ -1042,7 +1021,6 @@ static bool ad9389b_check_edid_status(struct v4l2_subdev *sd)
!edid_verify_header(sd, segment)) { !edid_verify_header(sd, segment)) {
/* edid crc error, force reread of edid segment */ /* edid crc error, force reread of edid segment */
v4l2_err(sd, "%s: edid crc or header error\n", __func__); v4l2_err(sd, "%s: edid crc or header error\n", __func__);
state->have_monitor = false;
ad9389b_s_power(sd, false); ad9389b_s_power(sd, false);
ad9389b_s_power(sd, true); ad9389b_s_power(sd, true);
return false; return false;
......
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