Hello :-) On 2021-07-06 18:08:42 +0200, Jacopo Mondi wrote: > Hi again, > > 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); > > Not a big deal, but 16 because we have to reserve space for the > eventual subdevice controls ? Yes, again for Gen2 where the controls of the subdevice are exposed on the video device. IIRC the number 16 comes from the soc-camera ancestor for this driver. > > > + 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) > > + 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