On Tue, May 05, 2026 at 03:25:01AM +0300, Dmitry Baryshkov wrote:
> The driver uses drm_writeback_connector_init() instead of its drmm
> counterpart, but it doesn't perform the job queue cleanup (neither
> manually nor by calling drm_writeback_connector_cleanup()). On the
> contrary, the drmm_writeback_connector_init() function ensures the
> proper cleanup of the job queue.
> 
> Use drmm_plain_encoder_alloc() to allocate simple encoder and
> drmm_writeback_connector_init() in order to initialize writeback
> connector instance.
> 
> Reviewed-by: Suraj Kandpal <[email protected]>
> Reviewed-by: Louis Chauvet <[email protected]>
> Signed-off-by: Dmitry Baryshkov <[email protected]>

Reviewed-by: Liviu Dudau <[email protected]>

Best regards,
Liviu

> ---
>  drivers/gpu/drm/arm/malidp_mw.c | 25 ++++++++++++++-----------
>  1 file changed, 14 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
> index fad343842038..6e0c78e998aa 100644
> --- a/drivers/gpu/drm/arm/malidp_mw.c
> +++ b/drivers/gpu/drm/arm/malidp_mw.c
> @@ -84,11 +84,6 @@ malidp_mw_connector_detect(struct drm_connector 
> *connector, bool force)
>       return connector_status_connected;
>  }
>  
> -static void malidp_mw_connector_destroy(struct drm_connector *connector)
> -{
> -     drm_connector_cleanup(connector);
> -}
> -
>  static struct drm_connector_state *
>  malidp_mw_connector_duplicate_state(struct drm_connector *connector)
>  {
> @@ -114,7 +109,6 @@ static const struct drm_connector_funcs 
> malidp_mw_connector_funcs = {
>       .reset = malidp_mw_connector_reset,
>       .detect = malidp_mw_connector_detect,
>       .fill_modes = drm_helper_probe_single_connector_modes,
> -     .destroy = malidp_mw_connector_destroy,
>       .atomic_duplicate_state = malidp_mw_connector_duplicate_state,
>       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
>  };
> @@ -211,6 +205,7 @@ static u32 *get_writeback_formats(struct malidp_drm 
> *malidp, int *n_formats)
>  int malidp_mw_connector_init(struct drm_device *drm)
>  {
>       struct malidp_drm *malidp = drm_to_malidp(drm);
> +     struct drm_encoder *encoder;
>       u32 *formats;
>       int ret, n_formats;
>  
> @@ -224,11 +219,19 @@ int malidp_mw_connector_init(struct drm_device *drm)
>       if (!formats)
>               return -ENOMEM;
>  
> -     ret = drm_writeback_connector_init(drm, &malidp->mw_connector,
> -                                        &malidp_mw_connector_funcs,
> -                                        &malidp_mw_encoder_helper_funcs,
> -                                        formats, n_formats,
> -                                        1 << drm_crtc_index(&malidp->crtc));
> +     encoder = drmm_plain_encoder_alloc(drm, NULL, DRM_MODE_ENCODER_VIRTUAL,
> +                                        NULL);
> +     if (IS_ERR(encoder))
> +             return PTR_ERR(encoder);
> +
> +     drm_encoder_helper_add(encoder, &malidp_mw_encoder_helper_funcs);
> +
> +     encoder->possible_crtcs = drm_crtc_mask(&malidp->crtc);
> +
> +     ret = drmm_writeback_connector_init(drm, &malidp->mw_connector,
> +                                         &malidp_mw_connector_funcs,
> +                                         encoder,
> +                                         formats, n_formats);
>       kfree(formats);
>       if (ret)
>               return ret;
> 
> -- 
> 2.47.3
> 

-- 
====================
| I would like to |
| fix the world,  |
| but they're not |
| giving me the   |
 \ source code!  /
  ---------------
    ¯\_(ツ)_/¯

Reply via email to