aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.10/950-0408-drm-atomic-Pass-the-full-state-to-CRTC-atomic-enable.patch
diff options
context:
space:
mode:
authorÁlvaro Fernández Rojas <noltari@gmail.com>2021-08-21 10:54:34 +0200
committerÁlvaro Fernández Rojas <noltari@gmail.com>2021-08-21 19:07:07 +0200
commit8299d1f057439f94c6a4412e2e5c5082b82a30c9 (patch)
tree1bf678d61f11f7394493be464c7876e496f7faed /target/linux/bcm27xx/patches-5.10/950-0408-drm-atomic-Pass-the-full-state-to-CRTC-atomic-enable.patch
parent33b6885975ce376ff075362b7f0890326043111b (diff)
downloadupstream-8299d1f057439f94c6a4412e2e5c5082b82a30c9.tar.gz
upstream-8299d1f057439f94c6a4412e2e5c5082b82a30c9.tar.bz2
upstream-8299d1f057439f94c6a4412e2e5c5082b82a30c9.zip
bcm27xx: add kernel 5.10 support
Rebased RPi foundation patches on linux 5.10.59, removed applied and reverted patches, wireless patches and defconfig patches. bcm2708: boot tested on RPi B+ v1.2 bcm2709: boot tested on RPi 4B v1.1 4G bcm2711: boot tested on RPi 4B v1.1 4G Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0408-drm-atomic-Pass-the-full-state-to-CRTC-atomic-enable.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.10/950-0408-drm-atomic-Pass-the-full-state-to-CRTC-atomic-enable.patch1183
1 files changed, 1183 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0408-drm-atomic-Pass-the-full-state-to-CRTC-atomic-enable.patch b/target/linux/bcm27xx/patches-5.10/950-0408-drm-atomic-Pass-the-full-state-to-CRTC-atomic-enable.patch
new file mode 100644
index 0000000000..3953a1d0ab
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.10/950-0408-drm-atomic-Pass-the-full-state-to-CRTC-atomic-enable.patch
@@ -0,0 +1,1183 @@
+From 41661de0a014d606f6f55dd030a14bc341e677fc Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime@cerno.tech>
+Date: Thu, 8 Oct 2020 14:44:08 +0200
+Subject: [PATCH] drm/atomic: Pass the full state to CRTC atomic
+ enable/disable
+
+Commit 351f950db4ab28c321a1bd4b92e4bb03e34c4703 upstream.
+
+If the CRTC driver ever needs to access the full DRM state, it can't do so
+at atomic_enable / atomic_disable time since drm_atomic_helper_swap_state
+will have cleared the pointer from the struct drm_crtc_state to the struct
+drm_atomic_state before calling those hooks.
+
+In order to allow that, let's pass the full DRM state to atomic_enable and
+atomic_disable. The conversion was done using the coccinelle script below,
+built tested on all the drivers and actually tested on vc4.
+
+virtual report
+
+@@
+struct drm_crtc_helper_funcs *FUNCS;
+identifier dev, state;
+identifier crtc, crtc_state;
+@@
+
+ disable_outputs(struct drm_device *dev, struct drm_atomic_state *state)
+ {
+ <...
+- FUNCS->atomic_disable(crtc, crtc_state);
++ FUNCS->atomic_disable(crtc, state);
+ ...>
+ }
+
+@@
+struct drm_crtc_helper_funcs *FUNCS;
+identifier dev, state;
+identifier crtc, crtc_state;
+@@
+
+ drm_atomic_helper_commit_modeset_enables(struct drm_device *dev, struct drm_atomic_state *state)
+ {
+ <...
+- FUNCS->atomic_enable(crtc, crtc_state);
++ FUNCS->atomic_enable(crtc, state);
+ ...>
+ }
+
+@@
+identifier crtc, old_state;
+@@
+
+ struct drm_crtc_helper_funcs {
+ ...
+- void (*atomic_enable)(struct drm_crtc *crtc, struct drm_crtc_state *old_state);
++ void (*atomic_enable)(struct drm_crtc *crtc, struct drm_atomic_state *state);
+ ...
+- void (*atomic_disable)(struct drm_crtc *crtc, struct drm_crtc_state *old_state);
++ void (*atomic_disable)(struct drm_crtc *crtc, struct drm_atomic_state *state);
+ ...
+}
+
+@ crtc_atomic_func @
+identifier helpers;
+identifier func;
+@@
+
+(
+static struct drm_crtc_helper_funcs helpers = {
+ ...,
+ .atomic_enable = func,
+ ...,
+};
+|
+static struct drm_crtc_helper_funcs helpers = {
+ ...,
+ .atomic_disable = func,
+ ...,
+};
+)
+
+@ ignores_old_state @
+identifier crtc_atomic_func.func;
+identifier crtc, old_state;
+@@
+
+void func(struct drm_crtc *crtc,
+ struct drm_crtc_state *old_state)
+{
+ ... when != old_state
+}
+
+@ adds_old_state depends on crtc_atomic_func && !ignores_old_state @
+identifier crtc_atomic_func.func;
+identifier crtc, old_state;
+@@
+
+void func(struct drm_crtc *crtc, struct drm_crtc_state *old_state)
+{
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state, crtc);
+ ...
+}
+
+@ depends on crtc_atomic_func @
+identifier crtc_atomic_func.func;
+expression E;
+type T;
+@@
+
+void func(...)
+{
+ ...
+- T state = E;
++ T crtc_state = E;
+ <+...
+- state
++ crtc_state
+ ...+>
+
+}
+
+@ depends on crtc_atomic_func @
+identifier crtc_atomic_func.func;
+type T;
+@@
+
+void func(...)
+{
+ ...
+- T state;
++ T crtc_state;
+ <+...
+- state
++ crtc_state
+ ...+>
+
+}
+
+@ depends on crtc_atomic_func @
+identifier crtc_atomic_func.func;
+identifier old_state;
+identifier crtc;
+@@
+
+void func(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state
++ struct drm_atomic_state *state
+ )
+ { ... }
+
+@ include depends on adds_old_state @
+@@
+
+ #include <drm/drm_atomic.h>
+
+@ no_include depends on !include && adds_old_state @
+@@
+
++ #include <drm/drm_atomic.h>
+ #include <drm/...>
+
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Link: https://patchwork.freedesktop.org/patch/msgid/845aa10ef171fc0ea060495efef142a0c13f7870.1602161031.git-series.maxime@cerno.tech
+---
+ drivers/gpu/drm/arc/arcpgu_crtc.c | 4 ++--
+ drivers/gpu/drm/arm/display/komeda/komeda_crtc.c | 8 ++++++--
+ drivers/gpu/drm/arm/hdlcd_crtc.c | 4 ++--
+ drivers/gpu/drm/arm/malidp_crtc.c | 6 ++++--
+ drivers/gpu/drm/armada/armada_crtc.c | 8 ++++++--
+ drivers/gpu/drm/ast/ast_mode.c | 6 ++++--
+ drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 4 ++--
+ drivers/gpu/drm/drm_atomic_helper.c | 4 ++--
+ drivers/gpu/drm/drm_simple_kms_helper.c | 4 ++--
+ drivers/gpu/drm/exynos/exynos_drm_crtc.c | 4 ++--
+ drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c | 6 ++++--
+ drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 4 ++--
+ drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c | 4 ++--
+ drivers/gpu/drm/imx/dcss/dcss-crtc.c | 9 +++++++--
+ drivers/gpu/drm/imx/ipuv3-crtc.c | 6 ++++--
+ drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 4 ++--
+ drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 4 ++--
+ drivers/gpu/drm/meson/meson_crtc.c | 8 ++++----
+ drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 7 +++++--
+ drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c | 4 ++--
+ drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c | 4 ++--
+ drivers/gpu/drm/mxsfb/mxsfb_kms.c | 4 ++--
+ drivers/gpu/drm/omapdrm/omap_crtc.c | 4 ++--
+ drivers/gpu/drm/qxl/qxl_display.c | 4 ++--
+ drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 6 ++++--
+ drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 6 ++++--
+ drivers/gpu/drm/sti/sti_crtc.c | 4 ++--
+ drivers/gpu/drm/stm/ltdc.c | 4 ++--
+ drivers/gpu/drm/sun4i/sun4i_crtc.c | 4 ++--
+ drivers/gpu/drm/tegra/dc.c | 8 ++++----
+ drivers/gpu/drm/tidss/tidss_crtc.c | 6 ++++--
+ drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 4 ++--
+ drivers/gpu/drm/vboxvideo/vbox_mode.c | 4 ++--
+ drivers/gpu/drm/vc4/vc4_crtc.c | 8 ++++++--
+ drivers/gpu/drm/vc4/vc4_txp.c | 9 +++++++--
+ drivers/gpu/drm/virtio/virtgpu_display.c | 4 ++--
+ drivers/gpu/drm/vkms/vkms_crtc.c | 4 ++--
+ drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c | 4 ++--
+ drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 4 ++--
+ drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 4 ++--
+ drivers/gpu/drm/xlnx/zynqmp_disp.c | 6 ++++--
+ drivers/gpu/drm/zte/zx_vou.c | 4 ++--
+ include/drm/drm_modeset_helper_vtables.h | 13 ++-----------
+ 43 files changed, 131 insertions(+), 99 deletions(-)
+
+--- a/drivers/gpu/drm/arc/arcpgu_crtc.c
++++ b/drivers/gpu/drm/arc/arcpgu_crtc.c
+@@ -116,7 +116,7 @@ static void arc_pgu_crtc_mode_set_nofb(s
+ }
+
+ static void arc_pgu_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
+
+@@ -127,7 +127,7 @@ static void arc_pgu_crtc_atomic_enable(s
+ }
+
+ static void arc_pgu_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
+
+--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
++++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+@@ -273,8 +273,10 @@ komeda_crtc_do_flush(struct drm_crtc *cr
+
+ static void
+ komeda_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ pm_runtime_get_sync(crtc->dev->dev);
+ komeda_crtc_prepare(to_kcrtc(crtc));
+ drm_crtc_vblank_on(crtc);
+@@ -319,8 +321,10 @@ komeda_crtc_flush_and_wait_for_flip_done
+
+ static void
+ komeda_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct komeda_crtc *kcrtc = to_kcrtc(crtc);
+ struct komeda_crtc_state *old_st = to_kcrtc_st(old);
+ struct komeda_pipeline *master = kcrtc->master;
+--- a/drivers/gpu/drm/arm/hdlcd_crtc.c
++++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
+@@ -168,7 +168,7 @@ static void hdlcd_crtc_mode_set_nofb(str
+ }
+
+ static void hdlcd_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc);
+
+@@ -179,7 +179,7 @@ static void hdlcd_crtc_atomic_enable(str
+ }
+
+ static void hdlcd_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc);
+
+--- a/drivers/gpu/drm/arm/malidp_crtc.c
++++ b/drivers/gpu/drm/arm/malidp_crtc.c
+@@ -46,7 +46,7 @@ static enum drm_mode_status malidp_crtc_
+ }
+
+ static void malidp_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct malidp_drm *malidp = crtc_to_malidp_device(crtc);
+ struct malidp_hw_device *hwdev = malidp->dev;
+@@ -70,8 +70,10 @@ static void malidp_crtc_atomic_enable(st
+ }
+
+ static void malidp_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct malidp_drm *malidp = crtc_to_malidp_device(crtc);
+ struct malidp_hw_device *hwdev = malidp->dev;
+ int err;
+--- a/drivers/gpu/drm/armada/armada_crtc.c
++++ b/drivers/gpu/drm/armada/armada_crtc.c
+@@ -467,8 +467,10 @@ static void armada_drm_crtc_atomic_flush
+ }
+
+ static void armada_drm_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
+ struct drm_pending_vblank_event *event;
+
+@@ -503,8 +505,10 @@ static void armada_drm_crtc_atomic_disab
+ }
+
+ static void armada_drm_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
+
+ DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);
+--- a/drivers/gpu/drm/ast/ast_mode.c
++++ b/drivers/gpu/drm/ast/ast_mode.c
+@@ -793,7 +793,7 @@ ast_crtc_helper_atomic_flush(struct drm_
+
+ static void
+ ast_crtc_helper_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_device *dev = crtc->dev;
+ struct ast_private *ast = to_ast_private(dev);
+@@ -816,8 +816,10 @@ ast_crtc_helper_atomic_enable(struct drm
+
+ static void
+ ast_crtc_helper_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct drm_device *dev = crtc->dev;
+ struct ast_private *ast = to_ast_private(dev);
+
+--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
++++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
+@@ -165,7 +165,7 @@ atmel_hlcdc_crtc_mode_valid(struct drm_c
+ }
+
+ static void atmel_hlcdc_crtc_atomic_disable(struct drm_crtc *c,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_device *dev = c->dev;
+ struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);
+@@ -200,7 +200,7 @@ static void atmel_hlcdc_crtc_atomic_disa
+ }
+
+ static void atmel_hlcdc_crtc_atomic_enable(struct drm_crtc *c,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_device *dev = c->dev;
+ struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);
+--- a/drivers/gpu/drm/drm_atomic_helper.c
++++ b/drivers/gpu/drm/drm_atomic_helper.c
+@@ -1093,7 +1093,7 @@ disable_outputs(struct drm_device *dev,
+ if (new_crtc_state->enable && funcs->prepare)
+ funcs->prepare(crtc);
+ else if (funcs->atomic_disable)
+- funcs->atomic_disable(crtc, old_crtc_state);
++ funcs->atomic_disable(crtc, old_state);
+ else if (funcs->disable)
+ funcs->disable(crtc);
+ else if (funcs->dpms)
+@@ -1358,7 +1358,7 @@ void drm_atomic_helper_commit_modeset_en
+ DRM_DEBUG_ATOMIC("enabling [CRTC:%d:%s]\n",
+ crtc->base.id, crtc->name);
+ if (funcs->atomic_enable)
+- funcs->atomic_enable(crtc, old_crtc_state);
++ funcs->atomic_enable(crtc, old_state);
+ else if (funcs->commit)
+ funcs->commit(crtc);
+ }
+--- a/drivers/gpu/drm/drm_simple_kms_helper.c
++++ b/drivers/gpu/drm/drm_simple_kms_helper.c
+@@ -99,7 +99,7 @@ static int drm_simple_kms_crtc_check(str
+ }
+
+ static void drm_simple_kms_crtc_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_plane *plane;
+ struct drm_simple_display_pipe *pipe;
+@@ -113,7 +113,7 @@ static void drm_simple_kms_crtc_enable(s
+ }
+
+ static void drm_simple_kms_crtc_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_simple_display_pipe *pipe;
+
+--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
++++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+@@ -19,7 +19,7 @@
+ #include "exynos_drm_plane.h"
+
+ static void exynos_drm_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+
+@@ -30,7 +30,7 @@ static void exynos_drm_crtc_atomic_enabl
+ }
+
+ static void exynos_drm_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+
+--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
++++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
+@@ -43,8 +43,10 @@ static void fsl_dcu_drm_crtc_atomic_flus
+ }
+
+ static void fsl_dcu_drm_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct drm_device *dev = crtc->dev;
+ struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
+
+@@ -62,7 +64,7 @@ static void fsl_dcu_drm_crtc_atomic_disa
+ }
+
+ static void fsl_dcu_drm_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_device *dev = crtc->dev;
+ struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
+--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
++++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
+@@ -172,7 +172,7 @@ static void hibmc_crtc_dpms(struct drm_c
+ }
+
+ static void hibmc_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ unsigned int reg;
+ struct hibmc_drm_private *priv = crtc->dev->dev_private;
+@@ -191,7 +191,7 @@ static void hibmc_crtc_atomic_enable(str
+ }
+
+ static void hibmc_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ unsigned int reg;
+ struct hibmc_drm_private *priv = crtc->dev->dev_private;
+--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
++++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
+@@ -436,7 +436,7 @@ static void ade_dump_regs(void __iomem *
+ #endif
+
+ static void ade_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct kirin_crtc *kcrtc = to_kirin_crtc(crtc);
+ struct ade_hw_ctx *ctx = kcrtc->hw_ctx;
+@@ -459,7 +459,7 @@ static void ade_crtc_atomic_enable(struc
+ }
+
+ static void ade_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct kirin_crtc *kcrtc = to_kirin_crtc(crtc);
+ struct ade_hw_ctx *ctx = kcrtc->hw_ctx;
+--- a/drivers/gpu/drm/imx/dcss/dcss-crtc.c
++++ b/drivers/gpu/drm/imx/dcss/dcss-crtc.c
+@@ -3,6 +3,7 @@
+ * Copyright 2019 NXP.
+ */
+
++#include <drm/drm_atomic.h>
+ #include <drm/drm_atomic_helper.h>
+ #include <drm/drm_vblank.h>
+ #include <linux/platform_device.h>
+@@ -77,8 +78,10 @@ static void dcss_crtc_atomic_flush(struc
+ }
+
+ static void dcss_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct dcss_crtc *dcss_crtc = container_of(crtc, struct dcss_crtc,
+ base);
+ struct dcss_dev *dcss = dcss_crtc->base.dev->dev_private;
+@@ -111,8 +114,10 @@ static void dcss_crtc_atomic_enable(stru
+ }
+
+ static void dcss_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct dcss_crtc *dcss_crtc = container_of(crtc, struct dcss_crtc,
+ base);
+ struct dcss_dev *dcss = dcss_crtc->base.dev->dev_private;
+--- a/drivers/gpu/drm/imx/ipuv3-crtc.c
++++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
+@@ -47,7 +47,7 @@ static inline struct ipu_crtc *to_ipu_cr
+ }
+
+ static void ipu_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
+ struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
+@@ -79,8 +79,10 @@ static void ipu_crtc_disable_planes(stru
+ }
+
+ static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
+ struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
+
+--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
++++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+@@ -112,7 +112,7 @@ static inline struct ingenic_drm *drm_cr
+ }
+
+ static void ingenic_drm_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *state)
++ struct drm_atomic_state *state)
+ {
+ struct ingenic_drm *priv = drm_crtc_get_priv(crtc);
+
+@@ -126,7 +126,7 @@ static void ingenic_drm_crtc_atomic_enab
+ }
+
+ static void ingenic_drm_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *state)
++ struct drm_atomic_state *state)
+ {
+ struct ingenic_drm *priv = drm_crtc_get_priv(crtc);
+ unsigned int var;
+--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
++++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+@@ -517,7 +517,7 @@ void mtk_drm_crtc_async_update(struct dr
+ }
+
+ static void mtk_drm_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+ struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
+@@ -542,7 +542,7 @@ static void mtk_drm_crtc_atomic_enable(s
+ }
+
+ static void mtk_drm_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+ struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
+--- a/drivers/gpu/drm/meson/meson_crtc.c
++++ b/drivers/gpu/drm/meson/meson_crtc.c
+@@ -82,7 +82,7 @@ static const struct drm_crtc_funcs meson
+ };
+
+ static void meson_g12a_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
+ struct drm_crtc_state *crtc_state = crtc->state;
+@@ -118,7 +118,7 @@ static void meson_g12a_crtc_atomic_enabl
+ }
+
+ static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
+ struct drm_crtc_state *crtc_state = crtc->state;
+@@ -146,7 +146,7 @@ static void meson_crtc_atomic_enable(str
+ }
+
+ static void meson_g12a_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
+ struct meson_drm *priv = meson_crtc->priv;
+@@ -171,7 +171,7 @@ static void meson_g12a_crtc_atomic_disab
+ }
+
+ static void meson_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
+ struct meson_drm *priv = meson_crtc->priv;
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+@@ -11,6 +11,7 @@
+ #include <linux/ktime.h>
+ #include <linux/bits.h>
+
++#include <drm/drm_atomic.h>
+ #include <drm/drm_crtc.h>
+ #include <drm/drm_flip_work.h>
+ #include <drm/drm_mode.h>
+@@ -706,10 +707,12 @@ static struct drm_crtc_state *dpu_crtc_d
+ }
+
+ static void dpu_crtc_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
+ struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
+ struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
++ struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct drm_encoder *encoder;
+ unsigned long flags;
+ bool release_bandwidth = false;
+@@ -770,7 +773,7 @@ static void dpu_crtc_disable(struct drm_
+ }
+
+ static void dpu_crtc_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
+ struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
+ struct drm_encoder *encoder;
+--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c
++++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c
+@@ -264,7 +264,7 @@ static void mdp4_crtc_mode_set_nofb(stru
+ }
+
+ static void mdp4_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
+ struct mdp4_kms *mdp4_kms = get_kms(crtc);
+@@ -284,7 +284,7 @@ static void mdp4_crtc_atomic_disable(str
+ }
+
+ static void mdp4_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
+ struct mdp4_kms *mdp4_kms = get_kms(crtc);
+--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
+@@ -483,7 +483,7 @@ static u32 mdp5_crtc_get_vblank_counter(
+ }
+
+ static void mdp5_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc);
+ struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
+@@ -529,7 +529,7 @@ static void mdp5_crtc_vblank_on(struct d
+ }
+
+ static void mdp5_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc);
+ struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
+--- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
++++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
+@@ -303,7 +303,7 @@ static void mxsfb_crtc_atomic_flush(stru
+ }
+
+ static void mxsfb_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev);
+ struct drm_device *drm = mxsfb->drm;
+@@ -327,7 +327,7 @@ static void mxsfb_crtc_atomic_enable(str
+ }
+
+ static void mxsfb_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev);
+ struct drm_device *drm = mxsfb->drm;
+--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
++++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
+@@ -436,7 +436,7 @@ static void omap_crtc_arm_event(struct d
+ }
+
+ static void omap_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct omap_drm_private *priv = crtc->dev->dev_private;
+ struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+@@ -462,7 +462,7 @@ static void omap_crtc_atomic_enable(stru
+ }
+
+ static void omap_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct omap_drm_private *priv = crtc->dev->dev_private;
+ struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+--- a/drivers/gpu/drm/qxl/qxl_display.c
++++ b/drivers/gpu/drm/qxl/qxl_display.c
+@@ -445,13 +445,13 @@ static const struct drm_framebuffer_func
+ };
+
+ static void qxl_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ qxl_crtc_update_monitors_config(crtc, "enable");
+ }
+
+ static void qxl_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ qxl_crtc_update_monitors_config(crtc, "disable");
+ }
+--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+@@ -710,7 +710,7 @@ static int rcar_du_crtc_atomic_check(str
+ }
+
+ static void rcar_du_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
+ struct rcar_du_crtc_state *rstate = to_rcar_crtc_state(crtc->state);
+@@ -745,8 +745,10 @@ static void rcar_du_crtc_atomic_enable(s
+ }
+
+ static void rcar_du_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
+ struct rcar_du_crtc_state *rstate = to_rcar_crtc_state(old_state);
+ struct rcar_du_device *rcdu = rcrtc->dev;
+--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+@@ -693,7 +693,7 @@ static void rockchip_drm_set_win_enabled
+ }
+
+ static void vop_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct vop *vop = to_vop(crtc);
+
+@@ -1261,8 +1261,10 @@ static void vop_crtc_atomic_begin(struct
+ }
+
+ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct vop *vop = to_vop(crtc);
+ const struct vop_data *vop_data = vop->data;
+ struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
+--- a/drivers/gpu/drm/sti/sti_crtc.c
++++ b/drivers/gpu/drm/sti/sti_crtc.c
+@@ -23,7 +23,7 @@
+ #include "sti_vtg.h"
+
+ static void sti_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct sti_mixer *mixer = to_sti_mixer(crtc);
+
+@@ -35,7 +35,7 @@ static void sti_crtc_atomic_enable(struc
+ }
+
+ static void sti_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct sti_mixer *mixer = to_sti_mixer(crtc);
+
+--- a/drivers/gpu/drm/stm/ltdc.c
++++ b/drivers/gpu/drm/stm/ltdc.c
+@@ -420,7 +420,7 @@ static void ltdc_crtc_update_clut(struct
+ }
+
+ static void ltdc_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct ltdc_device *ldev = crtc_to_ltdc(crtc);
+ struct drm_device *ddev = crtc->dev;
+@@ -442,7 +442,7 @@ static void ltdc_crtc_atomic_enable(stru
+ }
+
+ static void ltdc_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct ltdc_device *ldev = crtc_to_ltdc(crtc);
+ struct drm_device *ddev = crtc->dev;
+--- a/drivers/gpu/drm/sun4i/sun4i_crtc.c
++++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c
+@@ -101,7 +101,7 @@ static void sun4i_crtc_atomic_flush(stru
+ }
+
+ static void sun4i_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_encoder *encoder = sun4i_crtc_get_encoder(crtc);
+ struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
+@@ -122,7 +122,7 @@ static void sun4i_crtc_atomic_disable(st
+ }
+
+ static void sun4i_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_encoder *encoder = sun4i_crtc_get_encoder(crtc);
+ struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
+--- a/drivers/gpu/drm/tegra/dc.c
++++ b/drivers/gpu/drm/tegra/dc.c
+@@ -1748,7 +1748,7 @@ static int tegra_dc_wait_idle(struct teg
+ }
+
+ static void tegra_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct tegra_dc *dc = to_tegra_dc(crtc);
+ u32 value;
+@@ -1805,10 +1805,10 @@ static void tegra_crtc_atomic_disable(st
+ }
+
+ static void tegra_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_display_mode *mode = &crtc->state->adjusted_mode;
+- struct tegra_dc_state *state = to_dc_state(crtc->state);
++ struct tegra_dc_state *crtc_state = to_dc_state(crtc->state);
+ struct tegra_dc *dc = to_tegra_dc(crtc);
+ u32 value;
+ int err;
+@@ -1888,7 +1888,7 @@ static void tegra_crtc_atomic_enable(str
+ tegra_dc_writel(dc, 0, DC_DISP_BORDER_COLOR);
+
+ /* apply PLL and pixel clock changes */
+- tegra_dc_commit_state(dc, state);
++ tegra_dc_commit_state(dc, crtc_state);
+
+ /* program display mode */
+ tegra_dc_set_timings(dc, mode);
+--- a/drivers/gpu/drm/tidss/tidss_crtc.c
++++ b/drivers/gpu/drm/tidss/tidss_crtc.c
+@@ -212,8 +212,10 @@ static void tidss_crtc_atomic_flush(stru
+ }
+
+ static void tidss_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct tidss_crtc *tcrtc = to_tidss_crtc(crtc);
+ struct drm_device *ddev = crtc->dev;
+ struct tidss_device *tidss = to_tidss(ddev);
+@@ -255,7 +257,7 @@ static void tidss_crtc_atomic_enable(str
+ }
+
+ static void tidss_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct tidss_crtc *tcrtc = to_tidss_crtc(crtc);
+ struct drm_device *ddev = crtc->dev;
+--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
++++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
+@@ -484,7 +484,7 @@ static void tilcdc_crtc_enable(struct dr
+ }
+
+ static void tilcdc_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ tilcdc_crtc_enable(crtc);
+ }
+@@ -541,7 +541,7 @@ static void tilcdc_crtc_disable(struct d
+ }
+
+ static void tilcdc_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ tilcdc_crtc_disable(crtc);
+ }
+--- a/drivers/gpu/drm/vboxvideo/vbox_mode.c
++++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c
+@@ -213,12 +213,12 @@ static void vbox_crtc_set_base_and_mode(
+ }
+
+ static void vbox_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
+ }
+
+ static void vbox_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
+ }
+
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -489,8 +489,10 @@ int vc4_crtc_disable_at_boot(struct drm_
+ }
+
+ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct vc4_crtc_state *old_vc4_state = to_vc4_crtc_state(old_state);
+ struct drm_device *dev = crtc->dev;
+
+@@ -516,8 +518,10 @@ static void vc4_crtc_atomic_disable(stru
+ }
+
+ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct drm_device *dev = crtc->dev;
+ struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
+ struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc);
+--- a/drivers/gpu/drm/vc4/vc4_txp.c
++++ b/drivers/gpu/drm/vc4/vc4_txp.c
+@@ -13,6 +13,7 @@
+ #include <linux/of_platform.h>
+ #include <linux/pm_runtime.h>
+
++#include <drm/drm_atomic.h>
+ #include <drm/drm_atomic_helper.h>
+ #include <drm/drm_edid.h>
+ #include <drm/drm_fb_cma_helper.h>
+@@ -401,15 +402,19 @@ static int vc4_txp_atomic_check(struct d
+ }
+
+ static void vc4_txp_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ drm_crtc_vblank_on(crtc);
+ vc4_hvs_atomic_enable(crtc, old_state);
+ }
+
+ static void vc4_txp_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct drm_device *dev = crtc->dev;
+
+ /* Disable vblank irq handling before crtc is disabled. */
+--- a/drivers/gpu/drm/virtio/virtgpu_display.c
++++ b/drivers/gpu/drm/virtio/virtgpu_display.c
+@@ -95,12 +95,12 @@ static void virtio_gpu_crtc_mode_set_nof
+ }
+
+ static void virtio_gpu_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ }
+
+ static void virtio_gpu_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_device *dev = crtc->dev;
+ struct virtio_gpu_device *vgdev = dev->dev_private;
+--- a/drivers/gpu/drm/vkms/vkms_crtc.c
++++ b/drivers/gpu/drm/vkms/vkms_crtc.c
+@@ -215,13 +215,13 @@ static int vkms_crtc_atomic_check(struct
+ }
+
+ static void vkms_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ drm_crtc_vblank_on(crtc);
+ }
+
+ static void vkms_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ drm_crtc_vblank_off(crtc);
+ }
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
+@@ -214,7 +214,7 @@ static void vmw_ldu_crtc_mode_set_nofb(s
+ * CRTC, it makes more sense to do those at plane update time.
+ */
+ static void vmw_ldu_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ }
+
+@@ -224,7 +224,7 @@ static void vmw_ldu_crtc_atomic_enable(s
+ * @crtc: CRTC to be turned off
+ */
+ static void vmw_ldu_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ }
+
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
+@@ -279,7 +279,7 @@ static void vmw_sou_crtc_helper_prepare(
+ * This is called after a mode set has been completed.
+ */
+ static void vmw_sou_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ }
+
+@@ -289,7 +289,7 @@ static void vmw_sou_crtc_atomic_enable(s
+ * @crtc: CRTC to be turned off
+ */
+ static void vmw_sou_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct vmw_private *dev_priv;
+ struct vmw_screen_object_unit *sou;
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
+@@ -408,12 +408,12 @@ static void vmw_stdu_crtc_helper_prepare
+ }
+
+ static void vmw_stdu_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ }
+
+ static void vmw_stdu_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct vmw_private *dev_priv;
+ struct vmw_screen_target_display_unit *stdu;
+--- a/drivers/gpu/drm/xlnx/zynqmp_disp.c
++++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c
+@@ -1441,7 +1441,7 @@ static int zynqmp_disp_crtc_setup_clock(
+
+ static void
+ zynqmp_disp_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
+ struct zynqmp_disp *disp = crtc_to_disp(crtc);
+ struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
+@@ -1472,8 +1472,10 @@ zynqmp_disp_crtc_atomic_enable(struct dr
+
+ static void
+ zynqmp_disp_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state)
++ struct drm_atomic_state *state)
+ {
++ struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++ crtc);
+ struct zynqmp_disp *disp = crtc_to_disp(crtc);
+ struct drm_plane_state *old_plane_state;
+
+--- a/drivers/gpu/drm/zte/zx_vou.c
++++ b/drivers/gpu/drm/zte/zx_vou.c
+@@ -350,7 +350,7 @@ static inline void vou_chn_set_update(st
+ }
+
+ static void zx_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct drm_display_mode *mode = &crtc->state->adjusted_mode;
+ bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
+@@ -455,7 +455,7 @@ static void zx_crtc_atomic_enable(struct
+ }
+
+ static void zx_crtc_atomic_disable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
++ struct drm_atomic_state *state)
+ {
+ struct zx_crtc *zcrtc = to_zx_crtc(crtc);
+ const struct zx_crtc_bits *bits = zcrtc->bits;
+--- a/include/drm/drm_modeset_helper_vtables.h
++++ b/include/drm/drm_modeset_helper_vtables.h
+@@ -417,14 +417,10 @@ struct drm_crtc_helper_funcs {
+ * @atomic_enable must be the inverse of @atomic_disable for atomic
+ * drivers.
+ *
+- * Drivers can use the @old_crtc_state input parameter if the operations
+- * needed to enable the CRTC don't depend solely on the new state but
+- * also on the transition between the old state and the new state.
+- *
+ * This function is optional.
+ */
+ void (*atomic_enable)(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state);
++ struct drm_atomic_state *state);
+
+ /**
+ * @atomic_disable:
+@@ -441,15 +437,10 @@ struct drm_crtc_helper_funcs {
+ * need to implement it if there's no need to disable anything at the
+ * CRTC level.
+ *
+- * Comparing to @disable, this one provides the additional input
+- * parameter @old_crtc_state which could be used to access the old
+- * state. Atomic drivers should consider to use this one instead
+- * of @disable.
+- *
+ * This function is optional.
+ */
+ void (*atomic_disable)(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_crtc_state);
++ struct drm_atomic_state *state);
+
+ /**
+ * @get_scanout_position: