All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] connector debugfs properties
@ 2014-05-29 15:57 Thomas Wood
  2014-05-29 15:57 ` [PATCH 1/3] drm: add register and unregister functions for connectors Thomas Wood
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Thomas Wood @ 2014-05-29 15:57 UTC (permalink / raw)
  To: dri-devel; +Cc: intel-gfx

The following series adds support for exposing various connector features using
debugfs. The first patch refactors the sysfs connector add and remove functions
into generic functions to register and unregister connectors. The remaining
patches add an interface for each connector to debugfs and expose the force
connector attribute and allow the edid value to be overridden.

Thomas Wood (3):
  drm: add register and unregister functions for connectors
  drm/debugfs: add a "force" file per connector
  drm/debugfs: add an "edid_override" file per connector

 Documentation/DocBook/drm.tmpl                |   6 +-
 drivers/gpu/drm/armada/armada_output.c        |   4 +-
 drivers/gpu/drm/ast/ast_mode.c                |   4 +-
 drivers/gpu/drm/bridge/ptn3460.c              |   2 +-
 drivers/gpu/drm/drm_crtc.c                    |  49 +++++++-
 drivers/gpu/drm/drm_debugfs.c                 | 157 ++++++++++++++++++++++++++
 drivers/gpu/drm/drm_probe_helper.c            |   9 +-
 drivers/gpu/drm/drm_sysfs.c                   |   2 -
 drivers/gpu/drm/exynos/exynos_dp_core.c       |   2 +-
 drivers/gpu/drm/exynos/exynos_drm_connector.c |   6 +-
 drivers/gpu/drm/exynos/exynos_drm_dpi.c       |   4 +-
 drivers/gpu/drm/exynos/exynos_drm_dsi.c       |   2 +-
 drivers/gpu/drm/exynos/exynos_drm_vidi.c      |   2 +-
 drivers/gpu/drm/exynos/exynos_hdmi.c          |   2 +-
 drivers/gpu/drm/gma500/cdv_intel_crt.c        |   4 +-
 drivers/gpu/drm/gma500/cdv_intel_dp.c         |   4 +-
 drivers/gpu/drm/gma500/cdv_intel_hdmi.c       |   4 +-
 drivers/gpu/drm/gma500/cdv_intel_lvds.c       |   4 +-
 drivers/gpu/drm/gma500/mdfld_dsi_output.c     |   4 +-
 drivers/gpu/drm/gma500/oaktrail_hdmi.c        |   2 +-
 drivers/gpu/drm/gma500/oaktrail_lvds.c        |   2 +-
 drivers/gpu/drm/gma500/psb_intel_lvds.c       |   4 +-
 drivers/gpu/drm/gma500/psb_intel_sdvo.c       |   4 +-
 drivers/gpu/drm/i915/intel_crt.c              |   2 +-
 drivers/gpu/drm/i915/intel_display.c          |   2 +-
 drivers/gpu/drm/i915/intel_dp.c               |   4 +-
 drivers/gpu/drm/i915/intel_dsi.c              |   2 +-
 drivers/gpu/drm/i915/intel_dvo.c              |   2 +-
 drivers/gpu/drm/i915/intel_hdmi.c             |   2 +-
 drivers/gpu/drm/i915/intel_lvds.c             |   2 +-
 drivers/gpu/drm/i915/intel_sdvo.c             |  10 +-
 drivers/gpu/drm/i915/intel_tv.c               |   2 +-
 drivers/gpu/drm/mgag200/mgag200_mode.c        |   2 +-
 drivers/gpu/drm/msm/hdmi/hdmi_connector.c     |   4 +-
 drivers/gpu/drm/nouveau/nouveau_connector.c   |   4 +-
 drivers/gpu/drm/omapdrm/omap_connector.c      |   4 +-
 drivers/gpu/drm/qxl/qxl_display.c             |   4 +-
 drivers/gpu/drm/radeon/radeon_connectors.c    |   6 +-
 drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c     |   4 +-
 drivers/gpu/drm/rcar-du/rcar_du_vgacon.c      |   4 +-
 drivers/gpu/drm/shmobile/shmob_drm_crtc.c     |   6 +-
 drivers/gpu/drm/tegra/output.c                |   4 +-
 drivers/gpu/drm/tilcdc/tilcdc_panel.c         |   2 +-
 drivers/gpu/drm/tilcdc/tilcdc_slave.c         |   2 +-
 drivers/gpu/drm/tilcdc/tilcdc_tfp410.c        |   2 +-
 drivers/gpu/drm/udl/udl_connector.c           |   4 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c           |   2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c           |   2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c          |   2 +-
 drivers/staging/imx-drm/imx-drm-core.c        |   6 +-
 include/drm/drmP.h                            |  11 ++
 include/drm/drm_crtc.h                        |   5 +
 52 files changed, 308 insertions(+), 83 deletions(-)

-- 
1.9.0

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

* [PATCH 1/3] drm: add register and unregister functions for connectors
  2014-05-29 15:57 [PATCH 0/3] connector debugfs properties Thomas Wood
@ 2014-05-29 15:57 ` Thomas Wood
  2014-06-10 16:21   ` David Herrmann
  2014-05-29 15:57 ` [PATCH 2/3] drm/debugfs: add a "force" file per connector Thomas Wood
  2014-05-29 15:57 ` [PATCH 3/3] " Thomas Wood
  2 siblings, 1 reply; 14+ messages in thread
From: Thomas Wood @ 2014-05-29 15:57 UTC (permalink / raw)
  To: dri-devel; +Cc: intel-gfx

Introduce generic functions to register and unregister connectors. This
provides a common place to add and remove associated user space
interfaces.

Signed-off-by: Thomas Wood <thomas.wood@intel.com>
---
 Documentation/DocBook/drm.tmpl                |  6 +++---
 drivers/gpu/drm/armada/armada_output.c        |  4 ++--
 drivers/gpu/drm/ast/ast_mode.c                |  4 ++--
 drivers/gpu/drm/bridge/ptn3460.c              |  2 +-
 drivers/gpu/drm/drm_crtc.c                    | 30 ++++++++++++++++++++++++++-
 drivers/gpu/drm/drm_sysfs.c                   |  2 --
 drivers/gpu/drm/exynos/exynos_dp_core.c       |  2 +-
 drivers/gpu/drm/exynos/exynos_drm_connector.c |  6 +++---
 drivers/gpu/drm/exynos/exynos_drm_dpi.c       |  4 ++--
 drivers/gpu/drm/exynos/exynos_drm_dsi.c       |  2 +-
 drivers/gpu/drm/exynos/exynos_drm_vidi.c      |  2 +-
 drivers/gpu/drm/exynos/exynos_hdmi.c          |  2 +-
 drivers/gpu/drm/gma500/cdv_intel_crt.c        |  4 ++--
 drivers/gpu/drm/gma500/cdv_intel_dp.c         |  4 ++--
 drivers/gpu/drm/gma500/cdv_intel_hdmi.c       |  4 ++--
 drivers/gpu/drm/gma500/cdv_intel_lvds.c       |  4 ++--
 drivers/gpu/drm/gma500/mdfld_dsi_output.c     |  4 ++--
 drivers/gpu/drm/gma500/oaktrail_hdmi.c        |  2 +-
 drivers/gpu/drm/gma500/oaktrail_lvds.c        |  2 +-
 drivers/gpu/drm/gma500/psb_intel_lvds.c       |  4 ++--
 drivers/gpu/drm/gma500/psb_intel_sdvo.c       |  4 ++--
 drivers/gpu/drm/i915/intel_crt.c              |  2 +-
 drivers/gpu/drm/i915/intel_display.c          |  2 +-
 drivers/gpu/drm/i915/intel_dp.c               |  4 ++--
 drivers/gpu/drm/i915/intel_dsi.c              |  2 +-
 drivers/gpu/drm/i915/intel_dvo.c              |  2 +-
 drivers/gpu/drm/i915/intel_hdmi.c             |  2 +-
 drivers/gpu/drm/i915/intel_lvds.c             |  2 +-
 drivers/gpu/drm/i915/intel_sdvo.c             | 10 ++++-----
 drivers/gpu/drm/i915/intel_tv.c               |  2 +-
 drivers/gpu/drm/mgag200/mgag200_mode.c        |  2 +-
 drivers/gpu/drm/msm/hdmi/hdmi_connector.c     |  4 ++--
 drivers/gpu/drm/nouveau/nouveau_connector.c   |  4 ++--
 drivers/gpu/drm/omapdrm/omap_connector.c      |  4 ++--
 drivers/gpu/drm/qxl/qxl_display.c             |  4 ++--
 drivers/gpu/drm/radeon/radeon_connectors.c    |  6 +++---
 drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c     |  4 ++--
 drivers/gpu/drm/rcar-du/rcar_du_vgacon.c      |  4 ++--
 drivers/gpu/drm/shmobile/shmob_drm_crtc.c     |  6 +++---
 drivers/gpu/drm/tegra/output.c                |  4 ++--
 drivers/gpu/drm/tilcdc/tilcdc_panel.c         |  2 +-
 drivers/gpu/drm/tilcdc/tilcdc_slave.c         |  2 +-
 drivers/gpu/drm/tilcdc/tilcdc_tfp410.c        |  2 +-
 drivers/gpu/drm/udl/udl_connector.c           |  4 ++--
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c           |  2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c           |  2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c          |  2 +-
 drivers/staging/imx-drm/imx-drm-core.c        |  6 +++---
 include/drm/drm_crtc.h                        |  2 ++
 49 files changed, 110 insertions(+), 82 deletions(-)

diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
index 00f1c25..0f96b25 100644
--- a/Documentation/DocBook/drm.tmpl
+++ b/Documentation/DocBook/drm.tmpl
@@ -1574,7 +1574,7 @@ int max_width, max_height;</synopsis>
           The connector is then registered with a call to
           <function>drm_connector_init</function> with a pointer to the connector
           functions and a connector type, and exposed through sysfs with a call to
-          <function>drm_sysfs_connector_add</function>.
+          <function>drm_connector_register</function>.
         </para>
         <para>
           Supported connector types are
@@ -1732,7 +1732,7 @@ int max_width, max_height;</synopsis>
 	(<function>drm_encoder_cleanup</function>) and connectors
 	(<function>drm_connector_cleanup</function>). Furthermore, connectors
 	that have been added to sysfs must be removed by a call to
-	<function>drm_sysfs_connector_remove</function> before calling
+	<function>drm_connector_unregister</function> before calling
 	<function>drm_connector_cleanup</function>.
       </para>
       <para>
@@ -1777,7 +1777,7 @@ void intel_crt_init(struct drm_device *dev)
 	drm_encoder_helper_add(&intel_output->enc, &intel_crt_helper_funcs);
 	drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 }]]></programlisting>
       <para>
         In the example above (taken from the i915 driver), a CRTC, connector and
diff --git a/drivers/gpu/drm/armada/armada_output.c b/drivers/gpu/drm/armada/armada_output.c
index d685a54..abbc309 100644
--- a/drivers/gpu/drm/armada/armada_output.c
+++ b/drivers/gpu/drm/armada/armada_output.c
@@ -48,7 +48,7 @@ static void armada_drm_connector_destroy(struct drm_connector *conn)
 {
 	struct armada_connector *dconn = drm_to_armada_conn(conn);
 
-	drm_sysfs_connector_remove(conn);
+	drm_connector_unregister(conn);
 	drm_connector_cleanup(conn);
 	kfree(dconn);
 }
@@ -141,7 +141,7 @@ int armada_output_create(struct drm_device *dev,
 	if (ret)
 		goto err_conn;
 
-	ret = drm_sysfs_connector_add(&dconn->conn);
+	ret = drm_connector_register(&dconn->conn);
 	if (ret)
 		goto err_sysfs;
 
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index 114aee9..9896286 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -829,7 +829,7 @@ static void ast_connector_destroy(struct drm_connector *connector)
 {
 	struct ast_connector *ast_connector = to_ast_connector(connector);
 	ast_i2c_destroy(ast_connector->i2c);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -871,7 +871,7 @@ static int ast_connector_init(struct drm_device *dev)
 	connector->interlace_allowed = 0;
 	connector->doublescan_allowed = 0;
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	connector->polled = DRM_CONNECTOR_POLL_CONNECT;
 
diff --git a/drivers/gpu/drm/bridge/ptn3460.c b/drivers/gpu/drm/bridge/ptn3460.c
index 98fd17a..d466696 100644
--- a/drivers/gpu/drm/bridge/ptn3460.c
+++ b/drivers/gpu/drm/bridge/ptn3460.c
@@ -328,7 +328,7 @@ int ptn3460_init(struct drm_device *dev, struct drm_encoder *encoder,
 	}
 	drm_connector_helper_add(&ptn_bridge->connector,
 			&ptn3460_connector_helper_funcs);
-	drm_sysfs_connector_add(&ptn_bridge->connector);
+	drm_connector_register(&ptn_bridge->connector);
 	drm_mode_connector_attach_encoder(&ptn_bridge->connector, encoder);
 
 	return 0;
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 37a3e07..998663c 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -881,6 +881,34 @@ void drm_connector_cleanup(struct drm_connector *connector)
 EXPORT_SYMBOL(drm_connector_cleanup);
 
 /**
+ * drm_connector_register - register a connector
+ * @connector: the connector to register
+ *
+ * Register userspace interfaces for a connector
+ *
+ * Returns:
+ * Zero on success, error code on failure.
+ */
+int drm_connector_register(struct drm_connector *connector)
+{
+	return drm_sysfs_connector_add(connector);
+}
+EXPORT_SYMBOL(drm_connector_register);
+
+/**
+ * drm_connector_unregister - unregister a connector
+ * @connector: the connector to unregister
+ *
+ * Unregister userspace interfaces for a connector
+ */
+void drm_connector_unregister(struct drm_connector *connector)
+{
+	drm_sysfs_connector_remove(connector);
+}
+EXPORT_SYMBOL(drm_connector_unregister);
+
+
+/**
  * drm_connector_unplug_all - unregister connector userspace interfaces
  * @dev: drm device
  *
@@ -894,7 +922,7 @@ void drm_connector_unplug_all(struct drm_device *dev)
 
 	/* taking the mode config mutex ends up in a clash with sysfs */
 	list_for_each_entry(connector, &dev->mode_config.connector_list, head)
-		drm_sysfs_connector_remove(connector);
+		drm_connector_unregister(connector);
 
 }
 EXPORT_SYMBOL(drm_connector_unplug_all);
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index c22c309..5fb194f 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -438,7 +438,6 @@ err_out_files:
 out:
 	return ret;
 }
-EXPORT_SYMBOL(drm_sysfs_connector_add);
 
 /**
  * drm_sysfs_connector_remove - remove an connector device from sysfs
@@ -468,7 +467,6 @@ void drm_sysfs_connector_remove(struct drm_connector *connector)
 	device_unregister(connector->kdev);
 	connector->kdev = NULL;
 }
-EXPORT_SYMBOL(drm_sysfs_connector_remove);
 
 /**
  * drm_sysfs_hotplug_event - generate a DRM uevent
diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c
index bb74472..a643fba 100644
--- a/drivers/gpu/drm/exynos/exynos_dp_core.c
+++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
@@ -1025,7 +1025,7 @@ static int exynos_dp_create_connector(struct exynos_drm_display *display,
 	}
 
 	drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	drm_mode_connector_attach_encoder(connector, encoder);
 
 	return 0;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c
index 9a16dbe..25c7888 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_connector.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c
@@ -185,7 +185,7 @@ static void exynos_drm_connector_destroy(struct drm_connector *connector)
 	struct exynos_drm_connector *exynos_connector =
 		to_exynos_connector(connector);
 
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(exynos_connector);
 }
@@ -230,7 +230,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
 	drm_connector_init(dev, connector, &exynos_connector_funcs, type);
 	drm_connector_helper_add(connector, &exynos_connector_helper_funcs);
 
-	err = drm_sysfs_connector_add(connector);
+	err = drm_connector_register(connector);
 	if (err)
 		goto err_connector;
 
@@ -250,7 +250,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
 	return connector;
 
 err_sysfs:
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 err_connector:
 	drm_connector_cleanup(connector);
 	kfree(exynos_connector);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dpi.c b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
index 82e52c7..6d71591 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dpi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
@@ -58,7 +58,7 @@ exynos_dpi_detect(struct drm_connector *connector, bool force)
 
 static void exynos_dpi_connector_destroy(struct drm_connector *connector)
 {
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 }
 
@@ -130,7 +130,7 @@ static int exynos_dpi_create_connector(struct exynos_drm_display *display,
 	}
 
 	drm_connector_helper_add(connector, &exynos_dpi_connector_helper_funcs);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	drm_mode_connector_attach_encoder(connector, encoder);
 
 	return 0;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index 4ac4381..d6358d1 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -1245,7 +1245,7 @@ static int exynos_dsi_create_connector(struct exynos_drm_display *display,
 	}
 
 	drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	drm_mode_connector_attach_encoder(connector, encoder);
 
 	return 0;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index 3fa987d..c4693c1 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -563,7 +563,7 @@ static int vidi_create_connector(struct exynos_drm_display *display,
 	}
 
 	drm_connector_helper_add(connector, &vidi_connector_helper_funcs);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	drm_mode_connector_attach_encoder(connector, encoder);
 
 	return 0;
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 9a6d652..5bcbd83 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -922,7 +922,7 @@ static int hdmi_create_connector(struct exynos_drm_display *display,
 	}
 
 	drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	drm_mode_connector_attach_encoder(connector, encoder);
 
 	return 0;
diff --git a/drivers/gpu/drm/gma500/cdv_intel_crt.c b/drivers/gpu/drm/gma500/cdv_intel_crt.c
index c18268c..248c33a 100644
--- a/drivers/gpu/drm/gma500/cdv_intel_crt.c
+++ b/drivers/gpu/drm/gma500/cdv_intel_crt.c
@@ -192,7 +192,7 @@ static void cdv_intel_crt_destroy(struct drm_connector *connector)
 	struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
 
 	psb_intel_i2c_destroy(gma_encoder->ddc_bus);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -304,7 +304,7 @@ void cdv_intel_crt_init(struct drm_device *dev,
 	drm_connector_helper_add(connector,
 					&cdv_intel_crt_connector_helper_funcs);
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	return;
 failed_ddc:
diff --git a/drivers/gpu/drm/gma500/cdv_intel_dp.c b/drivers/gpu/drm/gma500/cdv_intel_dp.c
index 9ff30c2..a4cc0e6 100644
--- a/drivers/gpu/drm/gma500/cdv_intel_dp.c
+++ b/drivers/gpu/drm/gma500/cdv_intel_dp.c
@@ -1713,7 +1713,7 @@ cdv_intel_dp_destroy(struct drm_connector *connector)
 		}
 	}
 	i2c_del_adapter(&intel_dp->adapter);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -1847,7 +1847,7 @@ cdv_intel_dp_init(struct drm_device *dev, struct psb_intel_mode_device *mode_dev
 	connector->interlace_allowed = false;
 	connector->doublescan_allowed = false;
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	/* Set up the DDC bus. */
 	switch (output_reg) {
diff --git a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
index b99084b..4268bf2 100644
--- a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
+++ b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
@@ -248,7 +248,7 @@ static void cdv_hdmi_destroy(struct drm_connector *connector)
 
 	if (gma_encoder->i2c_bus)
 		psb_intel_i2c_destroy(gma_encoder->i2c_bus);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -356,7 +356,7 @@ void cdv_hdmi_init(struct drm_device *dev,
 
 	hdmi_priv->hdmi_i2c_adapter = &(gma_encoder->i2c_bus->adapter);
 	hdmi_priv->dev = dev;
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	return;
 
 failed_ddc:
diff --git a/drivers/gpu/drm/gma500/cdv_intel_lvds.c b/drivers/gpu/drm/gma500/cdv_intel_lvds.c
index 8ecc920..0b77039 100644
--- a/drivers/gpu/drm/gma500/cdv_intel_lvds.c
+++ b/drivers/gpu/drm/gma500/cdv_intel_lvds.c
@@ -446,7 +446,7 @@ static void cdv_intel_lvds_destroy(struct drm_connector *connector)
 
 	if (gma_encoder->i2c_bus)
 		psb_intel_i2c_destroy(gma_encoder->i2c_bus);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -774,7 +774,7 @@ void cdv_intel_lvds_init(struct drm_device *dev,
 
 out:
 	mutex_unlock(&dev->mode_config.mutex);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	return;
 
 failed_find:
diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_output.c b/drivers/gpu/drm/gma500/mdfld_dsi_output.c
index 6e91b20..abf2248 100644
--- a/drivers/gpu/drm/gma500/mdfld_dsi_output.c
+++ b/drivers/gpu/drm/gma500/mdfld_dsi_output.c
@@ -318,7 +318,7 @@ static void mdfld_dsi_connector_destroy(struct drm_connector *connector)
 
 	if (!dsi_connector)
 		return;
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	sender = dsi_connector->pkg_sender;
 	mdfld_dsi_pkg_sender_destroy(sender);
@@ -597,7 +597,7 @@ void mdfld_dsi_output_init(struct drm_device *dev,
 	dsi_config->encoder = encoder;
 	encoder->base.type = (pipe == 0) ? INTEL_OUTPUT_MIPI :
 		INTEL_OUTPUT_MIPI2;
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	return;
 
 	/*TODO: add code to destroy outputs on error*/
diff --git a/drivers/gpu/drm/gma500/oaktrail_hdmi.c b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
index cf018dd..e6f5c62 100644
--- a/drivers/gpu/drm/gma500/oaktrail_hdmi.c
+++ b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
@@ -665,7 +665,7 @@ void oaktrail_hdmi_init(struct drm_device *dev,
 	connector->display_info.subpixel_order = SubPixelHorizontalRGB;
 	connector->interlace_allowed = false;
 	connector->doublescan_allowed = false;
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	dev_info(dev->dev, "HDMI initialised.\n");
 
 	return;
diff --git a/drivers/gpu/drm/gma500/oaktrail_lvds.c b/drivers/gpu/drm/gma500/oaktrail_lvds.c
index 9b09946..0d39da6 100644
--- a/drivers/gpu/drm/gma500/oaktrail_lvds.c
+++ b/drivers/gpu/drm/gma500/oaktrail_lvds.c
@@ -404,7 +404,7 @@ void oaktrail_lvds_init(struct drm_device *dev,
 out:
 	mutex_unlock(&dev->mode_config.mutex);
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	return;
 
 failed_find:
diff --git a/drivers/gpu/drm/gma500/psb_intel_lvds.c b/drivers/gpu/drm/gma500/psb_intel_lvds.c
index d7778d0..88aad95 100644
--- a/drivers/gpu/drm/gma500/psb_intel_lvds.c
+++ b/drivers/gpu/drm/gma500/psb_intel_lvds.c
@@ -563,7 +563,7 @@ void psb_intel_lvds_destroy(struct drm_connector *connector)
 
 	if (lvds_priv->ddc_bus)
 		psb_intel_i2c_destroy(lvds_priv->ddc_bus);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -829,7 +829,7 @@ void psb_intel_lvds_init(struct drm_device *dev,
 	 */
 out:
 	mutex_unlock(&dev->mode_config.mutex);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	return;
 
 failed_find:
diff --git a/drivers/gpu/drm/gma500/psb_intel_sdvo.c b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
index deeb082..0be96fd 100644
--- a/drivers/gpu/drm/gma500/psb_intel_sdvo.c
+++ b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
@@ -1682,7 +1682,7 @@ static void psb_intel_sdvo_destroy(struct drm_connector *connector)
 				     psb_intel_sdvo_connector->tv_format);
 
 	psb_intel_sdvo_destroy_enhance_property(connector);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -2071,7 +2071,7 @@ psb_intel_sdvo_connector_init(struct psb_intel_sdvo_connector *connector,
 	connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB;
 
 	gma_connector_attach_encoder(&connector->base, &encoder->base);
-	drm_sysfs_connector_add(&connector->base.base);
+	drm_connector_register(&connector->base.base);
 }
 
 static void
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 22d8347..349f02a 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -868,7 +868,7 @@ void intel_crt_init(struct drm_device *dev)
 
 	drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	if (!I915_HAS_HOTPLUG(dev))
 		intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 731cd01..4746fb6 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12223,7 +12223,7 @@ 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);
+	drm_connector_unregister(connector);
 }
 
 void intel_modeset_cleanup(struct drm_device *dev)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 7d31769..f4a2736 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4309,7 +4309,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
 			  edp_panel_vdd_work);
 
 	intel_connector_attach_encoder(intel_connector, intel_encoder);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	if (HAS_DDI(dev))
 		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
@@ -4350,7 +4350,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
 			edp_panel_vdd_off_sync(intel_dp);
 			mutex_unlock(&dev->mode_config.mutex);
 		}
-		drm_sysfs_connector_remove(connector);
+		drm_connector_unregister(connector);
 		drm_connector_cleanup(connector);
 		return false;
 	}
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 9d789b3..7dcfe76 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -742,7 +742,7 @@ void intel_dsi_init(struct drm_device *dev)
 
 	intel_connector_attach_encoder(intel_connector, intel_encoder);
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	fixed_mode = dsi->dev_ops->get_modes(&intel_dsi->dev);
 	if (!fixed_mode) {
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index 1604235..8959c17 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -558,7 +558,7 @@ void intel_dvo_init(struct drm_device *dev)
 			intel_dvo->panel_wants_dither = true;
 		}
 
-		drm_sysfs_connector_add(connector);
+		drm_connector_register(connector);
 		return;
 	}
 
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 70a89cc..de33242 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1554,7 +1554,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
 	intel_hdmi_add_properties(intel_hdmi, connector);
 
 	intel_connector_attach_encoder(intel_connector, intel_encoder);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
 	 * 0xd.  Failure to do so will result in spurious interrupts being
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index d1539f3..e28cdd1 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -1097,7 +1097,7 @@ out:
 		DRM_DEBUG_KMS("lid notifier registration failed\n");
 		lvds_connector->lid_notifier.notifier_call = NULL;
 	}
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
 	intel_panel_setup_backlight(connector);
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index aa2c609..02031aa 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -2431,7 +2431,7 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
 	connector->base.unregister = intel_sdvo_connector_unregister;
 
 	intel_connector_attach_encoder(&connector->base, &encoder->base);
-	ret = drm_sysfs_connector_add(drm_connector);
+	ret = drm_connector_register(drm_connector);
 	if (ret < 0)
 		goto err1;
 
@@ -2444,7 +2444,7 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
 	return 0;
 
 err2:
-	drm_sysfs_connector_remove(drm_connector);
+	drm_connector_unregister(drm_connector);
 err1:
 	drm_connector_cleanup(drm_connector);
 
@@ -2557,7 +2557,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
 	return true;
 
 err:
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	intel_sdvo_destroy(connector);
 	return false;
 }
@@ -2636,7 +2636,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
 	return true;
 
 err:
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	intel_sdvo_destroy(connector);
 	return false;
 }
@@ -2709,7 +2709,7 @@ static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo)
 	list_for_each_entry_safe(connector, tmp,
 				 &dev->mode_config.connector_list, head) {
 		if (intel_attached_encoder(connector) == &intel_sdvo->base) {
-			drm_sysfs_connector_remove(connector);
+			drm_connector_unregister(connector);
 			intel_sdvo_destroy(connector);
 		}
 	}
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index e0193e8..2c970b3 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -1679,5 +1679,5 @@ intel_tv_init(struct drm_device *dev)
 	drm_object_attach_property(&connector->base,
 				   dev->mode_config.tv_bottom_margin_property,
 				   intel_tv->margin[TV_MARGIN_BOTTOM]);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 }
diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
index a034ed4..f9fe390 100644
--- a/drivers/gpu/drm/mgag200/mgag200_mode.c
+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
@@ -1621,7 +1621,7 @@ static struct drm_connector *mga_vga_init(struct drm_device *dev)
 
 	drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs);
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	mga_connector->i2c = mgag200_i2c_create(dev);
 	if (!mga_connector->i2c)
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_connector.c b/drivers/gpu/drm/msm/hdmi/hdmi_connector.c
index 7dedfdd..07af5c9 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi_connector.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi_connector.c
@@ -285,7 +285,7 @@ static void hdmi_connector_destroy(struct drm_connector *connector)
 
 	hdp_disable(hdmi_connector);
 
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 
 	hdmi_unreference(hdmi_connector->hdmi);
@@ -394,7 +394,7 @@ struct drm_connector *hdmi_connector_init(struct hdmi *hdmi)
 	connector->interlace_allowed = 1;
 	connector->doublescan_allowed = 0;
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	ret = hpd_enable(hdmi_connector);
 	if (ret) {
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index d07ce02..8ff798b 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -102,7 +102,7 @@ nouveau_connector_destroy(struct drm_connector *connector)
 	struct nouveau_connector *nv_connector = nouveau_connector(connector);
 	nouveau_event_ref(NULL, &nv_connector->hpd_func);
 	kfree(nv_connector->edid);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -1170,6 +1170,6 @@ nouveau_connector_create(struct drm_device *dev, int index)
 	if (nv_connector->hpd.func != DCB_GPIO_UNUSED)
 		connector->polled = DRM_CONNECTOR_POLL_HPD;
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	return connector;
 }
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 86f4ead..36bc5cc 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -130,7 +130,7 @@ static void omap_connector_destroy(struct drm_connector *connector)
 	struct omap_dss_device *dssdev = omap_connector->dssdev;
 
 	DBG("%s", omap_connector->dssdev->name);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(omap_connector);
 
@@ -307,7 +307,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
 	connector->interlace_allowed = 1;
 	connector->doublescan_allowed = 0;
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	return connector;
 
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
index 3ab9072..f09ffb4 100644
--- a/drivers/gpu/drm/qxl/qxl_display.c
+++ b/drivers/gpu/drm/qxl/qxl_display.c
@@ -831,7 +831,7 @@ static void qxl_conn_destroy(struct drm_connector *connector)
 	struct qxl_output *qxl_output =
 		drm_connector_to_qxl_output(connector);
 
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(qxl_output);
 }
@@ -898,7 +898,7 @@ static int qdev_output_init(struct drm_device *dev, int num_output)
 
 	drm_object_attach_property(&connector->base,
 				   qdev->hotplug_mode_update_property, 0);
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index ea50e0a..5d9c55b 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -676,7 +676,7 @@ static void radeon_connector_destroy(struct drm_connector *connector)
 	if (radeon_connector->edid)
 		kfree(radeon_connector->edid);
 	kfree(radeon_connector->con_priv);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -1976,7 +1976,7 @@ radeon_add_atom_connector(struct drm_device *dev,
 		connector->polled = DRM_CONNECTOR_POLL_HPD;
 
 	connector->display_info.subpixel_order = subpixel_order;
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	if (has_aux)
 		radeon_dp_aux_init(radeon_connector);
@@ -2137,5 +2137,5 @@ radeon_add_legacy_connector(struct drm_device *dev,
 	} else
 		connector->polled = DRM_CONNECTOR_POLL_HPD;
 	connector->display_info.subpixel_order = subpixel_order;
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 }
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c b/drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c
index 289048d..21426bd 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c
@@ -64,7 +64,7 @@ static const struct drm_connector_helper_funcs connector_helper_funcs = {
 
 static void rcar_du_lvds_connector_destroy(struct drm_connector *connector)
 {
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 }
 
@@ -105,7 +105,7 @@ int rcar_du_lvds_connector_init(struct rcar_du_device *rcdu,
 		return ret;
 
 	drm_connector_helper_add(connector, &connector_helper_funcs);
-	ret = drm_sysfs_connector_add(connector);
+	ret = drm_connector_register(connector);
 	if (ret < 0)
 		return ret;
 
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vgacon.c b/drivers/gpu/drm/rcar-du/rcar_du_vgacon.c
index ccfe64c..8af3944 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_vgacon.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_vgacon.c
@@ -32,7 +32,7 @@ static const struct drm_connector_helper_funcs connector_helper_funcs = {
 
 static void rcar_du_vga_connector_destroy(struct drm_connector *connector)
 {
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 }
 
@@ -70,7 +70,7 @@ int rcar_du_vga_connector_init(struct rcar_du_device *rcdu,
 		return ret;
 
 	drm_connector_helper_add(connector, &connector_helper_funcs);
-	ret = drm_sysfs_connector_add(connector);
+	ret = drm_connector_register(connector);
 	if (ret < 0)
 		return ret;
 
diff --git a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
index faf176b..47875de 100644
--- a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
+++ b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
@@ -692,7 +692,7 @@ static void shmob_drm_connector_destroy(struct drm_connector *connector)
 	struct shmob_drm_connector *scon = to_shmob_connector(connector);
 
 	shmob_drm_backlight_exit(scon);
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 }
 
@@ -726,7 +726,7 @@ int shmob_drm_connector_create(struct shmob_drm_device *sdev,
 		return ret;
 
 	drm_connector_helper_add(connector, &connector_helper_funcs);
-	ret = drm_sysfs_connector_add(connector);
+	ret = drm_connector_register(connector);
 	if (ret < 0)
 		goto err_cleanup;
 
@@ -749,7 +749,7 @@ int shmob_drm_connector_create(struct shmob_drm_device *sdev,
 err_backlight:
 	shmob_drm_backlight_exit(&sdev->connector);
 err_sysfs:
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 err_cleanup:
 	drm_connector_cleanup(connector);
 	return ret;
diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
index a3e4f1e..446837e 100644
--- a/drivers/gpu/drm/tegra/output.c
+++ b/drivers/gpu/drm/tegra/output.c
@@ -105,7 +105,7 @@ static void drm_connector_clear(struct drm_connector *connector)
 
 static void tegra_connector_destroy(struct drm_connector *connector)
 {
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	drm_connector_clear(connector);
 }
@@ -318,7 +318,7 @@ int tegra_output_init(struct drm_device *drm, struct tegra_output *output)
 	drm_encoder_helper_add(&output->encoder, &encoder_helper_funcs);
 
 	drm_mode_connector_attach_encoder(&output->connector, &output->encoder);
-	drm_sysfs_connector_add(&output->connector);
+	drm_connector_register(&output->connector);
 
 	output->encoder.possible_crtcs = 0x3;
 
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c
index 86c6732..0c0bce7 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c
@@ -247,7 +247,7 @@ static struct drm_connector *panel_connector_create(struct drm_device *dev,
 	if (ret)
 		goto fail;
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	return connector;
 
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_slave.c b/drivers/gpu/drm/tilcdc/tilcdc_slave.c
index 595068b..c578d14 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_slave.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_slave.c
@@ -261,7 +261,7 @@ static struct drm_connector *slave_connector_create(struct drm_device *dev,
 	if (ret)
 		goto fail;
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	return connector;
 
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
index c38b56b..5324dfd 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
@@ -261,7 +261,7 @@ static struct drm_connector *tfp410_connector_create(struct drm_device *dev,
 	if (ret)
 		goto fail;
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 
 	return connector;
 
diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
index b44d548..dea38ab 100644
--- a/drivers/gpu/drm/udl/udl_connector.c
+++ b/drivers/gpu/drm/udl/udl_connector.c
@@ -124,7 +124,7 @@ static int udl_connector_set_property(struct drm_connector *connector,
 
 static void udl_connector_destroy(struct drm_connector *connector)
 {
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 	kfree(connector);
 }
@@ -154,7 +154,7 @@ int udl_connector_init(struct drm_device *dev, struct drm_encoder *encoder)
 	drm_connector_init(dev, connector, &udl_connector_funcs, DRM_MODE_CONNECTOR_DVII);
 	drm_connector_helper_add(connector, &udl_connector_helper_funcs);
 
-	drm_sysfs_connector_add(connector);
+	drm_connector_register(connector);
 	drm_mode_connector_attach_encoder(connector, encoder);
 
 	drm_object_attach_property(&connector->base,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index e7199b4..c76337c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -75,7 +75,7 @@ void vmw_display_unit_cleanup(struct vmw_display_unit *du)
 		vmw_surface_unreference(&du->cursor_surface);
 	if (du->cursor_dmabuf)
 		vmw_dmabuf_unreference(&du->cursor_dmabuf);
-	drm_sysfs_connector_remove(&du->connector);
+	drm_connector_unregister(&du->connector);
 	drm_crtc_cleanup(&du->crtc);
 	drm_encoder_cleanup(&du->encoder);
 	drm_connector_cleanup(&du->connector);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
index b2b9bd2..15e185a 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
@@ -371,7 +371,7 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit)
 	encoder->possible_crtcs = (1 << unit);
 	encoder->possible_clones = 0;
 
-	(void) drm_sysfs_connector_add(connector);
+	(void) drm_connector_register(connector);
 
 	drm_crtc_init(dev, crtc, &vmw_legacy_crtc_funcs);
 
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
index a95d3a0..b295463 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
@@ -467,7 +467,7 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit)
 	encoder->possible_crtcs = (1 << unit);
 	encoder->possible_clones = 0;
 
-	(void) drm_sysfs_connector_add(connector);
+	(void) drm_connector_register(connector);
 
 	drm_crtc_init(dev, crtc, &vmw_screen_object_crtc_funcs);
 
diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
index 73b5986..d0117b4 100644
--- a/drivers/staging/imx-drm/imx-drm-core.c
+++ b/drivers/staging/imx-drm/imx-drm-core.c
@@ -202,7 +202,7 @@ static const struct file_operations imx_drm_driver_fops = {
 
 void imx_drm_connector_destroy(struct drm_connector *connector)
 {
-	drm_sysfs_connector_remove(connector);
+	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 }
 EXPORT_SYMBOL_GPL(imx_drm_connector_destroy);
@@ -293,10 +293,10 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
 	 * userspace will expect to be able to access DRM at this point.
 	 */
 	list_for_each_entry(connector, &drm->mode_config.connector_list, head) {
-		ret = drm_sysfs_connector_add(connector);
+		ret = drm_connector_register(connector);
 		if (ret) {
 			dev_err(drm->dev,
-				"[CONNECTOR:%d:%s] drm_sysfs_connector_add failed: %d\n",
+				"[CONNECTOR:%d:%s] drm_connector_register failed: %d\n",
 				connector->base.id,
 				drm_get_connector_name(connector), ret);
 			goto err_unbind;
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 5c1c31c..51e6255 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -860,6 +860,8 @@ extern int drm_connector_init(struct drm_device *dev,
 			      struct drm_connector *connector,
 			      const struct drm_connector_funcs *funcs,
 			      int connector_type);
+int drm_connector_register(struct drm_connector *connector);
+void drm_connector_unregister(struct drm_connector *connector);
 
 extern void drm_connector_cleanup(struct drm_connector *connector);
 /* helper to unplug all connectors from sysfs for device */
-- 
1.9.0

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

* [PATCH 2/3] drm/debugfs: add a "force" file per connector
  2014-05-29 15:57 [PATCH 0/3] connector debugfs properties Thomas Wood
  2014-05-29 15:57 ` [PATCH 1/3] drm: add register and unregister functions for connectors Thomas Wood
