static void intel_lvds_set_power(struct drm_device *dev, bool on)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       u32 pp_status, ctl_reg, status_reg;
+       u32 pp_status, ctl_reg, status_reg, lvds_reg;
 
        if (HAS_PCH_SPLIT(dev)) {
                ctl_reg = PCH_PP_CONTROL;
                status_reg = PCH_PP_STATUS;
+               lvds_reg = PCH_LVDS;
        } else {
                ctl_reg = PP_CONTROL;
                status_reg = PP_STATUS;
+               lvds_reg = LVDS;
        }
 
        if (on) {
+               I915_WRITE(lvds_reg, I915_READ(lvds_reg) | LVDS_PORT_EN);
+               POSTING_READ(lvds_reg);
+
                I915_WRITE(ctl_reg, I915_READ(ctl_reg) |
                           POWER_TARGET_ON);
                do {
                do {
                        pp_status = I915_READ(status_reg);
                } while (pp_status & PP_ON);
+
+               I915_WRITE(lvds_reg, I915_READ(lvds_reg) & ~LVDS_PORT_EN);
+               POSTING_READ(lvds_reg);
        }
 }