* [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.