As the old drm and the new drmm variants of drm_writeback_connector
requires almost the same initialization, create an internal helper to do
most of the initialization work.

Signed-off-by: Louis Chauvet <louis.chau...@bootlin.com>
---
 drivers/gpu/drm/drm_writeback.c | 87 +++++++++++++++++++++++++++++------------
 1 file changed, 61 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 
c274cba257cde5f4b446df3854974e690c60bf7b..494400b09796d37ed89145da45d5f1e029632de5
 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -219,7 +219,6 @@ EXPORT_SYMBOL(drm_writeback_connector_init);
  * @dev: DRM device
  * @wb_connector: Writeback connector to initialize
  * @enc: handle to the already initialized drm encoder
- * @con_funcs: Connector funcs vtable
  * @formats: Array of supported pixel formats for the writeback engine
  * @n_formats: Length of the formats array
  *
@@ -235,41 +234,31 @@ EXPORT_SYMBOL(drm_writeback_connector_init);
  * assigning the encoder helper functions, possible_crtcs and any other encoder
  * specific operation.
  *
- * Drivers should always use this function instead of drm_connector_init() to
- * set up writeback connectors if they want to manage themselves the lifetime 
of the
- * associated encoder.
- *
  * Returns: 0 on success, or a negative error code
  */
-int drm_writeback_connector_init_with_encoder(struct drm_device *dev,
-               struct drm_writeback_connector *wb_connector, struct 
drm_encoder *enc,
-               const struct drm_connector_funcs *con_funcs, const u32 *formats,
-               int n_formats)
+static int __drm_writeback_connector_init(struct drm_device *dev,
+                                         struct drm_writeback_connector 
*wb_connector,
+                                         struct drm_encoder *enc, const u32 
*formats,
+                                         int n_formats)
 {
-       struct drm_property_blob *blob;
        struct drm_connector *connector = &wb_connector->base;
        struct drm_mode_config *config = &dev->mode_config;
+       struct drm_property_blob *blob;
        int ret = create_writeback_properties(dev);
 
        if (ret != 0)
                return ret;
 
-       blob = drm_property_create_blob(dev, n_formats * sizeof(*formats),
-                                       formats);
-       if (IS_ERR(blob))
-               return PTR_ERR(blob);
-
-
        connector->interlace_allowed = 0;
 
-       ret = drm_connector_init(dev, connector, con_funcs,
-                                DRM_MODE_CONNECTOR_WRITEBACK);
-       if (ret)
-               goto connector_fail;
-
        ret = drm_connector_attach_encoder(connector, enc);
        if (ret)
-               goto attach_fail;
+               return ret;
+
+       blob = drm_property_create_blob(dev, n_formats * sizeof(*formats),
+                                       formats);
+       if (IS_ERR(blob))
+               return PTR_ERR(blob);
 
        INIT_LIST_HEAD(&wb_connector->job_queue);
        spin_lock_init(&wb_connector->job_lock);
@@ -292,11 +281,57 @@ int drm_writeback_connector_init_with_encoder(struct 
drm_device *dev,
        wb_connector->pixel_formats_blob_ptr = blob;
 
        return 0;
+}
+
+/**
+ * drm_writeback_connector_init_with_encoder - Initialize a writeback 
connector with
+ * a custom encoder
+ *
+ * @dev: DRM device
+ * @wb_connector: Writeback connector to initialize
+ * @enc: handle to the already initialized drm encoder
+ * @con_funcs: Connector funcs vtable
+ * @formats: Array of supported pixel formats for the writeback engine
+ * @n_formats: Length of the formats array
+ *
+ * This function creates the writeback-connector-specific properties if they
+ * have not been already created, initializes the connector as
+ * type DRM_MODE_CONNECTOR_WRITEBACK, and correctly initializes the property
+ * values.
+ *
+ * This function assumes that the drm_writeback_connector's encoder has 
already been
+ * created and initialized before invoking this function.
+ *
+ * In addition, this function also assumes that callers of this API will manage
+ * assigning the encoder helper functions, possible_crtcs and any other encoder
+ * specific operation.
+ *
+ * Drivers should always use this function instead of drm_connector_init() to
+ * set up writeback connectors if they want to manage themselves the lifetime 
of the
+ * associated encoder.
+ *
+ * Returns: 0 on success, or a negative error code
+ */
+int drm_writeback_connector_init_with_encoder(struct drm_device *dev,
+                                             struct drm_writeback_connector 
*wb_connector,
+                                             struct drm_encoder *enc,
+                                             const struct drm_connector_funcs 
*con_funcs,
+                                             const u32 *formats, int n_formats)
+{
+       struct drm_property_blob *blob;
+       struct drm_connector *connector = &wb_connector->base;
+       int ret;
+
+       ret = drm_connector_init(dev, connector, con_funcs,
+                                DRM_MODE_CONNECTOR_WRITEBACK);
+       if (ret)
+               return ret;
+
+       ret = __drm_writeback_connector_init(dev, wb_connector, enc, formats,
+                                            n_formats);
+       if (ret)
+               drm_connector_cleanup(connector);
 
-attach_fail:
-       drm_connector_cleanup(connector);
-connector_fail:
-       drm_property_blob_put(blob);
        return ret;
 }
 EXPORT_SYMBOL(drm_writeback_connector_init_with_encoder);

-- 
2.47.1

Reply via email to