diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 72883b5aefa72ef3492a19eb33c58056fa9a194e..f5d8780776ae9ee3331c07d23755d6df94930fc1 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -284,6 +284,9 @@ struct ast_vbios_mode_info {
 struct ast_crtc_state {
 	struct drm_crtc_state base;
 
+	/* Last known format of primary plane */
+	const struct drm_format_info *format;
+
 	struct ast_vbios_mode_info vbios_mode_info;
 };
 
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index a277248328450ae15a1217c3dd841a534e105075..cde1cae073ece76a8493314763bf476bb78b1566 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -535,6 +535,7 @@ static int ast_primary_plane_helper_atomic_check(struct drm_plane *plane,
 						 struct drm_plane_state *state)
 {
 	struct drm_crtc_state *crtc_state;
+	struct ast_crtc_state *ast_crtc_state;
 	int ret;
 
 	if (!state->crtc)
@@ -549,6 +550,13 @@ static int ast_primary_plane_helper_atomic_check(struct drm_plane *plane,
 	if (ret)
 		return ret;
 
+	if (!state->visible)
+		return 0;
+
+	ast_crtc_state = to_ast_crtc_state(crtc_state);
+
+	ast_crtc_state->format = state->fb->format;
+
 	return 0;
 }
 
@@ -783,8 +791,8 @@ static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc,
 					struct drm_crtc_state *state)
 {
 	struct ast_private *ast = crtc->dev->dev_private;
-	struct drm_plane_state *plane_state;
 	struct ast_crtc_state *ast_state;
+	const struct drm_format_info *format;
 	bool succ;
 
 	if (ast->chip == AST1180) {
@@ -793,12 +801,12 @@ static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc,
 	}
 
 	ast_state = to_ast_crtc_state(state);
-	plane_state = crtc->primary->state;
 
-	if (!plane_state || !plane_state->fb)
+	format = ast_state->format;
+	if (!format)
 		return 0;
 
-	succ = ast_get_vbios_mode_info(plane_state->fb->format, &state->mode,
+	succ = ast_get_vbios_mode_info(format, &state->mode,
 				       &state->adjusted_mode,
 				       &ast_state->vbios_mode_info);
 	if (!succ)
@@ -820,7 +828,6 @@ static void ast_crtc_helper_atomic_flush(struct drm_crtc *crtc,
 {
 	struct drm_device *dev = crtc->dev;
 	struct ast_private *ast = dev->dev_private;
-	const struct drm_framebuffer *fb = crtc->primary->state->fb;
 	struct ast_crtc_state *ast_state;
 	const struct drm_format_info *format;
 	struct ast_vbios_mode_info *vbios_mode_info;
@@ -828,12 +835,12 @@ static void ast_crtc_helper_atomic_flush(struct drm_crtc *crtc,
 
 	crtc->state->no_vblank = true;
 
-	if (!fb)
-		return;
-
 	ast_state = to_ast_crtc_state(crtc->state);
 
-	format = fb->format;
+	format = ast_state->format;
+	if (!format)
+		return;
+
 	vbios_mode_info = &ast_state->vbios_mode_info;
 
 	ast_set_color_reg(ast, format);
@@ -896,6 +903,7 @@ ast_crtc_atomic_duplicate_state(struct drm_crtc *crtc)
 
 	ast_state = to_ast_crtc_state(crtc->state);
 
+	new_ast_state->format = ast_state->format;
 	memcpy(&new_ast_state->vbios_mode_info, &ast_state->vbios_mode_info,
 	       sizeof(new_ast_state->vbios_mode_info));