diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index 9b1542f1cf01..2d73430a0d27 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
@@ -1515,15 +1515,13 @@ void intel_ddi_init(struct drm_device *dev, enum port port) | |||
1515 | struct intel_digital_port *intel_dig_port; | 1515 | struct intel_digital_port *intel_dig_port; |
1516 | struct intel_encoder *intel_encoder; | 1516 | struct intel_encoder *intel_encoder; |
1517 | struct drm_encoder *encoder; | 1517 | struct drm_encoder *encoder; |
1518 | struct intel_connector *hdmi_connector = NULL; | ||
1519 | struct intel_connector *dp_connector = NULL; | ||
1520 | bool init_hdmi, init_dp; | 1518 | bool init_hdmi, init_dp; |
1521 | 1519 | ||
1522 | init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi || | 1520 | init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi || |
1523 | dev_priv->vbt.ddi_port_info[port].supports_hdmi); | 1521 | dev_priv->vbt.ddi_port_info[port].supports_hdmi); |
1524 | init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp; | 1522 | init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp; |
1525 | if (!init_dp && !init_hdmi) { | 1523 | if (!init_dp && !init_hdmi) { |
1526 | DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible\n", | 1524 | DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, assuming it is\n", |
1527 | port_name(port)); | 1525 | port_name(port)); |
1528 | init_hdmi = true; | 1526 | init_hdmi = true; |
1529 | init_dp = true; | 1527 | init_dp = true; |
@@ -1553,23 +1551,28 @@ void intel_ddi_init(struct drm_device *dev, enum port port) | |||
1553 | DDI_A_4_LANES); | 1551 | DDI_A_4_LANES); |
1554 | 1552 | ||
1555 | intel_encoder->type = INTEL_OUTPUT_UNKNOWN; | 1553 | intel_encoder->type = INTEL_OUTPUT_UNKNOWN; |
1556 | intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); | 1554 | intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); |
1557 | intel_encoder->cloneable = 0; | 1555 | intel_encoder->cloneable = 0; |
1558 | intel_encoder->hot_plug = intel_ddi_hot_plug; | 1556 | intel_encoder->hot_plug = intel_ddi_hot_plug; |
1559 | 1557 | ||
1560 | intel_dig_port->hpd_pulse = intel_dp_hpd_pulse; | 1558 | if (init_dp) { |
1561 | dev_priv->hpd_irq_port[port] = intel_dig_port; | 1559 | if (!intel_ddi_init_dp_connector(intel_dig_port)) |
1560 | goto err; | ||
1562 | 1561 | ||
1563 | if (init_dp) | 1562 | intel_dig_port->hpd_pulse = intel_dp_hpd_pulse; |
1564 | dp_connector = intel_ddi_init_dp_connector(intel_dig_port); | 1563 | dev_priv->hpd_irq_port[port] = intel_dig_port; |
1564 | } | ||
1565 | 1565 | ||
1566 | /* In theory we don't need the encoder->type check, but leave it just in | 1566 | /* In theory we don't need the encoder->type check, but leave it just in |
1567 | * case we have some really bad VBTs... */ | 1567 | * case we have some really bad VBTs... */ |
1568 | if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) | 1568 | if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) { |
1569 | hdmi_connector = intel_ddi_init_hdmi_connector(intel_dig_port); | 1569 | if (!intel_ddi_init_hdmi_connector(intel_dig_port)) |
1570 | 1570 | goto err; | |
1571 | if (!dp_connector && !hdmi_connector) { | ||
1572 | drm_encoder_cleanup(encoder); | ||
1573 | kfree(intel_dig_port); | ||
1574 | } | 1571 | } |
1572 | |||
1573 | return; | ||
1574 | |||
1575 | err: | ||
1576 | drm_encoder_cleanup(encoder); | ||
1577 | kfree(intel_dig_port); | ||
1575 | } | 1578 | } |