aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2014-07-30 08:57:31 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-08-07 05:07:16 -0400
commitaba86890a1785d787bfe7a741f910a472280540a (patch)
tree99df058477d25fbc783c6e30a0d603571568d786
parent1381308bb1e24fd7906eab3f046654041546cce3 (diff)
drm/i915: factor out intel_edp_panel_vdd_sanitize
This will be needed by an upcoming patch too that needs to sanitize the VDD state during resume. The additional async disabling is only needed for the resume path, here it doesn't make a difference since we enable VDD right after the sanitize call. v2: - don't set intel_dp ptr for non-eDP encoders (Ville) Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c60
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
2 files changed, 44 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index ea6ff71b2910..71294b5b860c 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1285,6 +1285,19 @@ static void edp_panel_vdd_work(struct work_struct *__work)
1285 drm_modeset_unlock(&dev->mode_config.connection_mutex); 1285 drm_modeset_unlock(&dev->mode_config.connection_mutex);
1286} 1286}
1287 1287
1288static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp)
1289{
1290 unsigned long delay;
1291
1292 /*
1293 * Queue the timer to fire a long time from now (relative to the power
1294 * down delay) to keep the panel power up across a sequence of
1295 * operations.
1296 */
1297 delay = msecs_to_jiffies(intel_dp->panel_power_cycle_delay * 5);
1298 schedule_delayed_work(&intel_dp->panel_vdd_work, delay);
1299}
1300
1288static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) 1301static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
1289{ 1302{
1290 if (!is_edp(intel_dp)) 1303 if (!is_edp(intel_dp))
@@ -1294,17 +1307,10 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
1294 1307
1295 intel_dp->want_panel_vdd = false; 1308 intel_dp->want_panel_vdd = false;
1296 1309
1297 if (sync) { 1310 if (sync)
1298 edp_panel_vdd_off_sync(intel_dp); 1311 edp_panel_vdd_off_sync(intel_dp);
1299 } else { 1312 else
1300 /* 1313 edp_panel_vdd_schedule_off(intel_dp);
1301 * Queue the timer to fire a long
1302 * time from now (relative to the power down delay)
1303 * to keep the panel power up across a sequence of operations
1304 */
1305 schedule_delayed_work(&intel_dp->panel_vdd_work,
1306 msecs_to_jiffies(intel_dp->panel_power_cycle_delay * 5));
1307 }
1308} 1314}
1309 1315
1310void intel_edp_panel_on(struct intel_dp *intel_dp) 1316void intel_edp_panel_on(struct intel_dp *intel_dp)
@@ -4441,6 +4447,32 @@ intel_dp_drrs_init(struct intel_digital_port *intel_dig_port,
4441 return downclock_mode; 4447 return downclock_mode;
4442} 4448}
4443 4449
4450void intel_edp_panel_vdd_sanitize(struct intel_encoder *intel_encoder)
4451{
4452 struct drm_device *dev = intel_encoder->base.dev;
4453 struct drm_i915_private *dev_priv = dev->dev_private;
4454 struct intel_dp *intel_dp;
4455 enum intel_display_power_domain power_domain;
4456
4457 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4458 return;
4459
4460 intel_dp = enc_to_intel_dp(&intel_encoder->base);
4461 if (!edp_have_panel_vdd(intel_dp))
4462 return;
4463 /*
4464 * The VDD bit needs a power domain reference, so if the bit is
4465 * already enabled when we boot or resume, grab this reference and
4466 * schedule a vdd off, so we don't hold on to the reference
4467 * indefinitely.
4468 */
4469 DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n");
4470 power_domain = intel_display_port_power_domain(intel_encoder);
4471 intel_display_power_get(dev_priv, power_domain);
4472
4473 edp_panel_vdd_schedule_off(intel_dp);
4474}
4475
4444static bool intel_edp_init_connector(struct intel_dp *intel_dp, 4476static bool intel_edp_init_connector(struct intel_dp *intel_dp,
4445 struct intel_connector *intel_connector, 4477 struct intel_connector *intel_connector,
4446 struct edp_power_seq *power_seq) 4478 struct edp_power_seq *power_seq)
@@ -4461,13 +4493,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
4461 if (!is_edp(intel_dp)) 4493 if (!is_edp(intel_dp))
4462 return true; 4494 return true;
4463 4495
4464 /* The VDD bit needs a power domain reference, so if the bit is already 4496 intel_edp_panel_vdd_sanitize(intel_encoder);
4465 * enabled when we boot, grab this reference. */
4466 if (edp_have_panel_vdd(intel_dp)) {
4467 enum intel_display_power_domain power_domain;
4468 power_domain = intel_display_port_power_domain(intel_encoder);
4469 intel_display_power_get(dev_priv, power_domain);
4470 }
4471 4497
4472 /* Cache DPCD and EDID for edp. */ 4498 /* Cache DPCD and EDID for edp. */
4473 intel_edp_panel_vdd_on(intel_dp); 4499 intel_edp_panel_vdd_on(intel_dp);
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 8a475a6909c3..4b2664bd5b81 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -912,6 +912,7 @@ bool intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port,
912void intel_edp_backlight_on(struct intel_dp *intel_dp); 912void intel_edp_backlight_on(struct intel_dp *intel_dp);
913void intel_edp_backlight_off(struct intel_dp *intel_dp); 913void intel_edp_backlight_off(struct intel_dp *intel_dp);
914void intel_edp_panel_vdd_on(struct intel_dp *intel_dp); 914void intel_edp_panel_vdd_on(struct intel_dp *intel_dp);
915void intel_edp_panel_vdd_sanitize(struct intel_encoder *intel_encoder);
915void intel_edp_panel_on(struct intel_dp *intel_dp); 916void intel_edp_panel_on(struct intel_dp *intel_dp);
916void intel_edp_panel_off(struct intel_dp *intel_dp); 917void intel_edp_panel_off(struct intel_dp *intel_dp);
917void intel_edp_psr_enable(struct intel_dp *intel_dp); 918void intel_edp_psr_enable(struct intel_dp *intel_dp);