aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c26
-rw-r--r--drivers/gpu/drm/i915/intel_display.c8
2 files changed, 20 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 52a916082c65..7c6e8d549467 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -391,28 +391,20 @@ void intel_ddi_put_crtc_pll(struct drm_crtc *crtc)
391 struct drm_i915_private *dev_priv = crtc->dev->dev_private; 391 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
392 struct intel_ddi_plls *plls = &dev_priv->ddi_plls; 392 struct intel_ddi_plls *plls = &dev_priv->ddi_plls;
393 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 393 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
394 uint32_t val; 394 struct intel_shared_dpll *pll = intel_crtc_to_shared_dpll(intel_crtc);
395 395
396 switch (intel_crtc->config.ddi_pll_sel) { 396 switch (intel_crtc->config.ddi_pll_sel) {
397 case PORT_CLK_SEL_WRPLL1: 397 case PORT_CLK_SEL_WRPLL1:
398 plls->wrpll1_refcount--; 398 plls->wrpll1_refcount--;
399 if (plls->wrpll1_refcount == 0) { 399 if (plls->wrpll1_refcount == 0) {
400 DRM_DEBUG_KMS("Disabling WRPLL 1\n"); 400 pll->disable(dev_priv, pll);
401 val = I915_READ(WRPLL_CTL1);
402 WARN_ON(!(val & WRPLL_PLL_ENABLE));
403 I915_WRITE(WRPLL_CTL1, val & ~WRPLL_PLL_ENABLE);
404 POSTING_READ(WRPLL_CTL1);
405 } 401 }
406 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_NONE; 402 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_NONE;
407 break; 403 break;
408 case PORT_CLK_SEL_WRPLL2: 404 case PORT_CLK_SEL_WRPLL2:
409 plls->wrpll2_refcount--; 405 plls->wrpll2_refcount--;
410 if (plls->wrpll2_refcount == 0) { 406 if (plls->wrpll2_refcount == 0) {
411 DRM_DEBUG_KMS("Disabling WRPLL 2\n"); 407 pll->disable(dev_priv, pll);
412 val = I915_READ(WRPLL_CTL2);
413 WARN_ON(!(val & WRPLL_PLL_ENABLE));
414 I915_WRITE(WRPLL_CTL2, val & ~WRPLL_PLL_ENABLE);
415 POSTING_READ(WRPLL_CTL2);
416 } 408 }
417 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_NONE; 409 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_NONE;
418 break; 410 break;
@@ -1319,6 +1311,17 @@ int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
1319 } 1311 }
1320} 1312}
1321 1313
1314static void hsw_ddi_pll_disable(struct drm_i915_private *dev_priv,
1315 struct intel_shared_dpll *pll)
1316{
1317 uint32_t val;
1318
1319 val = I915_READ(WRPLL_CTL(pll->id));
1320 WARN_ON(!(val & WRPLL_PLL_ENABLE));
1321 I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
1322 POSTING_READ(WRPLL_CTL(pll->id));
1323}
1324
1322static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, 1325static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1323 struct intel_shared_dpll *pll, 1326 struct intel_shared_dpll *pll,
1324 struct intel_dpll_hw_state *hw_state) 1327 struct intel_dpll_hw_state *hw_state)
@@ -1352,6 +1355,7 @@ void intel_ddi_pll_init(struct drm_device *dev)
1352 for (i = 0; i < 2; i++) { 1355 for (i = 0; i < 2; i++) {
1353 dev_priv->shared_dplls[i].id = i; 1356 dev_priv->shared_dplls[i].id = i;
1354 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i]; 1357 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
1358 dev_priv->shared_dplls[i].disable = hsw_ddi_pll_disable;
1355 dev_priv->shared_dplls[i].get_hw_state = 1359 dev_priv->shared_dplls[i].get_hw_state =
1356 hsw_ddi_pll_get_hw_state; 1360 hsw_ddi_pll_get_hw_state;
1357 } 1361 }
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 3e0917dff54f..851221d6e7af 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -5224,9 +5224,11 @@ static int intel_crtc_compute_config(struct intel_crtc *crtc,
5224 if (HAS_IPS(dev)) 5224 if (HAS_IPS(dev))
5225 hsw_compute_ips_config(crtc, pipe_config); 5225 hsw_compute_ips_config(crtc, pipe_config);
5226 5226
5227 /* XXX: PCH clock sharing is done in ->mode_set, so make sure the old 5227 /*
5228 * clock survives for now. */ 5228 * XXX: PCH/WRPLL clock sharing is done in ->mode_set, so make sure the
5229 if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) 5229 * old clock survives for now.
5230 */
5231 if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev) || HAS_DDI(dev))
5230 pipe_config->shared_dpll = crtc->config.shared_dpll; 5232 pipe_config->shared_dpll = crtc->config.shared_dpll;
5231 5233
5232 if (pipe_config->has_pch_encoder) 5234 if (pipe_config->has_pch_encoder)