From: Ville Syrjälä <[email protected]>

To save a bit of power let's try to power down the TMDS buffers on
DP++ dongles hooked to downstream facing DP++ ports.

Signed-off-by: Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_ddi.c |  6 ++++++
 drivers/gpu/drm/i915/display/intel_dp.c  | 25 ++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 92c280905f31..5daa52909980 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -3512,6 +3512,9 @@ static void hsw_ddi_pre_enable_dp(struct intel_encoder 
*encoder,
        else
                WARN_ON(is_mst && port == PORT_A);
 
+       intel_dp_dual_mode_set_tmds_output(encoder,
+                                          &intel_dp->dp_dual_mode, true);
+
        intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
                                 crtc_state->lane_count, is_mst);
 
@@ -3757,6 +3760,9 @@ static void intel_ddi_post_disable_dp(struct 
intel_encoder *encoder,
                                                  
dig_port->ddi_io_power_domain);
 
        intel_ddi_clk_disable(encoder);
+
+       intel_dp_dual_mode_set_tmds_output(encoder,
+                                          &intel_dp->dp_dual_mode, false);
 }
 
 static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder,
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 5143c1b0fd92..0452cc9423e6 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3510,19 +3510,28 @@ static void g4x_post_disable_dp(struct intel_encoder 
*encoder,
        /* Only ilk+ has port A */
        if (port == PORT_A)
                ilk_edp_pll_off(intel_dp, old_crtc_state);
+
+       intel_dp_dual_mode_set_tmds_output(encoder,
+                                          &intel_dp->dp_dual_mode, false);
 }
 
 static void vlv_post_disable_dp(struct intel_encoder *encoder,
                                const struct intel_crtc_state *old_crtc_state,
                                const struct drm_connector_state 
*old_conn_state)
 {
+       struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+
        intel_dp_link_down(encoder, old_crtc_state);
+
+       intel_dp_dual_mode_set_tmds_output(encoder,
+                                          &intel_dp->dp_dual_mode, false);
 }
 
 static void chv_post_disable_dp(struct intel_encoder *encoder,
                                const struct intel_crtc_state *old_crtc_state,
                                const struct drm_connector_state 
*old_conn_state)
 {
+       struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 
        intel_dp_link_down(encoder, old_crtc_state);
@@ -3533,6 +3542,9 @@ static void chv_post_disable_dp(struct intel_encoder 
*encoder,
        chv_data_lane_soft_reset(encoder, old_crtc_state, true);
 
        vlv_dpio_put(dev_priv);
+
+       intel_dp_dual_mode_set_tmds_output(encoder,
+                                          &intel_dp->dp_dual_mode, false);
 }
 
 static void
@@ -3748,6 +3760,9 @@ static void g4x_pre_enable_dp(struct intel_encoder 
*encoder,
        struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
        enum port port = encoder->port;
 
+       intel_dp_dual_mode_set_tmds_output(encoder,
+                                          &intel_dp->dp_dual_mode, true);
+
        intel_dp_prepare(encoder, pipe_config);
 
        /* Only ilk+ has port A */
@@ -3865,6 +3880,11 @@ static void vlv_pre_enable_dp(struct intel_encoder 
*encoder,
                              const struct intel_crtc_state *pipe_config,
                              const struct drm_connector_state *conn_state)
 {
+       struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+
+       intel_dp_dual_mode_set_tmds_output(encoder,
+                                          &intel_dp->dp_dual_mode, true);
+
        vlv_phy_pre_encoder_enable(encoder, pipe_config);
 
        intel_enable_dp(encoder, pipe_config, conn_state);
@@ -3883,6 +3903,11 @@ static void chv_pre_enable_dp(struct intel_encoder 
*encoder,
                              const struct intel_crtc_state *pipe_config,
                              const struct drm_connector_state *conn_state)
 {
+       struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+
+       intel_dp_dual_mode_set_tmds_output(encoder,
+                                          &intel_dp->dp_dual_mode, true);
+
        chv_phy_pre_encoder_enable(encoder, pipe_config);
 
        intel_enable_dp(encoder, pipe_config, conn_state);
-- 
2.24.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to