@ 2014-05-29 15:57 ` Thomas Wood
  2014-06-10 16:36   ` David Herrmann
  2014-06-18 16:52   ` [PATCH v2 0/2] connector debugfs properties Thomas Wood
  2014-05-29 15:57 ` [PATCH 3/3] " Thomas Wood
  2 siblings, 2 replies; 14+ messages in thread
From: Thomas Wood @ 2014-05-29 15:57 UTC (permalink / raw)
  To: dri-devel; +Cc: intel-gfx

Add a file to debugfs for each connector to enable modification of the
"force" connector attribute. This allows connectors to be enabled or
disabled for testing and debugging purposes.

Signed-off-by: Thomas Wood <thomas.wood@intel.com>
---
 drivers/gpu/drm/drm_crtc.c    |  17 ++++++-
 drivers/gpu/drm/drm_debugfs.c | 101 ++++++++++++++++++++++++++++++++++++++++++
 include/drm/drmP.h            |  11 +++++
 include/drm/drm_crtc.h        |   2 +
 4 files changed, 130 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 998663c..59a2784 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -841,6 +841,8 @@ int drm_connector_init(struct drm_device *dev,
 	drm_object_attach_property(&connector->base,
 				      dev->mode_config.dpms_property, 0);
 
+	connector->debugfs_entry = NULL;
+
 out_put:
 	if (ret)
 		drm_mode_object_put(dev, &connector->base);
@@ -891,7 +893,19 @@ EXPORT_SYMBOL(drm_connector_cleanup);
  */
 int drm_connector_register(struct drm_connector *connector)
 {
-	return drm_sysfs_connector_add(connector);
+	int ret;
+
+	ret = drm_sysfs_connector_add(connector);
+	if (ret != 0)
+		return ret;
+
+	ret = drm_debugfs_connector_add(connector);
+	if (ret != 0) {
+		drm_sysfs_connector_remove(connector);
+		return ret;
+	}
+
+	return 0;
 }
 EXPORT_SYMBOL(drm_connector_register);
 
@@ -904,6 +918,7 @@ EXPORT_SYMBOL(drm_connector_register);
 void drm_connector_unregister(struct drm_connector *connector)
 {
 	drm_sysfs_connector_remove(connector);
+	drm_debugfs_connector_remove(connector);
 }
 EXPORT_SYMBOL(drm_connector_unregister);
 
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
index b4b51d4..b57b614 100644
--- a/drivers/gpu/drm/drm_debugfs.c
+++ b/drivers/gpu/drm/drm_debugfs.c
@@ -237,5 +237,106 @@ int drm_debugfs_cleanup(struct drm_minor *minor)
 	return 0;
 }
 
