Instead of creating an internal encoder for the writeback
connector to satisfy DRM requirements, allow the clients
to pass a real encoder to it by changing the drm_writeback's
encoder to a pointer.

If a real encoder is not passed, drm_writeback_connector_init
will internally allocate one.

This will help the clients to manage the real encoder states
better as they will allocate and maintain the encoder.

Signed-off-by: Abhinav Kumar <quic_abhin...@quicinc.com>
---
 drivers/gpu/drm/drm_writeback.c | 11 +++++++----
 include/drm/drm_writeback.h     |  2 +-
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index dccf4504..fdb7381 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -189,8 +189,11 @@ int drm_writeback_connector_init(struct drm_device *dev,
        if (IS_ERR(blob))
                return PTR_ERR(blob);
 
-       drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs);
-       ret = drm_encoder_init(dev, &wb_connector->encoder,
+       /* allocate the internal drm encoder if a real one wasnt passed */
+       if (!wb_connector->encoder)
+               wb_connector->encoder = devm_kzalloc(dev->dev, sizeof(struct 
drm_encoder), GFP_KERNEL);
+       drm_encoder_helper_add(wb_connector->encoder, enc_helper_funcs);
+       ret = drm_encoder_init(dev, wb_connector->encoder,
                               &drm_writeback_encoder_funcs,
                               DRM_MODE_ENCODER_VIRTUAL, NULL);
        if (ret)
@@ -204,7 +207,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
                goto connector_fail;
 
        ret = drm_connector_attach_encoder(connector,
-                                               &wb_connector->encoder);
+                                               wb_connector->encoder);
        if (ret)
                goto attach_fail;
 
@@ -233,7 +236,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
 attach_fail:
        drm_connector_cleanup(connector);
 connector_fail:
-       drm_encoder_cleanup(&wb_connector->encoder);
+       drm_encoder_cleanup(wb_connector->encoder);
 fail:
        drm_property_blob_put(blob);
        return ret;
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 9697d27..f0d8147 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -31,7 +31,7 @@ struct drm_writeback_connector {
         * by passing the @enc_funcs parameter to drm_writeback_connector_init()
         * function.
         */
-       struct drm_encoder encoder;
+       struct drm_encoder *encoder;
 
        /**
         * @pixel_formats_blob_ptr:
-- 
2.7.4

Reply via email to