Hide the dpio details of setting up the dplls on VLV/CHV to
intel_dpio_phy.c. This will allow the prepare and enable pll functions
to be merged in a follow up. It also creates a better split of the code
where most of the dpio access are concentrated in one place.

Signed-off-by: Ander Conselvan de Oliveira 
<ander.conselvan.de.olive...@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h       |   6 +
 drivers/gpu/drm/i915/intel_display.c  | 207 ++--------------------------------
 drivers/gpu/drm/i915/intel_dpio_phy.c | 202 +++++++++++++++++++++++++++++++++
 3 files changed, 217 insertions(+), 198 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 5f9dda2..99dfacd 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3627,6 +3627,9 @@ void chv_phy_pre_pll_enable(struct intel_encoder 
*encoder);
 void chv_phy_pre_encoder_enable(struct intel_encoder *encoder);
 void chv_phy_release_cl2_override(struct intel_encoder *encoder);
 void chv_phy_post_pll_disable(struct intel_encoder *encoder);
+void chv_phy_prepare_pll(struct intel_crtc *crtc, u32 bestn,
+                        u32 bestm1, u32 bestm2, u32 bestp1, u32 bestp2,
+                        int vco);
 
 void vlv_set_phy_signal_level(struct intel_encoder *encoder,
                              u32 demph_reg_value, u32 preemph_reg_value,
@@ -3634,6 +3637,9 @@ void vlv_set_phy_signal_level(struct intel_encoder 
*encoder,
 void vlv_phy_pre_pll_enable(struct intel_encoder *encoder);
 void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder);
 void vlv_phy_reset_lanes(struct intel_encoder *encoder);
+void vlv_phy_prepare_pll(struct intel_crtc *crtc, u32 bestn,
+                        u32 bestm1, u32 bestm2, u32 bestp1, u32 bestp2,
+                        int port_clock, bool dp);
 
 int intel_gpu_freq(struct drm_i915_private *dev_priv, int val);
 int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 048a5bf..06d9b96 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7080,35 +7080,6 @@ static void i9xx_update_pll_dividers(struct intel_crtc 
*crtc,
        }
 }
 
