Laurent Pinchart wrote: > The rkisp1_isp_register() and rkisp1_isp_unregister() functions don't > destroy the mutex (in the error path for the former). Fix this, simplify > error handling at registration time as media_entity_cleanup() can be > called on an uninitialized entity, and make rkisp1_isp_unregister() and > safe to be called on an unregistered isp subdev to prepare for > simplification of error handling at probe time. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> Reviewed-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> > --- > Changes since v3: > > - Use isp->sd.v4l2_dev instead of isp->sd.flags for registration test > --- > .../platform/rockchip/rkisp1/rkisp1-isp.c | 20 ++++++++++++------- > 1 file changed, 13 insertions(+), 7 deletions(-) > > diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c > index 2a35bf24e54e..4f7b2157b8cc 100644 > --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c > +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c > @@ -1090,29 +1090,35 @@ int rkisp1_isp_register(struct rkisp1_device *rkisp1) > mutex_init(&isp->ops_lock); > ret = media_entity_pads_init(&sd->entity, RKISP1_ISP_PAD_MAX, pads); > if (ret) > - return ret; > + goto error; > > ret = v4l2_device_register_subdev(&rkisp1->v4l2_dev, sd); > if (ret) { > dev_err(rkisp1->dev, "Failed to register isp subdev\n"); > - goto err_cleanup_media_entity; > + goto error; > } > > rkisp1_isp_init_config(sd, &state); > + > return 0; > > -err_cleanup_media_entity: > +error: > media_entity_cleanup(&sd->entity); > - > + mutex_destroy(&isp->ops_lock); > + isp->sd.v4l2_dev = NULL; > return ret; > } > > void rkisp1_isp_unregister(struct rkisp1_device *rkisp1) > { > - struct v4l2_subdev *sd = &rkisp1->isp.sd; > + struct rkisp1_isp *isp = &rkisp1->isp; > > - v4l2_device_unregister_subdev(sd); > - media_entity_cleanup(&sd->entity); > + if (!isp->sd.v4l2_dev) > + return; > + > + v4l2_device_unregister_subdev(&isp->sd); > + media_entity_cleanup(&isp->sd.entity); > + mutex_destroy(&isp->ops_lock); > } > > /* ---------------------------------------------------------------------------- > -- > Regards, > > Laurent Pinchart > >