All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup
@ 2014-02-11 15:12 Imre Deak
  2014-02-11 15:12 ` [PATCH v2 1/4] drm/i915: add unregister callback to connector Imre Deak
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Imre Deak @ 2014-02-11 15:12 UTC (permalink / raw)
  To: intel-gfx

The main point of this patchset is to fix a driver unload bug caused by
incorrect order of dp aux i2c cleanup wrt. destroying the corresponding
encoder/connector objects, see the second patch for details.

Tested on vlv/dp.

v2: move all sysfs removal bits to the new connector->unregister
    callback (Daniel)

Imre Deak (4):
  drm/i915: add unregister callback to connector
  drm/i915: dp: fix order of dp aux i2c device cleanup
  drm/i915: sdvo: fix error path in sdvo_connector_init
  drm/i915: sdvo: add i2c sysfs symlink to the connector's directory

 drivers/gpu/drm/i915/i915_drv.h      |  1 +
 drivers/gpu/drm/i915/intel_crt.c     |  1 +
 drivers/gpu/drm/i915/intel_display.c | 14 ++++++--
 drivers/gpu/drm/i915/intel_dp.c      | 23 +++++++++++-
 drivers/gpu/drm/i915/intel_drv.h     |  8 +++++
 drivers/gpu/drm/i915/intel_dsi.c     |  1 +
 drivers/gpu/drm/i915/intel_dvo.c     |  1 +
 drivers/gpu/drm/i915/intel_hdmi.c    |  1 +
 drivers/gpu/drm/i915/intel_lvds.c    |  1 +
 drivers/gpu/drm/i915/intel_sdvo.c    | 70 +++++++++++++++++++++++++++++++-----
 drivers/gpu/drm/i915/intel_tv.c      |  1 +
 11 files changed, 110 insertions(+), 12 deletions(-)

-- 
1.8.4

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/4] drm/i915: add unregister callback to connector
  2014-02-11 15:12 [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Imre Deak
@ 2014-02-11 15:12 ` Imre Deak
  2014-02-11 15:12 ` [PATCH v2 2/4] drm/i915: dp: fix order of dp aux i2c device cleanup Imre Deak
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Imre Deak @ 2014-02-11 15:12 UTC (permalink / raw)
  To: intel-gfx

Since

commit d9255d57147e1dbcebdf6670409c2fa0ac3609e6
Author: Paulo Zanoni <paulo.r.zanoni@intel.com>
Date:   Thu Sep 26 20:05:59 2013 -0300

it became clear that we need to separate the unload sequence into two
parts:

1. remove all interfaces through which new operations on some object
   (crtc, encoder, connector) can be started and make sure all pending
   operations are completed
2. do the actual tear down of the internal representation of the above
   objects

The above commit achieved this separation for connectors by splitting
out the sysfs removal part from the connector's destroy callback and
doing this removal before calling drm_mode_config_cleanup() which does
the actual tear-down of all the drm objects.

Since we'll have to customize the interface removal part for different
types of connectors in the upcoming patches, add a new unregister
callback and move the interface removal part to it.

No functional change.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h      |  1 +
 drivers/gpu/drm/i915/intel_crt.c     |  1 +
 drivers/gpu/drm/i915/intel_display.c | 14 ++++++++++++--
 drivers/gpu/drm/i915/intel_dp.c      |  1 +
 drivers/gpu/drm/i915/intel_drv.h     |  8 ++++++++
 drivers/gpu/drm/i915/intel_dsi.c     |  1 +
 drivers/gpu/drm/i915/intel_dvo.c     |  1 +
 drivers/gpu/drm/i915/intel_hdmi.c    |  1 +
 drivers/gpu/drm/i915/intel_lvds.c    |  1 +
 drivers/gpu/drm/i915/intel_sdvo.c    |  1 +
 drivers/gpu/drm/i915/intel_tv.c      |  1 +
 11 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index a58cbb9..9dc8558 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2550,6 +2550,7 @@ extern void intel_modeset_suspend_hw(struct drm_device *dev);
 extern void intel_modeset_init(struct drm_device *dev);
 extern void intel_modeset_gem_init(struct drm_device *dev);
 extern void intel_modeset_cleanup(struct drm_device *dev);
+extern void intel_connector_unregister(struct intel_connector *);
 extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state);
 extern void intel_modeset_setup_hw_state(struct drm_device *dev,
 					 bool force_restore);
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 5b444a4..9864aa1 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -833,6 +833,7 @@ void intel_crt_init(struct drm_device *dev)
 		crt->base.get_hw_state = intel_crt_get_hw_state;
 	}
 	intel_connector->get_hw_state = intel_connector_get_hw_state;
+	intel_connector->unregister = intel_connector_unregister;
 
 	drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
 
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 0c25310..2c79cdd 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -11435,6 +11435,14 @@ void intel_modeset_gem_init(struct drm_device *dev)
 	mutex_unlock(&dev->mode_config.mutex);
 }
 
+void intel_connector_unregister(struct intel_connector *intel_connector)
+{
+	struct drm_connector *connector = &intel_connector->base;
+
+	intel_panel_destroy_backlight(connector);
+	drm_sysfs_connector_remove(connector);
+}
+
 void intel_modeset_cleanup(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
@@ -11479,8 +11487,10 @@ void intel_modeset_cleanup(struct drm_device *dev)
 
 	/* destroy the backlight and sysfs files before encoders/connectors */
 	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-		intel_panel_destroy_backlight(connector);
-		drm_sysfs_connector_remove(connector);
+		struct intel_connector *intel_connector;
+
+		intel_connector = to_intel_connector(connector);
+		intel_connector->unregister(intel_connector);
 	}
 
 	drm_mode_config_cleanup(dev);
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 5477a72..5543ed0 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -3803,6 +3803,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
 		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
 	else
 		intel_connector->get_hw_state = intel_connector_get_hw_state;
+	intel_connector->unregister = intel_connector_unregister;
 
 	intel_dp->aux_ch_ctl_reg = intel_dp->output_reg + 0x10;
 	if (HAS_DDI(dev)) {
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index aff9171..8eacc71 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -187,6 +187,14 @@ struct intel_connector {
 	 * and active (i.e. dpms ON state). */
 	bool (*get_hw_state)(struct intel_connector *);
 
+	/*
+	 * Removes all interfaces through which the connector is accessible
+	 * - like sysfs, debugfs entries -, so that no new operations can be
+	 * started on the connector. Also makes sure all currently pending
+	 * operations finish before returing.
+	 */
+	void (*unregister)(struct intel_connector *);
+
 	/* Panel info for eDP and LVDS */
 	struct intel_panel panel;
 
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index fabbf0d..ad05683 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -586,6 +586,7 @@ bool intel_dsi_init(struct drm_device *dev)
 	intel_encoder->get_config = intel_dsi_get_config;
 
 	intel_connector->get_hw_state = intel_connector_get_hw_state;
+	intel_connector->unregister = intel_connector_unregister;
 
 	for (i = 0; i < ARRAY_SIZE(intel_dsi_devices); i++) {
 		dsi = &intel_dsi_devices[i];
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index eeff998..86eeb8b 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -477,6 +477,7 @@ void intel_dvo_init(struct drm_device *dev)
 	intel_encoder->compute_config = intel_dvo_compute_config;
 	intel_encoder->mode_set = intel_dvo_mode_set;
 	intel_connector->get_hw_state = intel_dvo_connector_get_hw_state;
+	intel_connector->unregister = intel_connector_unregister;
 
 	/* Now, try to find a controller */
 	for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) {
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 43872f0..517da15 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1263,6 +1263,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
 		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
 	else
 		intel_connector->get_hw_state = intel_connector_get_hw_state;
+	intel_connector->unregister = intel_connector_unregister;
 
 	intel_hdmi_add_properties(intel_hdmi, connector);
 
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 3f3043b..e4dcccd 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -957,6 +957,7 @@ void intel_lvds_init(struct drm_device *dev)
 	intel_encoder->get_hw_state = intel_lvds_get_hw_state;
 	intel_encoder->get_config = intel_lvds_get_config;
 	intel_connector->get_hw_state = intel_connector_get_hw_state;
+	intel_connector->unregister = intel_connector_unregister;
 
 	intel_connector_attach_encoder(intel_connector, intel_encoder);
 	intel_encoder->type = INTEL_OUTPUT_LVDS;
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 95bdfb3..cbc2fee 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -2397,6 +2397,7 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
 	connector->base.base.doublescan_allowed = 0;
 	connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB;
 	connector->base.get_hw_state = intel_sdvo_connector_get_hw_state;
+	connector->base.unregister = intel_connector_unregister;
 
 	intel_connector_attach_encoder(&connector->base, &encoder->base);
 	drm_sysfs_connector_add(&connector->base.base);
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index ccd02ec..b64fc1c 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -1634,6 +1634,7 @@ intel_tv_init(struct drm_device *dev)
 	intel_encoder->disable = intel_disable_tv;
 	intel_encoder->get_hw_state = intel_tv_get_hw_state;
 	intel_connector->get_hw_state = intel_connector_get_hw_state;
+	intel_connector->unregister = intel_connector_unregister;
 
 	intel_connector_attach_encoder(intel_connector, intel_encoder);
 	intel_encoder->type = INTEL_OUTPUT_TVOUT;
-- 
1.8.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/4] drm/i915: dp: fix order of dp aux i2c device cleanup
  2014-02-11 15:12 [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Imre Deak
  2014-02-11 15:12 ` [PATCH v2 1/4] drm/i915: add unregister callback to connector Imre Deak
