drm/i915: Create intel_dp->prepare_link_retrain() hook
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Fri, 23 Oct 2015 10:01:49 +0000 (13:01 +0300)
committerAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Thu, 5 Nov 2015 13:14:56 +0000 (15:14 +0200)
In order to prepare for a link training with DDI, the state machine
would call intel_ddi_prepare_link_retrain(). To remove the dependency to
the hardware information, replace that direct call with a callback.

Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Reviewed-by: Sivakumar Thulasimani <sivakumar.thulasimani@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1445594525-7174-7-git-send-email-ander.conselvan.de.oliveira@intel.com
drivers/gpu/drm/i915/intel_ddi.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_dp_link_training.c
drivers/gpu/drm/i915/intel_drv.h

index b1641224ae76e32b3bff6a922ec04bc5a0c1343b..06d30029da51a7980f7afc8c645160f9823563c4 100644 (file)
@@ -2971,11 +2971,11 @@ void intel_ddi_pll_init(struct drm_device *dev)
        }
 }
 
-void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder)
+void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
 {
-       struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
-       struct intel_dp *intel_dp = &intel_dig_port->dp;
-       struct drm_i915_private *dev_priv = encoder->dev->dev_private;
+       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+       struct drm_i915_private *dev_priv =
+               to_i915(intel_dig_port->base.base.dev);
        enum port port = intel_dig_port->port;
        uint32_t val;
        bool wait = false;
index d129507e5cff005dc7e027f80c1cab1280afa023..dd49286100ea6f7a86aa3429a1eb99d8c0e3eb2d 100644 (file)
@@ -5731,6 +5731,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
        else
                intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl;
 
+       if (HAS_DDI(dev))
+               intel_dp->prepare_link_retrain = intel_ddi_prepare_link_retrain;
+
        /* Preserve the current hw state. */
        intel_dp->DP = I915_READ(intel_dp->output_reg);
        intel_dp->attached_connector = intel_connector;
index 53f9c1439db4b2fbddc0e141b9ea0f4ea8aacb2a..bb036d51f93fe4b95b6f4f7e0b3e434f94fe5e7c 100644 (file)
@@ -108,16 +108,14 @@ intel_dp_update_link_train(struct intel_dp *intel_dp)
 static void
 intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
 {
-       struct drm_encoder *encoder = &dp_to_dig_port(intel_dp)->base.base;
-       struct drm_device *dev = encoder->dev;
        int i;
        uint8_t voltage;
        int voltage_tries, loop_tries;
        uint8_t link_config[2];
        uint8_t link_bw, rate_select;
 
-       if (HAS_DDI(dev))
-               intel_ddi_prepare_link_retrain(encoder);
+       if (intel_dp->prepare_link_retrain)
+               intel_dp->prepare_link_retrain(intel_dp);
 
        intel_dp_compute_rate(intel_dp, intel_dp->link_rate,
                              &link_bw, &rate_select);
index a721c50da370e2469909252adfaaf7a662cac592..87c786e63c91b2065a4dc28b0972c6c2dc593f91 100644 (file)
@@ -802,6 +802,10 @@ struct intel_dp {
                                     bool has_aux_irq,
                                     int send_bytes,
                                     uint32_t aux_clock_divider);
+
+       /* This is called before a link training is starterd */
+       void (*prepare_link_retrain)(struct intel_dp *intel_dp);
+
        bool train_set_valid;
 
        /* Displayport compliance testing */
@@ -1006,7 +1010,7 @@ void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc);
 bool intel_ddi_pll_select(struct intel_crtc *crtc,
                          struct intel_crtc_state *crtc_state);
 void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);
-void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder);
+void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp);
 bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
 void intel_ddi_fdi_disable(struct drm_crtc *crtc);
 void intel_ddi_get_config(struct intel_encoder *encoder,