diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ddi.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 41 |
1 files changed, 13 insertions, 28 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index 6cc79c83772c..bd8b1ebe8fa2 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
@@ -394,14 +394,11 @@ void intel_ddi_put_crtc_pll(struct drm_crtc *crtc) | |||
394 | 394 | ||
395 | switch (intel_crtc->ddi_pll_sel) { | 395 | switch (intel_crtc->ddi_pll_sel) { |
396 | case PORT_CLK_SEL_SPLL: | 396 | case PORT_CLK_SEL_SPLL: |
397 | plls->spll_refcount--; | 397 | DRM_DEBUG_KMS("Disabling SPLL\n"); |
398 | if (plls->spll_refcount == 0) { | 398 | val = I915_READ(SPLL_CTL); |
399 | DRM_DEBUG_KMS("Disabling SPLL\n"); | 399 | WARN_ON(!(val & SPLL_PLL_ENABLE)); |
400 | val = I915_READ(SPLL_CTL); | 400 | I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE); |
401 | WARN_ON(!(val & SPLL_PLL_ENABLE)); | 401 | POSTING_READ(SPLL_CTL); |
402 | I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE); | ||
403 | POSTING_READ(SPLL_CTL); | ||
404 | } | ||
405 | break; | 402 | break; |
406 | case PORT_CLK_SEL_WRPLL1: | 403 | case PORT_CLK_SEL_WRPLL1: |
407 | plls->wrpll1_refcount--; | 404 | plls->wrpll1_refcount--; |
@@ -425,7 +422,6 @@ void intel_ddi_put_crtc_pll(struct drm_crtc *crtc) | |||
425 | break; | 422 | break; |
426 | } | 423 | } |
427 | 424 | ||
428 | WARN(plls->spll_refcount < 0, "Invalid SPLL refcount\n"); | ||
429 | WARN(plls->wrpll1_refcount < 0, "Invalid WRPLL1 refcount\n"); | 425 | WARN(plls->wrpll1_refcount < 0, "Invalid WRPLL1 refcount\n"); |
430 | WARN(plls->wrpll2_refcount < 0, "Invalid WRPLL2 refcount\n"); | 426 | WARN(plls->wrpll2_refcount < 0, "Invalid WRPLL2 refcount\n"); |
431 | 427 | ||
@@ -821,16 +817,9 @@ bool intel_ddi_pll_select(struct intel_crtc *intel_crtc) | |||
821 | } | 817 | } |
822 | 818 | ||
823 | } else if (type == INTEL_OUTPUT_ANALOG) { | 819 | } else if (type == INTEL_OUTPUT_ANALOG) { |
824 | if (plls->spll_refcount == 0) { | 820 | DRM_DEBUG_KMS("Using SPLL on pipe %c\n", |
825 | DRM_DEBUG_KMS("Using SPLL on pipe %c\n", | 821 | pipe_name(pipe)); |
826 | pipe_name(pipe)); | 822 | intel_crtc->ddi_pll_sel = PORT_CLK_SEL_SPLL; |
827 | plls->spll_refcount++; | ||
828 | intel_crtc->ddi_pll_sel = PORT_CLK_SEL_SPLL; | ||
829 | } else { | ||
830 | DRM_ERROR("SPLL already in use\n"); | ||
831 | return false; | ||
832 | } | ||
833 | |||
834 | } else { | 823 | } else { |
835 | WARN(1, "Invalid DDI encoder type %d\n", type); | 824 | WARN(1, "Invalid DDI encoder type %d\n", type); |
836 | return false; | 825 | return false; |
@@ -869,13 +858,13 @@ void intel_ddi_pll_enable(struct intel_crtc *crtc) | |||
869 | return; | 858 | return; |
870 | 859 | ||
871 | case PORT_CLK_SEL_SPLL: | 860 | case PORT_CLK_SEL_SPLL: |
872 | pll_name = "SPLL"; | ||
873 | reg = SPLL_CTL; | ||
874 | refcount = plls->spll_refcount; | ||
875 | new_val = SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | | 861 | new_val = SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | |
876 | SPLL_PLL_SSC; | 862 | SPLL_PLL_SSC; |
877 | break; | 863 | WARN(I915_READ(SPLL_CTL) & enable_bit, "SPLL already enabled\n"); |
878 | 864 | I915_WRITE(SPLL_CTL, new_val); | |
865 | POSTING_READ(SPLL_CTL); | ||
866 | udelay(20); | ||
867 | return; | ||
879 | case PORT_CLK_SEL_WRPLL1: | 868 | case PORT_CLK_SEL_WRPLL1: |
880 | case PORT_CLK_SEL_WRPLL2: | 869 | case PORT_CLK_SEL_WRPLL2: |
881 | if (crtc->ddi_pll_sel == PORT_CLK_SEL_WRPLL1) { | 870 | if (crtc->ddi_pll_sel == PORT_CLK_SEL_WRPLL1) { |
@@ -1188,7 +1177,6 @@ void intel_ddi_setup_hw_pll_state(struct drm_device *dev) | |||
1188 | enum pipe pipe; | 1177 | enum pipe pipe; |
1189 | struct intel_crtc *intel_crtc; | 1178 | struct intel_crtc *intel_crtc; |
1190 | 1179 | ||
1191 | dev_priv->ddi_plls.spll_refcount = 0; | ||
1192 | dev_priv->ddi_plls.wrpll1_refcount = 0; | 1180 | dev_priv->ddi_plls.wrpll1_refcount = 0; |
1193 | dev_priv->ddi_plls.wrpll2_refcount = 0; | 1181 | dev_priv->ddi_plls.wrpll2_refcount = 0; |
1194 | 1182 | ||
@@ -1205,9 +1193,6 @@ void intel_ddi_setup_hw_pll_state(struct drm_device *dev) | |||
1205 | pipe); | 1193 | pipe); |
1206 | 1194 | ||
1207 | switch (intel_crtc->ddi_pll_sel) { | 1195 | switch (intel_crtc->ddi_pll_sel) { |
1208 | case PORT_CLK_SEL_SPLL: | ||
1209 | dev_priv->ddi_plls.spll_refcount++; | ||
1210 | break; | ||
1211 | case PORT_CLK_SEL_WRPLL1: | 1196 | case PORT_CLK_SEL_WRPLL1: |
1212 | dev_priv->ddi_plls.wrpll1_refcount++; | 1197 | dev_priv->ddi_plls.wrpll1_refcount++; |
1213 | break; | 1198 | break; |