Hello Svyatoslav,

On Fri, 5 Sep 2025 19:05:16 +0300
Svyatoslav Ryhel <[email protected]> wrote:

> пт, 5 вер. 2025 р. о 18:59 Luca Ceresoli <[email protected]> пише:
> >
> > Hello Svyatoslav,
> >
> > On Tue, 19 Aug 2025 15:16:21 +0300
> > Svyatoslav Ryhel <[email protected]> wrote:
> >  
> > > Add HFLIP and VFLIP from SoC only if camera sensor does not provide those
> > > controls.
> > >
> > > Signed-off-by: Svyatoslav Ryhel <[email protected]>
> > > ---
> > >  drivers/staging/media/tegra-video/vi.c | 9 ++++++---
> > >  1 file changed, 6 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/drivers/staging/media/tegra-video/vi.c 
> > > b/drivers/staging/media/tegra-video/vi.c
> > > index 4f67adc395ac..61b65a2c1436 100644
> > > --- a/drivers/staging/media/tegra-video/vi.c
> > > +++ b/drivers/staging/media/tegra-video/vi.c
> > > @@ -961,6 +961,7 @@ static int tegra_channel_setup_ctrl_handler(struct 
> > > tegra_vi_channel *chan)
> > >       }
> > >  #else
> > >       struct v4l2_subdev *subdev;
> > > +     struct v4l2_ctrl *hflip, *vflip;
> > >
> > >       /* custom control */
> > >       v4l2_ctrl_new_custom(&chan->ctrl_handler, &syncpt_timeout_ctrl, 
> > > NULL);
> > > @@ -986,11 +987,13 @@ static int tegra_channel_setup_ctrl_handler(struct 
> > > tegra_vi_channel *chan)
> > >               return ret;
> > >       }
> > >
> > > -     if (chan->vi->soc->has_h_v_flip) {
> > > +     hflip = v4l2_ctrl_find(subdev->ctrl_handler, V4L2_CID_HFLIP);
> > > +     if (chan->vi->soc->has_h_v_flip && !hflip)
> > >               v4l2_ctrl_new_std(&chan->ctrl_handler, &vi_ctrl_ops, 
> > > V4L2_CID_HFLIP, 0, 1, 1, 0);
> > > -             v4l2_ctrl_new_std(&chan->ctrl_handler, &vi_ctrl_ops, 
> > > V4L2_CID_VFLIP, 0, 1, 1, 0);
> > > -     }
> > >
> > > +     vflip = v4l2_ctrl_find(subdev->ctrl_handler, V4L2_CID_VFLIP);
> > > +     if (chan->vi->soc->has_h_v_flip && !vflip)
> > > +             v4l2_ctrl_new_std(&chan->ctrl_handler, &vi_ctrl_ops, 
> > > V4L2_CID_VFLIP, 0, 1, 1, 0);  
> >
> > Based on my understanding of V4L2, this should not be done.
> > AFAIK subdevs should expose what the hardware block can do,
> > independently from other subdevs. It is up to userspace (e.g.
> > libcamera) to use the most appropriate control when there are redundant
> > ones.
> >  
> 
> This driver is video-centric, interactions are done via /dev/videoX
> not subdevices like media-centric derivers do. Conversion is possible
> but it is not scope of this patchset and in case such conversion takes
> place, one who will do that, will definitely know what to do.
> Video-centric drivers expose all controls within single video device
> and it cannot hold duplicates of controls, this causes error. So this
> solution exposes camera flip controls and if camera has none, SoC
> controls are exposed.

Sorry, forgot to think in the past. :-)
Thanks for the clarification, it makes sense now!

Luca

-- 
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

Reply via email to