-static void vlv_pllb_recal_opamp(struct drm_i915_private *dev_priv, enum pipe
-               pipe)
-{
-       u32 reg_val;
-
-       /*
-        * PLLB opamp always calibrates to max value of 0x3f, force enable it
-        * and set it to a reasonable value instead.
-        */
-       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW9(1));
-       reg_val &= 0xffffff00;
-       reg_val |= 0x00000030;
-       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9(1), reg_val);
-
-       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_REF_DW13);
-       reg_val &= 0x8cffffff;
-       reg_val = 0x8c000000;
-       vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val);
-
-       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW9(1));
-       reg_val &= 0xffffff00;
-       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9(1), reg_val);
-
-       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_REF_DW13);
-       reg_val &= 0x00ffffff;
-       reg_val |= 0xb0000000;
-       vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val);
-}
-
 static void intel_pch_transcoder_set_m_n(struct intel_crtc *crtc,
                                         struct intel_link_m_n *m_n)
 {
@@ -7220,9 +7191,6 @@ static void vlv_prepare_pll(struct intel_crtc *crtc,
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        enum pipe pipe = crtc->pipe;
-       u32 mdiv;
-       u32 bestn, bestm1, bestm2, bestp1, bestp2;
-       u32 coreclk, reg_val;
 
        /* Enable Refclk */
        I915_WRITE(DPLL(pipe),
@@ -7233,85 +7201,12 @@ static void vlv_prepare_pll(struct intel_crtc *crtc,
        if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
                return;
 
-       mutex_lock(&dev_priv->sb_lock);
-
-       bestn = pipe_config->dpll.n;
-       bestm1 = pipe_config->dpll.m1;
-       bestm2 = pipe_config->dpll.m2;
-       bestp1 = pipe_config->dpll.p1;
-       bestp2 = pipe_config->dpll.p2;
-
-       /* See eDP HDMI DPIO driver vbios notes doc */
-
-       /* PLL B needs special handling */
-       if (pipe == PIPE_B)
-               vlv_pllb_recal_opamp(dev_priv, pipe);
-
-       /* Set up Tx target for periodic Rcomp update */
-       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9_BCAST, 0x0100000f);
+       vlv_phy_prepare_pll(crtc, pipe_config->dpll.n,
+                           pipe_config->dpll.m1, pipe_config->dpll.m2,
+                           pipe_config->dpll.p1, pipe_config->dpll.p2,
+                           pipe_config->port_clock,
+                           pipe_config->has_dp_encoder);
 
-       /* Disable target IRef on PLL */
-       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW8(pipe));
-       reg_val &= 0x00ffffff;
-       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW8(pipe), reg_val);
-
-       /* Disable fast lock */
-       vlv_dpio_write(dev_priv, pipe, VLV_CMN_DW0, 0x610);
-
-       /* Set idtafcrecal before PLL is enabled */
-       mdiv = ((bestm1 << DPIO_M1DIV_SHIFT) | (bestm2 & DPIO_M2DIV_MASK));
-       mdiv |= ((bestp1 << DPIO_P1_SHIFT) | (bestp2 << DPIO_P2_SHIFT));
-       mdiv |= ((bestn << DPIO_N_SHIFT));
-       mdiv |= (1 << DPIO_K_SHIFT);
-
-       /*
-        * Post divider depends on pixel clock rate, DAC vs digital (and LVDS,
-        * but we don't support that).
-        * Note: don't use the DAC post divider as it seems unstable.
-        */
-       mdiv |= (DPIO_POST_DIV_HDMIDP << DPIO_POST_DIV_SHIFT);
-       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW3(pipe), mdiv);
-
-       mdiv |= DPIO_ENABLE_CALIBRATION;
-       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW3(pipe), mdiv);
-
-       /* Set HBR and RBR LPF coefficients */
-       if (pipe_config->port_clock == 162000 ||
-           intel_pipe_has_type(crtc, INTEL_OUTPUT_ANALOG) ||
-           intel_pipe_has_type(crtc, INTEL_OUTPUT_HDMI))
-               vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe),
-                                0x009f0003);
-       else
-               vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe),
-                                0x00d0000f);
-
-       if (pipe_config->has_dp_encoder) {
-               /* Use SSC source */
-               if (pipe == PIPE_A)
-                       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
-                                        0x0df40000);
-               else
-                       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
-                                        0x0df70000);
-       } else { /* HDMI or VGA */
-               /* Use bend source */
-               if (pipe == PIPE_A)
-                       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
-                                        0x0df70000);
-               else
-                       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
-                                        0x0df40000);
-       }
-
-       coreclk = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW7(pipe));
-       coreclk = (coreclk & 0x0000ff00) | 0x01c00000;
-       if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) ||
-           intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))
-               coreclk |= 0x01000000;
-       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW7(pipe), coreclk);
-
-       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW11(pipe), 0x87871000);
-       mutex_unlock(&dev_priv->sb_lock);
 }
 
 static void chv_prepare_pll(struct intel_crtc *crtc,
@@ -7320,11 +7215,6 @@ static void chv_prepare_pll(struct intel_crtc *crtc,
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        enum pipe pipe = crtc->pipe;
-       enum dpio_channel port = vlv_pipe_to_channel(pipe);
-       u32 loopfilter, tribuf_calcntr;
-       u32 bestn, bestm1, bestm2, bestp1, bestp2, bestm2_frac;
-       u32 dpio_val;
-       int vco;
 
        /* Enable Refclk and SSC */
        I915_WRITE(DPLL(pipe),
@@ -7334,89 +7224,10 @@ static void chv_prepare_pll(struct intel_crtc *crtc,
        if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
                return;
 
-       bestn = pipe_config->dpll.n;
-       bestm2_frac = pipe_config->dpll.m2 & 0x3fffff;
-       bestm1 = pipe_config->dpll.m1;
-       bestm2 = pipe_config->dpll.m2 >> 22;
-       bestp1 = pipe_config->dpll.p1;
-       bestp2 = pipe_config->dpll.p2;
-       vco = pipe_config->dpll.vco;
-       dpio_val = 0;
-       loopfilter = 0;
-
-       mutex_lock(&dev_priv->sb_lock);
-
-       /* p1 and p2 divider */
-       vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW13(port),
-                       5 << DPIO_CHV_S1_DIV_SHIFT |
-                       bestp1 << DPIO_CHV_P1_DIV_SHIFT |
-                       bestp2 << DPIO_CHV_P2_DIV_SHIFT |
-                       1 << DPIO_CHV_K_DIV_SHIFT);
-
-       /* Feedback post-divider - m2 */
-       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW0(port), bestm2);
-
-       /* Feedback refclk divider - n and m1 */
-       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW1(port),
-                       DPIO_CHV_M1_DIV_BY_2 |
-                       1 << DPIO_CHV_N_DIV_SHIFT);
-
-       /* M2 fraction division */
-       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW2(port), bestm2_frac);
-
-       /* M2 fraction division enable */
-       dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW3(port));
-       dpio_val &= ~(DPIO_CHV_FEEDFWD_GAIN_MASK | DPIO_CHV_FRAC_DIV_EN);
-       dpio_val |= (2 << DPIO_CHV_FEEDFWD_GAIN_SHIFT);
-       if (bestm2_frac)
-               dpio_val |= DPIO_CHV_FRAC_DIV_EN;
-       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW3(port), dpio_val);
-
-       /* Program digital lock detect threshold */
-       dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW9(port));
-       dpio_val &= ~(DPIO_CHV_INT_LOCK_THRESHOLD_MASK |
-                                       DPIO_CHV_INT_LOCK_THRESHOLD_SEL_COARSE);
-       dpio_val |= (0x5 << DPIO_CHV_INT_LOCK_THRESHOLD_SHIFT);
-       if (!bestm2_frac)
-               dpio_val |= DPIO_CHV_INT_LOCK_THRESHOLD_SEL_COARSE;
-       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW9(port), dpio_val);
-
-       /* Loop filter */
-       if (vco == 5400000) {
-               loopfilter |= (0x3 << DPIO_CHV_PROP_COEFF_SHIFT);
-               loopfilter |= (0x8 << DPIO_CHV_INT_COEFF_SHIFT);
-               loopfilter |= (0x1 << DPIO_CHV_GAIN_CTRL_SHIFT);
-               tribuf_calcntr = 0x9;
-       } else if (vco <= 6200000) {
-               loopfilter |= (0x5 << DPIO_CHV_PROP_COEFF_SHIFT);
-               loopfilter |= (0xB << DPIO_CHV_INT_COEFF_SHIFT);
-               loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
-               tribuf_calcntr = 0x9;
-       } else if (vco <= 6480000) {
-               loopfilter |= (0x4 << DPIO_CHV_PROP_COEFF_SHIFT);
-               loopfilter |= (0x9 << DPIO_CHV_INT_COEFF_SHIFT);
-               loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
-               tribuf_calcntr = 0x8;
-       } else {
-               /* Not supported. Apply the same limits as in the max case */
-               loopfilter |= (0x4 << DPIO_CHV_PROP_COEFF_SHIFT);
-               loopfilter |= (0x9 << DPIO_CHV_INT_COEFF_SHIFT);
-               loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
-               tribuf_calcntr = 0;
-       }
-       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW6(port), loopfilter);
-
-       dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW8(port));
-       dpio_val &= ~DPIO_CHV_TDC_TARGET_CNT_MASK;
-       dpio_val |= (tribuf_calcntr << DPIO_CHV_TDC_TARGET_CNT_SHIFT);
-       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW8(port), dpio_val);
-
-       /* AFC Recal */
-       vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port),
-                       vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port)) |
-                       DPIO_AFC_RECAL);
-
-       mutex_unlock(&dev_priv->sb_lock);
+       chv_phy_prepare_pll(crtc, pipe_config->dpll.n,
+                           pipe_config->dpll.m1, pipe_config->dpll.m2,
+                           pipe_config->dpll.p1, pipe_config->dpll.p2,
+                           pipe_config->dpll.vco);
 }
 
 /**
diff --git a/drivers/gpu/drm/i915/intel_dpio_phy.c 
b/drivers/gpu/drm/i915/intel_dpio_phy.c
index 288da35..fcadc92 100644
--- a/drivers/gpu/drm/i915/intel_dpio_phy.c
+++ b/drivers/gpu/drm/i915/intel_dpio_phy.c
@@ -370,6 +370,97 @@ void chv_phy_post_pll_disable(struct intel_encoder 
*encoder)
        chv_phy_powergate_lanes(encoder, false, 0x0);
 }
 
+void chv_phy_prepare_pll(struct intel_crtc *crtc, u32 bestn,
+                        u32 bestm1, u32 bestm2, u32 bestp1, u32 bestp2,
+                        int vco)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       enum pipe pipe = crtc->pipe;
+       enum dpio_channel port = vlv_pipe_to_channel(pipe);
+       u32 loopfilter, tribuf_calcntr;
+       u32 bestm2_frac;
+       u32 dpio_val;
+
+       bestm2_frac = bestm2 & 0x3fffff;
+       bestm2 = bestm2 >> 22;
+       dpio_val = 0;
+       loopfilter = 0;
+
+       mutex_lock(&dev_priv->sb_lock);
+
+       /* p1 and p2 divider */
+       vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW13(port),
+                       5 << DPIO_CHV_S1_DIV_SHIFT |
+                       bestp1 << DPIO_CHV_P1_DIV_SHIFT |
+                       bestp2 << DPIO_CHV_P2_DIV_SHIFT |
+                       1 << DPIO_CHV_K_DIV_SHIFT);
+
+       /* Feedback post-divider - m2 */
+       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW0(port), bestm2);
+
+       /* Feedback refclk divider - n and m1 */
+       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW1(port),
+                       DPIO_CHV_M1_DIV_BY_2 |
+                       1 << DPIO_CHV_N_DIV_SHIFT);
+
+       /* M2 fraction division */
+       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW2(port), bestm2_frac);
+
+       /* M2 fraction division enable */
+       dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW3(port));
+       dpio_val &= ~(DPIO_CHV_FEEDFWD_GAIN_MASK | DPIO_CHV_FRAC_DIV_EN);
+       dpio_val |= (2 << DPIO_CHV_FEEDFWD_GAIN_SHIFT);
+       if (bestm2_frac)
+               dpio_val |= DPIO_CHV_FRAC_DIV_EN;
+       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW3(port), dpio_val);
+
+       /* Program digital lock detect threshold */
+       dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW9(port));
+       dpio_val &= ~(DPIO_CHV_INT_LOCK_THRESHOLD_MASK |
+                                       DPIO_CHV_INT_LOCK_THRESHOLD_SEL_COARSE);
+       dpio_val |= (0x5 << DPIO_CHV_INT_LOCK_THRESHOLD_SHIFT);
+       if (!bestm2_frac)
+               dpio_val |= DPIO_CHV_INT_LOCK_THRESHOLD_SEL_COARSE;
+       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW9(port), dpio_val);
+
+       /* Loop filter */
+       if (vco == 5400000) {
+               loopfilter |= (0x3 << DPIO_CHV_PROP_COEFF_SHIFT);
+               loopfilter |= (0x8 << DPIO_CHV_INT_COEFF_SHIFT);
+               loopfilter |= (0x1 << DPIO_CHV_GAIN_CTRL_SHIFT);
+               tribuf_calcntr = 0x9;
+       } else if (vco <= 6200000) {
+               loopfilter |= (0x5 << DPIO_CHV_PROP_COEFF_SHIFT);
+               loopfilter |= (0xB << DPIO_CHV_INT_COEFF_SHIFT);
+               loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
+               tribuf_calcntr = 0x9;
+       } else if (vco <= 6480000) {
+               loopfilter |= (0x4 << DPIO_CHV_PROP_COEFF_SHIFT);
+               loopfilter |= (0x9 << DPIO_CHV_INT_COEFF_SHIFT);
+               loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
+               tribuf_calcntr = 0x8;
+       } else {
+               /* Not supported. Apply the same limits as in the max case */
+               loopfilter |= (0x4 << DPIO_CHV_PROP_COEFF_SHIFT);
+               loopfilter |= (0x9 << DPIO_CHV_INT_COEFF_SHIFT);
+               loopfilter |= (0x3 << DPIO_CHV_GAIN_CTRL_SHIFT);
+               tribuf_calcntr = 0;
+       }
+       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW6(port), loopfilter);
+
+       dpio_val = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW8(port));
+       dpio_val &= ~DPIO_CHV_TDC_TARGET_CNT_MASK;
+       dpio_val |= (tribuf_calcntr << DPIO_CHV_TDC_TARGET_CNT_SHIFT);
+       vlv_dpio_write(dev_priv, pipe, CHV_PLL_DW8(port), dpio_val);
+
+       /* AFC Recal */
+       vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port),
+                       vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port)) |
+                       DPIO_AFC_RECAL);
+
+       mutex_unlock(&dev_priv->sb_lock);
+}
+
 void vlv_set_phy_signal_level(struct intel_encoder *encoder,
                              u32 demph_reg_value, u32 preemph_reg_value,
                              u32 uniqtranscale_reg_value, u32 tx3_demph)
