diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c index 22b2a5356566..48076b5e3a30 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c @@ -119,7 +119,7 @@ bool en_4096_2_3840; int en_4k_2_2k; int en_4k_timing = 1; bool hdmi_cec_en; -int skip_frame_cnt = 1; +int vdin_drop_frame_cnt = 1; /* suspend_pddq_sel: * 0: keep phy on when suspend(don't need phy init when * resume), it doesn't work now because phy VDDIO_3.3V @@ -811,7 +811,7 @@ void hdmirx_get_sig_property(struct tvin_frontend_s *fe, hdmirx_set_timing_info(prop); hdmirx_get_hdr_info(prop); hdmirx_get_vsi_info(prop); - prop->skip_vf_num = skip_frame_cnt; + prop->skip_vf_num = vdin_drop_frame_cnt; } /* diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h index 6e3c5cd8b41e..1c95c140f175 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h @@ -34,7 +34,7 @@ //#include "hdmi_rx_edid.h" -#define RX_VER0 "ver.2018-05-11" +#define RX_VER0 "ver.2018-05-17" /* * * @@ -393,6 +393,7 @@ extern struct device *hdmirx_dev; extern struct rx_s rx; extern struct reg_map reg_maps[MAP_ADDR_MODULE_NUM]; extern void rx_tasklet_handler(unsigned long arg); +extern void skip_frame(unsigned int cnt); /* reg */ @@ -421,7 +422,7 @@ extern bool en_4096_2_3840; extern int en_4k_2_2k; extern bool hdmi_cec_en; extern int hdmi_yuv444_enable; -extern int skip_frame_cnt; +extern int vdin_drop_frame_cnt; /* debug */ extern bool hdcp_enable; extern int log_level; diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c index b48aac90a683..13db3d6b6cac 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c @@ -184,7 +184,7 @@ static int stable_check_lvl = 0x7df; * Compared with other brands TV, delay 1.5S to avoid this noise. */ static int edid_update_delay = 150; - +int skip_frame_cnt = 1; static bool hdcp22_reauth_enable; unsigned int edid_update_flag; static bool hdcp22_stop_auth_enable; @@ -291,6 +291,7 @@ static int hdmi_rx_ctrl_irq_handler(void) if (intr_hdcp22 != 0) { hdmirx_wr_dwc(DWC_HDMI2_ICLR, intr_hdcp22); + skip_frame(skip_frame_cnt); if (log_level & HDCP_LOG) rx_pr("intr=%#x\n", intr_hdcp22); switch (intr_hdcp22) { @@ -1503,6 +1504,8 @@ int rx_set_global_variable(const char *buf, int size) return pr_var(new_hdr_lum, index); if (set_pr_var(tmpbuf, skip_frame_cnt, value, &index, ret)) return pr_var(skip_frame_cnt, index); + if (set_pr_var(tmpbuf, vdin_drop_frame_cnt, value, &index, ret)) + return pr_var(vdin_drop_frame_cnt, index); #ifndef USE_NEW_FSM_METHODE if (set_pr_var(tmpbuf, enable_hpd_reset, value, &index, ret)) return pr_var(enable_hpd_reset, index); @@ -1608,6 +1611,7 @@ void rx_get_global_variable(const char *buf) pr_var(port_map, i++); pr_var(new_hdr_lum, i++); pr_var(skip_frame_cnt, i++); + pr_var(vdin_drop_frame_cnt, i++); #ifndef USE_NEW_FSM_METHODE pr_var(enable_hpd_reset, i++); pr_var(sig_unstable_reset_hpd_max, i++); @@ -1618,12 +1622,13 @@ void rx_get_global_variable(const char *buf) pr_var(hdcp_none_wait_max, i++); } -void skip_frame(void) +void skip_frame(unsigned int cnt) { - if (rx.state == FSM_SIG_READY) + if (rx.state == FSM_SIG_READY) { rx.skip = (1000 * 100 / rx.pre.frame_rate / 10) + 1; - if (log_level & VIDEO_LOG) - rx_pr("rx.skip = %d\n", rx.skip); + rx.skip = cnt * rx.skip; + } + rx_pr("rx.skip = %d", rx.skip); } /*********************** @@ -1963,7 +1968,7 @@ void rx_main_state_machine(void) /* video info change */ if ((!is_tmds_valid()) || (!rx_is_timing_stable())) { - skip_frame(); + skip_frame(skip_frame_cnt); if (++sig_unready_cnt >= sig_unready_max) { /*sig_lost_lock_cnt = 0;*/ rx.unready_timestamp = rx.timestamp; @@ -2266,7 +2271,7 @@ void rx_main_state_machine(void) /* video info change */ if ((is_tmds_valid() == false) || (rx_is_timing_stable() == false)) { - skip_frame(); + skip_frame(skip_frame_cnt); if (++sig_unready_cnt >= sig_unready_max) { /*sig_lost_lock_cnt = 0;*/ sig_unready_cnt = 0; diff --git a/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c b/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c index 051e375a9b23..54bf28fe6f1a 100644 --- a/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c +++ b/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c @@ -1312,6 +1312,9 @@ irqreturn_t vdin_isr(int irq, void *dev_id) pre_prop->vdin_hdr_Flag = prop->vdin_hdr_Flag; pre_prop->color_fmt_range = prop->color_fmt_range; pre_prop->dest_cfmt = prop->dest_cfmt; + ignore_frames = 0; + vdin_drop_cnt++; + goto irq_handled; } /* change cutwindow */ if ((devp->cutwindow_cfg != 0) && (devp->auto_cutwindow_en == 1)) {