diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index d2b2825bfebf..dc10a0ced204 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -324,6 +324,23 @@ static void rockchip_dp_bridge_detach(struct analogix_dp_plat_data *plat_data, rockchip_drm_unregister_sub_dev(sdev); } +static enum drm_mode_status +rockchip_dp_drm_encoder_mode_valid(struct drm_encoder *encoder, + const struct drm_display_mode *mode) +{ + struct rockchip_dp_device *dp = encoder_to_dp(encoder); + struct videomode vm; + + drm_display_mode_to_videomode(mode, &vm); + + if (!vm.hfront_porch || !vm.hback_porch || !vm.vfront_porch || !vm.vback_porch) { + DRM_DEV_ERROR(dp->dev, "front porch or back porch can not be 0\n"); + return MODE_BAD; + } + + return MODE_OK; +} + static bool rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder, const struct drm_display_mode *mode, @@ -494,6 +511,7 @@ rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder, } static struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = { + .mode_valid = rockchip_dp_drm_encoder_mode_valid, .mode_fixup = rockchip_dp_drm_encoder_mode_fixup, .mode_set = rockchip_dp_drm_encoder_mode_set, .atomic_enable = rockchip_dp_drm_encoder_enable,