drm/i915: Hold the pps mutex across the whole panel power enable sequence
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 16 Oct 2014 18:27:33 +0000 (21:27 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 4 Nov 2014 22:22:01 +0000 (23:22 +0100)
Just grab the pps_mutex once and do all the pps panel startup operations
while holding the mutex instead of grabbing the mutex separately for
each individual step.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_dp.c

index c97bb5c8c62aa938410214dedd0420122dc3704f..cad4e112cfaa4948f1e19b38ca274c32b2874eb0 100644 (file)
@@ -113,6 +113,7 @@ static struct intel_dp *intel_attached_dp(struct drm_connector *connector)
 static void intel_dp_link_down(struct intel_dp *intel_dp);
 static bool edp_panel_vdd_on(struct intel_dp *intel_dp);
 static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync);
+static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp);
 
 int
 intel_dp_max_link_bw(struct intel_dp *intel_dp)
@@ -1539,22 +1540,6 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
                edp_panel_vdd_schedule_off(intel_dp);
 }
 
-/*
- * Must be paired with intel_edp_panel_vdd_on().
- * Nested calls to these functions are not allowed since
- * we drop the lock. Caller must use some higher level
- * locking to prevent nested calls from other threads.
- */
-static void intel_edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
-{
-       if (!is_edp(intel_dp))
-               return;
-
-       pps_lock(intel_dp);
-       edp_panel_vdd_off(intel_dp, sync);
-       pps_unlock(intel_dp);
-}
-
 static void edp_panel_on(struct intel_dp *intel_dp)
 {
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
@@ -2552,10 +2537,19 @@ static void intel_enable_dp(struct intel_encoder *encoder)
        if (WARN_ON(dp_reg & DP_PORT_EN))
                return;
 
+       pps_lock(intel_dp);
+
+       if (IS_VALLEYVIEW(dev))
+               vlv_init_panel_power_sequencer(intel_dp);
+
        intel_dp_enable_port(intel_dp);
-       intel_edp_panel_vdd_on(intel_dp);
-       intel_edp_panel_on(intel_dp);
-       intel_edp_panel_vdd_off(intel_dp, true);
+
+       edp_panel_vdd_on(intel_dp);
+       edp_panel_on(intel_dp);
+       edp_panel_vdd_off(intel_dp, true);
+
+       pps_unlock(intel_dp);
+
        intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
        intel_dp_start_link_train(intel_dp);
        intel_dp_complete_link_train(intel_dp);
@@ -2633,6 +2627,9 @@ static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp)
 
        lockdep_assert_held(&dev_priv->pps_mutex);
 
+       if (!is_edp(intel_dp))
+               return;
+
        if (intel_dp->pps_pipe == crtc->pipe)
                return;
 
@@ -2687,12 +2684,6 @@ static void vlv_pre_enable_dp(struct intel_encoder *encoder)
 
        mutex_unlock(&dev_priv->dpio_lock);
 
-       if (is_edp(intel_dp)) {
-               pps_lock(intel_dp);
-               vlv_init_panel_power_sequencer(intel_dp);
-               pps_unlock(intel_dp);
-       }
-
        intel_enable_dp(encoder);
 
        vlv_wait_port_ready(dev_priv, dport);
@@ -2787,12 +2778,6 @@ static void chv_pre_enable_dp(struct intel_encoder *encoder)
 
        mutex_unlock(&dev_priv->dpio_lock);
 
-       if (is_edp(intel_dp)) {
-               pps_lock(intel_dp);
-               vlv_init_panel_power_sequencer(intel_dp);
-               pps_unlock(intel_dp);
-       }
-
        intel_enable_dp(encoder);
 
        vlv_wait_port_ready(dev_priv, dport);