On Thu, 20 Jan 2022, Abhinav Kumar <quic_abhinavk@xxxxxxxxxxx> wrote: > 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. See also the thread starting at [1], and please try to coordinate. I don't know what the end result should be like, I'm just saying please collaborate instead of racing to get one set of changes in. BR, Jani. [1] https://patchwork.freedesktop.org/patch/msgid/20220111101801.28310-1-suraj.kandpal@xxxxxxxxx > > Signed-off-by: Abhinav Kumar <quic_abhinavk@xxxxxxxxxxx> > --- > 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: -- Jani Nikula, Intel Open Source Graphics Center