]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.6.8/drm-i915-sdvo-clean-up-connectors-on-intel_sdvo_init-failures.patch
Fixes for 4.19
[thirdparty/kernel/stable-queue.git] / releases / 3.6.8 / drm-i915-sdvo-clean-up-connectors-on-intel_sdvo_init-failures.patch
CommitLineData
1df8150e
GKH
1From d0ddfbd3d1346c1f481ec2289eef350cdba64b42 Mon Sep 17 00:00:00 2001
2From: Jani Nikula <jani.nikula@intel.com>
3Date: Mon, 12 Nov 2012 18:31:35 +0200
4Subject: drm/i915/sdvo: clean up connectors on intel_sdvo_init() failures
5
6From: Jani Nikula <jani.nikula@intel.com>
7
8commit d0ddfbd3d1346c1f481ec2289eef350cdba64b42 upstream.
9
10Any failures in intel_sdvo_init() after the intel_sdvo_setup_output() call
11left behind ghost connectors, attached (with a dangling pointer) to the
12sdvo that has been cleaned up and freed. Properly destroy any connectors
13attached to the encoder.
14
15Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=46381
16CC: Chris Wilson <chris@chris-wilson.co.uk>
17Signed-off-by: Jani Nikula <jani.nikula@intel.com>
18Tested-by: bjo@nord-west.org
19[danvet: added a comment to explain why we need to clean up connectors
20even when sdvo_output_setup fails.]
21Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
22Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
23
24---
25 drivers/gpu/drm/i915/intel_sdvo.c | 22 +++++++++++++++++++---
26 1 file changed, 19 insertions(+), 3 deletions(-)
27
28--- a/drivers/gpu/drm/i915/intel_sdvo.c
29+++ b/drivers/gpu/drm/i915/intel_sdvo.c
30@@ -2287,6 +2287,18 @@ intel_sdvo_output_setup(struct intel_sdv
31 return true;
32 }
33
34+static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo)
35+{
36+ struct drm_device *dev = intel_sdvo->base.base.dev;
37+ struct drm_connector *connector, *tmp;
38+
39+ list_for_each_entry_safe(connector, tmp,
40+ &dev->mode_config.connector_list, head) {
41+ if (intel_attached_encoder(connector) == &intel_sdvo->base)
42+ intel_sdvo_destroy(connector);
43+ }
44+}
45+
46 static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo,
47 struct intel_sdvo_connector *intel_sdvo_connector,
48 int type)
49@@ -2606,7 +2618,8 @@ bool intel_sdvo_init(struct drm_device *
50 intel_sdvo->caps.output_flags) != true) {
51 DRM_DEBUG_KMS("SDVO output failed to setup on %s\n",
52 SDVO_NAME(intel_sdvo));
53- goto err;
54+ /* Output_setup can leave behind connectors! */
55+ goto err_output;
56 }
57
58 /* Only enable the hotplug irq if we need it, to work around noisy
59@@ -2619,12 +2632,12 @@ bool intel_sdvo_init(struct drm_device *
60
61 /* Set the input timing to the screen. Assume always input 0. */
62 if (!intel_sdvo_set_target_input(intel_sdvo))
63- goto err;
64+ goto err_output;
65
66 if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo,
67 &intel_sdvo->pixel_clock_min,
68 &intel_sdvo->pixel_clock_max))
69- goto err;
70+ goto err_output;
71
72 DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, "
73 "clock range %dMHz - %dMHz, "
74@@ -2644,6 +2657,9 @@ bool intel_sdvo_init(struct drm_device *
75 (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N');
76 return true;
77
78+err_output:
79+ intel_sdvo_output_cleanup(intel_sdvo);
80+
81 err:
82 drm_encoder_cleanup(&intel_encoder->base);
83 i2c_del_adapter(&intel_sdvo->ddc);