|
@@ -1084,6 +1084,10 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
|
|
|
(void) I915_READ(IER);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Must be called after intel_modeset_init or hotplug interrupts won't be
|
|
|
+ * enabled correctly.
|
|
|
+ */
|
|
|
int i915_driver_irq_postinstall(struct drm_device *dev)
|
|
|
{
|
|
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
|
@@ -1106,19 +1110,23 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
|
|
|
if (I915_HAS_HOTPLUG(dev)) {
|
|
|
u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN);
|
|
|
|
|
|
- /* Leave other bits alone */
|
|
|
- hotplug_en |= HOTPLUG_EN_MASK;
|
|
|
+ /* Note HDMI and DP share bits */
|
|
|
+ if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS)
|
|
|
+ hotplug_en |= HDMIB_HOTPLUG_INT_EN;
|
|
|
+ if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS)
|
|
|
+ hotplug_en |= HDMIC_HOTPLUG_INT_EN;
|
|
|
+ if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS)
|
|
|
+ hotplug_en |= HDMID_HOTPLUG_INT_EN;
|
|
|
+ if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS)
|
|
|
+ hotplug_en |= SDVOC_HOTPLUG_INT_EN;
|
|
|
+ if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS)
|
|
|
+ hotplug_en |= SDVOB_HOTPLUG_INT_EN;
|
|
|
+ if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS)
|
|
|
+ hotplug_en |= CRT_HOTPLUG_INT_EN;
|
|
|
+ /* Ignore TV since it's buggy */
|
|
|
+
|
|
|
I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
|
|
|
|
|
|
- dev_priv->hotplug_supported_mask = CRT_HOTPLUG_INT_STATUS |
|
|
|
- TV_HOTPLUG_INT_STATUS | SDVOC_HOTPLUG_INT_STATUS |
|
|
|
- SDVOB_HOTPLUG_INT_STATUS;
|
|
|
- if (IS_G4X(dev)) {
|
|
|
- dev_priv->hotplug_supported_mask |=
|
|
|
- HDMIB_HOTPLUG_INT_STATUS |
|
|
|
- HDMIC_HOTPLUG_INT_STATUS |
|
|
|
- HDMID_HOTPLUG_INT_STATUS;
|
|
|
- }
|
|
|
/* Enable in IER... */
|
|
|
enable_mask |= I915_DISPLAY_PORT_INTERRUPT;
|
|
|
/* and unmask in IMR */
|