return dco_freq / (p0 * p1 * p2 * 5);
 }
 
+static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
+{
+       int dotclock;
+
+       if (pipe_config->has_pch_encoder)
+               dotclock = intel_dotclock_calculate(pipe_config->port_clock,
+                                                   &pipe_config->fdi_m_n);
+       else if (pipe_config->has_dp_encoder)
+               dotclock = intel_dotclock_calculate(pipe_config->port_clock,
+                                                   &pipe_config->dp_m_n);
+       else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp == 36)
+               dotclock = pipe_config->port_clock * 2 / 3;
+       else
+               dotclock = pipe_config->port_clock;
+
+       if (pipe_config->pixel_multiplier)
+               dotclock /= pipe_config->pixel_multiplier;
+
+       pipe_config->base.adjusted_mode.crtc_clock = dotclock;
+}
 
 static void skl_ddi_clock_get(struct intel_encoder *encoder,
                                struct intel_crtc_state *pipe_config)
 
        pipe_config->port_clock = link_clock;
 
-       if (pipe_config->has_dp_encoder)
-               pipe_config->base.adjusted_mode.crtc_clock =
-                       intel_dotclock_calculate(pipe_config->port_clock,
-                                                &pipe_config->dp_m_n);
-       else
-               pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
+       ddi_dotclock_get(pipe_config);
 }
 
 static void hsw_ddi_clock_get(struct intel_encoder *encoder,
 
        pipe_config->port_clock = link_clock * 2;
 
-       if (pipe_config->has_pch_encoder)
-               pipe_config->base.adjusted_mode.crtc_clock =
-                       intel_dotclock_calculate(pipe_config->port_clock,
-                                                &pipe_config->fdi_m_n);
-       else if (pipe_config->has_dp_encoder)
-               pipe_config->base.adjusted_mode.crtc_clock =
-                       intel_dotclock_calculate(pipe_config->port_clock,
-                                                &pipe_config->dp_m_n);
-       else
-               pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
+       ddi_dotclock_get(pipe_config);
 }
 
 static int bxt_calc_pll_link(struct drm_i915_private *dev_priv,
        enum port port = intel_ddi_get_encoder_port(encoder);
        uint32_t dpll = port;
 
-       pipe_config->port_clock =
-               bxt_calc_pll_link(dev_priv, dpll);
+       pipe_config->port_clock = bxt_calc_pll_link(dev_priv, dpll);
 
-       if (pipe_config->has_dp_encoder)
-               pipe_config->base.adjusted_mode.crtc_clock =
-                       intel_dotclock_calculate(pipe_config->port_clock,
-                                                       &pipe_config->dp_m_n);
-       else
-               pipe_config->base.adjusted_mode.crtc_clock =
-                                                       pipe_config->port_clock;
+       ddi_dotclock_get(pipe_config);
 }
 
 void intel_ddi_clock_get(struct intel_encoder *encoder,