* outputs, then LVDS outputs.
  */
 static void
-intel_sdvo_select_ddc_bus(struct intel_sdvo_priv *dev_priv)
+intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv,
+                         struct intel_sdvo_priv *sdvo, u32 reg)
 {
-       uint16_t mask = 0;
-       unsigned int num_bits;
+       struct sdvo_device_mapping *mapping;
 
-       /* Make a mask of outputs less than or equal to our own priority in the
-        * list.
-        */
-       switch (dev_priv->controlled_output) {
-       case SDVO_OUTPUT_LVDS1:
-               mask |= SDVO_OUTPUT_LVDS1;
-       case SDVO_OUTPUT_LVDS0:
-               mask |= SDVO_OUTPUT_LVDS0;
-       case SDVO_OUTPUT_TMDS1:
-               mask |= SDVO_OUTPUT_TMDS1;
-       case SDVO_OUTPUT_TMDS0:
-               mask |= SDVO_OUTPUT_TMDS0;
-       case SDVO_OUTPUT_RGB1:
-               mask |= SDVO_OUTPUT_RGB1;
-       case SDVO_OUTPUT_RGB0:
-               mask |= SDVO_OUTPUT_RGB0;
-               break;
-       }
-
-       /* Count bits to find what number we are in the priority list. */
-       mask &= dev_priv->caps.output_flags;
-       num_bits = hweight16(mask);
-       if (num_bits > 3) {
-               /* if more than 3 outputs, default to DDC bus 3 for now */
-               num_bits = 3;
-       }
+       if (IS_SDVOB(reg))
+               mapping = &(dev_priv->sdvo_mappings[0]);
+       else
+               mapping = &(dev_priv->sdvo_mappings[1]);
 
-       /* Corresponds to SDVO_CONTROL_BUS_DDCx */
-       dev_priv->ddc_bus = 1 << num_bits;
+       sdvo->ddc_bus = 1 << ((mapping->ddc_pin & 0xf0) >> 4);
 }
 
 static bool
                goto err_i2c;
        }
 
-       intel_sdvo_select_ddc_bus(sdvo_priv);
+       intel_sdvo_select_ddc_bus(dev_priv, sdvo_priv, sdvo_reg);
 
        /* Set the input timing to the screen. Assume always input 0. */
        intel_sdvo_set_target_input(intel_encoder, true, false);