uint32_t dpll = crtc->config.ddi_pll_sel;
                uint32_t val;
 
+               /*
+                * DPLL0 is used for eDP and is the only "private" DPLL (as
+                * opposed to shared) on SKL
+                */
+               if (type == INTEL_OUTPUT_EDP) {
+                       WARN_ON(dpll != SKL_DPLL0);
+
+                       val = I915_READ(DPLL_CTRL1);
+
+                       val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) |
+                                DPLL_CTRL1_SSC(dpll) |
+                                DPLL_CRTL1_LINK_RATE_MASK(dpll));
+                       val |= crtc->config.dpll_hw_state.ctrl1 << (dpll * 6);
+
+                       I915_WRITE(DPLL_CTRL1, val);
+                       POSTING_READ(DPLL_CTRL1);
+               }
+
+               /* DDI -> PLL mapping  */
                val = I915_READ(DPLL_CTRL2);
 
                val &= ~(DPLL_CTRL2_DDI_CLK_OFF(port) |
                        DPLL_CTRL2_DDI_SEL_OVERRIDE(port));
 
                I915_WRITE(DPLL_CTRL2, val);
+
        } else {
                WARN_ON(crtc->config.ddi_pll_sel == PORT_CLK_SEL_NONE);
                I915_WRITE(PORT_CLK_SEL(port), crtc->config.ddi_pll_sel);
 
        intel_connector_unregister(intel_connector);
 }
 
+static void
+skl_edp_set_pll_config(struct intel_crtc_config *pipe_config, int link_bw)
+{
+       u32 ctrl1;
+
+       pipe_config->ddi_pll_sel = SKL_DPLL0;
+       pipe_config->dpll_hw_state.cfgcr1 = 0;
+       pipe_config->dpll_hw_state.cfgcr2 = 0;
+
+       ctrl1 = DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
+       switch (link_bw) {
+       case DP_LINK_BW_1_62:
+               ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_810,
+                                             SKL_DPLL0);
+               break;
+       case DP_LINK_BW_2_7:
+               ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_1350,
+                                             SKL_DPLL0);
+               break;
+       case DP_LINK_BW_5_4:
+               ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_2700,
+                                             SKL_DPLL0);
+               break;
+       }
+       pipe_config->dpll_hw_state.ctrl1 = ctrl1;
+}
+
 static void
 hsw_dp_set_ddi_pll_sel(struct intel_crtc_config *pipe_config, int link_bw)
 {
                                &pipe_config->dp_m2_n2);
        }
 
-       if (IS_HASWELL(dev) || IS_BROADWELL(dev))
+       if (IS_SKYLAKE(dev) && is_edp(intel_dp))
+               skl_edp_set_pll_config(pipe_config, intel_dp->link_bw);
+       else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                hsw_dp_set_ddi_pll_sel(pipe_config, intel_dp->link_bw);
        else
                intel_dp_set_clock(encoder, pipe_config, intel_dp->link_bw);