diff --git a/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c b/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c index bdc6b2c3f31b..ab538e563162 100644 --- a/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c @@ -1033,37 +1033,9 @@ static int rk628_hdmirx_general_isr(struct v4l2_subdev *sd, u32 status, bool *ha return -EINVAL; } - if (!bt1120->vid_ints_en) - return 0; - - rk628_i2c_read(bt1120->rk628, GRF_INTR0_STATUS, &int0_status); - if (!(int0_status & (BIT(8) | BIT(9)))) - return 0; - - v4l2_dbg(1, debug, sd, "%s: int0 status: 0x%x\n", __func__, int0_status); - - rk628_i2c_read(bt1120->rk628, HDMI_RX_MD_ISTS, &md_ints); - rk628_i2c_read(bt1120->rk628, HDMI_RX_PDEC_ISTS, &pdec_ints); - - /* clear interrupts */ - rk628_i2c_write(bt1120->rk628, HDMI_RX_MD_ICLR, 0xffffffff); - rk628_i2c_write(bt1120->rk628, HDMI_RX_PDEC_ICLR, 0xffffffff); - - if (!rk628_is_general_isr(bt1120, md_ints, pdec_ints)) - return 0; - - if (bt1120->rk628->version >= RK628F_VERSION && - rk628_hdmirx_is_signal_change_ists(bt1120->rk628, md_ints, pdec_ints)) - rk628_set_bg_enable(bt1120->rk628, true); - - plugin = tx_5v_power_present(sd); - if (!plugin) { - rk628_bt1120_enable_interrupts(sd, false); - return 0; - } - if (bt1120->rk628->version < RK628F_VERSION) { if (rk628_audio_ctsnints_enabled(audio_info)) { + rk628_i2c_read(bt1120->rk628, HDMI_RX_PDEC_ISTS, &pdec_ints); if (pdec_ints & (ACR_N_CHG_ICLR | ACR_CTS_CHG_ICLR)) { rk628_csi_isr_ctsn(audio_info, pdec_ints); pdec_ints &= ~(ACR_CTS_CHG_ICLR | ACR_CTS_CHG_ICLR); @@ -1078,6 +1050,36 @@ static int rk628_hdmirx_general_isr(struct v4l2_subdev *sd, u32 status, bool *ha } } } + + if (!bt1120->vid_ints_en) + return 0; + + rk628_i2c_read(bt1120->rk628, GRF_INTR0_STATUS, &int0_status); + if (!(int0_status & (BIT(8) | BIT(9)))) + return 0; + + v4l2_dbg(1, debug, sd, "%s: int0 status: 0x%x\n", __func__, int0_status); + + rk628_i2c_read(bt1120->rk628, HDMI_RX_MD_ISTS, &md_ints); + rk628_i2c_read(bt1120->rk628, HDMI_RX_PDEC_ISTS, &pdec_ints); + + /* clear interrupts */ + rk628_i2c_write(bt1120->rk628, HDMI_RX_MD_ICLR, 0xffffffff); + rk628_i2c_write(bt1120->rk628, HDMI_RX_PDEC_ICLR, 0xff3fffff); + + if (!rk628_is_general_isr(bt1120, md_ints, pdec_ints)) + return 0; + + if (bt1120->rk628->version >= RK628F_VERSION && + rk628_hdmirx_is_signal_change_ists(bt1120->rk628, md_ints, pdec_ints)) + rk628_set_bg_enable(bt1120->rk628, true); + + plugin = tx_5v_power_present(sd); + if (!plugin) { + rk628_bt1120_enable_interrupts(sd, false); + return 0; + } + v4l2_dbg(1, debug, sd, "%s: md_ints: %#x, pdec_ints:%#x, plugin: %d\n", __func__, md_ints, pdec_ints, plugin); diff --git a/drivers/media/i2c/rk628/rk628_csi_v4l2.c b/drivers/media/i2c/rk628/rk628_csi_v4l2.c index 1d5dd51c3519..973c7f769e33 100644 --- a/drivers/media/i2c/rk628/rk628_csi_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_csi_v4l2.c @@ -1745,6 +1745,24 @@ static int rk628_hdmirx_general_isr(struct v4l2_subdev *sd, u32 status, bool *ha return -EINVAL; } + if (csi->rk628->version < RK628F_VERSION) { + if (rk628_audio_ctsnints_enabled(audio_info)) { + rk628_i2c_read(csi->rk628, HDMI_RX_PDEC_ISTS, &pdec_ints); + if (pdec_ints & (ACR_N_CHG_ICLR | ACR_CTS_CHG_ICLR)) { + rk628_csi_isr_ctsn(audio_info, pdec_ints); + pdec_ints &= ~(ACR_CTS_CHG_ICLR | ACR_CTS_CHG_ICLR); + *handled = true; + } + } + if (rk628_audio_fifoints_enabled(audio_info)) { + rk628_i2c_read(csi->rk628, HDMI_RX_AUD_FIFO_ISTS, &fifo_ints); + if (fifo_ints & 0x18) { + rk628_csi_isr_fifoints(audio_info, fifo_ints); + *handled = true; + } + } + } + if (!csi->vid_ints_en) return 0; @@ -1757,7 +1775,7 @@ static int rk628_hdmirx_general_isr(struct v4l2_subdev *sd, u32 status, bool *ha /* clear interrupts */ rk628_i2c_write(csi->rk628, HDMI_RX_MD_ICLR, 0xffffffff); - rk628_i2c_write(csi->rk628, HDMI_RX_PDEC_ICLR, 0xffffffff); + rk628_i2c_write(csi->rk628, HDMI_RX_PDEC_ICLR, 0xff3fffff); if (!rk628_is_general_isr(csi, md_ints, pdec_ints)) return 0; @@ -1774,23 +1792,6 @@ static int rk628_hdmirx_general_isr(struct v4l2_subdev *sd, u32 status, bool *ha return 0; } - if (csi->rk628->version < RK628F_VERSION) { - if (rk628_audio_ctsnints_enabled(audio_info)) { - if (pdec_ints & (ACR_N_CHG_ICLR | ACR_CTS_CHG_ICLR)) { - rk628_csi_isr_ctsn(audio_info, pdec_ints); - pdec_ints &= ~(ACR_CTS_CHG_ICLR | ACR_CTS_CHG_ICLR); - *handled = true; - } - } - if (rk628_audio_fifoints_enabled(audio_info)) { - rk628_i2c_read(csi->rk628, HDMI_RX_AUD_FIFO_ISTS, &fifo_ints); - if (fifo_ints & 0x18) { - rk628_csi_isr_fifoints(audio_info, fifo_ints); - *handled = true; - } - } - } - v4l2_dbg(1, debug, sd, "%s: md_ints: %#x, pdec_ints:%#x, plugin: %d\n", __func__, md_ints, pdec_ints, plugin);