diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 2e9fe2b93d181047709f16a94d1c6763a88e312f..95d1cbfe37123894b07ce11413b648ee15907aac 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -1474,6 +1474,7 @@ struct intel_pps { int backlight_off_delay; struct delayed_work panel_vdd_work; bool want_panel_vdd; + bool initializing; unsigned long last_power_on; unsigned long last_backlight_off; ktime_t panel_power_off_time; diff --git a/drivers/gpu/drm/i915/display/intel_pps.c b/drivers/gpu/drm/i915/display/intel_pps.c index bcc70a329ecf9000ba031d0bbe0dd7a767d8d8c6..e6f701e411e0d9583bdce37f293607c99c0c11d2 100644 --- a/drivers/gpu/drm/i915/display/intel_pps.c +++ b/drivers/gpu/drm/i915/display/intel_pps.c @@ -722,6 +722,13 @@ static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp) { unsigned long delay; + /* + * We may not yet know the real power sequencing delays, + * so keep VDD enabled until we're done with init. + */ + if (intel_dp->pps.initializing) + return; + /* * Queue the timer to fire a long time from now (relative to the power * down delay) to keep the panel power up across a sequence of @@ -1419,6 +1426,7 @@ void intel_pps_init(struct intel_dp *intel_dp) struct drm_i915_private *i915 = dp_to_i915(intel_dp); intel_wakeref_t wakeref; + intel_dp->pps.initializing = true; INIT_DELAYED_WORK(&intel_dp->pps.panel_vdd_work, edp_panel_vdd_work); pps_init_timestamps(intel_dp); @@ -1443,6 +1451,8 @@ void intel_pps_init_late(struct intel_dp *intel_dp) pps_init_delays(intel_dp); pps_init_registers(intel_dp, false); + intel_dp->pps.initializing = false; + if (edp_have_panel_vdd(intel_dp)) edp_panel_vdd_schedule_off(intel_dp); }