aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorZhenyu Wang <zhenyuw@linux.intel.com>2009-11-25 00:09:38 -0500
committerEric Anholt <eric@anholt.net>2009-11-25 16:09:35 -0500
commit1b3c7a47f993bf9ab6c4c7cc3bbf5588052b58f4 (patch)
tree833917442df88824de36c90a363884c21097bdae /drivers/gpu
parent4215866059b126590aceddfe9f846595b0c1f458 (diff)
drm/i915: Fix LVDS stability issue on Ironlake
In disable sequence, all output ports on PCH have to be disabled before PCH transcoder, but LVDS port was left always enabled. This one fixes that by disable LVDS port properly during pipe disable process, and resolved stability issue seen on Ironlake. Also move panel fitting disable time just after pipe disable to align with the spec. Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com> Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c60
1 files changed, 41 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index e25601bbcb57..a1833cbfaafd 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1488,6 +1488,15 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
1488 case DRM_MODE_DPMS_STANDBY: 1488 case DRM_MODE_DPMS_STANDBY:
1489 case DRM_MODE_DPMS_SUSPEND: 1489 case DRM_MODE_DPMS_SUSPEND:
1490 DRM_DEBUG_KMS("crtc %d dpms on\n", pipe); 1490 DRM_DEBUG_KMS("crtc %d dpms on\n", pipe);
1491
1492 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
1493 temp = I915_READ(PCH_LVDS);
1494 if ((temp & LVDS_PORT_EN) == 0) {
1495 I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN);
1496 POSTING_READ(PCH_LVDS);
1497 }
1498 }
1499
1491 if (HAS_eDP) { 1500 if (HAS_eDP) {
1492 /* enable eDP PLL */ 1501 /* enable eDP PLL */
1493 igdng_enable_pll_edp(crtc); 1502 igdng_enable_pll_edp(crtc);
@@ -1674,8 +1683,6 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
1674 case DRM_MODE_DPMS_OFF: 1683 case DRM_MODE_DPMS_OFF:
1675 DRM_DEBUG_KMS("crtc %d dpms off\n", pipe); 1684 DRM_DEBUG_KMS("crtc %d dpms off\n", pipe);
1676 1685
1677 i915_disable_vga(dev);
1678
1679 /* Disable display plane */ 1686 /* Disable display plane */
1680 temp = I915_READ(dspcntr_reg); 1687 temp = I915_READ(dspcntr_reg);
1681 if ((temp & DISPLAY_PLANE_ENABLE) != 0) { 1688 if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
@@ -1685,6 +1692,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
1685 I915_READ(dspbase_reg); 1692 I915_READ(dspbase_reg);
1686 } 1693 }
1687 1694
1695 i915_disable_vga(dev);
1696
1688 /* disable cpu pipe, disable after all planes disabled */ 1697 /* disable cpu pipe, disable after all planes disabled */
1689 temp = I915_READ(pipeconf_reg); 1698 temp = I915_READ(pipeconf_reg);
1690 if ((temp & PIPEACONF_ENABLE) != 0) { 1699 if ((temp & PIPEACONF_ENABLE) != 0) {
@@ -1706,9 +1715,15 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
1706 } else 1715 } else
1707 DRM_DEBUG_KMS("crtc %d is disabled\n", pipe); 1716 DRM_DEBUG_KMS("crtc %d is disabled\n", pipe);
1708 1717
1709 if (HAS_eDP) { 1718 udelay(100);
1710 igdng_disable_pll_edp(crtc); 1719
1720 /* Disable PF */
1721 temp = I915_READ(pf_ctl_reg);
1722 if ((temp & PF_ENABLE) != 0) {
1723 I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE);
1724 I915_READ(pf_ctl_reg);
1711 } 1725 }
1726 I915_WRITE(pf_win_size, 0);
1712 1727
1713 /* disable CPU FDI tx and PCH FDI rx */ 1728 /* disable CPU FDI tx and PCH FDI rx */
1714 temp = I915_READ(fdi_tx_reg); 1729 temp = I915_READ(fdi_tx_reg);
@@ -1734,6 +1749,13 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
1734 1749
1735 udelay(100); 1750 udelay(100);
1736 1751
1752 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
1753 temp = I915_READ(PCH_LVDS);
1754 I915_WRITE(PCH_LVDS, temp & ~LVDS_PORT_EN);
1755 I915_READ(PCH_LVDS);
1756 udelay(100);
1757 }
1758
1737 /* disable PCH transcoder */ 1759 /* disable PCH transcoder */
1738 temp = I915_READ(transconf_reg); 1760 temp = I915_READ(transconf_reg);
1739 if ((temp & TRANS_ENABLE) != 0) { 1761 if ((temp & TRANS_ENABLE) != 0) {
@@ -1754,6 +1776,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
1754 } 1776 }
1755 } 1777 }
1756 1778
1779 udelay(100);
1780
1757 /* disable PCH DPLL */ 1781 /* disable PCH DPLL */
1758 temp = I915_READ(pch_dpll_reg); 1782 temp = I915_READ(pch_dpll_reg);
1759 if ((temp & DPLL_VCO_ENABLE) != 0) { 1783 if ((temp & DPLL_VCO_ENABLE) != 0) {
@@ -1761,14 +1785,20 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
1761 I915_READ(pch_dpll_reg); 1785 I915_READ(pch_dpll_reg);
1762 } 1786 }
1763 1787
1764 temp = I915_READ(fdi_rx_reg); 1788 if (HAS_eDP) {
1765 if ((temp & FDI_RX_PLL_ENABLE) != 0) { 1789 igdng_disable_pll_edp(crtc);
1766 temp &= ~FDI_SEL_PCDCLK;
1767 temp &= ~FDI_RX_PLL_ENABLE;
1768 I915_WRITE(fdi_rx_reg, temp);
1769 I915_READ(fdi_rx_reg);
1770 } 1790 }
1771 1791
1792 temp = I915_READ(fdi_rx_reg);
1793 temp &= ~FDI_SEL_PCDCLK;
1794 I915_WRITE(fdi_rx_reg, temp);
1795 I915_READ(fdi_rx_reg);
1796
1797 temp = I915_READ(fdi_rx_reg);
1798 temp &= ~FDI_RX_PLL_ENABLE;
1799 I915_WRITE(fdi_rx_reg, temp);
1800 I915_READ(fdi_rx_reg);
1801
1772 /* Disable CPU FDI TX PLL */ 1802 /* Disable CPU FDI TX PLL */
1773 temp = I915_READ(fdi_tx_reg); 1803 temp = I915_READ(fdi_tx_reg);
1774 if ((temp & FDI_TX_PLL_ENABLE) != 0) { 1804 if ((temp & FDI_TX_PLL_ENABLE) != 0) {
@@ -1777,16 +1807,8 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
1777 udelay(100); 1807 udelay(100);
1778 } 1808 }
1779 1809
1780 /* Disable PF */
1781 temp = I915_READ(pf_ctl_reg);
1782 if ((temp & PF_ENABLE) != 0) {
1783 I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE);
1784 I915_READ(pf_ctl_reg);
1785 }
1786 I915_WRITE(pf_win_size, 0);
1787
1788 /* Wait for the clocks to turn off. */ 1810 /* Wait for the clocks to turn off. */
1789 udelay(150); 1811 udelay(100);
1790 break; 1812 break;
1791 } 1813 }
1792} 1814}