Hi Ricardo, Thank you for the patch. On Mon, Jun 10, 2024 at 11:09:52PM +0000, Ricardo Ribalda wrote: > Some advanced controls might not be completely implemented by vendors. > > If the controls are a enumeration, UVC does not gives a way to probe > what is implemented and what is not. > > Let's create a new callback function where heuristics can be implemented > to detect what is implemented and what not. > > Reviewed-by: Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> > Signed-off-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- > drivers/media/usb/uvc/uvc_ctrl.c | 10 +++++++++- > drivers/media/usb/uvc/uvcvideo.h | 5 +++++ > 2 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c > index e59a463c2761..44ec185a8c8b 100644 > --- a/drivers/media/usb/uvc/uvc_ctrl.c > +++ b/drivers/media/usb/uvc/uvc_ctrl.c > @@ -2360,7 +2360,7 @@ static int uvc_ctrl_add_info(struct uvc_device *dev, struct uvc_control *ctrl, > /* > * Add a control mapping to a given control. > */ > -static int __uvc_ctrl_add_mapping(struct uvc_video_chain *chain, > +static int __uvc_ctrl_add_mapping_to_list(struct uvc_video_chain *chain, > struct uvc_control *ctrl, const struct uvc_control_mapping *mapping) > { > struct uvc_control_mapping *map; > @@ -2434,6 +2434,14 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_chain *chain, > return -ENOMEM; > } > > +static int __uvc_ctrl_add_mapping(struct uvc_video_chain *chain, > + struct uvc_control *ctrl, const struct uvc_control_mapping *mapping) > +{ > + if (mapping && mapping->add_mapping) > + return mapping->add_mapping(chain, ctrl, mapping); > + return __uvc_ctrl_add_mapping_to_list(chain, ctrl, mapping); > +} > + > int uvc_ctrl_add_mapping(struct uvc_video_chain *chain, > const struct uvc_control_mapping *mapping) > { > diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h > index 6fb0a78b1b00..fa0396dd5b35 100644 > --- a/drivers/media/usb/uvc/uvcvideo.h > +++ b/drivers/media/usb/uvc/uvcvideo.h > @@ -84,7 +84,9 @@ > > struct gpio_desc; > struct sg_table; > +struct uvc_control; > struct uvc_device; > +struct uvc_video_chain; > > /* > * TODO: Put the most frequently accessed fields at the beginning of > @@ -123,6 +125,9 @@ struct uvc_control_mapping { > s32 master_manual; > u32 slave_ids[2]; > > + int (*add_mapping)(struct uvc_video_chain *chain, > + struct uvc_control *ctrl, > + const struct uvc_control_mapping *mapping); > s32 (*get)(struct uvc_control_mapping *mapping, u8 query, > const u8 *data); > void (*set)(struct uvc_control_mapping *mapping, s32 value, -- Regards, Laurent Pinchart