diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lvds.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 089f18c66ddb..05598ae10c4b 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -664,6 +664,15 @@ static int intel_lvds_get_modes(struct drm_connector *connector) | |||
664 | return 0; | 664 | return 0; |
665 | } | 665 | } |
666 | 666 | ||
667 | /* | ||
668 | * Lid events. Note the use of 'modeset_on_lid': | ||
669 | * - we set it on lid close, and reset it on open | ||
670 | * - we use it as a "only once" bit (ie we ignore | ||
671 | * duplicate events where it was already properly | ||
672 | * set/reset) | ||
673 | * - the suspend/resume paths will also set it to | ||
674 | * zero, since they restore the mode ("lid open"). | ||
675 | */ | ||
667 | static int intel_lid_notify(struct notifier_block *nb, unsigned long val, | 676 | static int intel_lid_notify(struct notifier_block *nb, unsigned long val, |
668 | void *unused) | 677 | void *unused) |
669 | { | 678 | { |
@@ -671,13 +680,19 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val, | |||
671 | container_of(nb, struct drm_i915_private, lid_notifier); | 680 | container_of(nb, struct drm_i915_private, lid_notifier); |
672 | struct drm_device *dev = dev_priv->dev; | 681 | struct drm_device *dev = dev_priv->dev; |
673 | 682 | ||
674 | if (acpi_lid_open() && !dev_priv->suspended) { | 683 | if (!acpi_lid_open()) { |
675 | mutex_lock(&dev->mode_config.mutex); | 684 | dev_priv->modeset_on_lid = 1; |
676 | drm_helper_resume_force_mode(dev); | 685 | return NOTIFY_OK; |
677 | mutex_unlock(&dev->mode_config.mutex); | ||
678 | } | 686 | } |
679 | 687 | ||
680 | drm_sysfs_hotplug_event(dev_priv->dev); | 688 | if (!dev_priv->modeset_on_lid) |
689 | return NOTIFY_OK; | ||
690 | |||
691 | dev_priv->modeset_on_lid = 0; | ||
692 | |||
693 | mutex_lock(&dev->mode_config.mutex); | ||
694 | drm_helper_resume_force_mode(dev); | ||
695 | mutex_unlock(&dev->mode_config.mutex); | ||
681 | 696 | ||
682 | return NOTIFY_OK; | 697 | return NOTIFY_OK; |
683 | } | 698 | } |