diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 26 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 8 |
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 | ||
1314 | static 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 | |||
1322 | static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, | 1325 | static 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) |