diff --git a/drivers/media/vin/tvin/hdmirx/hdmi_rx_drv.c b/drivers/media/vin/tvin/hdmirx/hdmi_rx_drv.c index f72ea6515..a1a503b3e 100644 --- a/drivers/media/vin/tvin/hdmirx/hdmi_rx_drv.c +++ b/drivers/media/vin/tvin/hdmirx/hdmi_rx_drv.c @@ -774,7 +774,7 @@ void hdmirx_get_hw_vic(struct tvin_sig_property_s *prop, u8 port) */ void hdmirx_get_fps_info(struct tvin_sig_property_s *prop, u8 port) { - u32 rate = rx[port].pre.frame_rate; + u32 rate = rx[port].cur.frame_rate; rate = rate / 100 + (((rate % 100) / 10 >= 5) ? 1 : 0); prop->fps = rate; diff --git a/drivers/media/vin/tvin/vdin/vdin_sm.c b/drivers/media/vin/tvin/vdin/vdin_sm.c index 53f2a17c5..58386c280 100644 --- a/drivers/media/vin/tvin/vdin/vdin_sm.c +++ b/drivers/media/vin/tvin/vdin/vdin_sm.c @@ -235,6 +235,19 @@ int vdin_get_base_fr(struct vdin_dev_s *devp) return ret; } +static bool vdin_check_fps_change(struct vdin_dev_s *devp) +{ + bool is_freesync = vdin_check_is_spd_data(devp) && + devp->prop.spd_data.data[5] >> 1 & 0x7; + if (devp->pre_prop.fps != devp->prop.fps) { + if (devp->prop.vtem_data.vrr_en || is_freesync) + return false; + else + return true; + } + return false; +} + void vdin_update_prop(struct vdin_dev_s *devp) { /*devp->pre_prop.fps = devp->prop.fps;*/ @@ -409,7 +422,7 @@ static enum tvin_sg_chg_flg vdin_hdmirx_fmt_chg_detect(struct vdin_dev_s *devp) } } - if (devp->pre_prop.fps != devp->prop.fps) { + if (vdin_check_fps_change(devp)) { signal_chg |= TVIN_SIG_CHG_VS_FRQ; pr_info("%s fps chg:(0x%x->0x%x)\n", __func__, devp->pre_prop.fps,