MLK-17047-1: drm/mxsfb: Fix suspend/resume
authorRobert Chiras <robert.chiras@nxp.com>
Fri, 8 Dec 2017 14:19:15 +0000 (16:19 +0200)
committerNitin Garg <nitin.garg@nxp.com>
Tue, 20 Mar 2018 19:51:03 +0000 (14:51 -0500)
MXSFB should always request bus_freq when enabled and release bus_freq
when disabled. Also, when suspend/resume occurs, check if the driver is
running, so what we won't enable it by mistake in resume.

Signed-off-by: Robert Chiras <robert.chiras@nxp.com>
drivers/gpu/drm/mxsfb/mxsfb_crtc.c
drivers/gpu/drm/mxsfb/mxsfb_drv.c
drivers/gpu/drm/mxsfb/mxsfb_drv.h

index 7410a11..9cac4b6 100644 (file)
@@ -26,6 +26,7 @@
 #include <drm/drm_of.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_simple_kms_helper.h>
+#include <linux/busfreq-imx.h>
 #include <linux/clk.h>
 #include <linux/iopoll.h>
 #include <linux/of_graph.h>
@@ -362,6 +363,9 @@ void mxsfb_crtc_enable(struct mxsfb_drm_private *mxsfb)
        if (mxsfb->enabled)
                return;
 
+       if (mxsfb->devdata->flags & MXSFB_FLAG_BUSFREQ)
+               request_bus_freq(BUS_FREQ_HIGH);
+
        writel(0, mxsfb->base + LCDC_CTRL);
        mxsfb_crtc_mode_set_nofb(mxsfb);
        mxsfb_enable_controller(mxsfb);
@@ -376,6 +380,9 @@ void mxsfb_crtc_disable(struct mxsfb_drm_private *mxsfb)
 
        mxsfb_disable_controller(mxsfb);
 
+       if (mxsfb->devdata->flags & MXSFB_FLAG_BUSFREQ)
+               release_bus_freq(BUS_FREQ_HIGH);
+
        mxsfb->enabled = false;
 }
 
index a8280d1..3f4f5c7 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/pm_runtime.h>
 #include <linux/reservation.h>
 #include <linux/version.h>
-#include <linux/busfreq-imx.h>
 
 #include <drm/drmP.h>
 #include <drm/drm_atomic.h>
@@ -520,9 +519,7 @@ static int mxsfb_runtime_suspend(struct device *dev)
                return 0;
 
        mxsfb_crtc_disable(mxsfb);
-
-       if (mxsfb->devdata->flags & MXSFB_FLAG_BUSFREQ)
-               release_bus_freq(BUS_FREQ_HIGH);
+       mxsfb->suspended = true;
 
        return 0;
 }
@@ -532,12 +529,9 @@ static int mxsfb_runtime_resume(struct device *dev)
        struct drm_device *drm = dev_get_drvdata(dev);
        struct mxsfb_drm_private *mxsfb = drm->dev_private;
 
-       if (!drm->registered)
+       if (!drm->registered || !mxsfb->suspended)
                return 0;
 
-       if (mxsfb->devdata->flags & MXSFB_FLAG_BUSFREQ)
-               request_bus_freq(BUS_FREQ_HIGH);
-
        mxsfb_crtc_enable(mxsfb);
 
        return 0;
@@ -549,6 +543,7 @@ static int mxsfb_suspend(struct device *dev)
        struct mxsfb_drm_private *mxsfb = drm->dev_private;
 
        mxsfb_crtc_disable(mxsfb);
+       mxsfb->suspended = true;
 
        return 0;
 }
@@ -558,6 +553,9 @@ static int mxsfb_resume(struct device *dev)
        struct drm_device *drm = dev_get_drvdata(dev);
        struct mxsfb_drm_private *mxsfb = drm->dev_private;
 
+       if (!mxsfb->suspended)
+               return 0;
+
        mxsfb_crtc_enable(mxsfb);
 
        return 0;
index 9023624..b4c98d4 100644 (file)
@@ -46,6 +46,7 @@ struct mxsfb_drm_private {
 
        struct drm_gem_cma_object       *gem;
        bool                            enabled;
+       bool                            suspended;
 };
 
 int mxsfb_setup_crtc(struct drm_device *dev);