struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct drm_display_mode *adjusted_mode =
                &intel_crtc->config.adjusted_mode;
-       struct drm_display_mode *mode = &intel_crtc->config.requested_mode;
-       struct intel_encoder *intel_encoder, *edp_encoder = NULL;
        struct intel_link_m_n m_n = {0};
        int target_clock, lane, link_bw;
-       bool is_dp = false, is_cpu_edp = false;
-
-       for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
-               switch (intel_encoder->type) {
-               case INTEL_OUTPUT_DISPLAYPORT:
-                       is_dp = true;
-                       break;
-               case INTEL_OUTPUT_EDP:
-                       is_dp = true;
-                       if (!intel_encoder_is_pch_edp(&intel_encoder->base))
-                               is_cpu_edp = true;
-                       edp_encoder = intel_encoder;
-                       break;
-               }
-       }
+       uint32_t bps;
 
        /* FDI is a binary signal running at ~2.7GHz, encoding
         * each output octet as 10 bits. The actual frequency
         */
        link_bw = intel_fdi_link_freq(dev) * MHz(100)/KHz(1)/10;
 
-       /* [e]DP over FDI requires target mode clock instead of link clock. */
-       if (edp_encoder)
-               target_clock = intel_edp_target_clock(edp_encoder, mode);
-       else if (is_dp)
-               target_clock = mode->clock;
+       if (intel_crtc->config.pixel_target_clock)
+               target_clock = intel_crtc->config.pixel_target_clock;
        else
                target_clock = adjusted_mode->clock;
 
 
        intel_dp->lane_count = lane_count;
        adjusted_mode->clock = drm_dp_bw_code_to_link_rate(intel_dp->link_bw);
        pipe_config->pipe_bpp = bpp;
+       pipe_config->pixel_target_clock = target_clock;
 
        DRM_DEBUG_KMS("DP link bw %02x lane count %d clock %d bpp %d\n",
                      intel_dp->link_bw, intel_dp->lane_count,
 
        bool dither;
        int pipe_bpp;
        struct intel_link_m_n dp_m_n;
-
+       /**
+        * This is currently used by DP and HDMI encoders since those can have a
+        * target pixel clock != the port link clock (which is currently stored
+        * in adjusted_mode->clock).
+        */
+       int pixel_target_clock;
        /* Used by SDVO (and if we ever fix it, HDMI). */
        unsigned pixel_multiplier;
 };