diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 2479be001e40..e9710a7005d4 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1387,29 +1387,10 @@ int i915_driver_irq_postinstall(struct drm_device *dev) | |||
1387 | dev_priv->pipestat[1] = 0; | 1387 | dev_priv->pipestat[1] = 0; |
1388 | 1388 | ||
1389 | if (I915_HAS_HOTPLUG(dev)) { | 1389 | if (I915_HAS_HOTPLUG(dev)) { |
1390 | u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); | ||
1391 | |||
1392 | /* Note HDMI and DP share bits */ | ||
1393 | if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS) | ||
1394 | hotplug_en |= HDMIB_HOTPLUG_INT_EN; | ||
1395 | if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS) | ||
1396 | hotplug_en |= HDMIC_HOTPLUG_INT_EN; | ||
1397 | if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) | ||
1398 | hotplug_en |= HDMID_HOTPLUG_INT_EN; | ||
1399 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS) | ||
1400 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; | ||
1401 | if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS) | ||
1402 | hotplug_en |= SDVOB_HOTPLUG_INT_EN; | ||
1403 | if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) | ||
1404 | hotplug_en |= CRT_HOTPLUG_INT_EN; | ||
1405 | /* Ignore TV since it's buggy */ | ||
1406 | |||
1407 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); | ||
1408 | |||
1409 | /* Enable in IER... */ | 1390 | /* Enable in IER... */ |
1410 | enable_mask |= I915_DISPLAY_PORT_INTERRUPT; | 1391 | enable_mask |= I915_DISPLAY_PORT_INTERRUPT; |
1411 | /* and unmask in IMR */ | 1392 | /* and unmask in IMR */ |
1412 | i915_enable_irq(dev_priv, I915_DISPLAY_PORT_INTERRUPT); | 1393 | dev_priv->irq_mask_reg &= ~I915_DISPLAY_PORT_INTERRUPT; |
1413 | } | 1394 | } |
1414 | 1395 | ||
1415 | /* | 1396 | /* |
@@ -1427,16 +1408,31 @@ int i915_driver_irq_postinstall(struct drm_device *dev) | |||
1427 | } | 1408 | } |
1428 | I915_WRITE(EMR, error_mask); | 1409 | I915_WRITE(EMR, error_mask); |
1429 | 1410 | ||
1430 | /* Disable pipe interrupt enables, clear pending pipe status */ | ||
1431 | I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); | ||
1432 | I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); | ||
1433 | /* Clear pending interrupt status */ | ||
1434 | I915_WRITE(IIR, I915_READ(IIR)); | ||
1435 | |||
1436 | I915_WRITE(IER, enable_mask); | ||
1437 | I915_WRITE(IMR, dev_priv->irq_mask_reg); | 1411 | I915_WRITE(IMR, dev_priv->irq_mask_reg); |
1412 | I915_WRITE(IER, enable_mask); | ||
1438 | (void) I915_READ(IER); | 1413 | (void) I915_READ(IER); |
1439 | 1414 | ||
1415 | if (I915_HAS_HOTPLUG(dev)) { | ||
1416 | u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); | ||
1417 | |||
1418 | /* Note HDMI and DP share bits */ | ||
1419 | if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS) | ||
1420 | hotplug_en |= HDMIB_HOTPLUG_INT_EN; | ||
1421 | if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS) | ||
1422 | hotplug_en |= HDMIC_HOTPLUG_INT_EN; | ||
1423 | if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) | ||
1424 | hotplug_en |= HDMID_HOTPLUG_INT_EN; | ||
1425 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS) | ||
1426 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; | ||
1427 | if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS) | ||
1428 | hotplug_en |= SDVOB_HOTPLUG_INT_EN; | ||
1429 | if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) | ||
1430 | hotplug_en |= CRT_HOTPLUG_INT_EN; | ||
1431 | /* Ignore TV since it's buggy */ | ||
1432 | |||
1433 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); | ||
1434 | } | ||
1435 | |||
1440 | opregion_enable_asle(dev); | 1436 | opregion_enable_asle(dev); |
1441 | 1437 | ||
1442 | return 0; | 1438 | return 0; |