@@ -468,3 +559,114 @@ void vlv_phy_reset_lanes(struct intel_encoder *encoder)
        vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port), 0x00e00060);
        mutex_unlock(&dev_priv->sb_lock);
 }
+
+static void vlv_pllb_recal_opamp(struct drm_i915_private *dev_priv,
+                                enum pipe pipe)
+{
+       u32 reg_val;
+
+       /*
+        * PLLB opamp always calibrates to max value of 0x3f, force enable it
+        * and set it to a reasonable value instead.
+        */
+       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW9(1));
+       reg_val &= 0xffffff00;
+       reg_val |= 0x00000030;
+       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9(1), reg_val);
+
+       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_REF_DW13);
+       reg_val &= 0x8cffffff;
+       reg_val = 0x8c000000;
+       vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val);
+
+       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW9(1));
+       reg_val &= 0xffffff00;
+       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9(1), reg_val);
+
+       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_REF_DW13);
+       reg_val &= 0x00ffffff;
+       reg_val |= 0xb0000000;
+       vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val);
+}
+
+void vlv_phy_prepare_pll(struct intel_crtc *crtc, u32 bestn,
+                        u32 bestm1, u32 bestm2, u32 bestp1, u32 bestp2,
+                        int port_clock, bool dp)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       int pipe = crtc->pipe;
+       u32 mdiv;
+       u32 coreclk, reg_val;
+
+       mutex_lock(&dev_priv->sb_lock);
+
+       /* See eDP HDMI DPIO driver vbios notes doc */
+
+       /* PLL B needs special handling */
+       if (pipe == PIPE_B)
+               vlv_pllb_recal_opamp(dev_priv, pipe);
+
+       /* Set up Tx target for periodic Rcomp update */
+       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW9_BCAST, 0x0100000f);
+
+       /* Disable target IRef on PLL */
+       reg_val = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW8(pipe));
+       reg_val &= 0x00ffffff;
+       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW8(pipe), reg_val);
+
+       /* Disable fast lock */
+       vlv_dpio_write(dev_priv, pipe, VLV_CMN_DW0, 0x610);
+
+       /* Set idtafcrecal before PLL is enabled */
+       mdiv = ((bestm1 << DPIO_M1DIV_SHIFT) | (bestm2 & DPIO_M2DIV_MASK));
+       mdiv |= ((bestp1 << DPIO_P1_SHIFT) | (bestp2 << DPIO_P2_SHIFT));
+       mdiv |= ((bestn << DPIO_N_SHIFT));
+       mdiv |= (1 << DPIO_K_SHIFT);
+
+       /*
+        * Post divider depends on pixel clock rate, DAC vs digital (and LVDS,
+        * but we don't support that).
+        * Note: don't use the DAC post divider as it seems unstable.
+        */
+       mdiv |= (DPIO_POST_DIV_HDMIDP << DPIO_POST_DIV_SHIFT);
+       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW3(pipe), mdiv);
+
+       mdiv |= DPIO_ENABLE_CALIBRATION;
+       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW3(pipe), mdiv);
+
+       /* Set HBR and RBR LPF coefficients */
+       if (port_clock == 162000 || !dp)
+               vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe),
+                                0x009f0003);
+       else
+               vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe),
+                                0x00d0000f);
+
+       if (dp) {
+               /* Use SSC source */
+               if (pipe == PIPE_A)
+                       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
+                                        0x0df40000);
+               else
+                       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
+                                        0x0df70000);
+       } else { /* HDMI or VGA */
+               /* Use bend source */
+               if (pipe == PIPE_A)
+                       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
+                                        0x0df70000);
+               else
+                       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW5(pipe),
+                                        0x0df40000);
+       }
+
+       coreclk = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW7(pipe));
+       coreclk = (coreclk & 0x0000ff00) | 0x01c00000;
+       if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT) ||
+           intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))
+               coreclk |= 0x01000000;
+       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW7(pipe), coreclk);
+
+       vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW11(pipe), 0x87871000);
+       mutex_unlock(&dev_priv->sb_lock);
+}
-- 
2.5.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to