diff --git a/msm/msm_drv.c b/msm/msm_drv.c index 9fece7fd6ce4..f091be5a252c 100644 --- a/msm/msm_drv.c +++ b/msm/msm_drv.c @@ -1069,10 +1069,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 728cf9eec651..2fa69f6af04d 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -3738,10 +3738,17 @@ 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]; @@ -3754,10 +3761,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; } #ifdef CONFIG_DEEPSLEEP