diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 39 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 60 |
2 files changed, 60 insertions, 39 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index fbe42f0a315d..14c45b1e8778 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -1622,32 +1622,6 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
| 1622 | return 0; | 1622 | return 0; |
| 1623 | } | 1623 | } |
| 1624 | 1624 | ||
| 1625 | static void ironlake_disable_pll_edp (struct drm_crtc *crtc) | ||
| 1626 | { | ||
| 1627 | struct drm_device *dev = crtc->dev; | ||
| 1628 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1629 | u32 dpa_ctl; | ||
| 1630 | |||
| 1631 | DRM_DEBUG_KMS("\n"); | ||
| 1632 | dpa_ctl = I915_READ(DP_A); | ||
| 1633 | dpa_ctl &= ~DP_PLL_ENABLE; | ||
| 1634 | I915_WRITE(DP_A, dpa_ctl); | ||
| 1635 | } | ||
| 1636 | |||
| 1637 | static void ironlake_enable_pll_edp (struct drm_crtc *crtc) | ||
| 1638 | { | ||
| 1639 | struct drm_device *dev = crtc->dev; | ||
| 1640 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1641 | u32 dpa_ctl; | ||
| 1642 | |||
| 1643 | dpa_ctl = I915_READ(DP_A); | ||
| 1644 | dpa_ctl |= DP_PLL_ENABLE; | ||
| 1645 | I915_WRITE(DP_A, dpa_ctl); | ||
| 1646 | POSTING_READ(DP_A); | ||
| 1647 | udelay(200); | ||
| 1648 | } | ||
| 1649 | |||
| 1650 | |||
| 1651 | static void ironlake_set_pll_edp (struct drm_crtc *crtc, int clock) | 1625 | static void ironlake_set_pll_edp (struct drm_crtc *crtc, int clock) |
| 1652 | { | 1626 | { |
| 1653 | struct drm_device *dev = crtc->dev; | 1627 | struct drm_device *dev = crtc->dev; |
| @@ -1940,10 +1914,7 @@ static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 1940 | } | 1914 | } |
| 1941 | } | 1915 | } |
| 1942 | 1916 | ||
| 1943 | if (HAS_eDP) { | 1917 | if (!HAS_eDP) { |
| 1944 | /* enable eDP PLL */ | ||
| 1945 | ironlake_enable_pll_edp(crtc); | ||
| 1946 | } else { | ||
| 1947 | 1918 | ||
| 1948 | /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ | 1919 | /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ |
| 1949 | temp = I915_READ(fdi_rx_reg); | 1920 | temp = I915_READ(fdi_rx_reg); |
| @@ -2242,10 +2213,6 @@ static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 2242 | I915_WRITE(pch_dpll_reg, temp & ~DPLL_VCO_ENABLE); | 2213 | I915_WRITE(pch_dpll_reg, temp & ~DPLL_VCO_ENABLE); |
| 2243 | I915_READ(pch_dpll_reg); | 2214 | I915_READ(pch_dpll_reg); |
| 2244 | 2215 | ||
| 2245 | if (HAS_eDP) { | ||
| 2246 | ironlake_disable_pll_edp(crtc); | ||
| 2247 | } | ||
| 2248 | |||
| 2249 | /* Switch from PCDclk to Rawclk */ | 2216 | /* Switch from PCDclk to Rawclk */ |
| 2250 | temp = I915_READ(fdi_rx_reg); | 2217 | temp = I915_READ(fdi_rx_reg); |
| 2251 | temp &= ~FDI_SEL_PCDCLK; | 2218 | temp &= ~FDI_SEL_PCDCLK; |
| @@ -3930,9 +3897,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 3930 | dpll_reg = pch_dpll_reg; | 3897 | dpll_reg = pch_dpll_reg; |
| 3931 | } | 3898 | } |
| 3932 | 3899 | ||
| 3933 | if (is_edp) { | 3900 | if (!is_edp) { |
| 3934 | ironlake_disable_pll_edp(crtc); | ||
| 3935 | } else if ((dpll & DPLL_VCO_ENABLE)) { | ||
| 3936 | I915_WRITE(fp_reg, fp); | 3901 | I915_WRITE(fp_reg, fp); |
| 3937 | I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE); | 3902 | I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE); |
| 3938 | I915_READ(dpll_reg); | 3903 | I915_READ(dpll_reg); |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 8061a48804a3..caaaa8f9db3e 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -831,6 +831,60 @@ static void ironlake_edp_backlight_off (struct drm_device *dev) | |||
| 831 | I915_WRITE(PCH_PP_CONTROL, pp); | 831 | I915_WRITE(PCH_PP_CONTROL, pp); |
| 832 | } | 832 | } |
| 833 | 833 | ||
| 834 | static void ironlake_edp_pll_on(struct drm_encoder *encoder) | ||
| 835 | { | ||
| 836 | struct drm_device *dev = encoder->dev; | ||
| 837 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 838 | u32 dpa_ctl; | ||
| 839 | |||
| 840 | DRM_DEBUG_KMS("\n"); | ||
| 841 | dpa_ctl = I915_READ(DP_A); | ||
| 842 | dpa_ctl &= ~DP_PLL_ENABLE; | ||
| 843 | I915_WRITE(DP_A, dpa_ctl); | ||
| 844 | } | ||
| 845 | |||
| 846 | static void ironlake_edp_pll_off(struct drm_encoder *encoder) | ||
| 847 | { | ||
| 848 | struct drm_device *dev = encoder->dev; | ||
| 849 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 850 | u32 dpa_ctl; | ||
| 851 | |||
| 852 | dpa_ctl = I915_READ(DP_A); | ||
| 853 | dpa_ctl |= DP_PLL_ENABLE; | ||
| 854 | I915_WRITE(DP_A, dpa_ctl); | ||
| 855 | udelay(200); | ||
| 856 | } | ||
| 857 | |||
| 858 | static void intel_dp_prepare(struct drm_encoder *encoder) | ||
| 859 | { | ||
| 860 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); | ||
| 861 | struct drm_device *dev = encoder->dev; | ||
| 862 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 863 | uint32_t dp_reg = I915_READ(intel_dp->output_reg); | ||
| 864 | |||
| 865 | if (IS_eDP(intel_dp)) { | ||
| 866 | ironlake_edp_backlight_off(dev); | ||
| 867 | ironlake_edp_panel_on(dev); | ||
| 868 | ironlake_edp_pll_on(encoder); | ||
| 869 | } | ||
| 870 | if (dp_reg & DP_PORT_EN) | ||
| 871 | intel_dp_link_down(intel_dp); | ||
| 872 | } | ||
| 873 | |||
| 874 | static void intel_dp_commit(struct drm_encoder *encoder) | ||
| 875 | { | ||
| 876 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); | ||
| 877 | struct drm_device *dev = encoder->dev; | ||
| 878 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 879 | uint32_t dp_reg = I915_READ(intel_dp->output_reg); | ||
| 880 | |||
| 881 | if (!(dp_reg & DP_PORT_EN)) { | ||
| 882 | intel_dp_link_train(intel_dp); | ||
| 883 | } | ||
| 884 | if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) | ||
| 885 | ironlake_edp_backlight_on(dev); | ||
| 886 | } | ||
| 887 | |||
| 834 | static void | 888 | static void |
| 835 | intel_dp_dpms(struct drm_encoder *encoder, int mode) | 889 | intel_dp_dpms(struct drm_encoder *encoder, int mode) |
| 836 | { | 890 | { |
| @@ -846,6 +900,8 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode) | |||
| 846 | } | 900 | } |
| 847 | if (dp_reg & DP_PORT_EN) | 901 | if (dp_reg & DP_PORT_EN) |
| 848 | intel_dp_link_down(intel_dp); | 902 | intel_dp_link_down(intel_dp); |
| 903 | if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) | ||
| 904 | ironlake_edp_pll_off(encoder); | ||
| 849 | } else { | 905 | } else { |
| 850 | if (!(dp_reg & DP_PORT_EN)) { | 906 | if (!(dp_reg & DP_PORT_EN)) { |
| 851 | if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) | 907 | if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) |
| @@ -1427,9 +1483,9 @@ intel_dp_destroy (struct drm_connector *connector) | |||
| 1427 | static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = { | 1483 | static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = { |
| 1428 | .dpms = intel_dp_dpms, | 1484 | .dpms = intel_dp_dpms, |
| 1429 | .mode_fixup = intel_dp_mode_fixup, | 1485 | .mode_fixup = intel_dp_mode_fixup, |
| 1430 | .prepare = intel_encoder_prepare, | 1486 | .prepare = intel_dp_prepare, |
| 1431 | .mode_set = intel_dp_mode_set, | 1487 | .mode_set = intel_dp_mode_set, |
| 1432 | .commit = intel_encoder_commit, | 1488 | .commit = intel_dp_commit, |
| 1433 | }; | 1489 | }; |
| 1434 | 1490 | ||
| 1435 | static const struct drm_connector_funcs intel_dp_connector_funcs = { | 1491 | static const struct drm_connector_funcs intel_dp_connector_funcs = { |
