--- /dev/null
+From ce0210c12433031aba3bbacd75f4c02ab77f2004 Mon Sep 17 00:00:00 2001
+From: Neil Armstrong <narmstrong@baylibre.com>
+Date: Mon, 14 Jan 2019 16:31:18 +0100
+Subject: drm/meson: Fix atomic mode switching regression
+
+From: Neil Armstrong <narmstrong@baylibre.com>
+
+commit ce0210c12433031aba3bbacd75f4c02ab77f2004 upstream.
+
+Since commit 2bcd3ecab773 when switching mode from X11 (ubuntu mate for
+example) the display gets blurry, looking like an invalid framebuffer width.
+
+This commit fixed atomic crtc modesetting in a totally wrong way and
+introduced a local unnecessary ->enabled crtc state.
+
+This commit reverts the crctc _begin() and _enable() changes and simply
+adds drm_atomic_helper_commit_tail_rpm as helper.
+
+Reported-by: Tony McKahan <tonymckahan@gmail.com>
+Suggested-by: Daniel Vetter <daniel@ffwll.ch>
+Fixes: 2bcd3ecab773 ("drm/meson: Fixes for drm_crtc_vblank_on/off support")
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+[narmstrong: fixed blank line issue from checkpatch]
+Link: https://patchwork.freedesktop.org/patch/msgid/20190114153118.8024-1-narmstrong@baylibre.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/meson/meson_crtc.c | 23 ++---------------------
+ drivers/gpu/drm/meson/meson_drv.c | 5 +++++
+ 2 files changed, 7 insertions(+), 21 deletions(-)
+
+--- a/drivers/gpu/drm/meson/meson_crtc.c
++++ b/drivers/gpu/drm/meson/meson_crtc.c
+@@ -45,7 +45,6 @@ struct meson_crtc {
+ struct drm_crtc base;
+ struct drm_pending_vblank_event *event;
+ struct meson_drm *priv;
+- bool enabled;
+ };
+ #define to_meson_crtc(x) container_of(x, struct meson_crtc, base)
+
+@@ -81,7 +80,8 @@ static const struct drm_crtc_funcs meson
+
+ };
+
+-static void meson_crtc_enable(struct drm_crtc *crtc)
++static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
++ struct drm_crtc_state *old_state)
+ {
+ struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
+ struct drm_crtc_state *crtc_state = crtc->state;
+@@ -103,20 +103,6 @@ static void meson_crtc_enable(struct drm
+
+ drm_crtc_vblank_on(crtc);
+
+- meson_crtc->enabled = true;
+-}
+-
+-static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
+- struct drm_crtc_state *old_state)
+-{
+- struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
+- struct meson_drm *priv = meson_crtc->priv;
+-
+- DRM_DEBUG_DRIVER("\n");
+-
+- if (!meson_crtc->enabled)
+- meson_crtc_enable(crtc);
+-
+ priv->viu.osd1_enabled = true;
+ }
+
+@@ -142,8 +128,6 @@ static void meson_crtc_atomic_disable(st
+
+ crtc->state->event = NULL;
+ }
+-
+- meson_crtc->enabled = false;
+ }
+
+ static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
+@@ -152,9 +136,6 @@ static void meson_crtc_atomic_begin(stru
+ struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
+ unsigned long flags;
+
+- if (crtc->state->enable && !meson_crtc->enabled)
+- meson_crtc_enable(crtc);
+-
+ if (crtc->state->event) {
+ WARN_ON(drm_crtc_vblank_get(crtc) != 0);
+
+--- a/drivers/gpu/drm/meson/meson_drv.c
++++ b/drivers/gpu/drm/meson/meson_drv.c
+@@ -82,6 +82,10 @@ static const struct drm_mode_config_func
+ .fb_create = drm_gem_fb_create,
+ };
+
++static const struct drm_mode_config_helper_funcs meson_mode_config_helpers = {
++ .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
++};
++
+ static irqreturn_t meson_irq(int irq, void *arg)
+ {
+ struct drm_device *dev = arg;
+@@ -246,6 +250,7 @@ static int meson_drv_bind_master(struct
+ drm->mode_config.max_width = 3840;
+ drm->mode_config.max_height = 2160;
+ drm->mode_config.funcs = &meson_mode_config_funcs;
++ drm->mode_config.helper_private = &meson_mode_config_helpers;
+
+ /* Hardware Initialization */
+