Hi Niklas, On Tue, Jul 06, 2021 at 06:16:04PM +0200, Niklas Söderlund wrote: > Hi Jacopo, > > On 2021-07-06 18:04:01 +0200, Jacopo Mondi wrote: > > Hi Niklas, > > > > On Tue, Apr 13, 2021 at 08:02:43PM +0200, Niklas Söderlund wrote: > > > The controls for the video device are created in different code paths > > > depending on if the driver is using the media graph centric model (Gen3) > > > or the device centric model (Gen2 and earlier). This have lead to code > > > duplication that can be consolidated. > > > > > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx> > > > --- > > > drivers/media/platform/rcar-vin/rcar-core.c | 82 +++++++++++---------- > > > 1 file changed, 45 insertions(+), 37 deletions(-) > > > > > > diff --git a/drivers/media/platform/rcar-vin/rcar-core.c b/drivers/media/platform/rcar-vin/rcar-core.c > > > index cb3025992817d625..c798dc9409e4cdcd 100644 > > > --- a/drivers/media/platform/rcar-vin/rcar-core.c > > > +++ b/drivers/media/platform/rcar-vin/rcar-core.c > > > @@ -405,6 +405,45 @@ static const struct v4l2_ctrl_ops rvin_ctrl_ops = { > > > .s_ctrl = rvin_s_ctrl, > > > }; > > > > > > +static void rvin_free_controls(struct rvin_dev *vin) > > > +{ > > > + v4l2_ctrl_handler_free(&vin->ctrl_handler); > > > + vin->vdev.ctrl_handler = NULL; > > > +} > > > + > > > +static int rvin_create_controls(struct rvin_dev *vin, struct v4l2_subdev *subdev) > > > +{ > > > + int ret; > > > + > > > + ret = v4l2_ctrl_handler_init(&vin->ctrl_handler, 16); > > > + if (ret < 0) > > > + return ret; > > > + > > > + /* The VIN directly deals with alpha component. */ > > > + v4l2_ctrl_new_std(&vin->ctrl_handler, &rvin_ctrl_ops, > > > + V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255); > > > + > > > + if (vin->ctrl_handler.error) { > > > + ret = vin->ctrl_handler.error; > > > + rvin_free_controls(vin); > > > + return ret; > > > + } > > > + > > > + /* For the non-MC mode add controls from the subdevice. */ > > > + if (subdev) { > > > + ret = v4l2_ctrl_add_handler(&vin->ctrl_handler, > > > + subdev->ctrl_handler, NULL, true); > > > + if (ret < 0) { > > > + rvin_free_controls(vin); > > > + return ret; > > > + } > > > + } > > > + > > > + vin->vdev.ctrl_handler = &vin->ctrl_handler; > > > + > > > + return 0; > > > +} > > > + > > > /* ----------------------------------------------------------------------------- > > > * Async notifier > > > */ > > > @@ -490,28 +529,10 @@ static int rvin_parallel_subdevice_attach(struct rvin_dev *vin, > > > return ret; > > > > > > /* Add the controls */ > > > - ret = v4l2_ctrl_handler_init(&vin->ctrl_handler, 16); > > > + ret = rvin_create_controls(vin, subdev); > > > if (ret < 0) > > > return ret; > > > > > > - v4l2_ctrl_new_std(&vin->ctrl_handler, &rvin_ctrl_ops, > > > - V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255); > > > - > > > - if (vin->ctrl_handler.error) { > > > - ret = vin->ctrl_handler.error; > > > - v4l2_ctrl_handler_free(&vin->ctrl_handler); > > > - return ret; > > > - } > > > - > > > - ret = v4l2_ctrl_add_handler(&vin->ctrl_handler, subdev->ctrl_handler, > > > - NULL, true); > > > - if (ret < 0) { > > > - v4l2_ctrl_handler_free(&vin->ctrl_handler); > > > - return ret; > > > - } > > > - > > > - vin->vdev.ctrl_handler = &vin->ctrl_handler; > > > - > > > vin->parallel.subdev = subdev; > > > > > > return 0; > > > @@ -522,10 +543,8 @@ static void rvin_parallel_subdevice_detach(struct rvin_dev *vin) > > > rvin_v4l2_unregister(vin); > > > vin->parallel.subdev = NULL; > > > > > > - if (!vin->info->use_mc) { > > > - v4l2_ctrl_handler_free(&vin->ctrl_handler); > > > - vin->vdev.ctrl_handler = NULL; > > > - } > > > + if (!vin->info->use_mc) > > > > I know it was there already, but give that rvin_parallel_notify_unbind() > > is only registered for parallel, can this happen ? > > Yes, on Gen2 where we don't use a media-graph. > Ah correct, for gen3 the controls are freed elsewhere, right! Thanks for the clarification > > > > Apart this small nit: > > Reviewed-by: Jacopo Mondi <jacopo+renesas@xxxxxxxxxx> > > > > Thanks > > j > > > > > + rvin_free_controls(vin); > > > } > > > > > > static int rvin_parallel_notify_complete(struct v4l2_async_notifier *notifier) > > > @@ -935,21 +954,10 @@ static int rvin_mc_init(struct rvin_dev *vin) > > > if (ret) > > > rvin_group_put(vin); > > > > > > - ret = v4l2_ctrl_handler_init(&vin->ctrl_handler, 1); > > > + ret = rvin_create_controls(vin, NULL); > > > if (ret < 0) > > > return ret; > > > > > > - v4l2_ctrl_new_std(&vin->ctrl_handler, &rvin_ctrl_ops, > > > - V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255); > > > - > > > - if (vin->ctrl_handler.error) { > > > - ret = vin->ctrl_handler.error; > > > - v4l2_ctrl_handler_free(&vin->ctrl_handler); > > > - return ret; > > > - } > > > - > > > - vin->vdev.ctrl_handler = &vin->ctrl_handler; > > > - > > > return ret; > > > } > > > > > > @@ -1446,7 +1454,7 @@ static int rcar_vin_probe(struct platform_device *pdev) > > > return 0; > > > > > > error_group_unregister: > > > - v4l2_ctrl_handler_free(&vin->ctrl_handler); > > > + rvin_free_controls(vin); > > > > > > if (vin->info->use_mc) { > > > mutex_lock(&vin->group->lock); > > > @@ -1481,7 +1489,7 @@ static int rcar_vin_remove(struct platform_device *pdev) > > > rvin_group_put(vin); > > > } > > > > > > - v4l2_ctrl_handler_free(&vin->ctrl_handler); > > > + rvin_free_controls(vin); > > > > > > rvin_dma_unregister(vin); > > > > > > -- > > > 2.31.1 > > > > > -- > Regards, > Niklas Söderlund