@ 2014-02-11 15:12 ` Imre Deak
  2014-02-11 15:12 ` [PATCH v2 3/4] drm/i915: sdvo: fix error path in sdvo_connector_init Imre Deak
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Imre Deak @ 2014-02-11 15:12 UTC (permalink / raw)
  To: intel-gfx

Atm we set the parent of the dp i2c device to be the correspondig
connector device. During driver cleanup we first remove the connector
device through intel_modeset_cleanup()->drm_sysfs_connector_remove() and
only after that the i2c device through the encoder's destroy callback.
This order is not supported by the device core and we'll get a warning,
see the below bugzilla ticket. The proper order is to remove first any
child device and only then the parent device.

The first part of the fix changes the i2c device's parent to be the drm
device. Its logical owner is not the connector anyway, but the encoder.
Since the encoder doesn't have a device object, the next best choice is
the drm device. This is the same what we do in the case of the sdvo i2c
device and what the nouveau driver does.

The second part creates a symlink in the connector's sysfs directory
pointing to the i2c device. This is so, that we keep the current ABI,
which also makes sense in case someone wants to look up the i2c device
belonging to a specific connector.

Reference: http://lists.freedesktop.org/archives/intel-gfx/2014-January/038782.html
Reference: http://lists.freedesktop.org/archives/intel-gfx/2014-February/039427.html
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=70523
Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 5543ed0..ec5fd65 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -777,6 +777,16 @@ out:
 	return ret;
 }
 
