drm/msm: Fix suspend/resume on i.MX5
When putting iMX5 into suspend, the following flow is
observed:
[ 70.023427] [<
c07755f0>] (msm_atomic_commit_tail) from [<
c06e7218>]
(commit_tail+0x9c/0x18c)
[ 70.031890] [<
c06e7218>] (commit_tail) from [<
c0e2920c>]
(drm_atomic_helper_commit+0x1a0/0x1d4)
[ 70.040627] [<
c0e2920c>] (drm_atomic_helper_commit) from
[<
c06e74d4>] (drm_atomic_helper_disable_all+0x1c4/0x1d4)
[ 70.050913] [<
c06e74d4>] (drm_atomic_helper_disable_all) from
[<
c0e2943c>] (drm_atomic_helper_suspend+0xb8/0x170)
[ 70.061198] [<
c0e2943c>] (drm_atomic_helper_suspend) from
[<
c06e84bc>] (drm_mode_config_helper_suspend+0x24/0x58)
In the i.MX5 case, priv->kms is not populated (as i.MX5 does not use any
of the Qualcomm display controllers), causing a NULL pointer
dereference in msm_atomic_commit_tail():
[ 24.268964] 8<--- cut here ---
[ 24.274602] Unable to handle kernel NULL pointer dereference at
virtual address
00000000
[ 24.283434] pgd = (ptrval)
[ 24.286387] [
00000000] *pgd=
ca212831
[ 24.290788] Internal error: Oops: 17 [#1] SMP ARM
[ 24.295609] Modules linked in:
[ 24.298777] CPU: 0 PID: 197 Comm: init Not tainted 5.11.0-rc2-next-
20210111 #333
[ 24.306276] Hardware name: Freescale i.MX53 (Device Tree Support)
[ 24.312442] PC is at msm_atomic_commit_tail+0x54/0xb9c
[ 24.317743] LR is at commit_tail+0xa4/0x1b0
Fix the problem by calling drm_mode_config_helper_suspend/resume()
only when priv->kms is available.
Fixes: ca8199f13498 ("drm/msm/dpu: ensure device suspend happens during PM sleep")
Signed-off-by: Fabio Estevam <festevam@gmail.com>
Signed-off-by: Rob Clark <robdclark@chromium.org>