diff --git a/msm/msm_drv.c b/msm/msm_drv.c index 0b0d707176..d43673cd3e 100644 --- a/msm/msm_drv.c +++ b/msm/msm_drv.c @@ -1157,10 +1157,8 @@ static void msm_lastclose(struct drm_device *dev) priv->pending_crtcs); rc = kms->funcs->trigger_null_flush(kms); - if (rc) { - DRM_ERROR("null flush commit failure during lastclose\n"); + if (rc) return; - } } /* diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 45cd994f90..bea70fb8ee 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -3896,10 +3896,18 @@ static int sde_kms_trigger_null_flush(struct msm_kms *kms) sde_kms = to_sde_kms(kms); - if (!sde_kms->splash_data.num_splash_displays || - sde_kms->dsi_display_count == sde_kms->splash_data.num_splash_displays) - return rc; + /* If splash handoff is done, early return*/ + if (!sde_kms->splash_data.num_splash_displays) + return 0; + /* If all builtin-displays are having cont splash enabled, ignore lastclose*/ + if (sde_kms->dsi_display_count == sde_kms->splash_data.num_splash_displays) + return -EINVAL; + + /* + * Trigger NULL flush if built-in secondary/primary is stuck in splash + * while the primary/secondary is running respectively before lastclose. + */ for (i = 0; i < MAX_DSI_DISPLAYS; i++) { splash_display = &sde_kms->splash_data.splash_display[i]; @@ -3912,10 +3920,12 @@ static int sde_kms_trigger_null_flush(struct msm_kms *kms) if (!rc && crtc) sde_kms_cancel_delayed_work(crtc); + if (rc) + DRM_ERROR("null flush commit failure during lastclose\n"); } } - return rc; + return 0; } static void _sde_kms_pm_suspend_idle_helper(struct sde_kms *sde_kms,