aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2015-07-08 16:45:49 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-08-26 04:22:19 -0400
commitd6db995fe36c7460a30c8c6250bb47937d38c482 (patch)
tree1588d97e412ea36e74833dcee450102c38e13e55
parent67fa24b4041436f1a21f7640d1d7ab56d023d7e9 (diff)
drm/i915: Add encoder->post_pll_disable() hooks and move CHV clock buffer disables there
Move the CHV clock buffer disable from chv_disable_pll() to the new encoder .post_pll_disable() hook. This is more symmetric since the clock buffer enable happens from the .pre_pll_enable() hook. We'll have more use for the new hook soon. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Deepak S <deepak.s@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c15
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c23
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c23
4 files changed, 51 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index a64da67b4f40..328d1eec6af4 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1828,17 +1828,6 @@ static void chv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
1828 val &= ~DPIO_DCLKP_EN; 1828 val &= ~DPIO_DCLKP_EN;
1829 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port), val); 1829 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port), val);
1830 1830
1831 /* disable left/right clock distribution */
1832 if (pipe != PIPE_B) {
1833 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
1834 val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
1835 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
1836 } else {
1837 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
1838 val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
1839 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
1840 }
1841
1842 mutex_unlock(&dev_priv->sb_lock); 1831 mutex_unlock(&dev_priv->sb_lock);
1843} 1832}
1844 1833
@@ -6193,6 +6182,10 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
6193 i9xx_disable_pll(intel_crtc); 6182 i9xx_disable_pll(intel_crtc);
6194 } 6183 }
6195 6184
6185 for_each_encoder_on_crtc(dev, crtc, encoder)
6186 if (encoder->post_pll_disable)
6187 encoder->post_pll_disable(encoder);
6188
6196 if (!IS_GEN2(dev)) 6189 if (!IS_GEN2(dev))
6197 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false); 6190 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
6198 6191
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index da7d1ae18b9b..4e5bd87b75db 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2943,6 +2943,28 @@ static void chv_dp_pre_pll_enable(struct intel_encoder *encoder)
2943 mutex_unlock(&dev_priv->sb_lock); 2943 mutex_unlock(&dev_priv->sb_lock);
2944} 2944}
2945 2945
2946static void chv_dp_post_pll_disable(struct intel_encoder *encoder)
2947{
2948 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2949 enum pipe pipe = to_intel_crtc(encoder->base.crtc)->pipe;
2950 u32 val;
2951
2952 mutex_lock(&dev_priv->sb_lock);
2953
2954 /* disable left/right clock distribution */
2955 if (pipe != PIPE_B) {
2956 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
2957 val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
2958 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
2959 } else {
2960 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
2961 val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
2962 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
2963 }
2964
2965 mutex_unlock(&dev_priv->sb_lock);
2966}
2967
2946/* 2968/*
2947 * Native read with retry for link status and receiver capability reads for 2969 * Native read with retry for link status and receiver capability reads for
2948 * cases where the sink may still be asleep. 2970 * cases where the sink may still be asleep.
@@ -6000,6 +6022,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
6000 intel_encoder->pre_enable = chv_pre_enable_dp; 6022 intel_encoder->pre_enable = chv_pre_enable_dp;
6001 intel_encoder->enable = vlv_enable_dp; 6023 intel_encoder->enable = vlv_enable_dp;
6002 intel_encoder->post_disable = chv_post_disable_dp; 6024 intel_encoder->post_disable = chv_post_disable_dp;
6025 intel_encoder->post_pll_disable = chv_dp_post_pll_disable;
6003 } else if (IS_VALLEYVIEW(dev)) { 6026 } else if (IS_VALLEYVIEW(dev)) {
6004 intel_encoder->pre_pll_enable = vlv_dp_pre_pll_enable; 6027 intel_encoder->pre_pll_enable = vlv_dp_pre_pll_enable;
6005 intel_encoder->pre_enable = vlv_pre_enable_dp; 6028 intel_encoder->pre_enable = vlv_pre_enable_dp;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 8383442b6fa0..525e45736e1c 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -142,6 +142,7 @@ struct intel_encoder {
142 void (*mode_set)(struct intel_encoder *intel_encoder); 142 void (*mode_set)(struct intel_encoder *intel_encoder);
143 void (*disable)(struct intel_encoder *); 143 void (*disable)(struct intel_encoder *);
144 void (*post_disable)(struct intel_encoder *); 144 void (*post_disable)(struct intel_encoder *);
145 void (*post_pll_disable)(struct intel_encoder *);
145 /* Read out the current hw state of this connector, returning true if 146 /* Read out the current hw state of this connector, returning true if
146 * the encoder is active. If the encoder is enabled it also set the pipe 147 * the encoder is active. If the encoder is enabled it also set the pipe
147 * it is connected to in the pipe parameter. */ 148 * it is connected to in the pipe parameter. */
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index c25835f46c62..269937a7919a 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1681,6 +1681,28 @@ static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder)
1681 mutex_unlock(&dev_priv->sb_lock); 1681 mutex_unlock(&dev_priv->sb_lock);
1682} 1682}
1683 1683
1684static void chv_hdmi_post_pll_disable(struct intel_encoder *encoder)
1685{
1686 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1687 enum pipe pipe = to_intel_crtc(encoder->base.crtc)->pipe;
1688 u32 val;
1689
1690 mutex_lock(&dev_priv->sb_lock);
1691
1692 /* disable left/right clock distribution */
1693 if (pipe != PIPE_B) {
1694 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
1695 val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
1696 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
1697 } else {
1698 val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
1699 val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
1700 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
1701 }
1702
1703 mutex_unlock(&dev_priv->sb_lock);
1704}
1705
1684static void vlv_hdmi_post_disable(struct intel_encoder *encoder) 1706static void vlv_hdmi_post_disable(struct intel_encoder *encoder)
1685{ 1707{
1686 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); 1708 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
@@ -2083,6 +2105,7 @@ void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
2083 intel_encoder->pre_enable = chv_hdmi_pre_enable; 2105 intel_encoder->pre_enable = chv_hdmi_pre_enable;
2084 intel_encoder->enable = vlv_enable_hdmi; 2106 intel_encoder->enable = vlv_enable_hdmi;
2085 intel_encoder->post_disable = chv_hdmi_post_disable; 2107 intel_encoder->post_disable = chv_hdmi_post_disable;
2108 intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
2086 } else if (IS_VALLEYVIEW(dev)) { 2109 } else if (IS_VALLEYVIEW(dev)) {
2087 intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable; 2110 intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
2088 intel_encoder->pre_enable = vlv_hdmi_pre_enable; 2111 intel_encoder->pre_enable = vlv_hdmi_pre_enable;