Currently drm_writeback_connector are created by drm_writeback_connector_init or drm_writeback_connector_init_with_encoder. Both of the function uses drm_connector_init and drm_encoder_init, but there is no way to properly clean those structure from outside. This patch introduce the new function drm_writeback_connector_cleanup to allow a proper cleanup. Signed-off-by: Louis Chauvet <louis.chauvet@xxxxxxxxxxx> --- drivers/gpu/drm/drm_writeback.c | 10 ++++++++++ include/drm/drm_writeback.h | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c index a031c335bdb9..505a4eb40f93 100644 --- a/drivers/gpu/drm/drm_writeback.c +++ b/drivers/gpu/drm/drm_writeback.c @@ -184,6 +184,7 @@ int drm_writeback_connector_init(struct drm_device *dev, drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs); wb_connector->encoder.possible_crtcs = possible_crtcs; + wb_connector->managed_encoder = true; ret = drm_encoder_init(dev, &wb_connector->encoder, &drm_writeback_encoder_funcs, @@ -290,6 +291,15 @@ int drm_writeback_connector_init_with_encoder(struct drm_device *dev, } EXPORT_SYMBOL(drm_writeback_connector_init_with_encoder); +void drm_writeback_connector_cleanup(struct drm_writeback_connector *wb_connector) +{ + drm_connector_cleanup(&wb_connector->base); + drm_property_blob_put(wb_connector->pixel_formats_blob_ptr); + if (wb_connector->managed_encoder) + drm_encoder_cleanup(&wb_connector->encoder); +} +EXPORT_SYMBOL(drm_writeback_connector_cleanup); + int drm_writeback_set_fb(struct drm_connector_state *conn_state, struct drm_framebuffer *fb) { diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h index 17e576c80169..e651c0c0c84c 100644 --- a/include/drm/drm_writeback.h +++ b/include/drm/drm_writeback.h @@ -35,6 +35,15 @@ struct drm_writeback_connector { */ struct drm_encoder encoder; + /** + * @managed_encoder: Sets to true if @encoder was created by drm_writeback_connector_init() + * + * If the user used drm_writeback_connector_init_with_encoder() to create the connector, + * @encoder is not valid and not managed by drm_writeback_connector. This fields allows + * the drm_writeback_cleanup() function to properly destroy the encoder if needed. + */ + bool managed_encoder; + /** * @pixel_formats_blob_ptr: * @@ -161,6 +170,8 @@ int drm_writeback_connector_init_with_encoder(struct drm_device *dev, const struct drm_connector_funcs *con_funcs, const u32 *formats, int n_formats); +void drm_writeback_connector_cleanup(struct drm_writeback_connector *wb_connector); + int drm_writeback_set_fb(struct drm_connector_state *conn_state, struct drm_framebuffer *fb); -- 2.44.2