if (I915_READ(PCH_HDMIB) & SDVO_DETECTED) {
                        /* PCH SDVOB multiplex with HDMIB */
-                       found = intel_sdvo_init(dev, PCH_SDVOB, true);
+                       found = intel_sdvo_init(dev, PCH_SDVOB, PORT_B);
                        if (!found)
                                intel_hdmi_init(dev, PCH_HDMIB, PORT_B);
                        if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
 
                if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
                        DRM_DEBUG_KMS("probing SDVOB\n");
-                       found = intel_sdvo_init(dev, GEN3_SDVOB, true);
+                       found = intel_sdvo_init(dev, GEN3_SDVOB, PORT_B);
                        if (!found && IS_G4X(dev)) {
                                DRM_DEBUG_KMS("probing HDMI on SDVOB\n");
                                intel_hdmi_init(dev, GEN4_HDMIB, PORT_B);
 
                if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
                        DRM_DEBUG_KMS("probing SDVOC\n");
-                       found = intel_sdvo_init(dev, GEN3_SDVOC, false);
+                       found = intel_sdvo_init(dev, GEN3_SDVOC, PORT_C);
                }
 
                if (!found && (I915_READ(GEN3_SDVOC) & SDVO_DETECTED)) {
 
         */
        bool is_tv;
 
-       /* On different gens SDVOB is at different places. */
-       bool is_sdvob;
+       enum port port;
 
        /* This is for current tv format name */
        int tv_format_index;
        u32 bval = val, cval = val;
        int i;
 
-       if (intel_sdvo->sdvo_reg == PCH_SDVOB) {
+       if (HAS_PCH_SPLIT(dev_priv)) {
                I915_WRITE(intel_sdvo->sdvo_reg, val);
                POSTING_READ(intel_sdvo->sdvo_reg);
                /*
                return;
        }
 
-       if (intel_sdvo->sdvo_reg == GEN3_SDVOB)
+       if (intel_sdvo->port == PORT_B)
                cval = I915_READ(GEN3_SDVOC);
        else
                bval = I915_READ(GEN3_SDVOB);
        SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_DATA),
 };
 
-#define SDVO_NAME(svdo) ((svdo)->is_sdvob ? "SDVOB" : "SDVOC")
+#define SDVO_NAME(svdo) ((svdo)->port == PORT_B ? "SDVOB" : "SDVOC")
 
 static void intel_sdvo_debug_write(struct intel_sdvo *intel_sdvo, u8 cmd,
                                   const void *args, int args_len)
                        sdvox |= SDVO_BORDER_ENABLE;
        } else {
                sdvox = I915_READ(intel_sdvo->sdvo_reg);
-               switch (intel_sdvo->sdvo_reg) {
-               case GEN3_SDVOB:
+               if (intel_sdvo->port == PORT_B)
                        sdvox &= SDVOB_PRESERVE_MASK;
-                       break;
-               case GEN3_SDVOC:
+               else
                        sdvox &= SDVOC_PRESERVE_MASK;
-                       break;
-               }
                sdvox |= (9 << 19) | SDVO_BORDER_ENABLE;
        }
 
 {
        struct sdvo_device_mapping *mapping;
 
-       if (sdvo->is_sdvob)
+       if (sdvo->port == PORT_B)
                mapping = &(dev_priv->sdvo_mappings[0]);
        else
                mapping = &(dev_priv->sdvo_mappings[1]);
        struct sdvo_device_mapping *mapping;
        u8 pin;
 
-       if (sdvo->is_sdvob)
+       if (sdvo->port == PORT_B)
                mapping = &dev_priv->sdvo_mappings[0];
        else
                mapping = &dev_priv->sdvo_mappings[1];
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct sdvo_device_mapping *my_mapping, *other_mapping;
 
-       if (sdvo->is_sdvob) {
+       if (sdvo->port == PORT_B) {
                my_mapping = &dev_priv->sdvo_mappings[0];
                other_mapping = &dev_priv->sdvo_mappings[1];
        } else {
        /* No SDVO device info is found for another DVO port,
         * so use mapping assumption we had before BIOS parsing.
         */
-       if (sdvo->is_sdvob)
+       if (sdvo->port == PORT_B)
                return 0x70;
        else
                return 0x72;
        return i2c_add_adapter(&sdvo->ddc) == 0;
 }
 
-bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
+static void assert_sdvo_port_valid(const struct drm_i915_private *dev_priv,
+                                  enum port port)
+{
+       if (HAS_PCH_SPLIT(dev_priv))
+               WARN_ON(port != PORT_B);
+       else
+               WARN_ON(port != PORT_B && port != PORT_C);
+}
+
+bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, enum port port)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_encoder *intel_encoder;
        struct intel_sdvo *intel_sdvo;
        int i;
+
+       assert_sdvo_port_valid(dev_priv, port);
+
        intel_sdvo = kzalloc(sizeof(*intel_sdvo), GFP_KERNEL);
        if (!intel_sdvo)
                return false;
 
        intel_sdvo->sdvo_reg = sdvo_reg;
-       intel_sdvo->is_sdvob = is_sdvob;
+       intel_sdvo->port = port;
        intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, intel_sdvo) >> 1;
        intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo);
        if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev))
         * hotplug lines.
         */
        if (intel_sdvo->hotplug_active) {
-               intel_encoder->hpd_pin =
-                       intel_sdvo->is_sdvob ?  HPD_SDVO_B : HPD_SDVO_C;
+               if (intel_sdvo->port == PORT_B)
+                       intel_encoder->hpd_pin = HPD_SDVO_B;
+               else
+                       intel_encoder->hpd_pin = HPD_SDVO_C;
        }
 
        /*