aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ddi.c
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2013-06-12 16:27:27 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-06-28 08:14:19 -0400
commit15b1d171d87e86366266255462e6b11d21b61c1c (patch)
treeaafd88ac91164f176ed365ec7ff8cd82c8112dde /drivers/gpu/drm/i915/intel_ddi.c
parentb2f246a8998ccf9e00477c8829a62139804e9857 (diff)
drm/i915: fix the "ghost eDP" encoder unwind path
Because calling intel_dp_encoder_destroy inside intel_edp_init_connector is just wrong. This is the initialization path, so we should properly unwind all the initialization through the whole caller stack. On the intel_dp_encoder_destroy function we do the following: 1 - Call i2c_del_adapter 2 - Call drm_encoder_cleanup 3 - If edp: 3.1 - Cancel panel_vdd_work 3.2 - Call ironlake_panel_vdd_of_sync 4 - Free the encoder And here is how we unwind each specific step: 1 - We have intel_dp_init_connector -> intel_dp_i2c_init -> i2c_dp_aux_add_bus -> i2c_add_adapter, so we call i2c_del_dapter at intel_dp_init_connector 2 - Call it in the same function that called drm_encoder_init 3 - Call it in the same function that called INIT_DELAYED_WORK 4 - Free it in the same function that allocated it Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Zoltan Nyul <zoltan.nyul@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ddi.c')
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index aed363cabe07..324211ac9c55 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -1357,6 +1357,8 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
1357 intel_encoder->hot_plug = intel_ddi_hot_plug; 1357 intel_encoder->hot_plug = intel_ddi_hot_plug;
1358 1358
1359 if (!intel_dp_init_connector(intel_dig_port, dp_connector)) { 1359 if (!intel_dp_init_connector(intel_dig_port, dp_connector)) {
1360 drm_encoder_cleanup(encoder);
1361 kfree(intel_dig_port);
1360 kfree(dp_connector); 1362 kfree(dp_connector);
1361 return; 1363 return;
1362 } 1364 }