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
