MA-10971 [8M-EVK]system cannot resume with mipi display
authorguoyin.chen <guoyin.chen@nxp.com>
Thu, 28 Dec 2017 13:20:45 +0000 (21:20 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Tue, 20 Mar 2018 19:52:21 +0000 (14:52 -0500)
In andorid UI framework, we will send DRM_MODE_DPMS_OFF
to drm driver before we request kernel into suspend sate
And send DRM_MODE_DPMS_ON after we resume kernel. mxsfb_resume
should just recover the sate before kernel into suspend.
Otherwise the mxsfb->connector is reset for DRM_MODE_DPMS_OFF,
mxsfb drm driver have below kernel panic when resuming from suspend

Unable to handle kernel NULL pointer dereference at virtual address 000000f4
pgd = ffff8000aa8ea000
[000000f4] *pgd=00000000ea8e9003, *pud=00000000ea4d6003, *pmd=0000000000000000
Internal error: Oops: 96000006 [#1] PREEMPT SMP
Modules linked in: ath10k_pci ath10k_core ath
CPU: 2 PID: 2693 Comm: system_server Not tainted 4.9.68-00922-g707b2da-dirty #35
Hardware name: Freescale i.MX8MQ EVK (DT)
task: ffff8000b92d1b00 task.stack: ffff8000aad60000
PC is at mxsfb_crtc_enable+0xa4/0x538
LR is at mxsfb_crtc_enable+0x4dc/0x538
[<ffff00000871b5cc>] mxsfb_crtc_enable+0xa4/0x538
[<ffff00000871a6fc>] mxsfb_resume+0x68/0x84
[<ffff000008725f08>] platform_pm_resume+0x24/0x4c
[<ffff00000873271c>] dpm_run_callback+0x40/0x1f0
[<ffff0000087336b0>] device_resume+0xac/0x284
[<ffff000008734bec>] dpm_resume+0x11c/0x374
[<ffff00000873526c>] dpm_resume_end+0x14/0x28
[<ffff00000811e558>] suspend_devices_and_enter+0x134/0x2f8
[<ffff00000811ead0>] pm_suspend+0x3b4/0x678
[<ffff00000811ceec>] state_store+0x80/0x9c
[<ffff000008445068>] kobj_attr_store+0x14/0x24
[<ffff0000082c51d8>] sysfs_kf_write+0x40/0x50
[<ffff0000082c43e0>] kernfs_fop_write+0xb0/0x1e0
[<ffff000008242708>] vfs_write+0xac/0x1d0
[<ffff000008243be4>] SyS_write+0x50/0xb0
[<ffff000008082ef0>] el0_svc_naked+0x24/0x28

Change-Id: Ia2c4d0ef42e4a2761209fd678ace35804b40a387
Signed-off-by: guoyin.chen <guoyin.chen@nxp.com>
drivers/gpu/drm/mxsfb/mxsfb_drv.c

index 0f17c1e..60be18f 100644 (file)
@@ -520,8 +520,10 @@ static int mxsfb_runtime_suspend(struct device *dev)
        if (!drm->registered)
                return 0;
 
-       mxsfb_crtc_disable(mxsfb);
-       mxsfb->suspended = true;
+       if (mxsfb->enabled) {
+               mxsfb_crtc_disable(mxsfb);
+               mxsfb->suspended = true;
+       }
 
        return 0;
 }
@@ -535,6 +537,7 @@ static int mxsfb_runtime_resume(struct device *dev)
                return 0;
 
        mxsfb_crtc_enable(mxsfb);
+       mxsfb->suspended = false;
 
        return 0;
 }
@@ -544,8 +547,10 @@ static int mxsfb_suspend(struct device *dev)
        struct drm_device *drm = dev_get_drvdata(dev);
        struct mxsfb_drm_private *mxsfb = drm->dev_private;
 
-       mxsfb_crtc_disable(mxsfb);
-       mxsfb->suspended = true;
+       if (mxsfb->enabled) {
+               mxsfb_crtc_disable(mxsfb);
+               mxsfb->suspended = true;
+       }
 
        return 0;
 }
@@ -559,6 +564,7 @@ static int mxsfb_resume(struct device *dev)
                return 0;
 
        mxsfb_crtc_enable(mxsfb);
+       mxsfb->suspended = false;
 
        return 0;
 }