+static void
+intel_dp_connector_unregister(struct intel_connector *intel_connector)
+{
+	struct intel_dp *intel_dp = intel_attached_dp(&intel_connector->base);
+
+	sysfs_remove_link(&intel_connector->base.kdev->kobj,
+			  intel_dp->adapter.dev.kobj.name);
+	intel_connector_unregister(intel_connector);
+}
+
 static int
 intel_dp_i2c_init(struct intel_dp *intel_dp,
 		  struct intel_connector *intel_connector, const char *name)
@@ -794,9 +804,19 @@ intel_dp_i2c_init(struct intel_dp *intel_dp,
 	strncpy(intel_dp->adapter.name, name, sizeof(intel_dp->adapter.name) - 1);
 	intel_dp->adapter.name[sizeof(intel_dp->adapter.name) - 1] = '\0';
 	intel_dp->adapter.algo_data = &intel_dp->algo;
-	intel_dp->adapter.dev.parent = intel_connector->base.kdev;
+	intel_dp->adapter.dev.parent = intel_connector->base.dev->dev;
 
 	ret = i2c_dp_aux_add_bus(&intel_dp->adapter);
+	if (ret < 0)
+		return ret;
+
+	ret = sysfs_create_link(&intel_connector->base.kdev->kobj,
+				&intel_dp->adapter.dev.kobj,
+				intel_dp->adapter.dev.kobj.name);
+
+	if (ret < 0)
+		i2c_del_adapter(&intel_dp->adapter);
+
 	return ret;
 }
 
