diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2020-10-01 18:16:36 +0300 |
---|---|---|
committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2020-10-09 21:12:12 +0300 |
commit | 100fe4c01efff5e3b930c7aaff9c2ebeb78d1b87 (patch) | |
tree | 2ca36c33a9943fc4e5678b97aa7914d99cf422c6 | |
parent | fe0f1e3bfdfeb53e18f1206aea4f40b9bd1f291c (diff) |
drm/i915: Add an encoder .shutdown() hook
Add a new encoder hook .shutdown() which will get called at the end
of the pci .shutdown() hook. We shall use this to deal with the
panel power cycle delay issues.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201001151640.14590-2-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/display/intel_display_types.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 13 |
2 files changed, 18 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 65ae2070576f..bd242b33908b 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -214,6 +214,11 @@ struct intel_encoder { * device interrupts are disabled. */ void (*suspend)(struct intel_encoder *); + /* + * Called during system reboot/shutdown after all the + * encoders have been disabled and suspended. + */ + void (*shutdown)(struct intel_encoder *encoder); enum hpd_pin hpd_pin; enum intel_display_power_domain power_domain; /* for communication with audio component; protected by av_mutex */ diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 4e4527acda4d..6a3af0db86d2 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -1037,6 +1037,18 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv) drm_modeset_unlock_all(dev); } +static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) +{ + struct drm_device *dev = &dev_priv->drm; + struct intel_encoder *encoder; + + drm_modeset_lock_all(dev); + for_each_intel_encoder(dev, encoder) + if (encoder->shutdown) + encoder->shutdown(encoder); + drm_modeset_unlock_all(dev); +} + void i915_driver_shutdown(struct drm_i915_private *i915) { i915_gem_suspend(i915); @@ -1051,6 +1063,7 @@ void i915_driver_shutdown(struct drm_i915_private *i915) intel_hpd_cancel_work(i915); intel_suspend_encoders(i915); + intel_shutdown_encoders(i915); } static bool suspend_to_idle(struct drm_i915_private *dev_priv) |