diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2015-07-08 16:45:49 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-08-26 04:22:19 -0400 |
commit | d6db995fe36c7460a30c8c6250bb47937d38c482 (patch) | |
tree | 1588d97e412ea36e74833dcee450102c38e13e55 | |
parent | 67fa24b4041436f1a21f7640d1d7ab56d023d7e9 (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.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 23 |
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 | ||
2946 | static 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 | ||
1684 | static 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 | |||
1684 | static void vlv_hdmi_post_disable(struct intel_encoder *encoder) | 1706 | static 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; |