media: i2c: rk628: fix resolution change but not recognized

Type: Fix
Redmine ID: #456052
Associated modifications: N/A
Test: Use some laptops to change resolution

Change-Id: I671eecb719ef619850fddb93bdda669046060f9d
Signed-off-by: Chen Shunqing <csq@rock-chips.com>
This commit is contained in:
Chen Shunqing
2024-01-18 07:58:12 +00:00
parent 06e95d2c43
commit 042b0700bd
4 changed files with 32 additions and 21 deletions

View File

@@ -912,7 +912,7 @@ static void rk628_bt1120_enable_interrupts(struct v4l2_subdev *sd, bool en)
pdec_mask = AVI_RCV_ENSET | AVI_CKS_CHG_ICLR;
md_mask = VACT_LIN_ENSET | HACT_PIX_ENSET | HS_CLK_ENSET |
DE_ACTIVITY_ENSET | VS_ACT_ENSET | HS_ACT_ENSET;
DE_ACTIVITY_ENSET | VS_ACT_ENSET | HS_ACT_ENSET | VS_CLK_ENSET;
v4l2_dbg(1, debug, sd, "%s: %sable\n", __func__, en ? "en" : "dis");
/* clr irq */
rk628_i2c_write(bt1120->rk628, HDMI_RX_MD_ICLR, md_mask);
@@ -946,10 +946,7 @@ static void rk628_work_isr(struct work_struct *work)
rk628_i2c_read(bt1120->rk628, HDMI_RX_MD_ISTS, &md_ints);
rk628_i2c_read(bt1120->rk628, HDMI_RX_PDEC_ISTS, &pdec_ints);
if (bt1120->rk628->version >= RK628F_VERSION &&
(md_ints & (VACT_LIN_ISTS | HACT_PIX_ISTS |
HS_CLK_ISTS | DE_ACTIVITY_ISTS |
VS_ACT_ISTS | HS_ACT_ISTS) ||
pdec_ints & AVI_CKS_CHG_ISTS))
rk628_hdmirx_is_signal_change_ists(bt1120->rk628))
rk628_set_bg_enable(bt1120->rk628, true);
plugin = tx_5v_power_present(sd);
@@ -975,14 +972,10 @@ static void rk628_work_isr(struct work_struct *work)
}
}
if (bt1120->vid_ints_en) {
rk628_i2c_read(bt1120->rk628, HDMI_RX_MD_ISTS, &md_ints);
v4l2_dbg(1, debug, sd, "%s: md_ints: %#x, pdec_ints:%#x, plugin: %d\n",
__func__, md_ints, pdec_ints, plugin);
if ((md_ints & (VACT_LIN_ISTS | HACT_PIX_ISTS |
HS_CLK_ISTS | DE_ACTIVITY_ISTS |
VS_ACT_ISTS | HS_ACT_ISTS) ||
pdec_ints & AVI_CKS_CHG_ISTS)) {
if (rk628_hdmirx_is_signal_change_ists(bt1120->rk628)) {
rk628_i2c_read(bt1120->rk628, HDMI_RX_MD_HACT_PX, &hact);
rk628_i2c_read(bt1120->rk628, HDMI_RX_MD_VAL, &vact);

View File

@@ -1403,7 +1403,7 @@ static void rk628_csi_enable_interrupts(struct v4l2_subdev *sd, bool en)
pdec_mask = AVI_RCV_ENSET | AVI_CKS_CHG_ICLR;
md_mask = VACT_LIN_ENSET | HACT_PIX_ENSET | HS_CLK_ENSET |
DE_ACTIVITY_ENSET | VS_ACT_ENSET | HS_ACT_ENSET;
DE_ACTIVITY_ENSET | VS_ACT_ENSET | HS_ACT_ENSET | VS_CLK_ENSET;
v4l2_dbg(1, debug, sd, "%s: %sable\n", __func__, en ? "en" : "dis");
/* clr irq */
rk628_i2c_write(csi->rk628, HDMI_RX_MD_ICLR, md_mask);
@@ -1437,10 +1437,7 @@ static void rk628_work_isr(struct work_struct *work)
rk628_i2c_read(csi->rk628, HDMI_RX_MD_ISTS, &md_ints);
rk628_i2c_read(csi->rk628, HDMI_RX_PDEC_ISTS, &pdec_ints);
if (csi->rk628->version >= RK628F_VERSION &&
(md_ints & (VACT_LIN_ISTS | HACT_PIX_ISTS |
HS_CLK_ISTS | DE_ACTIVITY_ISTS |
VS_ACT_ISTS | HS_ACT_ISTS) ||
pdec_ints & AVI_CKS_CHG_ISTS))
rk628_hdmirx_is_signal_change_ists(csi->rk628))
rk628_set_bg_enable(csi->rk628, true);
plugin = tx_5v_power_present(sd);
@@ -1466,15 +1463,10 @@ static void rk628_work_isr(struct work_struct *work)
}
}
if (csi->vid_ints_en) {
rk628_i2c_read(csi->rk628, HDMI_RX_MD_ISTS, &md_ints);
v4l2_dbg(1, debug, sd, "%s: md_ints: %#x, pdec_ints:%#x, plugin: %d\n",
__func__, md_ints, pdec_ints, plugin);
if ((md_ints & (VACT_LIN_ISTS | HACT_PIX_ISTS |
HS_CLK_ISTS | DE_ACTIVITY_ISTS |
VS_ACT_ISTS | HS_ACT_ISTS) ||
pdec_ints & AVI_CKS_CHG_ISTS)) {
if (rk628_hdmirx_is_signal_change_ists(csi->rk628)) {
rk628_i2c_read(csi->rk628, HDMI_RX_MD_HACT_PX, &hact);
rk628_i2c_read(csi->rk628, HDMI_RX_MD_VAL, &vact);
v4l2_dbg(1, debug, sd, "%s: HACT:%#x, VACT:%#x\n",

View File

@@ -1213,3 +1213,24 @@ bool rk628_hdmirx_scdc_ced_err(struct rk628 *rk628)
return true;
}
EXPORT_SYMBOL(rk628_hdmirx_scdc_ced_err);
bool rk628_hdmirx_is_signal_change_ists(struct rk628 *rk628)
{
u32 md_ints, pdec_ints;
u32 md_mask, pded_madk;
md_mask = VACT_LIN_ISTS | HACT_PIX_ISTS |
HS_CLK_ISTS | DE_ACTIVITY_ISTS |
VS_ACT_ISTS | HS_ACT_ISTS | VS_CLK_ISTS;
rk628_i2c_read(rk628, HDMI_RX_MD_ISTS, &md_ints);
if (md_ints & md_mask)
return true;
pded_madk = AVI_CKS_CHG_ISTS;
rk628_i2c_read(rk628, HDMI_RX_PDEC_ISTS, &pdec_ints);
if (pdec_ints & pded_madk)
return true;
return false;
}
EXPORT_SYMBOL(rk628_hdmirx_is_signal_change_ists);

View File

@@ -335,6 +335,8 @@
#define HDMI_RX_MD_IEN_CLR (HDMI_RX_BASE + 0x0fc0)
#define HDMI_RX_MD_IEN_SET (HDMI_RX_BASE + 0x0fc4)
#define VACT_LIN_ENSET BIT(9)
#define VS_CLK_ENSET BIT(8)
#define VTOT_CLK_ENSET BIT(7)
#define HACT_PIX_ENSET BIT(6)
#define HS_CLK_ENSET BIT(5)
#define DE_ACTIVITY_ENSET BIT(2)
@@ -342,6 +344,8 @@
#define HS_ACT_ENSET BIT(0)
#define HDMI_RX_MD_ISTS (HDMI_RX_BASE + 0x0fc8)
#define VACT_LIN_ISTS BIT(9)
#define VS_CLK_ISTS BIT(8)
#define VTOT_CLK_ISTS BIT(7)
#define HACT_PIX_ISTS BIT(6)
#define HS_CLK_ISTS BIT(5)
#define DE_ACTIVITY_ISTS BIT(2)
@@ -463,5 +467,6 @@ int rk628_hdmirx_get_timings(struct rk628 *rk628,
u8 rk628_hdmirx_get_range(struct rk628 *rk628);
void rk628_hdmirx_controller_reset(struct rk628 *rk628);
bool rk628_hdmirx_scdc_ced_err(struct rk628 *rk628);
bool rk628_hdmirx_is_signal_change_ists(struct rk628 *rk628);
#endif