diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 33 | 
1 files changed, 12 insertions, 21 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 390ccc2a3096..0050ee9470f1 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -1189,8 +1189,8 @@ static void i915_hotplug_work_func(struct work_struct *work)  	  * some connectors */  	if (hpd_disabled) {  		drm_kms_helper_poll_enable(dev); -		mod_timer(&dev_priv->hotplug_reenable_timer, -			  jiffies + msecs_to_jiffies(I915_REENABLE_HOTPLUG_DELAY)); +		mod_delayed_work(system_wq, &dev_priv->hotplug_reenable_work, +				 msecs_to_jiffies(I915_REENABLE_HOTPLUG_DELAY));  	}  	spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); @@ -1213,11 +1213,6 @@ static void i915_hotplug_work_func(struct work_struct *work)  		drm_kms_helper_hotplug_event(dev);  } -static void intel_hpd_irq_uninstall(struct drm_i915_private *dev_priv) -{ -	del_timer_sync(&dev_priv->hotplug_reenable_timer); -} -  static void ironlake_rps_change_irq_handler(struct drm_device *dev)  {  	struct drm_i915_private *dev_priv = dev->dev_private; @@ -3892,8 +3887,6 @@ static void gen8_irq_uninstall(struct drm_device *dev)  	if (!dev_priv)  		return; -	intel_hpd_irq_uninstall(dev_priv); -  	gen8_irq_reset(dev);  } @@ -3908,8 +3901,6 @@ static void valleyview_irq_uninstall(struct drm_device *dev)  	I915_WRITE(VLV_MASTER_IER, 0); -	intel_hpd_irq_uninstall(dev_priv); -  	for_each_pipe(pipe)  		I915_WRITE(PIPESTAT(pipe), 0xffff); @@ -3988,8 +3979,6 @@ static void ironlake_irq_uninstall(struct drm_device *dev)  	if (!dev_priv)  		return; -	intel_hpd_irq_uninstall(dev_priv); -  	ironlake_irq_reset(dev);  } @@ -4360,8 +4349,6 @@ static void i915_irq_uninstall(struct drm_device * dev)  	struct drm_i915_private *dev_priv = dev->dev_private;  	int pipe; -	intel_hpd_irq_uninstall(dev_priv); -  	if (I915_HAS_HOTPLUG(dev)) {  		I915_WRITE(PORT_HOTPLUG_EN, 0);  		I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT)); @@ -4598,8 +4585,6 @@ static void i965_irq_uninstall(struct drm_device * dev)  	if (!dev_priv)  		return; -	intel_hpd_irq_uninstall(dev_priv); -  	I915_WRITE(PORT_HOTPLUG_EN, 0);  	I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT)); @@ -4615,14 +4600,18 @@ static void i965_irq_uninstall(struct drm_device * dev)  	I915_WRITE(IIR, I915_READ(IIR));  } -static void intel_hpd_irq_reenable(unsigned long data) +static void intel_hpd_irq_reenable(struct work_struct *work)  { -	struct drm_i915_private *dev_priv = (struct drm_i915_private *)data; +	struct drm_i915_private *dev_priv = +		container_of(work, typeof(*dev_priv), +			     hotplug_reenable_work.work);  	struct drm_device *dev = dev_priv->dev;  	struct drm_mode_config *mode_config = &dev->mode_config;  	unsigned long irqflags;  	int i; +	intel_runtime_pm_get(dev_priv); +  	spin_lock_irqsave(&dev_priv->irq_lock, irqflags);  	for (i = (HPD_NONE + 1); i < HPD_NUM_PINS; i++) {  		struct drm_connector *connector; @@ -4648,6 +4637,8 @@ static void intel_hpd_irq_reenable(unsigned long data)  	if (dev_priv->display.hpd_irq_setup)  		dev_priv->display.hpd_irq_setup(dev);  	spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); + +	intel_runtime_pm_put(dev_priv);  }  void intel_irq_init(struct drm_device *dev) @@ -4670,8 +4661,8 @@ void intel_irq_init(struct drm_device *dev)  	setup_timer(&dev_priv->gpu_error.hangcheck_timer,  		    i915_hangcheck_elapsed,  		    (unsigned long) dev); -	setup_timer(&dev_priv->hotplug_reenable_timer, intel_hpd_irq_reenable, -		    (unsigned long) dev_priv); +	INIT_DELAYED_WORK(&dev_priv->hotplug_reenable_work, +			  intel_hpd_irq_reenable);  	pm_qos_add_request(&dev_priv->pm_qos, PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE);  |