In preparation for adding hotpluggable bridges into the
drm_bridge_connector, we need connectors to be created dynamically, both
regular connectors and HDMI ones. drm_connector_init() already has a
dynamic variant, add one for HDMI connectors too.

Signed-off-by: Luca Ceresoli <[email protected]>

---

Changes in v2:
- rebased on current drm-misc-next: now drm_connector_hdmi_init() can fail,
  so call drm_connector_cleanup(connector) if that happens
---
 drivers/gpu/drm/drm_connector.c | 42 +++++++++++++++++++++++++++++++++++++++++
 include/drm/drm_connector.h     |  6 ++++++
 2 files changed, 48 insertions(+)

diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index f5bd08640d25..f264cab0d184 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -708,6 +708,48 @@ int drmm_connector_hdmi_init(struct drm_device *dev,
 }
 EXPORT_SYMBOL(drmm_connector_hdmi_init);
 
+/**
+ * drmm_connector_hdmi_init - Init a preallocated dynamic HDMI connector
+ * @dev: DRM device
+ * @connector: A pointer to the HDMI connector to init
+ * @funcs: callbacks for this connector
+ * @hdmi_funcs: HDMI-related callbacks and capabilities for this connector
+ * @connector_type: user visible type of the connector
+ * @ddc: optional pointer to the associated ddc adapter
+ *
+ * Initialises a preallocated dynamic HDMI connector. Connectors can be
+ * subclassed as part of driver connector objects.
+ *
+ * See drm_connector_dynamic_init(), the same constraints apply here. This
+ * is just the HDMI version.
+ *
+ * Returns:
+ * Zero on success, error code on failure.
+ */
+int drm_connector_hdmi_dynamic_init(struct drm_device *dev,
+                                   struct drm_connector *connector,
+                                   const struct drm_connector_funcs *funcs,
+                                   const struct drm_connector_hdmi_funcs 
*hdmi_funcs,
+                                   int connector_type,
+                                   struct i2c_adapter *ddc)
+{
+       int ret;
+
+       ret = drm_connector_hdmi_sanity_checks(dev, connector, hdmi_funcs, 
connector_type);
+       if (ret)
+               return ret;
+
+       ret = drm_connector_dynamic_init(dev, connector, funcs, connector_type, 
ddc);
+       if (ret)
+               return ret;
+
+       if (ret)
+               drm_connector_cleanup(connector);
+
+       return drm_connector_hdmi_initialize(dev, connector, hdmi_funcs);
+}
+EXPORT_SYMBOL(drm_connector_hdmi_dynamic_init);
+
 /**
  * drmm_connector_hdmi_ini2 - Init a preallocated HDMI connector
  * @dev: DRM device
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 2ee7c59329aa..48bbbc365c93 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -2743,6 +2743,12 @@ int drmm_connector_hdmi_init(struct drm_device *dev,
                             const struct drm_connector_hdmi_funcs *hdmi_funcs,
                             int connector_type,
                             struct i2c_adapter *ddc);
+int drm_connector_hdmi_dynamic_init(struct drm_device *dev,
+                                   struct drm_connector *connector,
+                                   const struct drm_connector_funcs *funcs,
+                                   const struct drm_connector_hdmi_funcs 
*hdmi_funcs,
+                                   int connector_type,
+                                   struct i2c_adapter *ddc);
 int drmm_connector_hdmi_ini2(struct drm_device *dev,
                             struct drm_connector *connector,
                             const char *vendor, const char *product,

-- 
2.55.0

Reply via email to