+static int connector_show(struct seq_file *m, void *data)
+{
+	struct drm_connector *connector = m->private;
+	const char *status;
+
+	switch (connector->force) {
+	case DRM_FORCE_ON:
+		status = "on\n";
+		break;
+
+	case DRM_FORCE_ON_DIGITAL:
+		status = "digital\n";
+		break;
+
+	case DRM_FORCE_OFF:
+		status = "off\n";
+		break;
+
+	case DRM_FORCE_UNSPECIFIED:
+		status = "unspecified\n";
+		break;
+
+	default:
+		return 0;
+	}
+
+	seq_puts(m, status);
+
+	return 0;
+}
+
+static int connector_open(struct inode *inode, struct file *file)
+{
+	struct drm_connector *dev = inode->i_private;
+
+	return single_open(file, connector_show, dev);
+}
+
+static ssize_t connector_write(struct file *file, const char __user *ubuf,
+			       size_t len, loff_t *offp)
+{
+	struct seq_file *m = file->private_data;
+	struct drm_connector *connector = m->private;
+
+	if (strncmp(ubuf, "on", len) == 0)
+		connector->force = DRM_FORCE_ON;
+	else if (strncmp(ubuf, "digital", len) == 0)
+		connector->force = DRM_FORCE_ON_DIGITAL;
+	else if (strncmp(ubuf, "off", len) == 0)
+		connector->force = DRM_FORCE_OFF;
+	else if (strncmp(ubuf, "unspecified", len) == 0)
+		connector->force = DRM_FORCE_UNSPECIFIED;
+	else
+		return -EINVAL;
+
+	return len;
+}
+
+static const struct file_operations drm_connector_fops = {
+	.owner = THIS_MODULE,
+	.open = connector_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+	.write = connector_write
+};
+
+int drm_debugfs_connector_add(struct drm_connector *connector)
+{
+	struct drm_minor *minor = connector->dev->primary;
+	struct dentry *root, *ent;
+
+	if (!minor->debugfs_root)
+		return -1;
+
+	root = debugfs_create_dir(drm_get_connector_name(connector),
+				  minor->debugfs_root);
+	if (!root)
+		return -ENOMEM;
+
+	connector->debugfs_entry = root;
+
+	/* force */
+	ent = debugfs_create_file("force", S_IRUGO, root, connector,
+				  &drm_connector_fops);
+	if (!ent)
+		return -ENOMEM;
+
+	return 0;
+}
+
+void drm_debugfs_connector_remove(struct drm_connector *connector)
+{
+	if (!connector->debugfs_entry)
+		return;
+
+	debugfs_remove_recursive(connector->debugfs_entry);
+
+	connector->debugfs_entry = NULL;
+}
+
 #endif /* CONFIG_DEBUG_FS */
 
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 76ccaab..c6c85f7 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1425,6 +1425,8 @@ extern int drm_debugfs_create_files(const struct drm_info_list *files,
 extern int drm_debugfs_remove_files(const struct drm_info_list *files,
 				    int count, struct drm_minor *minor);
 extern int drm_debugfs_cleanup(struct drm_minor *minor);
+extern int drm_debugfs_connector_add(struct drm_connector *connector);
+extern void drm_debugfs_connector_remove(struct drm_connector *connector);
 #else
 static inline int drm_debugfs_init(struct drm_minor *minor, int minor_id,
 				   struct dentry *root)
@@ -1449,6 +1451,15 @@ static inline int drm_debugfs_cleanup(struct drm_minor *minor)
 {
 	return 0;
 }
+
+static inline int drm_debugfs_connector_add(struct drm_connector *connector)
+{
+	return 0;
+}
+static inline void drm_debugfs_connector_remove(struct drm_connector *connector)
+{
+}
+
 #endif
 
 				/* Info file support */
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 51e6255..f04f4b9 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -525,6 +525,8 @@ struct drm_connector {
 	int audio_latency[2];
 	int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
 	unsigned bad_edid_counter;
+
+	struct dentry *debugfs_entry;
 };
 
 /**
-- 
1.9.0

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

* [PATCH 3/3] drm/debugfs: add an "edid_override" file per connector
  2014-05-29 15:57 [PATCH 0/3] connector debugfs properties Thomas Wood
  2014-05-29 15:57 ` [PATCH 1/3] drm: add register and unregister functions for connectors Thomas Wood
  2014-05-29 15:57 ` [PATCH 2/3] drm/debugfs: add a "force" file per connector Thomas Wood
@ 2014-05-29 15:57 ` Thomas Wood
  2014-06-10 16:58   ` David Herrmann
  2 siblings, 1 reply; 14+ messages in thread
From: Thomas Wood @ 2014-05-29 15:57 UTC (permalink / raw)
  To: dri-devel; +Cc: intel-gfx

Add a file to debugfs for each connector that allows the edid data to be
overridden.

Signed-off-by: Thomas Wood <thomas.wood@intel.com>
---
 drivers/gpu/drm/drm_crtc.c         |  4 +++
 drivers/gpu/drm/drm_debugfs.c      | 56 ++++++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/drm_probe_helper.c |  9 +++++-
 include/drm/drm_crtc.h             |  1 +
 4 files changed, 69 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 59a2784..8543eac 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -3701,6 +3701,10 @@ int drm_mode_connector_update_edid_property(struct drm_connector *connector,
 	struct drm_device *dev = connector->dev;
 	int ret, size;
 
+	/* ignore requests to set edid when overridden */
+	if (connector->override_edid)
+		return 0;
+
 	if (connector->edid_blob_ptr)
 		drm_property_destroy_blob(dev, connector->edid_blob_ptr);
 
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
index b57b614..2c666ba 100644
--- a/drivers/gpu/drm/drm_debugfs.c
+++ b/drivers/gpu/drm/drm_debugfs.c
@@ -35,6 +35,7 @@
 #include <linux/slab.h>
 #include <linux/export.h>
 #include <drm/drmP.h>
+#include <drm/drm_edid.h>
 
 #if defined(CONFIG_DEBUG_FS)
 
@@ -295,6 +296,55 @@ static ssize_t connector_write(struct file *file, const char __user *ubuf,
 	return len;
 }
 
+static int edid_show(struct seq_file *m, void *data)
+{
+	struct drm_connector *connector = m->private;
+	struct drm_property_blob *edid = connector->edid_blob_ptr;
+
+	if (connector->override_edid && edid)
+		seq_write(m, edid->data, edid->length);
+
+	return 0;
+}
+
+static int edid_open(struct inode *inode, struct file *file)
+{
+	struct drm_connector *dev = inode->i_private;
+
+	return single_open(file, edid_show, dev);
+}
+
+static ssize_t edid_write(struct file *file, const char __user *ubuf,
+			  size_t len, loff_t *offp)
+{
+	struct seq_file *m = file->private_data;
+	struct drm_connector *connector = m->private;
+
+	if (len >= EDID_LENGTH) {
+		drm_mode_connector_update_edid_property(connector,
+							(struct edid *) ubuf);
+		connector->override_edid = true;
+	} else {
+		if (connector->override_edid) {
+			connector->override_edid = false;
+			drm_mode_connector_update_edid_property(connector,
+								NULL);
+		}
+	}
+
+	return len;
+}
+
+static const struct file_operations drm_edid_fops = {
+	.owner = THIS_MODULE,
+	.open = edid_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+	.write = edid_write
+};
+
+
 static const struct file_operations drm_connector_fops = {
 	.owner = THIS_MODULE,
 	.open = connector_open,
@@ -325,6 +375,12 @@ int drm_debugfs_connector_add(struct drm_connector *connector)
 	if (!ent)
 		return -ENOMEM;
 
+	/* edid */
+	ent = debugfs_create_file("edid_override", S_IRUGO, root, connector,
+				  &drm_edid_fops);
+	if (!ent)
+		return -ENOMEM;
+
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index 79f07f2..1f0dc77 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -130,7 +130,14 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
 	count = drm_load_edid_firmware(connector);
 	if (count == 0)
 #endif
-		count = (*connector_funcs->get_modes)(connector);
+	{
+		if (connector->override_edid) {
+			struct edid *edid = (struct edid *) connector->edid_blob_ptr->data;
+
+			count = drm_add_edid_modes(connector, edid);
+		} else
+			count = (*connector_funcs->get_modes)(connector);
+	}
 
 	if (count == 0 && connector->status == connector_status_connected)
 		count = drm_add_modes_noedid(connector, 1024, 768);
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index f04f4b9..11fce43 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -513,6 +513,7 @@ struct drm_connector {
 
 	/* forced on connector */
 	enum drm_connector_force force;
+	bool override_edid;
 	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
 	struct drm_encoder *encoder; /* currently active encoder */
 
-- 
1.9.0

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

* Re: [PATCH 1/3] drm: add register and unregister functions for connectors
  2014-05-29 15:57 ` [PATCH 1/3] drm: add register and unregister functions for connectors Thomas Wood
@ 2014-06-10 16:21   ` David Herrmann
  2014-06-19  6:57     ` Daniel Vetter
  0 siblings, 1 reply; 14+ messages in thread
From: David Herrmann @ 2014-06-10 16:21 UTC (permalink / raw)
  To: Thomas Wood, Daniel Vetter, Dave Airlie
  Cc: Intel Graphics Development, dri-devel

Hi

On Thu, May 29, 2014 at 5:57 PM, Thomas Wood <thomas.wood@intel.com> wrote:
> Introduce generic functions to register and unregister connectors. This
> provides a common place to add and remove associated user space
> interfaces.
>
> Signed-off-by: Thomas Wood <thomas.wood@intel.com>
> ---
>  Documentation/DocBook/drm.tmpl                |  6 +++---
>  drivers/gpu/drm/armada/armada_output.c        |  4 ++--
>  drivers/gpu/drm/ast/ast_mode.c                |  4 ++--
>  drivers/gpu/drm/bridge/ptn3460.c              |  2 +-
>  drivers/gpu/drm/drm_crtc.c                    | 30 ++++++++++++++++++++++++++-
>  drivers/gpu/drm/drm_sysfs.c                   |  2 --
>  drivers/gpu/drm/exynos/exynos_dp_core.c       |  2 +-
>  drivers/gpu/drm/exynos/exynos_drm_connector.c |  6 +++---
>  drivers/gpu/drm/exynos/exynos_drm_dpi.c       |  4 ++--
>  drivers/gpu/drm/exynos/exynos_drm_dsi.c       |  2 +-
>  drivers/gpu/drm/exynos/exynos_drm_vidi.c      |  2 +-
>  drivers/gpu/drm/exynos/exynos_hdmi.c          |  2 +-
>  drivers/gpu/drm/gma500/cdv_intel_crt.c        |  4 ++--
>  drivers/gpu/drm/gma500/cdv_intel_dp.c         |  4 ++--
>  drivers/gpu/drm/gma500/cdv_intel_hdmi.c       |  4 ++--
>  drivers/gpu/drm/gma500/cdv_intel_lvds.c       |  4 ++--
>  drivers/gpu/drm/gma500/mdfld_dsi_output.c     |  4 ++--
>  drivers/gpu/drm/gma500/oaktrail_hdmi.c        |  2 +-
>  drivers/gpu/drm/gma500/oaktrail_lvds.c        |  2 +-
>  drivers/gpu/drm/gma500/psb_intel_lvds.c       |  4 ++--
>  drivers/gpu/drm/gma500/psb_intel_sdvo.c       |  4 ++--
>  drivers/gpu/drm/i915/intel_crt.c              |  2 +-
>  drivers/gpu/drm/i915/intel_display.c          |  2 +-
>  drivers/gpu/drm/i915/intel_dp.c               |  4 ++--
>  drivers/gpu/drm/i915/intel_dsi.c              |  2 +-
>  drivers/gpu/drm/i915/intel_dvo.c              |  2 +-
>  drivers/gpu/drm/i915/intel_hdmi.c             |  2 +-
>  drivers/gpu/drm/i915/intel_lvds.c             |  2 +-
>  drivers/gpu/drm/i915/intel_sdvo.c             | 10 ++++-----
>  drivers/gpu/drm/i915/intel_tv.c               |  2 +-
>  drivers/gpu/drm/mgag200/mgag200_mode.c        |  2 +-
>  drivers/gpu/drm/msm/hdmi/hdmi_connector.c     |  4 ++--
>  drivers/gpu/drm/nouveau/nouveau_connector.c   |  4 ++--
>  drivers/gpu/drm/omapdrm/omap_connector.c      |  4 ++--
>  drivers/gpu/drm/qxl/qxl_display.c             |  4 ++--
>  drivers/gpu/drm/radeon/radeon_connectors.c    |  6 +++---
>  drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c     |  4 ++--
>  drivers/gpu/drm/rcar-du/rcar_du_vgacon.c      |  4 ++--
>  drivers/gpu/drm/shmobile/shmob_drm_crtc.c     |  6 +++---
>  drivers/gpu/drm/tegra/output.c                |  4 ++--
>  drivers/gpu/drm/tilcdc/tilcdc_panel.c         |  2 +-
>  drivers/gpu/drm/tilcdc/tilcdc_slave.c         |  2 +-
>  drivers/gpu/drm/tilcdc/tilcdc_tfp410.c        |  2 +-
>  drivers/gpu/drm/udl/udl_connector.c           |  4 ++--
>  drivers/gpu/drm/vmwgfx/vmwgfx_kms.c           |  2 +-
>  drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c           |  2 +-
>  drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c          |  2 +-
>  drivers/staging/imx-drm/imx-drm-core.c        |  6 +++---

You even caught imx.. and you removed the EXPORT_SYMBOL. So looks all
good to me.
I like that refactoring and I don't think we need an ACK from all
driver authors. This is:

Reviewed-by: David Herrmann <dh.herrmann@gmail.com>

Maybe Daniel or Dave can pick this up?

Thanks
David

>  include/drm/drm_crtc.h                        |  2 ++
>  49 files changed, 110 insertions(+), 82 deletions(-)
>
> diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
> index 00f1c25..0f96b25 100644
> --- a/Documentation/DocBook/drm.tmpl
> +++ b/Documentation/DocBook/drm.tmpl
> @@ -1574,7 +1574,7 @@ int max_width, max_height;</synopsis>
>            The connector is then registered with a call to
>            <function>drm_connector_init</function> with a pointer to the connector
>            functions and a connector type, and exposed through sysfs with a call to
> -          <function>drm_sysfs_connector_add</function>.
> +          <function>drm_connector_register</function>.
>          </para>
>          <para>
>            Supported connector types are
> @@ -1732,7 +1732,7 @@ int max_width, max_height;</synopsis>
>         (<function>drm_encoder_cleanup</function>) and connectors
>         (<function>drm_connector_cleanup</function>). Furthermore, connectors
>         that have been added to sysfs must be removed by a call to
> -       <function>drm_sysfs_connector_remove</function> before calling
> +       <function>drm_connector_unregister</function> before calling
>         <function>drm_connector_cleanup</function>.
>        </para>
>        <para>
> @@ -1777,7 +1777,7 @@ void intel_crt_init(struct drm_device *dev)
>         drm_encoder_helper_add(&intel_output->enc, &intel_crt_helper_funcs);
>         drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>  }]]></programlisting>
>        <para>
>          In the example above (taken from the i915 driver), a CRTC, connector and
> diff --git a/drivers/gpu/drm/armada/armada_output.c b/drivers/gpu/drm/armada/armada_output.c
> index d685a54..abbc309 100644
> --- a/drivers/gpu/drm/armada/armada_output.c
> +++ b/drivers/gpu/drm/armada/armada_output.c
> @@ -48,7 +48,7 @@ static void armada_drm_connector_destroy(struct drm_connector *conn)
>  {
>         struct armada_connector *dconn = drm_to_armada_conn(conn);
>
> -       drm_sysfs_connector_remove(conn);
> +       drm_connector_unregister(conn);
>         drm_connector_cleanup(conn);
>         kfree(dconn);
>  }
> @@ -141,7 +141,7 @@ int armada_output_create(struct drm_device *dev,
>         if (ret)
>                 goto err_conn;
>
> -       ret = drm_sysfs_connector_add(&dconn->conn);
> +       ret = drm_connector_register(&dconn->conn);
>         if (ret)
>                 goto err_sysfs;
>
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index 114aee9..9896286 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -829,7 +829,7 @@ static void ast_connector_destroy(struct drm_connector *connector)
>  {
>         struct ast_connector *ast_connector = to_ast_connector(connector);
>         ast_i2c_destroy(ast_connector->i2c);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -871,7 +871,7 @@ static int ast_connector_init(struct drm_device *dev)
>         connector->interlace_allowed = 0;
>         connector->doublescan_allowed = 0;
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         connector->polled = DRM_CONNECTOR_POLL_CONNECT;
>
> diff --git a/drivers/gpu/drm/bridge/ptn3460.c b/drivers/gpu/drm/bridge/ptn3460.c
> index 98fd17a..d466696 100644
> --- a/drivers/gpu/drm/bridge/ptn3460.c
> +++ b/drivers/gpu/drm/bridge/ptn3460.c
> @@ -328,7 +328,7 @@ int ptn3460_init(struct drm_device *dev, struct drm_encoder *encoder,
>         }
>         drm_connector_helper_add(&ptn_bridge->connector,
>                         &ptn3460_connector_helper_funcs);
> -       drm_sysfs_connector_add(&ptn_bridge->connector);
> +       drm_connector_register(&ptn_bridge->connector);
>         drm_mode_connector_attach_encoder(&ptn_bridge->connector, encoder);
>
>         return 0;
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 37a3e07..998663c 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -881,6 +881,34 @@ void drm_connector_cleanup(struct drm_connector *connector)
>  EXPORT_SYMBOL(drm_connector_cleanup);
>
>  /**
> + * drm_connector_register - register a connector
> + * @connector: the connector to register
> + *
> + * Register userspace interfaces for a connector
> + *
> + * Returns:
> + * Zero on success, error code on failure.
> + */
> +int drm_connector_register(struct drm_connector *connector)
> +{
> +       return drm_sysfs_connector_add(connector);
> +}
> +EXPORT_SYMBOL(drm_connector_register);
> +
> +/**
> + * drm_connector_unregister - unregister a connector
> + * @connector: the connector to unregister
> + *
> + * Unregister userspace interfaces for a connector
> + */
> +void drm_connector_unregister(struct drm_connector *connector)
> +{
> +       drm_sysfs_connector_remove(connector);
> +}
> +EXPORT_SYMBOL(drm_connector_unregister);
> +
> +
> +/**
>   * drm_connector_unplug_all - unregister connector userspace interfaces
>   * @dev: drm device
>   *
> @@ -894,7 +922,7 @@ void drm_connector_unplug_all(struct drm_device *dev)
>
>         /* taking the mode config mutex ends up in a clash with sysfs */
>         list_for_each_entry(connector, &dev->mode_config.connector_list, head)
> -               drm_sysfs_connector_remove(connector);
> +               drm_connector_unregister(connector);
>
>  }
>  EXPORT_SYMBOL(drm_connector_unplug_all);
> diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
> index c22c309..5fb194f 100644
> --- a/drivers/gpu/drm/drm_sysfs.c
> +++ b/drivers/gpu/drm/drm_sysfs.c
> @@ -438,7 +438,6 @@ err_out_files:
>  out:
>         return ret;
>  }
> -EXPORT_SYMBOL(drm_sysfs_connector_add);
>
>  /**
>   * drm_sysfs_connector_remove - remove an connector device from sysfs
> @@ -468,7 +467,6 @@ void drm_sysfs_connector_remove(struct drm_connector *connector)
>         device_unregister(connector->kdev);
>         connector->kdev = NULL;
>  }
> -EXPORT_SYMBOL(drm_sysfs_connector_remove);
>
>  /**
>   * drm_sysfs_hotplug_event - generate a DRM uevent
> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c
> index bb74472..a643fba 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp_core.c
> +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c
> @@ -1025,7 +1025,7 @@ static int exynos_dp_create_connector(struct exynos_drm_display *display,
>         }
>
>         drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         drm_mode_connector_attach_encoder(connector, encoder);
>
>         return 0;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c
> index 9a16dbe..25c7888 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c
> @@ -185,7 +185,7 @@ static void exynos_drm_connector_destroy(struct drm_connector *connector)
>         struct exynos_drm_connector *exynos_connector =
>                 to_exynos_connector(connector);
>
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(exynos_connector);
>  }
> @@ -230,7 +230,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
>         drm_connector_init(dev, connector, &exynos_connector_funcs, type);
>         drm_connector_helper_add(connector, &exynos_connector_helper_funcs);
>
> -       err = drm_sysfs_connector_add(connector);
> +       err = drm_connector_register(connector);
>         if (err)
>                 goto err_connector;
>
> @@ -250,7 +250,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
>         return connector;
>
>  err_sysfs:
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>  err_connector:
>         drm_connector_cleanup(connector);
>         kfree(exynos_connector);
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dpi.c b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
> index 82e52c7..6d71591 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_dpi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
> @@ -58,7 +58,7 @@ exynos_dpi_detect(struct drm_connector *connector, bool force)
>
>  static void exynos_dpi_connector_destroy(struct drm_connector *connector)
>  {
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>  }
>
> @@ -130,7 +130,7 @@ static int exynos_dpi_create_connector(struct exynos_drm_display *display,
>         }
>
>         drm_connector_helper_add(connector, &exynos_dpi_connector_helper_funcs);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         drm_mode_connector_attach_encoder(connector, encoder);
>
>         return 0;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> index 4ac4381..d6358d1 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> @@ -1245,7 +1245,7 @@ static int exynos_dsi_create_connector(struct exynos_drm_display *display,
>         }
>
>         drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         drm_mode_connector_attach_encoder(connector, encoder);
>
>         return 0;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> index 3fa987d..c4693c1 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> @@ -563,7 +563,7 @@ static int vidi_create_connector(struct exynos_drm_display *display,
>         }
>
>         drm_connector_helper_add(connector, &vidi_connector_helper_funcs);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         drm_mode_connector_attach_encoder(connector, encoder);
>
>         return 0;
> diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
> index 9a6d652..5bcbd83 100644
> --- a/drivers/gpu/drm/exynos/exynos_hdmi.c
> +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
> @@ -922,7 +922,7 @@ static int hdmi_create_connector(struct exynos_drm_display *display,
>         }
>
>         drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         drm_mode_connector_attach_encoder(connector, encoder);
>
>         return 0;
> diff --git a/drivers/gpu/drm/gma500/cdv_intel_crt.c b/drivers/gpu/drm/gma500/cdv_intel_crt.c
> index c18268c..248c33a 100644
> --- a/drivers/gpu/drm/gma500/cdv_intel_crt.c
> +++ b/drivers/gpu/drm/gma500/cdv_intel_crt.c
> @@ -192,7 +192,7 @@ static void cdv_intel_crt_destroy(struct drm_connector *connector)
>         struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
>
>         psb_intel_i2c_destroy(gma_encoder->ddc_bus);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -304,7 +304,7 @@ void cdv_intel_crt_init(struct drm_device *dev,
>         drm_connector_helper_add(connector,
>                                         &cdv_intel_crt_connector_helper_funcs);
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         return;
>  failed_ddc:
> diff --git a/drivers/gpu/drm/gma500/cdv_intel_dp.c b/drivers/gpu/drm/gma500/cdv_intel_dp.c
> index 9ff30c2..a4cc0e6 100644
> --- a/drivers/gpu/drm/gma500/cdv_intel_dp.c
> +++ b/drivers/gpu/drm/gma500/cdv_intel_dp.c
> @@ -1713,7 +1713,7 @@ cdv_intel_dp_destroy(struct drm_connector *connector)
>                 }
>         }
>         i2c_del_adapter(&intel_dp->adapter);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -1847,7 +1847,7 @@ cdv_intel_dp_init(struct drm_device *dev, struct psb_intel_mode_device *mode_dev
>         connector->interlace_allowed = false;
>         connector->doublescan_allowed = false;
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         /* Set up the DDC bus. */
>         switch (output_reg) {
> diff --git a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
> index b99084b..4268bf2 100644
> --- a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
> +++ b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
> @@ -248,7 +248,7 @@ static void cdv_hdmi_destroy(struct drm_connector *connector)
>
>         if (gma_encoder->i2c_bus)
>                 psb_intel_i2c_destroy(gma_encoder->i2c_bus);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -356,7 +356,7 @@ void cdv_hdmi_init(struct drm_device *dev,
>
>         hdmi_priv->hdmi_i2c_adapter = &(gma_encoder->i2c_bus->adapter);
>         hdmi_priv->dev = dev;
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         return;
>
>  failed_ddc:
> diff --git a/drivers/gpu/drm/gma500/cdv_intel_lvds.c b/drivers/gpu/drm/gma500/cdv_intel_lvds.c
> index 8ecc920..0b77039 100644
> --- a/drivers/gpu/drm/gma500/cdv_intel_lvds.c
> +++ b/drivers/gpu/drm/gma500/cdv_intel_lvds.c
> @@ -446,7 +446,7 @@ static void cdv_intel_lvds_destroy(struct drm_connector *connector)
>
>         if (gma_encoder->i2c_bus)
>                 psb_intel_i2c_destroy(gma_encoder->i2c_bus);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -774,7 +774,7 @@ void cdv_intel_lvds_init(struct drm_device *dev,
>
>  out:
>         mutex_unlock(&dev->mode_config.mutex);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         return;
>
>  failed_find:
> diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_output.c b/drivers/gpu/drm/gma500/mdfld_dsi_output.c
> index 6e91b20..abf2248 100644
> --- a/drivers/gpu/drm/gma500/mdfld_dsi_output.c
> +++ b/drivers/gpu/drm/gma500/mdfld_dsi_output.c
> @@ -318,7 +318,7 @@ static void mdfld_dsi_connector_destroy(struct drm_connector *connector)
>
>         if (!dsi_connector)
>                 return;
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         sender = dsi_connector->pkg_sender;
>         mdfld_dsi_pkg_sender_destroy(sender);
> @@ -597,7 +597,7 @@ void mdfld_dsi_output_init(struct drm_device *dev,
>         dsi_config->encoder = encoder;
>         encoder->base.type = (pipe == 0) ? INTEL_OUTPUT_MIPI :
>                 INTEL_OUTPUT_MIPI2;
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         return;
>
>         /*TODO: add code to destroy outputs on error*/
> diff --git a/drivers/gpu/drm/gma500/oaktrail_hdmi.c b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
> index cf018dd..e6f5c62 100644
> --- a/drivers/gpu/drm/gma500/oaktrail_hdmi.c
> +++ b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
> @@ -665,7 +665,7 @@ void oaktrail_hdmi_init(struct drm_device *dev,
>         connector->display_info.subpixel_order = SubPixelHorizontalRGB;
>         connector->interlace_allowed = false;
>         connector->doublescan_allowed = false;
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         dev_info(dev->dev, "HDMI initialised.\n");
>
>         return;
> diff --git a/drivers/gpu/drm/gma500/oaktrail_lvds.c b/drivers/gpu/drm/gma500/oaktrail_lvds.c
> index 9b09946..0d39da6 100644
> --- a/drivers/gpu/drm/gma500/oaktrail_lvds.c
> +++ b/drivers/gpu/drm/gma500/oaktrail_lvds.c
> @@ -404,7 +404,7 @@ void oaktrail_lvds_init(struct drm_device *dev,
>  out:
>         mutex_unlock(&dev->mode_config.mutex);
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         return;
>
>  failed_find:
> diff --git a/drivers/gpu/drm/gma500/psb_intel_lvds.c b/drivers/gpu/drm/gma500/psb_intel_lvds.c
> index d7778d0..88aad95 100644
> --- a/drivers/gpu/drm/gma500/psb_intel_lvds.c
> +++ b/drivers/gpu/drm/gma500/psb_intel_lvds.c
> @@ -563,7 +563,7 @@ void psb_intel_lvds_destroy(struct drm_connector *connector)
>
>         if (lvds_priv->ddc_bus)
>                 psb_intel_i2c_destroy(lvds_priv->ddc_bus);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -829,7 +829,7 @@ void psb_intel_lvds_init(struct drm_device *dev,
>          */
>  out:
>         mutex_unlock(&dev->mode_config.mutex);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         return;
>
>  failed_find:
> diff --git a/drivers/gpu/drm/gma500/psb_intel_sdvo.c b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
> index deeb082..0be96fd 100644
> --- a/drivers/gpu/drm/gma500/psb_intel_sdvo.c
> +++ b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
> @@ -1682,7 +1682,7 @@ static void psb_intel_sdvo_destroy(struct drm_connector *connector)
>                                      psb_intel_sdvo_connector->tv_format);
>
>         psb_intel_sdvo_destroy_enhance_property(connector);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -2071,7 +2071,7 @@ psb_intel_sdvo_connector_init(struct psb_intel_sdvo_connector *connector,
>         connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB;
>
>         gma_connector_attach_encoder(&connector->base, &encoder->base);
> -       drm_sysfs_connector_add(&connector->base.base);
> +       drm_connector_register(&connector->base.base);
>  }
>
>  static void
> diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
> index 22d8347..349f02a 100644
> --- a/drivers/gpu/drm/i915/intel_crt.c
> +++ b/drivers/gpu/drm/i915/intel_crt.c
> @@ -868,7 +868,7 @@ void intel_crt_init(struct drm_device *dev)
>
>         drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         if (!I915_HAS_HOTPLUG(dev))
>                 intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 731cd01..4746fb6 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -12223,7 +12223,7 @@ 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);
> +       drm_connector_unregister(connector);
>  }
>
>  void intel_modeset_cleanup(struct drm_device *dev)
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 7d31769..f4a2736 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -4309,7 +4309,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
>                           edp_panel_vdd_work);
>
>         intel_connector_attach_encoder(intel_connector, intel_encoder);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         if (HAS_DDI(dev))
>                 intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
> @@ -4350,7 +4350,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
>                         edp_panel_vdd_off_sync(intel_dp);
>                         mutex_unlock(&dev->mode_config.mutex);
>                 }
> -               drm_sysfs_connector_remove(connector);
> +               drm_connector_unregister(connector);
>                 drm_connector_cleanup(connector);
>                 return false;
>         }
> diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
> index 9d789b3..7dcfe76 100644
> --- a/drivers/gpu/drm/i915/intel_dsi.c
> +++ b/drivers/gpu/drm/i915/intel_dsi.c
> @@ -742,7 +742,7 @@ void intel_dsi_init(struct drm_device *dev)
>
>         intel_connector_attach_encoder(intel_connector, intel_encoder);
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         fixed_mode = dsi->dev_ops->get_modes(&intel_dsi->dev);
>         if (!fixed_mode) {
> diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
> index 1604235..8959c17 100644
> --- a/drivers/gpu/drm/i915/intel_dvo.c
> +++ b/drivers/gpu/drm/i915/intel_dvo.c
> @@ -558,7 +558,7 @@ void intel_dvo_init(struct drm_device *dev)
>                         intel_dvo->panel_wants_dither = true;
>                 }
>
> -               drm_sysfs_connector_add(connector);
> +               drm_connector_register(connector);
>                 return;
>         }
>
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> index 70a89cc..de33242 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -1554,7 +1554,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
>         intel_hdmi_add_properties(intel_hdmi, connector);
>
>         intel_connector_attach_encoder(intel_connector, intel_encoder);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
>          * 0xd.  Failure to do so will result in spurious interrupts being
> diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
> index d1539f3..e28cdd1 100644
> --- a/drivers/gpu/drm/i915/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/intel_lvds.c
> @@ -1097,7 +1097,7 @@ out:
>                 DRM_DEBUG_KMS("lid notifier registration failed\n");
>                 lvds_connector->lid_notifier.notifier_call = NULL;
>         }
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
>         intel_panel_setup_backlight(connector);
> diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
> index aa2c609..02031aa 100644
> --- a/drivers/gpu/drm/i915/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/intel_sdvo.c
> @@ -2431,7 +2431,7 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
>         connector->base.unregister = intel_sdvo_connector_unregister;
>
>         intel_connector_attach_encoder(&connector->base, &encoder->base);
> -       ret = drm_sysfs_connector_add(drm_connector);
> +       ret = drm_connector_register(drm_connector);
>         if (ret < 0)
>                 goto err1;
>
> @@ -2444,7 +2444,7 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
>         return 0;
>
>  err2:
> -       drm_sysfs_connector_remove(drm_connector);
> +       drm_connector_unregister(drm_connector);
>  err1:
>         drm_connector_cleanup(drm_connector);
>
> @@ -2557,7 +2557,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
>         return true;
>
>  err:
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         intel_sdvo_destroy(connector);
>         return false;
>  }
> @@ -2636,7 +2636,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
>         return true;
>
>  err:
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         intel_sdvo_destroy(connector);
>         return false;
>  }
> @@ -2709,7 +2709,7 @@ static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo)
>         list_for_each_entry_safe(connector, tmp,
>                                  &dev->mode_config.connector_list, head) {
>                 if (intel_attached_encoder(connector) == &intel_sdvo->base) {
> -                       drm_sysfs_connector_remove(connector);
> +                       drm_connector_unregister(connector);
>                         intel_sdvo_destroy(connector);
>                 }
>         }
> diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
> index e0193e8..2c970b3 100644
> --- a/drivers/gpu/drm/i915/intel_tv.c
> +++ b/drivers/gpu/drm/i915/intel_tv.c
> @@ -1679,5 +1679,5 @@ intel_tv_init(struct drm_device *dev)
>         drm_object_attach_property(&connector->base,
>                                    dev->mode_config.tv_bottom_margin_property,
>                                    intel_tv->margin[TV_MARGIN_BOTTOM]);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>  }
> diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
> index a034ed4..f9fe390 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_mode.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
> @@ -1621,7 +1621,7 @@ static struct drm_connector *mga_vga_init(struct drm_device *dev)
>
>         drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs);
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         mga_connector->i2c = mgag200_i2c_create(dev);
>         if (!mga_connector->i2c)
> diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_connector.c b/drivers/gpu/drm/msm/hdmi/hdmi_connector.c
> index 7dedfdd..07af5c9 100644
> --- a/drivers/gpu/drm/msm/hdmi/hdmi_connector.c
> +++ b/drivers/gpu/drm/msm/hdmi/hdmi_connector.c
> @@ -285,7 +285,7 @@ static void hdmi_connector_destroy(struct drm_connector *connector)
>
>         hdp_disable(hdmi_connector);
>
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>
>         hdmi_unreference(hdmi_connector->hdmi);
> @@ -394,7 +394,7 @@ struct drm_connector *hdmi_connector_init(struct hdmi *hdmi)
>         connector->interlace_allowed = 1;
>         connector->doublescan_allowed = 0;
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         ret = hpd_enable(hdmi_connector);
>         if (ret) {
> diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
> index d07ce02..8ff798b 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_connector.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
> @@ -102,7 +102,7 @@ nouveau_connector_destroy(struct drm_connector *connector)
>         struct nouveau_connector *nv_connector = nouveau_connector(connector);
>         nouveau_event_ref(NULL, &nv_connector->hpd_func);
>         kfree(nv_connector->edid);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -1170,6 +1170,6 @@ nouveau_connector_create(struct drm_device *dev, int index)
>         if (nv_connector->hpd.func != DCB_GPIO_UNUSED)
>                 connector->polled = DRM_CONNECTOR_POLL_HPD;
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         return connector;
>  }
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index 86f4ead..36bc5cc 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -130,7 +130,7 @@ static void omap_connector_destroy(struct drm_connector *connector)
>         struct omap_dss_device *dssdev = omap_connector->dssdev;
>
>         DBG("%s", omap_connector->dssdev->name);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(omap_connector);
>
> @@ -307,7 +307,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
>         connector->interlace_allowed = 1;
>         connector->doublescan_allowed = 0;
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         return connector;
>
> diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
> index 3ab9072..f09ffb4 100644
> --- a/drivers/gpu/drm/qxl/qxl_display.c
> +++ b/drivers/gpu/drm/qxl/qxl_display.c
> @@ -831,7 +831,7 @@ static void qxl_conn_destroy(struct drm_connector *connector)
>         struct qxl_output *qxl_output =
>                 drm_connector_to_qxl_output(connector);
>
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(qxl_output);
>  }
> @@ -898,7 +898,7 @@ static int qdev_output_init(struct drm_device *dev, int num_output)
>
>         drm_object_attach_property(&connector->base,
>                                    qdev->hotplug_mode_update_property, 0);
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
> index ea50e0a..5d9c55b 100644
> --- a/drivers/gpu/drm/radeon/radeon_connectors.c
> +++ b/drivers/gpu/drm/radeon/radeon_connectors.c
> @@ -676,7 +676,7 @@ static void radeon_connector_destroy(struct drm_connector *connector)
>         if (radeon_connector->edid)
>                 kfree(radeon_connector->edid);
>         kfree(radeon_connector->con_priv);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -1976,7 +1976,7 @@ radeon_add_atom_connector(struct drm_device *dev,
>                 connector->polled = DRM_CONNECTOR_POLL_HPD;
>
>         connector->display_info.subpixel_order = subpixel_order;
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         if (has_aux)
>                 radeon_dp_aux_init(radeon_connector);
> @@ -2137,5 +2137,5 @@ radeon_add_legacy_connector(struct drm_device *dev,
>         } else
>                 connector->polled = DRM_CONNECTOR_POLL_HPD;
>         connector->display_info.subpixel_order = subpixel_order;
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>  }
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c b/drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c
> index 289048d..21426bd 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c
> @@ -64,7 +64,7 @@ static const struct drm_connector_helper_funcs connector_helper_funcs = {
>
>  static void rcar_du_lvds_connector_destroy(struct drm_connector *connector)
>  {
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>  }
>
> @@ -105,7 +105,7 @@ int rcar_du_lvds_connector_init(struct rcar_du_device *rcdu,
>                 return ret;
>
>         drm_connector_helper_add(connector, &connector_helper_funcs);
> -       ret = drm_sysfs_connector_add(connector);
> +       ret = drm_connector_register(connector);
>         if (ret < 0)
>                 return ret;
>
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vgacon.c b/drivers/gpu/drm/rcar-du/rcar_du_vgacon.c
> index ccfe64c..8af3944 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_vgacon.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vgacon.c
> @@ -32,7 +32,7 @@ static const struct drm_connector_helper_funcs connector_helper_funcs = {
>
>  static void rcar_du_vga_connector_destroy(struct drm_connector *connector)
>  {
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>  }
>
> @@ -70,7 +70,7 @@ int rcar_du_vga_connector_init(struct rcar_du_device *rcdu,
>                 return ret;
>
>         drm_connector_helper_add(connector, &connector_helper_funcs);
> -       ret = drm_sysfs_connector_add(connector);
> +       ret = drm_connector_register(connector);
>         if (ret < 0)
>                 return ret;
>
> diff --git a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
> index faf176b..47875de 100644
> --- a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
> +++ b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
> @@ -692,7 +692,7 @@ static void shmob_drm_connector_destroy(struct drm_connector *connector)
>         struct shmob_drm_connector *scon = to_shmob_connector(connector);
>
>         shmob_drm_backlight_exit(scon);
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>  }
>
> @@ -726,7 +726,7 @@ int shmob_drm_connector_create(struct shmob_drm_device *sdev,
>                 return ret;
>
>         drm_connector_helper_add(connector, &connector_helper_funcs);
> -       ret = drm_sysfs_connector_add(connector);
> +       ret = drm_connector_register(connector);
>         if (ret < 0)
>                 goto err_cleanup;
>
> @@ -749,7 +749,7 @@ int shmob_drm_connector_create(struct shmob_drm_device *sdev,
>  err_backlight:
>         shmob_drm_backlight_exit(&sdev->connector);
>  err_sysfs:
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>  err_cleanup:
>         drm_connector_cleanup(connector);
>         return ret;
> diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
> index a3e4f1e..446837e 100644
> --- a/drivers/gpu/drm/tegra/output.c
> +++ b/drivers/gpu/drm/tegra/output.c
> @@ -105,7 +105,7 @@ static void drm_connector_clear(struct drm_connector *connector)
>
>  static void tegra_connector_destroy(struct drm_connector *connector)
>  {
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         drm_connector_clear(connector);
>  }
> @@ -318,7 +318,7 @@ int tegra_output_init(struct drm_device *drm, struct tegra_output *output)
>         drm_encoder_helper_add(&output->encoder, &encoder_helper_funcs);
>
>         drm_mode_connector_attach_encoder(&output->connector, &output->encoder);
> -       drm_sysfs_connector_add(&output->connector);
> +       drm_connector_register(&output->connector);
>
>         output->encoder.possible_crtcs = 0x3;
>
> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c
> index 86c6732..0c0bce7 100644
> --- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c
> +++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c
> @@ -247,7 +247,7 @@ static struct drm_connector *panel_connector_create(struct drm_device *dev,
>         if (ret)
>                 goto fail;
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         return connector;
>
> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_slave.c b/drivers/gpu/drm/tilcdc/tilcdc_slave.c
> index 595068b..c578d14 100644
> --- a/drivers/gpu/drm/tilcdc/tilcdc_slave.c
> +++ b/drivers/gpu/drm/tilcdc/tilcdc_slave.c
> @@ -261,7 +261,7 @@ static struct drm_connector *slave_connector_create(struct drm_device *dev,
>         if (ret)
>                 goto fail;
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         return connector;
>
> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
> index c38b56b..5324dfd 100644
> --- a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
> +++ b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
> @@ -261,7 +261,7 @@ static struct drm_connector *tfp410_connector_create(struct drm_device *dev,
>         if (ret)
>                 goto fail;
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>
>         return connector;
>
> diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
> index b44d548..dea38ab 100644
> --- a/drivers/gpu/drm/udl/udl_connector.c
> +++ b/drivers/gpu/drm/udl/udl_connector.c
> @@ -124,7 +124,7 @@ static int udl_connector_set_property(struct drm_connector *connector,
>
>  static void udl_connector_destroy(struct drm_connector *connector)
>  {
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>         kfree(connector);
>  }
> @@ -154,7 +154,7 @@ int udl_connector_init(struct drm_device *dev, struct drm_encoder *encoder)
>         drm_connector_init(dev, connector, &udl_connector_funcs, DRM_MODE_CONNECTOR_DVII);
>         drm_connector_helper_add(connector, &udl_connector_helper_funcs);
>
> -       drm_sysfs_connector_add(connector);
> +       drm_connector_register(connector);
>         drm_mode_connector_attach_encoder(connector, encoder);
>
>         drm_object_attach_property(&connector->base,
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> index e7199b4..c76337c 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> @@ -75,7 +75,7 @@ void vmw_display_unit_cleanup(struct vmw_display_unit *du)
>                 vmw_surface_unreference(&du->cursor_surface);
>         if (du->cursor_dmabuf)
>                 vmw_dmabuf_unreference(&du->cursor_dmabuf);
> -       drm_sysfs_connector_remove(&du->connector);
> +       drm_connector_unregister(&du->connector);
>         drm_crtc_cleanup(&du->crtc);
>         drm_encoder_cleanup(&du->encoder);
>         drm_connector_cleanup(&du->connector);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
> index b2b9bd2..15e185a 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
> @@ -371,7 +371,7 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit)
>         encoder->possible_crtcs = (1 << unit);
>         encoder->possible_clones = 0;
>
> -       (void) drm_sysfs_connector_add(connector);
> +       (void) drm_connector_register(connector);
>
>         drm_crtc_init(dev, crtc, &vmw_legacy_crtc_funcs);
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
> index a95d3a0..b295463 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
> @@ -467,7 +467,7 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit)
>         encoder->possible_crtcs = (1 << unit);
>         encoder->possible_clones = 0;
>
> -       (void) drm_sysfs_connector_add(connector);
> +       (void) drm_connector_register(connector);
>
>         drm_crtc_init(dev, crtc, &vmw_screen_object_crtc_funcs);
>
> diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c
> index 73b5986..d0117b4 100644
> --- a/drivers/staging/imx-drm/imx-drm-core.c
> +++ b/drivers/staging/imx-drm/imx-drm-core.c
> @@ -202,7 +202,7 @@ static const struct file_operations imx_drm_driver_fops = {
>
>  void imx_drm_connector_destroy(struct drm_connector *connector)
>  {
> -       drm_sysfs_connector_remove(connector);
> +       drm_connector_unregister(connector);
>         drm_connector_cleanup(connector);
>  }
>  EXPORT_SYMBOL_GPL(imx_drm_connector_destroy);
> @@ -293,10 +293,10 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
>          * userspace will expect to be able to access DRM at this point.
>          */
>         list_for_each_entry(connector, &drm->mode_config.connector_list, head) {
> -               ret = drm_sysfs_connector_add(connector);
> +               ret = drm_connector_register(connector);
>                 if (ret) {
>                         dev_err(drm->dev,
> -                               "[CONNECTOR:%d:%s] drm_sysfs_connector_add failed: %d\n",
> +                               "[CONNECTOR:%d:%s] drm_connector_register failed: %d\n",
>                                 connector->base.id,
>                                 drm_get_connector_name(connector), ret);
>                         goto err_unbind;
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 5c1c31c..51e6255 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -860,6 +860,8 @@ extern int drm_connector_init(struct drm_device *dev,
>                               struct drm_connector *connector,
>                               const struct drm_connector_funcs *funcs,
>                               int connector_type);
> +int drm_connector_register(struct drm_connector *connector);
> +void drm_connector_unregister(struct drm_connector *connector);
>
>  extern void drm_connector_cleanup(struct drm_connector *connector);
>  /* helper to unplug all connectors from sysfs for device */
> --
> 1.9.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 2/3] drm/debugfs: add a "force" file per connector
  2014-05-29 15:57 ` [PATCH 2/3] drm/debugfs: add a "force" file per connector Thomas Wood
@ 2014-06-10 16:36   ` David Herrmann
  2014-06-18 16:52   ` [PATCH v2 0/2] connector debugfs properties Thomas Wood
  1 sibling, 0 replies; 14+ messages in thread
From: David Herrmann @ 2014-06-10 16:36 UTC (permalink / raw)
  To: Thomas Wood; +Cc: Intel Graphics Development, dri-devel

Hi

On Thu, May 29, 2014 at 5:57 PM, Thomas Wood <thomas.wood@intel.com> wrote:
> Add a file to debugfs for each connector to enable modification of the
> "force" connector attribute. This allows connectors to be enabled or
> disabled for testing and debugging purposes.
>
> Signed-off-by: Thomas Wood <thomas.wood@intel.com>
> ---
>  drivers/gpu/drm/drm_crtc.c    |  17 ++++++-
>  drivers/gpu/drm/drm_debugfs.c | 101 ++++++++++++++++++++++++++++++++++++++++++
>  include/drm/drmP.h            |  11 +++++
>  include/drm/drm_crtc.h        |   2 +
>  4 files changed, 130 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 998663c..59a2784 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -841,6 +841,8 @@ int drm_connector_init(struct drm_device *dev,
>         drm_object_attach_property(&connector->base,
>                                       dev->mode_config.dpms_property, 0);
>
> +       connector->debugfs_entry = NULL;
> +
>  out_put:
>         if (ret)
>                 drm_mode_object_put(dev, &connector->base);
> @@ -891,7 +893,19 @@ EXPORT_SYMBOL(drm_connector_cleanup);
>   */
>  int drm_connector_register(struct drm_connector *connector)
>  {
> -       return drm_sysfs_connector_add(connector);
> +       int ret;
> +
> +       ret = drm_sysfs_connector_add(connector);
> +       if (ret != 0)

nitpick: I've never seen "xy != 0" in DRM code, I think "if (ret)" or
"if (ret < 0)" is what we usually use..

> +               return ret;
> +
> +       ret = drm_debugfs_connector_add(connector);
> +       if (ret != 0) {
> +               drm_sysfs_connector_remove(connector);
> +               return ret;
> +       }
> +
> +       return 0;
>  }
>  EXPORT_SYMBOL(drm_connector_register);
>
> @@ -904,6 +918,7 @@ EXPORT_SYMBOL(drm_connector_register);
>  void drm_connector_unregister(struct drm_connector *connector)
>  {
>         drm_sysfs_connector_remove(connector);
> +       drm_debugfs_connector_remove(connector);
>  }
>  EXPORT_SYMBOL(drm_connector_unregister);
>
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index b4b51d4..b57b614 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -237,5 +237,106 @@ int drm_debugfs_cleanup(struct drm_minor *minor)
>         return 0;
>  }
>
> +static int connector_show(struct seq_file *m, void *data)
> +{
> +       struct drm_connector *connector = m->private;
> +       const char *status;
> +
> +       switch (connector->force) {
> +       case DRM_FORCE_ON:
> +               status = "on\n";
> +               break;
> +
> +       case DRM_FORCE_ON_DIGITAL:
> +               status = "digital\n";
> +               break;
> +
> +       case DRM_FORCE_OFF:
> +               status = "off\n";
> +               break;
> +
> +       case DRM_FORCE_UNSPECIFIED:
> +               status = "unspecified\n";
> +               break;
> +
> +       default:
> +               return 0;
> +       }
> +
> +       seq_puts(m, status);
> +
> +       return 0;
> +}
> +
> +static int connector_open(struct inode *inode, struct file *file)
> +{
> +       struct drm_connector *dev = inode->i_private;
> +
> +       return single_open(file, connector_show, dev);
> +}
> +
> +static ssize_t connector_write(struct file *file, const char __user *ubuf,
> +                              size_t len, loff_t *offp)
> +{
> +       struct seq_file *m = file->private_data;
> +       struct drm_connector *connector = m->private;
> +
> +       if (strncmp(ubuf, "on", len) == 0)

That hits on "o" as strncmp("o", "on", 1) == 0. We really need a
"startswith()" macro in the kernel.. same below.

> +               connector->force = DRM_FORCE_ON;
> +       else if (strncmp(ubuf, "digital", len) == 0)
> +               connector->force = DRM_FORCE_ON_DIGITAL;
> +       else if (strncmp(ubuf, "off", len) == 0)
> +               connector->force = DRM_FORCE_OFF;
> +       else if (strncmp(ubuf, "unspecified", len) == 0)
> +               connector->force = DRM_FORCE_UNSPECIFIED;
> +       else
> +               return -EINVAL;
> +
> +       return len;
> +}
> +
> +static const struct file_operations drm_connector_fops = {
> +       .owner = THIS_MODULE,
> +       .open = connector_open,
> +       .read = seq_read,
> +       .llseek = seq_lseek,
> +       .release = single_release,
> +       .write = connector_write
> +};
> +
> +int drm_debugfs_connector_add(struct drm_connector *connector)
> +{
> +       struct drm_minor *minor = connector->dev->primary;
> +       struct dentry *root, *ent;
> +
> +       if (!minor->debugfs_root)
> +               return -1;
> +
> +       root = debugfs_create_dir(drm_get_connector_name(connector),
> +                                 minor->debugfs_root);
> +       if (!root)
> +               return -ENOMEM;
> +
> +       connector->debugfs_entry = root;
> +
> +       /* force */
> +       ent = debugfs_create_file("force", S_IRUGO, root, connector,
> +                                 &drm_connector_fops);
> +       if (!ent)
> +               return -ENOMEM;

You need to cleanup connector->debugfs_entry here as you're not doing
that in drm_connector_add().

Thanks
David

> +
> +       return 0;
> +}
> +
> +void drm_debugfs_connector_remove(struct drm_connector *connector)
> +{
> +       if (!connector->debugfs_entry)
> +               return;
> +
> +       debugfs_remove_recursive(connector->debugfs_entry);
> +
> +       connector->debugfs_entry = NULL;
> +}
> +
>  #endif /* CONFIG_DEBUG_FS */
>
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 76ccaab..c6c85f7 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1425,6 +1425,8 @@ extern int drm_debugfs_create_files(const struct drm_info_list *files,
>  extern int drm_debugfs_remove_files(const struct drm_info_list *files,
>                                     int count, struct drm_minor *minor);
>  extern int drm_debugfs_cleanup(struct drm_minor *minor);
> +extern int drm_debugfs_connector_add(struct drm_connector *connector);
> +extern void drm_debugfs_connector_remove(struct drm_connector *connector);
>  #else
>  static inline int drm_debugfs_init(struct drm_minor *minor, int minor_id,
>                                    struct dentry *root)
> @@ -1449,6 +1451,15 @@ static inline int drm_debugfs_cleanup(struct drm_minor *minor)
>  {
>         return 0;
>  }
> +
> +static inline int drm_debugfs_connector_add(struct drm_connector *connector)
> +{
> +       return 0;
> +}
> +static inline void drm_debugfs_connector_remove(struct drm_connector *connector)
> +{
> +}
> +
>  #endif
>
>                                 /* Info file support */
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 51e6255..f04f4b9 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -525,6 +525,8 @@ struct drm_connector {
>         int audio_latency[2];
>         int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
>         unsigned bad_edid_counter;
> +
> +       struct dentry *debugfs_entry;
>  };
>
>  /**
> --
> 1.9.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 3/3] drm/debugfs: add an "edid_override" file per connector
  2014-05-29 15:57 ` [PATCH 3/3] " Thomas Wood
@ 2014-06-10 16:58   ` David Herrmann
  0 siblings, 0 replies; 14+ messages in thread
From: David Herrmann @ 2014-06-10 16:58 UTC (permalink / raw)
  To: Thomas Wood; +Cc: Intel Graphics Development, dri-devel

Hi

On Thu, May 29, 2014 at 5:57 PM, Thomas Wood <thomas.wood@intel.com> wrote:
> Add a file to debugfs for each connector that allows the edid data to be
> overridden.
>
> Signed-off-by: Thomas Wood <thomas.wood@intel.com>
> ---
>  drivers/gpu/drm/drm_crtc.c         |  4 +++
>  drivers/gpu/drm/drm_debugfs.c      | 56 ++++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/drm_probe_helper.c |  9 +++++-
>  include/drm/drm_crtc.h             |  1 +
>  4 files changed, 69 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 59a2784..8543eac 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -3701,6 +3701,10 @@ int drm_mode_connector_update_edid_property(struct drm_connector *connector,
>         struct drm_device *dev = connector->dev;
>         int ret, size;
>
> +       /* ignore requests to set edid when overridden */
> +       if (connector->override_edid)
> +               return 0;
> +
>         if (connector->edid_blob_ptr)
>                 drm_property_destroy_blob(dev, connector->edid_blob_ptr);
>
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index b57b614..2c666ba 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -35,6 +35,7 @@
>  #include <linux/slab.h>
>  #include <linux/export.h>
>  #include <drm/drmP.h>
> +#include <drm/drm_edid.h>
>
>  #if defined(CONFIG_DEBUG_FS)
>
> @@ -295,6 +296,55 @@ static ssize_t connector_write(struct file *file, const char __user *ubuf,
>         return len;
>  }
>
> +static int edid_show(struct seq_file *m, void *data)
> +{
> +       struct drm_connector *connector = m->private;
> +       struct drm_property_blob *edid = connector->edid_blob_ptr;
> +
> +       if (connector->override_edid && edid)
> +               seq_write(m, edid->data, edid->length);
> +
> +       return 0;
> +}
> +
> +static int edid_open(struct inode *inode, struct file *file)
> +{
> +       struct drm_connector *dev = inode->i_private;
> +
> +       return single_open(file, edid_show, dev);
> +}
> +
> +static ssize_t edid_write(struct file *file, const char __user *ubuf,
> +                         size_t len, loff_t *offp)
> +{
> +       struct seq_file *m = file->private_data;
> +       struct drm_connector *connector = m->private;

Please copy "ubuf" before accessing it.. that's a user-space buffer.
> +
> +       if (len >= EDID_LENGTH) {

What? So if you write any invalid EDID, you reset it? That's wrong..
You should return an error in those cases.

> +               drm_mode_connector_update_edid_property(connector,
> +                                                       (struct edid *) ubuf);
> +               connector->override_edid = true;

Please check the error-code of update_edid_property() before setting
override_edid. You should also return that code if it is an error.

Furthermore, you must force override_edid = false; before calling
update_edid_property, otherwise writing twice to this file will
discard the second write (because update_edid_property() will do
nothing as override_edid is already true).

Last but not least, you *must* do an overflow check here!

> +       } else {
> +               if (connector->override_edid) {
> +                       connector->override_edid = false;
> +                       drm_mode_connector_update_edid_property(connector,
> +                                                               NULL);
> +               }
> +       }
> +
> +       return len;


Maybe you want something like this (untested!):


char *buf;
struct edid *edid;
int ret;

buf = memdup_user(ubuf, len);
if (IS_ERR(buf))
        return PTR_ERR(buf);

edid = buf;
connector->override_edid = false;

if (len == 5 && !strcmp(buf, "reset")) {
        ret = drm_mode_connector_update_edid_property(connector, NULL);
} else if (len < EDID_LENGTH || EDID_LENGTH * (1 + edid->extensions) > len) {
        ret = -EINVAL;
} else {
        ret = drm_mode_connector_update_edid_property(connector,
(struct edid*)buf);
        if (!ret)
                connector->override_edid = true;
}

kfree(buf);
return ret ? : len;



Thanks
David

> +}
> +
> +static const struct file_operations drm_edid_fops = {
> +       .owner = THIS_MODULE,
> +       .open = edid_open,
> +       .read = seq_read,
> +       .llseek = seq_lseek,
> +       .release = single_release,
> +       .write = edid_write
> +};
> +
> +
>  static const struct file_operations drm_connector_fops = {
>         .owner = THIS_MODULE,
>         .open = connector_open,
> @@ -325,6 +375,12 @@ int drm_debugfs_connector_add(struct drm_connector *connector)
>         if (!ent)
>                 return -ENOMEM;
>
> +       /* edid */
> +       ent = debugfs_create_file("edid_override", S_IRUGO, root, connector,

IRUGO? Shouldn't this be writable for root?

> +                                 &drm_edid_fops);
> +       if (!ent)
> +               return -ENOMEM;
> +
>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
> index 79f07f2..1f0dc77 100644
> --- a/drivers/gpu/drm/drm_probe_helper.c
> +++ b/drivers/gpu/drm/drm_probe_helper.c
> @@ -130,7 +130,14 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
>         count = drm_load_edid_firmware(connector);
>         if (count == 0)
>  #endif
> -               count = (*connector_funcs->get_modes)(connector);
> +       {
> +               if (connector->override_edid) {
> +                       struct edid *edid = (struct edid *) connector->edid_blob_ptr->data;
> +
> +                       count = drm_add_edid_modes(connector, edid);
> +               } else
> +                       count = (*connector_funcs->get_modes)(connector);
> +       }
>
>         if (count == 0 && connector->status == connector_status_connected)
>                 count = drm_add_modes_noedid(connector, 1024, 768);
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index f04f4b9..11fce43 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -513,6 +513,7 @@ struct drm_connector {
>
>         /* forced on connector */
>         enum drm_connector_force force;
> +       bool override_edid;
>         uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
>         struct drm_encoder *encoder; /* currently active encoder */
>
> --
> 1.9.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [PATCH v2 0/2] connector debugfs properties
  2014-05-29 15:57 ` [PATCH 2/3] drm/debugfs: add a "force" file per connector Thomas Wood
  2014-06-10 16:36   ` David Herrmann
@ 2014-06-18 16:52   ` Thomas Wood
  2014-06-18 16:52     ` [PATCH v2 1/2] drm/debugfs: add a "force" file per connector Thomas Wood
  2014-06-18 16:52     ` [PATCH v2 2/2] drm/debugfs: add an "edid_override" " Thomas Wood
  1 sibling, 2 replies; 14+ messages in thread
From: Thomas Wood @ 2014-06-18 16:52 UTC (permalink / raw)
  To: dri-devel; +Cc: intel-gfx

The following patches update the last two patches in the original series with
the suggested changes from David Herrmann.

Thomas Wood (2):
  drm/debugfs: add a "force" file per connector
  drm/debugfs: add an "edid_override" file per connector

 drivers/gpu/drm/drm_crtc.c         |  21 ++++-
 drivers/gpu/drm/drm_debugfs.c      | 182 +++++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/drm_probe_helper.c |   9 +-
 include/drm/drmP.h                 |  11 +++
 include/drm/drm_crtc.h             |   3 +
 5 files changed, 224 insertions(+), 2 deletions(-)

-- 
1.9.3

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

* [PATCH v2 1/2] drm/debugfs: add a "force" file per connector
  2014-06-18 16:52   ` [PATCH v2 0/2] connector debugfs properties Thomas Wood
@ 2014-06-18 16:52     ` Thomas Wood
  2014-06-18 20:11       ` Alex Deucher
  2014-06-18 16:52     ` [PATCH v2 2/2] drm/debugfs: add an "edid_override" " Thomas Wood
  1 sibling, 1 reply; 14+ messages in thread
From: Thomas Wood @ 2014-06-18 16:52 UTC (permalink / raw)
  To: dri-devel; +Cc: intel-gfx

Add a file to debugfs for each connector to enable modification of the
"force" connector attribute. This allows connectors to be enabled or
disabled for testing and debugging purposes.

v2: Add stricter value checking and clean up debugfs_entry if file
    creation fails in drm_debugfs_connector_add. (David Herrmann)

Signed-off-by: Thomas Wood <thomas.wood@intel.com>
---
 drivers/gpu/drm/drm_crtc.c    |  17 ++++++-
 drivers/gpu/drm/drm_debugfs.c | 114 ++++++++++++++++++++++++++++++++++++++++++
 include/drm/drmP.h            |  11 ++++
 include/drm/drm_crtc.h        |   2 +
 4 files changed, 143 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 365e2c0..fdb69f7 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -888,6 +888,8 @@ int drm_connector_init(struct drm_device *dev,
 	drm_object_attach_property(&connector->base,
 				      dev->mode_config.dpms_property, 0);
 
+	connector->debugfs_entry = NULL;
+
 out_put:
 	if (ret)
 		drm_mode_object_put(dev, &connector->base);
@@ -938,7 +940,19 @@ EXPORT_SYMBOL(drm_connector_cleanup);
  */
 int drm_connector_register(struct drm_connector *connector)
 {
-	return drm_sysfs_connector_add(connector);
+	int ret;
+
+	ret = drm_sysfs_connector_add(connector);
+	if (ret)
+		return ret;
+
+	ret = drm_debugfs_connector_add(connector);
+	if (ret) {
+		drm_sysfs_connector_remove(connector);
+		return ret;
+	}
+
+	return 0;
 }
 EXPORT_SYMBOL(drm_connector_register);
 
@@ -951,6 +965,7 @@ EXPORT_SYMBOL(drm_connector_register);
 void drm_connector_unregister(struct drm_connector *connector)
 {
 	drm_sysfs_connector_remove(connector);
+	drm_debugfs_connector_remove(connector);
 }
 EXPORT_SYMBOL(drm_connector_unregister);
 
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
index b4b51d4..8ab3f3e 100644
--- a/drivers/gpu/drm/drm_debugfs.c
+++ b/drivers/gpu/drm/drm_debugfs.c
@@ -237,5 +237,119 @@ int drm_debugfs_cleanup(struct drm_minor *minor)
 	return 0;
 }
 
+static int connector_show(struct seq_file *m, void *data)
+{
+	struct drm_connector *connector = m->private;
+	const char *status;
+
+	switch (connector->force) {
+	case DRM_FORCE_ON:
+		status = "on\n";
+		break;
+
+	case DRM_FORCE_ON_DIGITAL:
+		status = "digital\n";
+		break;
+
+	case DRM_FORCE_OFF:
+		status = "off\n";
+		break;
+
+	case DRM_FORCE_UNSPECIFIED:
+		status = "unspecified\n";
+		break;
+
+	default:
+		return 0;
+	}
+
+	seq_puts(m, status);
+
+	return 0;
+}
+
+static int connector_open(struct inode *inode, struct file *file)
+{
+	struct drm_connector *dev = inode->i_private;
+
+	return single_open(file, connector_show, dev);
+}
+
+static ssize_t connector_write(struct file *file, const char __user *ubuf,
+			       size_t len, loff_t *offp)
+{
+	struct seq_file *m = file->private_data;
+	struct drm_connector *connector = m->private;
+	char buf[12];
+
+	if (len > sizeof(buf) - 1)
+		return -EINVAL;
+
+	if (copy_from_user(buf, ubuf, len))
+		return -EFAULT;
+
+	buf[len] = '\0';
+
+	if (!strcmp(buf, "on"))
+		connector->force = DRM_FORCE_ON;
+	else if (!strcmp(buf, "digital"))
+		connector->force = DRM_FORCE_ON_DIGITAL;
+	else if (!strcmp(buf, "off"))
+		connector->force = DRM_FORCE_OFF;
+	else if (!strcmp(buf, "unspecified"))
+		connector->force = DRM_FORCE_UNSPECIFIED;
+	else
+		return -EINVAL;
+
+	return len;
+}
+
+static const struct file_operations drm_connector_fops = {
+	.owner = THIS_MODULE,
+	.open = connector_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+	.write = connector_write
+};
+
+int drm_debugfs_connector_add(struct drm_connector *connector)
+{
+	struct drm_minor *minor = connector->dev->primary;
+	struct dentry *root, *ent;
+
+	if (!minor->debugfs_root)
+		return -1;
+
+	root = debugfs_create_dir(connector->name, minor->debugfs_root);
+	if (!root)
+		return -ENOMEM;
+
+	connector->debugfs_entry = root;
+
+	/* force */
+	ent = debugfs_create_file("force", S_IRUGO | S_IWUSR, root, connector,
+				  &drm_connector_fops);
+	if (!ent)
+		goto error;
+
+	return 0;
+
+error:
+	debugfs_remove_recursive(connector->debugfs_entry);
+	connector->debugfs_entry = NULL;
+	return -ENOMEM;
+}
+
+void drm_debugfs_connector_remove(struct drm_connector *connector)
+{
+	if (!connector->debugfs_entry)
+		return;
+
+	debugfs_remove_recursive(connector->debugfs_entry);
+
+	connector->debugfs_entry = NULL;
+}
+
 #endif /* CONFIG_DEBUG_FS */
 
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 8af71a8..57ecc42 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1419,6 +1419,8 @@ extern int drm_debugfs_create_files(const struct drm_info_list *files,
 extern int drm_debugfs_remove_files(const struct drm_info_list *files,
 				    int count, struct drm_minor *minor);
 extern int drm_debugfs_cleanup(struct drm_minor *minor);
+extern int drm_debugfs_connector_add(struct drm_connector *connector);
+extern void drm_debugfs_connector_remove(struct drm_connector *connector);
 #else
 static inline int drm_debugfs_init(struct drm_minor *minor, int minor_id,
 				   struct dentry *root)
@@ -1443,6 +1445,15 @@ static inline int drm_debugfs_cleanup(struct drm_minor *minor)
 {
 	return 0;
 }
+
+static inline int drm_debugfs_connector_add(struct drm_connector *connector)
+{
+	return 0;
+}
+static inline void drm_debugfs_connector_remove(struct drm_connector *connector)
+{
+}
+
 #endif
 
 				/* Info file support */
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 40f6588..67a33bc 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -549,6 +549,8 @@ struct drm_connector {
 	int audio_latency[2];
 	int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
 	unsigned bad_edid_counter;
+
+	struct dentry *debugfs_entry;
 };
 
 /**
-- 
1.9.3

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

* [PATCH v2 2/2] drm/debugfs: add an "edid_override" file per connector
  2014-06-18 16:52   ` [PATCH v2 0/2] connector debugfs properties Thomas Wood
  2014-06-18 16:52     ` [PATCH v2 1/2] drm/debugfs: add a "force" file per connector Thomas Wood
@ 2014-06-18 16:52     ` Thomas Wood
  2014-06-18 19:37       ` Alex Deucher
  1 sibling, 1 reply; 14+ messages in thread
From: Thomas Wood @ 2014-06-18 16:52 UTC (permalink / raw)
  To: dri-devel; +Cc: intel-gfx

Add a file to debugfs for each connector to allow the EDID to be
overridden.

v2: Copy ubuf before accessing it and reject invalid length data. (David
    Herrmann)
    Ensure override_edid is reset when a new EDID value is written.
    (David Herrmann)
    Fix the debugfs file permissions. (David Herrmann)

Signed-off-by: Thomas Wood <thomas.wood@intel.com>
---
 drivers/gpu/drm/drm_crtc.c         |  4 +++
 drivers/gpu/drm/drm_debugfs.c      | 68 ++++++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/drm_probe_helper.c |  9 ++++-
 include/drm/drm_crtc.h             |  1 +
 4 files changed, 81 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index fdb69f7..4b3bbc4 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -3916,6 +3916,10 @@ int drm_mode_connector_update_edid_property(struct drm_connector *connector,
 	struct drm_device *dev = connector->dev;
 	int ret, size;
 
+	/* ignore requests to set edid when overridden */
+	if (connector->override_edid)
+		return 0;
+
 	if (connector->edid_blob_ptr)
 		drm_property_destroy_blob(dev, connector->edid_blob_ptr);
 
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
index 8ab3f3e..13bd429 100644
--- a/drivers/gpu/drm/drm_debugfs.c
+++ b/drivers/gpu/drm/drm_debugfs.c
@@ -35,6 +35,7 @@
 #include <linux/slab.h>
 #include <linux/export.h>
 #include <drm/drmP.h>
+#include <drm/drm_edid.h>
 
 #if defined(CONFIG_DEBUG_FS)
 
@@ -304,6 +305,67 @@ static ssize_t connector_write(struct file *file, const char __user *ubuf,
 	return len;
 }
 
+static int edid_show(struct seq_file *m, void *data)
+{
+	struct drm_connector *connector = m->private;
+	struct drm_property_blob *edid = connector->edid_blob_ptr;
+
+	if (connector->override_edid && edid)
+		seq_write(m, edid->data, edid->length);
+
+	return 0;
+}
+
+static int edid_open(struct inode *inode, struct file *file)
+{
+	struct drm_connector *dev = inode->i_private;
+
+	return single_open(file, edid_show, dev);
+}
+
+static ssize_t edid_write(struct file *file, const char __user *ubuf,
+			  size_t len, loff_t *offp)
+{
+	struct seq_file *m = file->private_data;
+	struct drm_connector *connector = m->private;
+	char *buf;
+	struct edid *edid;
+	int ret;
+
+	buf = memdup_user(ubuf, len);
+	if (IS_ERR(buf))
+		return PTR_ERR(buf);
+
+	edid = (struct edid *) buf;
+
+	if (len == 5 && !strncmp(buf, "reset", 5)) {
+		connector->override_edid = false;
+		ret = drm_mode_connector_update_edid_property(connector, NULL);
+	} else if (len < EDID_LENGTH ||
+		   EDID_LENGTH * (1 + edid->extensions) > len)
+		ret = -EINVAL;
+	else {
+		connector->override_edid = false;
+		ret = drm_mode_connector_update_edid_property(connector, edid);
+		if (!ret)
+			connector->override_edid = true;
+	}
+
+	kfree(buf);
+
+	return (ret) ? ret : len;
+}
+
+static const struct file_operations drm_edid_fops = {
+	.owner = THIS_MODULE,
+	.open = edid_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+	.write = edid_write
+};
+
+
 static const struct file_operations drm_connector_fops = {
 	.owner = THIS_MODULE,
 	.open = connector_open,
@@ -333,6 +395,12 @@ int drm_debugfs_connector_add(struct drm_connector *connector)
 	if (!ent)
 		goto error;
 
+	/* edid */
+	ent = debugfs_create_file("edid_override", S_IRUGO | S_IWUSR, root,
+				  connector, &drm_edid_fops);
+	if (!ent)
+		goto error;
+
 	return 0;
 
 error:
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index d22676b..db7d250 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -130,7 +130,14 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
 	count = drm_load_edid_firmware(connector);
 	if (count == 0)
 #endif
-		count = (*connector_funcs->get_modes)(connector);
+	{
+		if (connector->override_edid) {
+			struct edid *edid = (struct edid *) connector->edid_blob_ptr->data;
+
+			count = drm_add_edid_modes(connector, edid);
+		} else
+			count = (*connector_funcs->get_modes)(connector);
+	}
 
 	if (count == 0 && connector->status == connector_status_connected)
 		count = drm_add_modes_noedid(connector, 1024, 768);
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 67a33bc..d09b471 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -537,6 +537,7 @@ struct drm_connector {
 
 	/* forced on connector */
 	enum drm_connector_force force;
+	bool override_edid;
 	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
 	struct drm_encoder *encoder; /* currently active encoder */
 
-- 
1.9.3

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

* Re: [PATCH v2 2/2] drm/debugfs: add an "edid_override" file per connector
  2014-06-18 16:52     ` [PATCH v2 2/2] drm/debugfs: add an "edid_override" " Thomas Wood
@ 2014-06-18 19:37       ` Alex Deucher
  2014-06-18 20:08         ` [Intel-gfx] " Daniel Vetter
  0 siblings, 1 reply; 14+ messages in thread
From: Alex Deucher @ 2014-06-18 19:37 UTC (permalink / raw)
  To: Thomas Wood; +Cc: Intel Graphics Development, Maling list - DRI developers

On Wed, Jun 18, 2014 at 12:52 PM, Thomas Wood <thomas.wood@intel.com> wrote:
> Add a file to debugfs for each connector to allow the EDID to be
> overridden.
>
> v2: Copy ubuf before accessing it and reject invalid length data. (David
>     Herrmann)
>     Ensure override_edid is reset when a new EDID value is written.
>     (David Herrmann)
>     Fix the debugfs file permissions. (David Herrmann)
>
> Signed-off-by: Thomas Wood <thomas.wood@intel.com>

One minor nit below, but either way:

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

> ---
>  drivers/gpu/drm/drm_crtc.c         |  4 +++
>  drivers/gpu/drm/drm_debugfs.c      | 68 ++++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/drm_probe_helper.c |  9 ++++-
>  include/drm/drm_crtc.h             |  1 +
>  4 files changed, 81 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index fdb69f7..4b3bbc4 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -3916,6 +3916,10 @@ int drm_mode_connector_update_edid_property(struct drm_connector *connector,
>         struct drm_device *dev = connector->dev;
>         int ret, size;
>
> +       /* ignore requests to set edid when overridden */
> +       if (connector->override_edid)
> +               return 0;
> +
>         if (connector->edid_blob_ptr)
>                 drm_property_destroy_blob(dev, connector->edid_blob_ptr);
>
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index 8ab3f3e..13bd429 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -35,6 +35,7 @@
>  #include <linux/slab.h>
>  #include <linux/export.h>
>  #include <drm/drmP.h>
> +#include <drm/drm_edid.h>
>
>  #if defined(CONFIG_DEBUG_FS)
>
> @@ -304,6 +305,67 @@ static ssize_t connector_write(struct file *file, const char __user *ubuf,
>         return len;
>  }
>
> +static int edid_show(struct seq_file *m, void *data)
> +{
> +       struct drm_connector *connector = m->private;
> +       struct drm_property_blob *edid = connector->edid_blob_ptr;
> +
> +       if (connector->override_edid && edid)
> +               seq_write(m, edid->data, edid->length);
> +
> +       return 0;
> +}
> +
> +static int edid_open(struct inode *inode, struct file *file)
> +{
> +       struct drm_connector *dev = inode->i_private;
> +
> +       return single_open(file, edid_show, dev);
> +}
> +
> +static ssize_t edid_write(struct file *file, const char __user *ubuf,
> +                         size_t len, loff_t *offp)
> +{
> +       struct seq_file *m = file->private_data;
> +       struct drm_connector *connector = m->private;
> +       char *buf;
> +       struct edid *edid;
> +       int ret;
> +
> +       buf = memdup_user(ubuf, len);
> +       if (IS_ERR(buf))
> +               return PTR_ERR(buf);
> +
> +       edid = (struct edid *) buf;
> +
> +       if (len == 5 && !strncmp(buf, "reset", 5)) {
> +               connector->override_edid = false;
> +               ret = drm_mode_connector_update_edid_property(connector, NULL);
> +       } else if (len < EDID_LENGTH ||
> +                  EDID_LENGTH * (1 + edid->extensions) > len)
> +               ret = -EINVAL;
> +       else {
> +               connector->override_edid = false;

Might be worth doing some minimal validation of the EDID (e.g., make
sure it has a valid header).

Alex

> +               ret = drm_mode_connector_update_edid_property(connector, edid);
> +               if (!ret)
> +                       connector->override_edid = true;
> +       }
> +
> +       kfree(buf);
> +
> +       return (ret) ? ret : len;
> +}
> +
> +static const struct file_operations drm_edid_fops = {
> +       .owner = THIS_MODULE,
> +       .open = edid_open,
> +       .read = seq_read,
> +       .llseek = seq_lseek,
> +       .release = single_release,
> +       .write = edid_write
> +};
> +
> +
>  static const struct file_operations drm_connector_fops = {
>         .owner = THIS_MODULE,
>         .open = connector_open,
> @@ -333,6 +395,12 @@ int drm_debugfs_connector_add(struct drm_connector *connector)
>         if (!ent)
>                 goto error;
>
> +       /* edid */
> +       ent = debugfs_create_file("edid_override", S_IRUGO | S_IWUSR, root,
> +                                 connector, &drm_edid_fops);
> +       if (!ent)
> +               goto error;
> +
>         return 0;
>
>  error:
> diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
> index d22676b..db7d250 100644
> --- a/drivers/gpu/drm/drm_probe_helper.c
> +++ b/drivers/gpu/drm/drm_probe_helper.c
> @@ -130,7 +130,14 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
>         count = drm_load_edid_firmware(connector);
>         if (count == 0)
>  #endif
> -               count = (*connector_funcs->get_modes)(connector);
> +       {
> +               if (connector->override_edid) {
> +                       struct edid *edid = (struct edid *) connector->edid_blob_ptr->data;
> +
> +                       count = drm_add_edid_modes(connector, edid);
> +               } else
> +                       count = (*connector_funcs->get_modes)(connector);
> +       }
>
>         if (count == 0 && connector->status == connector_status_connected)
>                 count = drm_add_modes_noedid(connector, 1024, 768);
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 67a33bc..d09b471 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -537,6 +537,7 @@ struct drm_connector {
>
>         /* forced on connector */
>         enum drm_connector_force force;
> +       bool override_edid;
>         uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
>         struct drm_encoder *encoder; /* currently active encoder */
>
> --
> 1.9.3
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [Intel-gfx] [PATCH v2 2/2] drm/debugfs: add an "edid_override" file per connector
  2014-06-18 19:37       ` Alex Deucher
@ 2014-06-18 20:08         ` Daniel Vetter
  0 siblings, 0 replies; 14+ messages in thread
From: Daniel Vetter @ 2014-06-18 20:08 UTC (permalink / raw)
  To: Alex Deucher
  Cc: Intel Graphics Development, Thomas Wood, Maling list - DRI developers

On Wed, Jun 18, 2014 at 03:37:30PM -0400, Alex Deucher wrote:
> On Wed, Jun 18, 2014 at 12:52 PM, Thomas Wood <thomas.wood@intel.com> wrote:
> > +static ssize_t edid_write(struct file *file, const char __user *ubuf,
> > +                         size_t len, loff_t *offp)
> > +{
> > +       struct seq_file *m = file->private_data;
> > +       struct drm_connector *connector = m->private;
> > +       char *buf;
> > +       struct edid *edid;
> > +       int ret;
> > +
> > +       buf = memdup_user(ubuf, len);
> > +       if (IS_ERR(buf))
> > +               return PTR_ERR(buf);
> > +
> > +       edid = (struct edid *) buf;
> > +
> > +       if (len == 5 && !strncmp(buf, "reset", 5)) {
> > +               connector->override_edid = false;
> > +               ret = drm_mode_connector_update_edid_property(connector, NULL);
> > +       } else if (len < EDID_LENGTH ||
> > +                  EDID_LENGTH * (1 + edid->extensions) > len)
> > +               ret = -EINVAL;
> > +       else {
> > +               connector->override_edid = false;
> 
> Might be worth doing some minimal validation of the EDID (e.g., make
> sure it has a valid header).

Actually we also have plans to abuse this for a bit of nasty EDID
injection to exercise our parser. So at most we should do just enough
checking to make sure the claimed edid length field agrees with the edid
itself (which we have), but beyond that any kind of garbage should be
allowed imo.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

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

* Re: [PATCH v2 1/2] drm/debugfs: add a "force" file per connector
  2014-06-18 16:52     ` [PATCH v2 1/2] drm/debugfs: add a "force" file per connector Thomas Wood
@ 2014-06-18 20:11       ` Alex Deucher
  0 siblings, 0 replies; 14+ messages in thread
From: Alex Deucher @ 2014-06-18 20:11 UTC (permalink / raw)
  To: Thomas Wood; +Cc: Intel Graphics Development, Maling list - DRI developers

On Wed, Jun 18, 2014 at 12:52 PM, Thomas Wood <thomas.wood@intel.com> wrote:
> Add a file to debugfs for each connector to enable modification of the
> "force" connector attribute. This allows connectors to be enabled or
> disabled for testing and debugging purposes.
>
> v2: Add stricter value checking and clean up debugfs_entry if file
>     creation fails in drm_debugfs_connector_add. (David Herrmann)
>
> Signed-off-by: Thomas Wood <thomas.wood@intel.com>

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

> ---
>  drivers/gpu/drm/drm_crtc.c    |  17 ++++++-
>  drivers/gpu/drm/drm_debugfs.c | 114 ++++++++++++++++++++++++++++++++++++++++++
>  include/drm/drmP.h            |  11 ++++
>  include/drm/drm_crtc.h        |   2 +
>  4 files changed, 143 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 365e2c0..fdb69f7 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -888,6 +888,8 @@ int drm_connector_init(struct drm_device *dev,
>         drm_object_attach_property(&connector->base,
>                                       dev->mode_config.dpms_property, 0);
>
> +       connector->debugfs_entry = NULL;
> +
>  out_put:
>         if (ret)
>                 drm_mode_object_put(dev, &connector->base);
> @@ -938,7 +940,19 @@ EXPORT_SYMBOL(drm_connector_cleanup);
>   */
>  int drm_connector_register(struct drm_connector *connector)
>  {
> -       return drm_sysfs_connector_add(connector);
> +       int ret;
> +
> +       ret = drm_sysfs_connector_add(connector);
> +       if (ret)
> +               return ret;
> +
> +       ret = drm_debugfs_connector_add(connector);
> +       if (ret) {
> +               drm_sysfs_connector_remove(connector);
> +               return ret;
> +       }
> +
> +       return 0;
>  }
>  EXPORT_SYMBOL(drm_connector_register);
>
> @@ -951,6 +965,7 @@ EXPORT_SYMBOL(drm_connector_register);
>  void drm_connector_unregister(struct drm_connector *connector)
>  {
>         drm_sysfs_connector_remove(connector);
> +       drm_debugfs_connector_remove(connector);
>  }
>  EXPORT_SYMBOL(drm_connector_unregister);
>
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index b4b51d4..8ab3f3e 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -237,5 +237,119 @@ int drm_debugfs_cleanup(struct drm_minor *minor)
>         return 0;
>  }
>
> +static int connector_show(struct seq_file *m, void *data)
> +{
> +       struct drm_connector *connector = m->private;
> +       const char *status;
> +
> +       switch (connector->force) {
> +       case DRM_FORCE_ON:
> +               status = "on\n";
> +               break;
> +
> +       case DRM_FORCE_ON_DIGITAL:
> +               status = "digital\n";
> +               break;
> +
> +       case DRM_FORCE_OFF:
> +               status = "off\n";
> +               break;
> +
> +       case DRM_FORCE_UNSPECIFIED:
> +               status = "unspecified\n";
> +               break;
> +
> +       default:
> +               return 0;
> +       }
> +
> +       seq_puts(m, status);
> +
> +       return 0;
> +}
> +
> +static int connector_open(struct inode *inode, struct file *file)
> +{
> +       struct drm_connector *dev = inode->i_private;
> +
> +       return single_open(file, connector_show, dev);
> +}
> +
> +static ssize_t connector_write(struct file *file, const char __user *ubuf,
> +                              size_t len, loff_t *offp)
> +{
> +       struct seq_file *m = file->private_data;
> +       struct drm_connector *connector = m->private;
> +       char buf[12];
> +
> +       if (len > sizeof(buf) - 1)
> +               return -EINVAL;
> +
> +       if (copy_from_user(buf, ubuf, len))
> +               return -EFAULT;
> +
> +       buf[len] = '\0';
> +
> +       if (!strcmp(buf, "on"))
> +               connector->force = DRM_FORCE_ON;
> +       else if (!strcmp(buf, "digital"))
> +               connector->force = DRM_FORCE_ON_DIGITAL;
> +       else if (!strcmp(buf, "off"))
> +               connector->force = DRM_FORCE_OFF;
> +       else if (!strcmp(buf, "unspecified"))
> +               connector->force = DRM_FORCE_UNSPECIFIED;
> +       else
> +               return -EINVAL;
> +
> +       return len;
> +}
> +
> +static const struct file_operations drm_connector_fops = {
> +       .owner = THIS_MODULE,
> +       .open = connector_open,
> +       .read = seq_read,
> +       .llseek = seq_lseek,
> +       .release = single_release,
> +       .write = connector_write
> +};
> +
> +int drm_debugfs_connector_add(struct drm_connector *connector)
> +{
> +       struct drm_minor *minor = connector->dev->primary;
> +       struct dentry *root, *ent;
> +
> +       if (!minor->debugfs_root)
> +               return -1;
> +
> +       root = debugfs_create_dir(connector->name, minor->debugfs_root);
> +       if (!root)
> +               return -ENOMEM;
> +
> +       connector->debugfs_entry = root;
> +
> +       /* force */
> +       ent = debugfs_create_file("force", S_IRUGO | S_IWUSR, root, connector,
> +                                 &drm_connector_fops);
> +       if (!ent)
> +               goto error;
> +
> +       return 0;
> +
> +error:
> +       debugfs_remove_recursive(connector->debugfs_entry);
> +       connector->debugfs_entry = NULL;
> +       return -ENOMEM;
> +}
> +
> +void drm_debugfs_connector_remove(struct drm_connector *connector)
> +{
> +       if (!connector->debugfs_entry)
> +               return;
> +
> +       debugfs_remove_recursive(connector->debugfs_entry);
> +
> +       connector->debugfs_entry = NULL;
> +}
> +
>  #endif /* CONFIG_DEBUG_FS */
>
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 8af71a8..57ecc42 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1419,6 +1419,8 @@ extern int drm_debugfs_create_files(const struct drm_info_list *files,
>  extern int drm_debugfs_remove_files(const struct drm_info_list *files,
>                                     int count, struct drm_minor *minor);
>  extern int drm_debugfs_cleanup(struct drm_minor *minor);
> +extern int drm_debugfs_connector_add(struct drm_connector *connector);
> +extern void drm_debugfs_connector_remove(struct drm_connector *connector);
>  #else
>  static inline int drm_debugfs_init(struct drm_minor *minor, int minor_id,
>                                    struct dentry *root)
> @@ -1443,6 +1445,15 @@ static inline int drm_debugfs_cleanup(struct drm_minor *minor)
>  {
>         return 0;
>  }
> +
> +static inline int drm_debugfs_connector_add(struct drm_connector *connector)
> +{
> +       return 0;
> +}
> +static inline void drm_debugfs_connector_remove(struct drm_connector *connector)
> +{
> +}
> +
>  #endif
>
>                                 /* Info file support */
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 40f6588..67a33bc 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -549,6 +549,8 @@ struct drm_connector {
>         int audio_latency[2];
>         int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
>         unsigned bad_edid_counter;
> +
> +       struct dentry *debugfs_entry;
>  };
>
>  /**
> --
> 1.9.3
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 1/3] drm: add register and unregister functions for connectors
  2014-06-10 16:21   ` David Herrmann
@ 2014-06-19  6:57     ` Daniel Vetter
  0 siblings, 0 replies; 14+ messages in thread
From: Daniel Vetter @ 2014-06-19  6:57 UTC (permalink / raw)
  To: David Herrmann
  Cc: Daniel Vetter, Intel Graphics Development, Thomas Wood, dri-devel

On Tue, Jun 10, 2014 at 06:21:35PM +0200, David Herrmann wrote:
> Hi
> 
> On Thu, May 29, 2014 at 5:57 PM, Thomas Wood <thomas.wood@intel.com> wrote:
> > Introduce generic functions to register and unregister connectors. This
> > provides a common place to add and remove associated user space
> > interfaces.
> >
> > Signed-off-by: Thomas Wood <thomas.wood@intel.com>
> > ---
> >  Documentation/DocBook/drm.tmpl                |  6 +++---
> >  drivers/gpu/drm/armada/armada_output.c        |  4 ++--
> >  drivers/gpu/drm/ast/ast_mode.c                |  4 ++--
> >  drivers/gpu/drm/bridge/ptn3460.c              |  2 +-
> >  drivers/gpu/drm/drm_crtc.c                    | 30 ++++++++++++++++++++++++++-
> >  drivers/gpu/drm/drm_sysfs.c                   |  2 --
> >  drivers/gpu/drm/exynos/exynos_dp_core.c       |  2 +-
> >  drivers/gpu/drm/exynos/exynos_drm_connector.c |  6 +++---
> >  drivers/gpu/drm/exynos/exynos_drm_dpi.c       |  4 ++--
> >  drivers/gpu/drm/exynos/exynos_drm_dsi.c       |  2 +-
> >  drivers/gpu/drm/exynos/exynos_drm_vidi.c      |  2 +-
> >  drivers/gpu/drm/exynos/exynos_hdmi.c          |  2 +-
> >  drivers/gpu/drm/gma500/cdv_intel_crt.c        |  4 ++--
> >  drivers/gpu/drm/gma500/cdv_intel_dp.c         |  4 ++--
> >  drivers/gpu/drm/gma500/cdv_intel_hdmi.c       |  4 ++--
> >  drivers/gpu/drm/gma500/cdv_intel_lvds.c       |  4 ++--
> >  drivers/gpu/drm/gma500/mdfld_dsi_output.c     |  4 ++--
> >  drivers/gpu/drm/gma500/oaktrail_hdmi.c        |  2 +-
> >  drivers/gpu/drm/gma500/oaktrail_lvds.c        |  2 +-
> >  drivers/gpu/drm/gma500/psb_intel_lvds.c       |  4 ++--
> >  drivers/gpu/drm/gma500/psb_intel_sdvo.c       |  4 ++--
> >  drivers/gpu/drm/i915/intel_crt.c              |  2 +-
> >  drivers/gpu/drm/i915/intel_display.c          |  2 +-
> >  drivers/gpu/drm/i915/intel_dp.c               |  4 ++--
> >  drivers/gpu/drm/i915/intel_dsi.c              |  2 +-
> >  drivers/gpu/drm/i915/intel_dvo.c              |  2 +-
> >  drivers/gpu/drm/i915/intel_hdmi.c             |  2 +-
> >  drivers/gpu/drm/i915/intel_lvds.c             |  2 +-
> >  drivers/gpu/drm/i915/intel_sdvo.c             | 10 ++++-----
> >  drivers/gpu/drm/i915/intel_tv.c               |  2 +-
> >  drivers/gpu/drm/mgag200/mgag200_mode.c        |  2 +-
> >  drivers/gpu/drm/msm/hdmi/hdmi_connector.c     |  4 ++--
> >  drivers/gpu/drm/nouveau/nouveau_connector.c   |  4 ++--
> >  drivers/gpu/drm/omapdrm/omap_connector.c      |  4 ++--
> >  drivers/gpu/drm/qxl/qxl_display.c             |  4 ++--
> >  drivers/gpu/drm/radeon/radeon_connectors.c    |  6 +++---
> >  drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c     |  4 ++--
> >  drivers/gpu/drm/rcar-du/rcar_du_vgacon.c      |  4 ++--
> >  drivers/gpu/drm/shmobile/shmob_drm_crtc.c     |  6 +++---
> >  drivers/gpu/drm/tegra/output.c                |  4 ++--
> >  drivers/gpu/drm/tilcdc/tilcdc_panel.c         |  2 +-
> >  drivers/gpu/drm/tilcdc/tilcdc_slave.c         |  2 +-
> >  drivers/gpu/drm/tilcdc/tilcdc_tfp410.c        |  2 +-
> >  drivers/gpu/drm/udl/udl_connector.c           |  4 ++--
> >  drivers/gpu/drm/vmwgfx/vmwgfx_kms.c           |  2 +-
> >  drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c           |  2 +-
> >  drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c          |  2 +-
> >  drivers/staging/imx-drm/imx-drm-core.c        |  6 +++---
> 
> You even caught imx.. and you removed the EXPORT_SYMBOL. So looks all
> good to me.
> I like that refactoring and I don't think we need an ACK from all
> driver authors. This is:
> 
> Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
> 
> Maybe Daniel or Dave can pick this up?

I've pulled in all three patches into my topic/core-stuff branch and will
send a pull request to Dave once drm-next is open.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

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

end of thread, other threads:[~2014-06-19  6:57 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-29 15:57 [PATCH 0/3] connector debugfs properties Thomas Wood
2014-05-29 15:57 ` [PATCH 1/3] drm: add register and unregister functions for connectors Thomas Wood
2014-06-10 16:21   ` David Herrmann
2014-06-19  6:57     ` Daniel Vetter
2014-05-29 15:57 ` [PATCH 2/3] drm/debugfs: add a "force" file per connector Thomas Wood
2014-06-10 16:36   ` David Herrmann
2014-06-18 16:52   ` [PATCH v2 0/2] connector debugfs properties Thomas Wood
2014-06-18 16:52     ` [PATCH v2 1/2] drm/debugfs: add a "force" file per connector Thomas Wood
2014-06-18 20:11       ` Alex Deucher
2014-06-18 16:52     ` [PATCH v2 2/2] drm/debugfs: add an "edid_override" " Thomas Wood
2014-06-18 19:37       ` Alex Deucher
2014-06-18 20:08         ` [Intel-gfx] " Daniel Vetter
2014-05-29 15:57 ` [PATCH 3/3] " Thomas Wood
2014-06-10 16:58   ` David Herrmann

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.