@@ -172,6 +172,10 @@ struct intel_sdvo_connector {
u32 cur_hue, max_hue;
};
+static void
+intel_sdvo_select_ddc_bus(struct intel_sdvo_priv *dev_priv,
+ struct intel_connector *intel_connector);
+
static bool
intel_sdvo_output_setup(struct intel_encoder *intel_encoder,
uint16_t flags);
@@ -1599,8 +1603,11 @@ static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connect
sdvo_priv->attached_output = response;
if ((sdvo_connector->output_flag & response) == 0)
- ret = connector_status_disconnected;
- else if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
+ return connector_status_disconnected;
+
+ intel_sdvo_select_ddc_bus(sdvo_priv, intel_connector);
+
+ if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
ret = intel_sdvo_hdmi_sink_detect(connector, response);
else
ret = connector_status_connected;
@@ -2047,21 +2054,25 @@ static const struct drm_encoder_funcs intel_sdvo_enc_funcs = {
/**
* Choose the appropriate DDC bus for control bus switch command for this
- * SDVO output based on the controlled output.
+ * SDVO output based on the connector's output.
*
* DDC bus number assignment is in a priority order of RGB outputs, then TMDS
* outputs, then LVDS outputs.
*/
static void
-intel_sdvo_select_ddc_bus(struct intel_sdvo_priv *dev_priv)
+intel_sdvo_select_ddc_bus(struct intel_sdvo_priv *dev_priv,
+ struct intel_connector *intel_connector)
{
uint16_t mask = 0;
unsigned int num_bits;
+ struct intel_sdvo_connector *sdvo_connector;
+
+ sdvo_connector = intel_connector->dev_priv;
/* Make a mask of outputs less than or equal to our own priority in the
* list.
*/
- switch (dev_priv->controlled_output) {
+ switch (sdvo_connector->output_flag) {
case SDVO_OUTPUT_LVDS1:
mask |= SDVO_OUTPUT_LVDS1;
case SDVO_OUTPUT_LVDS0:
@@ -2863,8 +2874,6 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg)
goto err_i2c;
}
- intel_sdvo_select_ddc_bus(sdvo_priv);
-
/* Set the input timing to the screen. Assume always input 0. */
intel_sdvo_set_target_input(intel_encoder, true, false);