|
@@ -1777,10 +1777,13 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
|
|
* arranged in priority order.
|
|
* arranged in priority order.
|
|
*/
|
|
*/
|
|
intel_ddc_get_modes(connector, &intel_sdvo->ddc);
|
|
intel_ddc_get_modes(connector, &intel_sdvo->ddc);
|
|
- if (list_empty(&connector->probed_modes) == false)
|
|
|
|
- goto end;
|
|
|
|
|
|
|
|
- /* Fetch modes from VBT */
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Fetch modes from VBT. For SDVO prefer the VBT mode since some
|
|
|
|
+ * SDVO->LVDS transcoders can't cope with the EDID mode. Since
|
|
|
|
+ * drm_mode_probed_add adds the mode at the head of the list we add it
|
|
|
|
+ * last.
|
|
|
|
+ */
|
|
if (dev_priv->sdvo_lvds_vbt_mode != NULL) {
|
|
if (dev_priv->sdvo_lvds_vbt_mode != NULL) {
|
|
newmode = drm_mode_duplicate(connector->dev,
|
|
newmode = drm_mode_duplicate(connector->dev,
|
|
dev_priv->sdvo_lvds_vbt_mode);
|
|
dev_priv->sdvo_lvds_vbt_mode);
|
|
@@ -1792,7 +1795,6 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-end:
|
|
|
|
list_for_each_entry(newmode, &connector->probed_modes, head) {
|
|
list_for_each_entry(newmode, &connector->probed_modes, head) {
|
|
if (newmode->type & DRM_MODE_TYPE_PREFERRED) {
|
|
if (newmode->type & DRM_MODE_TYPE_PREFERRED) {
|
|
intel_sdvo->sdvo_lvds_fixed_mode =
|
|
intel_sdvo->sdvo_lvds_fixed_mode =
|
|
@@ -2790,12 +2792,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
|
|
SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915;
|
|
SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Only enable the hotplug irq if we need it, to work around noisy
|
|
|
|
- * hotplug lines.
|
|
|
|
- */
|
|
|
|
- if (intel_sdvo->hotplug_active)
|
|
|
|
- intel_encoder->hpd_pin = HPD_SDVO_B ? HPD_SDVO_B : HPD_SDVO_C;
|
|
|
|
-
|
|
|
|
intel_encoder->compute_config = intel_sdvo_compute_config;
|
|
intel_encoder->compute_config = intel_sdvo_compute_config;
|
|
intel_encoder->disable = intel_disable_sdvo;
|
|
intel_encoder->disable = intel_disable_sdvo;
|
|
intel_encoder->mode_set = intel_sdvo_mode_set;
|
|
intel_encoder->mode_set = intel_sdvo_mode_set;
|
|
@@ -2814,6 +2810,14 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
|
|
goto err_output;
|
|
goto err_output;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* Only enable the hotplug irq if we need it, to work around noisy
|
|
|
|
+ * hotplug lines.
|
|
|
|
+ */
|
|
|
|
+ if (intel_sdvo->hotplug_active) {
|
|
|
|
+ intel_encoder->hpd_pin =
|
|
|
|
+ intel_sdvo->is_sdvob ? HPD_SDVO_B : HPD_SDVO_C;
|
|
|
|
+ }
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Cloning SDVO with anything is often impossible, since the SDVO
|
|
* Cloning SDVO with anything is often impossible, since the SDVO
|
|
* encoder can request a special input timing mode. And even if that's
|
|
* encoder can request a special input timing mode. And even if that's
|