@@ -3803,7 +3823,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
 		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
 	else
 		intel_connector->get_hw_state = intel_connector_get_hw_state;
-	intel_connector->unregister = intel_connector_unregister;
+	intel_connector->unregister = intel_dp_connector_unregister;
 
 	intel_dp->aux_ch_ctl_reg = intel_dp->output_reg + 0x10;
 	if (HAS_DDI(dev)) {
-- 
1.8.4

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 3/4] drm/i915: sdvo: fix error path in sdvo_connector_init
  2014-02-11 15:12 [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Imre Deak
  2014-02-11 15:12 ` [PATCH v2 1/4] drm/i915: add unregister callback to connector Imre Deak
  2014-02-11 15:12 ` [PATCH v2 2/4] drm/i915: dp: fix order of dp aux i2c device cleanup Imre Deak
@ 2014-02-11 15:12 ` Imre Deak
  2014-02-11 15:12 ` [PATCH v2 4/4] drm/i915: sdvo: add i2c sysfs symlink to the connector's directory Imre Deak
  2014-02-13 14:11 ` [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Antti Koskipää
  4 siblings, 0 replies; 7+ messages in thread
From: Imre Deak @ 2014-02-11 15:12 UTC (permalink / raw)
  To: intel-gfx

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/intel_sdvo.c | 49 +++++++++++++++++++++++++++++++--------
 1 file changed, 39 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index cbc2fee..08af4a1 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -2381,16 +2381,22 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, struct intel_sdvo *sdvo)
 		return 0x72;
 }
 
-static void
+static int
 intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
 			  struct intel_sdvo *encoder)
 {
-	drm_connector_init(encoder->base.base.dev,
-			   &connector->base.base,
+	struct drm_connector *drm_connector;
+	int ret;
+
+	drm_connector = &connector->base.base;
+	ret = drm_connector_init(encoder->base.base.dev,
+			   drm_connector,
 			   &intel_sdvo_connector_funcs,
 			   connector->base.base.connector_type);
+	if (ret < 0)
+		return ret;
 
-	drm_connector_helper_add(&connector->base.base,
+	drm_connector_helper_add(drm_connector,
 				 &intel_sdvo_connector_helper_funcs);
 
 	connector->base.base.interlace_allowed = 1;
@@ -2400,7 +2406,16 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
 	connector->base.unregister = intel_connector_unregister;
 
 	intel_connector_attach_encoder(&connector->base, &encoder->base);
-	drm_sysfs_connector_add(&connector->base.base);
+	ret = drm_sysfs_connector_add(drm_connector);
+	if (ret < 0)
+		goto err1;
+
+	return 0;
+
+err1:
+	drm_connector_cleanup(drm_connector);
+
+	return ret;
 }
 
 static void
@@ -2460,7 +2475,11 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
 		intel_sdvo->is_hdmi = true;
 	}
 
-	intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
+	if (intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo) < 0) {
+		kfree(intel_sdvo_connector);
+		return false;
+	}
+
 	if (intel_sdvo->is_hdmi)
 		intel_sdvo_add_hdmi_properties(intel_sdvo, intel_sdvo_connector);
 
@@ -2491,7 +2510,10 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
 
 	intel_sdvo->is_tv = true;
 
-	intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
+	if (intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo) < 0) {
+		kfree(intel_sdvo_connector);
+		return false;
+	}
 
 	if (!intel_sdvo_tv_create_property(intel_sdvo, intel_sdvo_connector, type))
 		goto err;
@@ -2535,8 +2557,11 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device)
 		intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB1;
 	}
 
-	intel_sdvo_connector_init(intel_sdvo_connector,
-				  intel_sdvo);
+	if (intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo) < 0) {
+		kfree(intel_sdvo_connector);
+		return false;
+	}
+
 	return true;
 }
 
@@ -2567,7 +2592,11 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
 		intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1;
 	}
 
-	intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
+	if (intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo) < 0) {
+		kfree(intel_sdvo_connector);
+		return false;
+	}
+
 	if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector))
 		goto err;
 
-- 
1.8.4

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 4/4] drm/i915: sdvo: add i2c sysfs symlink to the connector's directory
  2014-02-11 15:12 [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Imre Deak
                   ` (2 preceding siblings ...)
  2014-02-11 15:12 ` [PATCH v2 3/4] drm/i915: sdvo: fix error path in sdvo_connector_init Imre Deak
@ 2014-02-11 15:12 ` Imre Deak
  2014-02-13 14:11 ` [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Antti Koskipää
  4 siblings, 0 replies; 7+ messages in thread
From: Imre Deak @ 2014-02-11 15:12 UTC (permalink / raw)
  To: intel-gfx

This is the same what we do for DP connectors, so make things more
consistent.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/intel_sdvo.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 08af4a1..825853d 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -2381,6 +2381,20 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, struct intel_sdvo *sdvo)
 		return 0x72;
 }
 
+static void
+intel_sdvo_connector_unregister(struct intel_connector *intel_connector)
+{
+	struct drm_connector *drm_connector;
+	struct intel_sdvo *sdvo_encoder;
+
+	drm_connector = &intel_connector->base;
+	sdvo_encoder = intel_attached_sdvo(&intel_connector->base);
+
+	sysfs_remove_link(&drm_connector->kdev->kobj,
+			  sdvo_encoder->ddc.dev.kobj.name);
+	intel_connector_unregister(intel_connector);
+}
+
 static int
 intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
 			  struct intel_sdvo *encoder)
@@ -2403,15 +2417,23 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
 	connector->base.base.doublescan_allowed = 0;
 	connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB;
 	connector->base.get_hw_state = intel_sdvo_connector_get_hw_state;
-	connector->base.unregister = intel_connector_unregister;
+	connector->base.unregister = intel_sdvo_connector_unregister;
 
 	intel_connector_attach_encoder(&connector->base, &encoder->base);
 	ret = drm_sysfs_connector_add(drm_connector);
 	if (ret < 0)
 		goto err1;
 
+	ret = sysfs_create_link(&encoder->ddc.dev.kobj,
+				&drm_connector->kdev->kobj,
+				encoder->ddc.dev.kobj.name);
+	if (ret < 0)
+		goto err2;
+
 	return 0;
 
+err2:
+	drm_sysfs_connector_remove(drm_connector);
 err1:
 	drm_connector_cleanup(drm_connector);
 
-- 
1.8.4

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup
  2014-02-11 15:12 [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Imre Deak
                   ` (3 preceding siblings ...)
  2014-02-11 15:12 ` [PATCH v2 4/4] drm/i915: sdvo: add i2c sysfs symlink to the connector's directory Imre Deak
@ 2014-02-13 14:11 ` Antti Koskipää
  2014-02-14 10:25   ` Daniel Vetter
  4 siblings, 1 reply; 7+ messages in thread
From: Antti Koskipää @ 2014-02-13 14:11 UTC (permalink / raw)
  To: intel-gfx

On 02/11/2014 05:12 PM, Imre Deak wrote:
> The main point of this patchset is to fix a driver unload bug caused by
> incorrect order of dp aux i2c cleanup wrt. destroying the corresponding
> encoder/connector objects, see the second patch for details.
> 
> Tested on vlv/dp.
> 
> v2: move all sysfs removal bits to the new connector->unregister
>     callback (Daniel)
> 
> Imre Deak (4):
>   drm/i915: add unregister callback to connector
>   drm/i915: dp: fix order of dp aux i2c device cleanup
>   drm/i915: sdvo: fix error path in sdvo_connector_init
>   drm/i915: sdvo: add i2c sysfs symlink to the connector's directory
> 
>  drivers/gpu/drm/i915/i915_drv.h      |  1 +
>  drivers/gpu/drm/i915/intel_crt.c     |  1 +
>  drivers/gpu/drm/i915/intel_display.c | 14 ++++++--
>  drivers/gpu/drm/i915/intel_dp.c      | 23 +++++++++++-
>  drivers/gpu/drm/i915/intel_drv.h     |  8 +++++
>  drivers/gpu/drm/i915/intel_dsi.c     |  1 +
>  drivers/gpu/drm/i915/intel_dvo.c     |  1 +
>  drivers/gpu/drm/i915/intel_hdmi.c    |  1 +
>  drivers/gpu/drm/i915/intel_lvds.c    |  1 +
>  drivers/gpu/drm/i915/intel_sdvo.c    | 70 +++++++++++++++++++++++++++++++-----
>  drivers/gpu/drm/i915/intel_tv.c      |  1 +
>  11 files changed, 110 insertions(+), 12 deletions(-)
>
> Signed-off-by: Imre Deak <imre.deak@intel.com>

Reviewed-by: Antti Koskipää <antti.koskipaa@linux.intel.com>

-- 
- Antti

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup
  2014-02-13 14:11 ` [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Antti Koskipää
@ 2014-02-14 10:25   ` Daniel Vetter
  0 siblings, 0 replies; 7+ messages in thread
From: Daniel Vetter @ 2014-02-14 10:25 UTC (permalink / raw)
  To: Antti Koskipää; +Cc: intel-gfx

On Thu, Feb 13, 2014 at 04:11:55PM +0200, Antti Koskipää wrote:
> On 02/11/2014 05:12 PM, Imre Deak wrote:
> > The main point of this patchset is to fix a driver unload bug caused by
> > incorrect order of dp aux i2c cleanup wrt. destroying the corresponding
> > encoder/connector objects, see the second patch for details.
> > 
> > Tested on vlv/dp.
> > 
> > v2: move all sysfs removal bits to the new connector->unregister
> >     callback (Daniel)
> > 
> > Imre Deak (4):
> >   drm/i915: add unregister callback to connector
> >   drm/i915: dp: fix order of dp aux i2c device cleanup
> >   drm/i915: sdvo: fix error path in sdvo_connector_init
> >   drm/i915: sdvo: add i2c sysfs symlink to the connector's directory
> > 
> >  drivers/gpu/drm/i915/i915_drv.h      |  1 +
> >  drivers/gpu/drm/i915/intel_crt.c     |  1 +
> >  drivers/gpu/drm/i915/intel_display.c | 14 ++++++--
> >  drivers/gpu/drm/i915/intel_dp.c      | 23 +++++++++++-
> >  drivers/gpu/drm/i915/intel_drv.h     |  8 +++++
> >  drivers/gpu/drm/i915/intel_dsi.c     |  1 +
> >  drivers/gpu/drm/i915/intel_dvo.c     |  1 +
> >  drivers/gpu/drm/i915/intel_hdmi.c    |  1 +
> >  drivers/gpu/drm/i915/intel_lvds.c    |  1 +
> >  drivers/gpu/drm/i915/intel_sdvo.c    | 70 +++++++++++++++++++++++++++++++-----
> >  drivers/gpu/drm/i915/intel_tv.c      |  1 +
> >  11 files changed, 110 insertions(+), 12 deletions(-)
> >
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> 
> Reviewed-by: Antti Koskipää <antti.koskipaa@linux.intel.com>

All pulled in, thanks for patches and review.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-02-14 10:25 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-11 15:12 [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Imre Deak
2014-02-11 15:12 ` [PATCH v2 1/4] drm/i915: add unregister callback to connector Imre Deak
2014-02-11 15:12 ` [PATCH v2 2/4] drm/i915: dp: fix order of dp aux i2c device cleanup Imre Deak
2014-02-11 15:12 ` [PATCH v2 3/4] drm/i915: sdvo: fix error path in sdvo_connector_init Imre Deak
2014-02-11 15:12 ` [PATCH v2 4/4] drm/i915: sdvo: add i2c sysfs symlink to the connector's directory Imre Deak
2014-02-13 14:11 ` [PATCH v2 0/4] drm/i915: dp: fix order of dp aux i2c device cleanup Antti Koskipää
2014-02-14 10:25   ` Daniel Vetter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.