]> Git Repo - linux.git/blob - drivers/media/v4l2-core/v4l2-ctrls-api.c
Merge tag 'cxl-for-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl
[linux.git] / drivers / media / v4l2-core / v4l2-ctrls-api.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * V4L2 controls framework uAPI implementation:
4  *
5  * Copyright (C) 2010-2021  Hans Verkuil <[email protected]>
6  */
7
8 #define pr_fmt(fmt) "v4l2-ctrls: " fmt
9
10 #include <linux/export.h>
11 #include <linux/mm.h>
12 #include <linux/slab.h>
13 #include <media/v4l2-ctrls.h>
14 #include <media/v4l2-dev.h>
15 #include <media/v4l2-device.h>
16 #include <media/v4l2-event.h>
17 #include <media/v4l2-ioctl.h>
18
19 #include "v4l2-ctrls-priv.h"
20
21 /* Internal temporary helper struct, one for each v4l2_ext_control */
22 struct v4l2_ctrl_helper {
23         /* Pointer to the control reference of the master control */
24         struct v4l2_ctrl_ref *mref;
25         /* The control ref corresponding to the v4l2_ext_control ID field. */
26         struct v4l2_ctrl_ref *ref;
27         /*
28          * v4l2_ext_control index of the next control belonging to the
29          * same cluster, or 0 if there isn't any.
30          */
31         u32 next;
32 };
33
34 /*
35  * Helper functions to copy control payload data from kernel space to
36  * user space and vice versa.
37  */
38
39 /* Helper function: copy the given control value back to the caller */
40 static int ptr_to_user(struct v4l2_ext_control *c,
41                        struct v4l2_ctrl *ctrl,
42                        union v4l2_ctrl_ptr ptr)
43 {
44         u32 len;
45
46         if (ctrl->is_ptr && !ctrl->is_string)
47                 return copy_to_user(c->ptr, ptr.p_const, c->size) ?
48                        -EFAULT : 0;
49
50         switch (ctrl->type) {
51         case V4L2_CTRL_TYPE_STRING:
52                 len = strlen(ptr.p_char);
53                 if (c->size < len + 1) {
54                         c->size = ctrl->elem_size;
55                         return -ENOSPC;
56                 }
57                 return copy_to_user(c->string, ptr.p_char, len + 1) ?
58                        -EFAULT : 0;
59         case V4L2_CTRL_TYPE_INTEGER64:
60                 c->value64 = *ptr.p_s64;
61                 break;
62         default:
63                 c->value = *ptr.p_s32;
64                 break;
65         }
66         return 0;
67 }
68
69 /* Helper function: copy the current control value back to the caller */
70 static int cur_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl)
71 {
72         return ptr_to_user(c, ctrl, ctrl->p_cur);
73 }
74
75 /* Helper function: copy the new control value back to the caller */
76 static int new_to_user(struct v4l2_ext_control *c,
77                        struct v4l2_ctrl *ctrl)
78 {
79         return ptr_to_user(c, ctrl, ctrl->p_new);
80 }
81
82 /* Helper function: copy the request value back to the caller */
83 static int req_to_user(struct v4l2_ext_control *c,
84                        struct v4l2_ctrl_ref *ref)
85 {
86         return ptr_to_user(c, ref->ctrl, ref->p_req);
87 }
88
89 /* Helper function: copy the initial control value back to the caller */
90 static int def_to_user(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl)
91 {
92         int idx;
93
94         for (idx = 0; idx < ctrl->elems; idx++)
95                 ctrl->type_ops->init(ctrl, idx, ctrl->p_new);
96
97         return ptr_to_user(c, ctrl, ctrl->p_new);
98 }
99
100 /* Helper function: copy the caller-provider value as the new control value */
101 static int user_to_new(struct v4l2_ext_control *c, struct v4l2_ctrl *ctrl)
102 {
103         int ret;
104         u32 size;
105
106         ctrl->is_new = 0;
107         if (ctrl->is_dyn_array &&
108             c->size > ctrl->p_dyn_alloc_elems * ctrl->elem_size) {
109                 void *old = ctrl->p_dyn;
110                 void *tmp = kvzalloc(2 * c->size, GFP_KERNEL);
111
112                 if (!tmp)
113                         return -ENOMEM;
114                 memcpy(tmp, ctrl->p_new.p, ctrl->elems * ctrl->elem_size);
115                 memcpy(tmp + c->size, ctrl->p_cur.p, ctrl->elems * ctrl->elem_size);
116                 ctrl->p_new.p = tmp;
117                 ctrl->p_cur.p = tmp + c->size;
118                 ctrl->p_dyn = tmp;
119                 ctrl->p_dyn_alloc_elems = c->size / ctrl->elem_size;
120                 kvfree(old);
121         }
122
123         if (ctrl->is_ptr && !ctrl->is_string) {
124                 unsigned int elems = c->size / ctrl->elem_size;
125                 unsigned int idx;
126
127                 if (copy_from_user(ctrl->p_new.p, c->ptr, c->size))
128                         return -EFAULT;
129                 ctrl->is_new = 1;
130                 if (ctrl->is_dyn_array)
131                         ctrl->new_elems = elems;
132                 else if (ctrl->is_array)
133                         for (idx = elems; idx < ctrl->elems; idx++)
134                                 ctrl->type_ops->init(ctrl, idx, ctrl->p_new);
135                 return 0;
136         }
137
138         switch (ctrl->type) {
139         case V4L2_CTRL_TYPE_INTEGER64:
140                 *ctrl->p_new.p_s64 = c->value64;
141                 break;
142         case V4L2_CTRL_TYPE_STRING:
143                 size = c->size;
144                 if (size == 0)
145                         return -ERANGE;
146                 if (size > ctrl->maximum + 1)
147                         size = ctrl->maximum + 1;
148                 ret = copy_from_user(ctrl->p_new.p_char, c->string, size) ? -EFAULT : 0;
149                 if (!ret) {
150                         char last = ctrl->p_new.p_char[size - 1];
151
152                         ctrl->p_new.p_char[size - 1] = 0;
153                         /*
154                          * If the string was longer than ctrl->maximum,
155                          * then return an error.
156                          */
157                         if (strlen(ctrl->p_new.p_char) == ctrl->maximum && last)
158                                 return -ERANGE;
159                 }
160                 return ret;
161         default:
162                 *ctrl->p_new.p_s32 = c->value;
163                 break;
164         }
165         ctrl->is_new = 1;
166         return 0;
167 }
168
169 /*
170  * VIDIOC_G/TRY/S_EXT_CTRLS implementation
171  */
172
173 /*
174  * Some general notes on the atomic requirements of VIDIOC_G/TRY/S_EXT_CTRLS:
175  *
176  * It is not a fully atomic operation, just best-effort only. After all, if
177  * multiple controls have to be set through multiple i2c writes (for example)
178  * then some initial writes may succeed while others fail. Thus leaving the
179  * system in an inconsistent state. The question is how much effort you are
180  * willing to spend on trying to make something atomic that really isn't.
181  *
182  * From the point of view of an application the main requirement is that
183  * when you call VIDIOC_S_EXT_CTRLS and some values are invalid then an
184  * error should be returned without actually affecting any controls.
185  *
186  * If all the values are correct, then it is acceptable to just give up
187  * in case of low-level errors.
188  *
189  * It is important though that the application can tell when only a partial
190  * configuration was done. The way we do that is through the error_idx field
191  * of struct v4l2_ext_controls: if that is equal to the count field then no
192  * controls were affected. Otherwise all controls before that index were
193  * successful in performing their 'get' or 'set' operation, the control at
194  * the given index failed, and you don't know what happened with the controls
195  * after the failed one. Since if they were part of a control cluster they
196  * could have been successfully processed (if a cluster member was encountered
197  * at index < error_idx), they could have failed (if a cluster member was at
198  * error_idx), or they may not have been processed yet (if the first cluster
199  * member appeared after error_idx).
200  *
201  * It is all fairly theoretical, though. In practice all you can do is to
202  * bail out. If error_idx == count, then it is an application bug. If
203  * error_idx < count then it is only an application bug if the error code was
204  * EBUSY. That usually means that something started streaming just when you
205  * tried to set the controls. In all other cases it is a driver/hardware
206  * problem and all you can do is to retry or bail out.
207  *
208  * Note that these rules do not apply to VIDIOC_TRY_EXT_CTRLS: since that
209  * never modifies controls the error_idx is just set to whatever control
210  * has an invalid value.
211  */
212
213 /*
214  * Prepare for the extended g/s/try functions.
215  * Find the controls in the control array and do some basic checks.
216  */
217 static int prepare_ext_ctrls(struct v4l2_ctrl_handler *hdl,
218                              struct v4l2_ext_controls *cs,
219                              struct v4l2_ctrl_helper *helpers,
220                              struct video_device *vdev,
221                              bool get)
222 {
223         struct v4l2_ctrl_helper *h;
224         bool have_clusters = false;
225         u32 i;
226
227         for (i = 0, h = helpers; i < cs->count; i++, h++) {
228                 struct v4l2_ext_control *c = &cs->controls[i];
229                 struct v4l2_ctrl_ref *ref;
230                 struct v4l2_ctrl *ctrl;
231                 u32 id = c->id & V4L2_CTRL_ID_MASK;
232
233                 cs->error_idx = i;
234
235                 if (cs->which &&
236                     cs->which != V4L2_CTRL_WHICH_DEF_VAL &&
237                     cs->which != V4L2_CTRL_WHICH_REQUEST_VAL &&
238                     V4L2_CTRL_ID2WHICH(id) != cs->which) {
239                         dprintk(vdev,
240                                 "invalid which 0x%x or control id 0x%x\n",
241                                 cs->which, id);
242                         return -EINVAL;
243                 }
244
245                 /*
246                  * Old-style private controls are not allowed for
247                  * extended controls.
248                  */
249                 if (id >= V4L2_CID_PRIVATE_BASE) {
250                         dprintk(vdev,
251                                 "old-style private controls not allowed\n");
252                         return -EINVAL;
253                 }
254                 ref = find_ref_lock(hdl, id);
255                 if (!ref) {
256                         dprintk(vdev, "cannot find control id 0x%x\n", id);
257                         return -EINVAL;
258                 }
259                 h->ref = ref;
260                 ctrl = ref->ctrl;
261                 if (ctrl->flags & V4L2_CTRL_FLAG_DISABLED) {
262                         dprintk(vdev, "control id 0x%x is disabled\n", id);
263                         return -EINVAL;
264                 }
265
266                 if (ctrl->cluster[0]->ncontrols > 1)
267                         have_clusters = true;
268                 if (ctrl->cluster[0] != ctrl)
269                         ref = find_ref_lock(hdl, ctrl->cluster[0]->id);
270                 if (ctrl->is_dyn_array) {
271                         unsigned int max_size = ctrl->dims[0] * ctrl->elem_size;
272                         unsigned int tot_size = ctrl->elem_size;
273
274                         if (cs->which == V4L2_CTRL_WHICH_REQUEST_VAL)
275                                 tot_size *= ref->p_req_elems;
276                         else
277                                 tot_size *= ctrl->elems;
278
279                         c->size = ctrl->elem_size * (c->size / ctrl->elem_size);
280                         if (get) {
281                                 if (c->size < tot_size) {
282                                         c->size = tot_size;
283                                         return -ENOSPC;
284                                 }
285                                 c->size = tot_size;
286                         } else {
287                                 if (c->size > max_size) {
288                                         c->size = max_size;
289                                         return -ENOSPC;
290                                 }
291                                 if (!c->size)
292                                         return -EFAULT;
293                         }
294                 } else if (ctrl->is_ptr && !ctrl->is_string) {
295                         unsigned int tot_size = ctrl->elems * ctrl->elem_size;
296
297                         if (c->size < tot_size) {
298                                 /*
299                                  * In the get case the application first
300                                  * queries to obtain the size of the control.
301                                  */
302                                 if (get) {
303                                         c->size = tot_size;
304                                         return -ENOSPC;
305                                 }
306                                 dprintk(vdev,
307                                         "pointer control id 0x%x size too small, %d bytes but %d bytes needed\n",
308                                         id, c->size, tot_size);
309                                 return -EFAULT;
310                         }
311                         c->size = tot_size;
312                 }
313                 /* Store the ref to the master control of the cluster */
314                 h->mref = ref;
315                 /*
316                  * Initially set next to 0, meaning that there is no other
317                  * control in this helper array belonging to the same
318                  * cluster.
319                  */
320                 h->next = 0;
321         }
322
323         /*
324          * We are done if there were no controls that belong to a multi-
325          * control cluster.
326          */
327         if (!have_clusters)
328                 return 0;
329
330         /*
331          * The code below figures out in O(n) time which controls in the list
332          * belong to the same cluster.
333          */
334
335         /* This has to be done with the handler lock taken. */
336         mutex_lock(hdl->lock);
337
338         /* First zero the helper field in the master control references */
339         for (i = 0; i < cs->count; i++)
340                 helpers[i].mref->helper = NULL;
341         for (i = 0, h = helpers; i < cs->count; i++, h++) {
342                 struct v4l2_ctrl_ref *mref = h->mref;
343
344                 /*
345                  * If the mref->helper is set, then it points to an earlier
346                  * helper that belongs to the same cluster.
347                  */
348                 if (mref->helper) {
349                         /*
350                          * Set the next field of mref->helper to the current
351                          * index: this means that the earlier helper now
352                          * points to the next helper in the same cluster.
353                          */
354                         mref->helper->next = i;
355                         /*
356                          * mref should be set only for the first helper in the
357                          * cluster, clear the others.
358                          */
359                         h->mref = NULL;
360                 }
361                 /* Point the mref helper to the current helper struct. */
362                 mref->helper = h;
363         }
364         mutex_unlock(hdl->lock);
365         return 0;
366 }
367
368 /*
369  * Handles the corner case where cs->count == 0. It checks whether the
370  * specified control class exists. If that class ID is 0, then it checks
371  * whether there are any controls at all.
372  */
373 static int class_check(struct v4l2_ctrl_handler *hdl, u32 which)
374 {
375         if (which == 0 || which == V4L2_CTRL_WHICH_DEF_VAL ||
376             which == V4L2_CTRL_WHICH_REQUEST_VAL)
377                 return 0;
378         return find_ref_lock(hdl, which | 1) ? 0 : -EINVAL;
379 }
380
381 /*
382  * Get extended controls. Allocates the helpers array if needed.
383  *
384  * Note that v4l2_g_ext_ctrls_common() with 'which' set to
385  * V4L2_CTRL_WHICH_REQUEST_VAL is only called if the request was
386  * completed, and in that case p_req_valid is true for all controls.
387  */
388 int v4l2_g_ext_ctrls_common(struct v4l2_ctrl_handler *hdl,
389                             struct v4l2_ext_controls *cs,
390                             struct video_device *vdev)
391 {
392         struct v4l2_ctrl_helper helper[4];
393         struct v4l2_ctrl_helper *helpers = helper;
394         int ret;
395         int i, j;
396         bool is_default, is_request;
397
398         is_default = (cs->which == V4L2_CTRL_WHICH_DEF_VAL);
399         is_request = (cs->which == V4L2_CTRL_WHICH_REQUEST_VAL);
400
401         cs->error_idx = cs->count;
402         cs->which = V4L2_CTRL_ID2WHICH(cs->which);
403
404         if (!hdl)
405                 return -EINVAL;
406
407         if (cs->count == 0)
408                 return class_check(hdl, cs->which);
409
410         if (cs->count > ARRAY_SIZE(helper)) {
411                 helpers = kvmalloc_array(cs->count, sizeof(helper[0]),
412                                          GFP_KERNEL);
413                 if (!helpers)
414                         return -ENOMEM;
415         }
416
417         ret = prepare_ext_ctrls(hdl, cs, helpers, vdev, true);
418         cs->error_idx = cs->count;
419
420         for (i = 0; !ret && i < cs->count; i++)
421                 if (helpers[i].ref->ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
422                         ret = -EACCES;
423
424         for (i = 0; !ret && i < cs->count; i++) {
425                 struct v4l2_ctrl *master;
426                 bool is_volatile = false;
427                 u32 idx = i;
428
429                 if (!helpers[i].mref)
430                         continue;
431
432                 master = helpers[i].mref->ctrl;
433                 cs->error_idx = i;
434
435                 v4l2_ctrl_lock(master);
436
437                 /*
438                  * g_volatile_ctrl will update the new control values.
439                  * This makes no sense for V4L2_CTRL_WHICH_DEF_VAL and
440                  * V4L2_CTRL_WHICH_REQUEST_VAL. In the case of requests
441                  * it is v4l2_ctrl_request_complete() that copies the
442                  * volatile controls at the time of request completion
443                  * to the request, so you don't want to do that again.
444                  */
445                 if (!is_default && !is_request &&
446                     ((master->flags & V4L2_CTRL_FLAG_VOLATILE) ||
447                     (master->has_volatiles && !is_cur_manual(master)))) {
448                         for (j = 0; j < master->ncontrols; j++)
449                                 cur_to_new(master->cluster[j]);
450                         ret = call_op(master, g_volatile_ctrl);
451                         is_volatile = true;
452                 }
453
454                 if (ret) {
455                         v4l2_ctrl_unlock(master);
456                         break;
457                 }
458
459                 /*
460                  * Copy the default value (if is_default is true), the
461                  * request value (if is_request is true and p_req is valid),
462                  * the new volatile value (if is_volatile is true) or the
463                  * current value.
464                  */
465                 do {
466                         struct v4l2_ctrl_ref *ref = helpers[idx].ref;
467
468                         if (is_default)
469                                 ret = def_to_user(cs->controls + idx, ref->ctrl);
470                         else if (is_request && ref->p_req_dyn_enomem)
471                                 ret = -ENOMEM;
472                         else if (is_request && ref->p_req_valid)
473                                 ret = req_to_user(cs->controls + idx, ref);
474                         else if (is_volatile)
475                                 ret = new_to_user(cs->controls + idx, ref->ctrl);
476                         else
477                                 ret = cur_to_user(cs->controls + idx, ref->ctrl);
478                         idx = helpers[idx].next;
479                 } while (!ret && idx);
480
481                 v4l2_ctrl_unlock(master);
482         }
483
484         if (cs->count > ARRAY_SIZE(helper))
485                 kvfree(helpers);
486         return ret;
487 }
488
489 int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct video_device *vdev,
490                      struct media_device *mdev, struct v4l2_ext_controls *cs)
491 {
492         if (cs->which == V4L2_CTRL_WHICH_REQUEST_VAL)
493                 return v4l2_g_ext_ctrls_request(hdl, vdev, mdev, cs);
494
495         return v4l2_g_ext_ctrls_common(hdl, cs, vdev);
496 }
497 EXPORT_SYMBOL(v4l2_g_ext_ctrls);
498
499 /* Validate a new control */
500 static int validate_new(const struct v4l2_ctrl *ctrl, union v4l2_ctrl_ptr p_new)
501 {
502         unsigned int idx;
503         int err = 0;
504
505         for (idx = 0; !err && idx < ctrl->new_elems; idx++)
506                 err = ctrl->type_ops->validate(ctrl, idx, p_new);
507         return err;
508 }
509
510 /* Validate controls. */
511 static int validate_ctrls(struct v4l2_ext_controls *cs,
512                           struct v4l2_ctrl_helper *helpers,
513                           struct video_device *vdev,
514                           bool set)
515 {
516         unsigned int i;
517         int ret = 0;
518
519         cs->error_idx = cs->count;
520         for (i = 0; i < cs->count; i++) {
521                 struct v4l2_ctrl *ctrl = helpers[i].ref->ctrl;
522                 union v4l2_ctrl_ptr p_new;
523
524                 cs->error_idx = i;
525
526                 if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY) {
527                         dprintk(vdev,
528                                 "control id 0x%x is read-only\n",
529                                 ctrl->id);
530                         return -EACCES;
531                 }
532                 /*
533                  * This test is also done in try_set_control_cluster() which
534                  * is called in atomic context, so that has the final say,
535                  * but it makes sense to do an up-front check as well. Once
536                  * an error occurs in try_set_control_cluster() some other
537                  * controls may have been set already and we want to do a
538                  * best-effort to avoid that.
539                  */
540                 if (set && (ctrl->flags & V4L2_CTRL_FLAG_GRABBED)) {
541                         dprintk(vdev,
542                                 "control id 0x%x is grabbed, cannot set\n",
543                                 ctrl->id);
544                         return -EBUSY;
545                 }
546                 /*
547                  * Skip validation for now if the payload needs to be copied
548                  * from userspace into kernelspace. We'll validate those later.
549                  */
550                 if (ctrl->is_ptr)
551                         continue;
552                 if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
553                         p_new.p_s64 = &cs->controls[i].value64;
554                 else
555                         p_new.p_s32 = &cs->controls[i].value;
556                 ret = validate_new(ctrl, p_new);
557                 if (ret)
558                         return ret;
559         }
560         return 0;
561 }
562
563 /* Try or try-and-set controls */
564 int try_set_ext_ctrls_common(struct v4l2_fh *fh,
565                              struct v4l2_ctrl_handler *hdl,
566                              struct v4l2_ext_controls *cs,
567                              struct video_device *vdev, bool set)
568 {
569         struct v4l2_ctrl_helper helper[4];
570         struct v4l2_ctrl_helper *helpers = helper;
571         unsigned int i, j;
572         int ret;
573
574         cs->error_idx = cs->count;
575
576         /* Default value cannot be changed */
577         if (cs->which == V4L2_CTRL_WHICH_DEF_VAL) {
578                 dprintk(vdev, "%s: cannot change default value\n",
579                         video_device_node_name(vdev));
580                 return -EINVAL;
581         }
582
583         cs->which = V4L2_CTRL_ID2WHICH(cs->which);
584
585         if (!hdl) {
586                 dprintk(vdev, "%s: invalid null control handler\n",
587                         video_device_node_name(vdev));
588                 return -EINVAL;
589         }
590
591         if (cs->count == 0)
592                 return class_check(hdl, cs->which);
593
594         if (cs->count > ARRAY_SIZE(helper)) {
595                 helpers = kvmalloc_array(cs->count, sizeof(helper[0]),
596                                          GFP_KERNEL);
597                 if (!helpers)
598                         return -ENOMEM;
599         }
600         ret = prepare_ext_ctrls(hdl, cs, helpers, vdev, false);
601         if (!ret)
602                 ret = validate_ctrls(cs, helpers, vdev, set);
603         if (ret && set)
604                 cs->error_idx = cs->count;
605         for (i = 0; !ret && i < cs->count; i++) {
606                 struct v4l2_ctrl *master;
607                 u32 idx = i;
608
609                 if (!helpers[i].mref)
610                         continue;
611
612                 cs->error_idx = i;
613                 master = helpers[i].mref->ctrl;
614                 v4l2_ctrl_lock(master);
615
616                 /* Reset the 'is_new' flags of the cluster */
617                 for (j = 0; j < master->ncontrols; j++)
618                         if (master->cluster[j])
619                                 master->cluster[j]->is_new = 0;
620
621                 /*
622                  * For volatile autoclusters that are currently in auto mode
623                  * we need to discover if it will be set to manual mode.
624                  * If so, then we have to copy the current volatile values
625                  * first since those will become the new manual values (which
626                  * may be overwritten by explicit new values from this set
627                  * of controls).
628                  */
629                 if (master->is_auto && master->has_volatiles &&
630                     !is_cur_manual(master)) {
631                         /* Pick an initial non-manual value */
632                         s32 new_auto_val = master->manual_mode_value + 1;
633                         u32 tmp_idx = idx;
634
635                         do {
636                                 /*
637                                  * Check if the auto control is part of the
638                                  * list, and remember the new value.
639                                  */
640                                 if (helpers[tmp_idx].ref->ctrl == master)
641                                         new_auto_val = cs->controls[tmp_idx].value;
642                                 tmp_idx = helpers[tmp_idx].next;
643                         } while (tmp_idx);
644                         /*
645                          * If the new value == the manual value, then copy
646                          * the current volatile values.
647                          */
648                         if (new_auto_val == master->manual_mode_value)
649                                 update_from_auto_cluster(master);
650                 }
651
652                 /*
653                  * Copy the new caller-supplied control values.
654                  * user_to_new() sets 'is_new' to 1.
655                  */
656                 do {
657                         struct v4l2_ctrl *ctrl = helpers[idx].ref->ctrl;
658
659                         ret = user_to_new(cs->controls + idx, ctrl);
660                         if (!ret && ctrl->is_ptr) {
661                                 ret = validate_new(ctrl, ctrl->p_new);
662                                 if (ret)
663                                         dprintk(vdev,
664                                                 "failed to validate control %s (%d)\n",
665                                                 v4l2_ctrl_get_name(ctrl->id), ret);
666                         }
667                         idx = helpers[idx].next;
668                 } while (!ret && idx);
669
670                 if (!ret)
671                         ret = try_or_set_cluster(fh, master,
672                                                  !hdl->req_obj.req && set, 0);
673                 if (!ret && hdl->req_obj.req && set) {
674                         for (j = 0; j < master->ncontrols; j++) {
675                                 struct v4l2_ctrl_ref *ref =
676                                         find_ref(hdl, master->cluster[j]->id);
677
678                                 new_to_req(ref);
679                         }
680                 }
681
682                 /* Copy the new values back to userspace. */
683                 if (!ret) {
684                         idx = i;
685                         do {
686                                 ret = new_to_user(cs->controls + idx,
687                                                   helpers[idx].ref->ctrl);
688                                 idx = helpers[idx].next;
689                         } while (!ret && idx);
690                 }
691                 v4l2_ctrl_unlock(master);
692         }
693
694         if (cs->count > ARRAY_SIZE(helper))
695                 kvfree(helpers);
696         return ret;
697 }
698
699 static int try_set_ext_ctrls(struct v4l2_fh *fh,
700                              struct v4l2_ctrl_handler *hdl,
701                              struct video_device *vdev,
702                              struct media_device *mdev,
703                              struct v4l2_ext_controls *cs, bool set)
704 {
705         int ret;
706
707         if (cs->which == V4L2_CTRL_WHICH_REQUEST_VAL)
708                 return try_set_ext_ctrls_request(fh, hdl, vdev, mdev, cs, set);
709
710         ret = try_set_ext_ctrls_common(fh, hdl, cs, vdev, set);
711         if (ret)
712                 dprintk(vdev,
713                         "%s: try_set_ext_ctrls_common failed (%d)\n",
714                         video_device_node_name(vdev), ret);
715
716         return ret;
717 }
718
719 int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl,
720                        struct video_device *vdev,
721                        struct media_device *mdev,
722                        struct v4l2_ext_controls *cs)
723 {
724         return try_set_ext_ctrls(NULL, hdl, vdev, mdev, cs, false);
725 }
726 EXPORT_SYMBOL(v4l2_try_ext_ctrls);
727
728 int v4l2_s_ext_ctrls(struct v4l2_fh *fh,
729                      struct v4l2_ctrl_handler *hdl,
730                      struct video_device *vdev,
731                      struct media_device *mdev,
732                      struct v4l2_ext_controls *cs)
733 {
734         return try_set_ext_ctrls(fh, hdl, vdev, mdev, cs, true);
735 }
736 EXPORT_SYMBOL(v4l2_s_ext_ctrls);
737
738 /*
739  * VIDIOC_G/S_CTRL implementation
740  */
741
742 /* Helper function to get a single control */
743 static int get_ctrl(struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c)
744 {
745         struct v4l2_ctrl *master = ctrl->cluster[0];
746         int ret = 0;
747         int i;
748
749         /* Compound controls are not supported. The new_to_user() and
750          * cur_to_user() calls below would need to be modified not to access
751          * userspace memory when called from get_ctrl().
752          */
753         if (!ctrl->is_int && ctrl->type != V4L2_CTRL_TYPE_INTEGER64)
754                 return -EINVAL;
755
756         if (ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY)
757                 return -EACCES;
758
759         v4l2_ctrl_lock(master);
760         /* g_volatile_ctrl will update the current control values */
761         if (ctrl->flags & V4L2_CTRL_FLAG_VOLATILE) {
762                 for (i = 0; i < master->ncontrols; i++)
763                         cur_to_new(master->cluster[i]);
764                 ret = call_op(master, g_volatile_ctrl);
765                 new_to_user(c, ctrl);
766         } else {
767                 cur_to_user(c, ctrl);
768         }
769         v4l2_ctrl_unlock(master);
770         return ret;
771 }
772
773 int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *control)
774 {
775         struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
776         struct v4l2_ext_control c;
777         int ret;
778
779         if (!ctrl || !ctrl->is_int)
780                 return -EINVAL;
781         ret = get_ctrl(ctrl, &c);
782         control->value = c.value;
783         return ret;
784 }
785 EXPORT_SYMBOL(v4l2_g_ctrl);
786
787 /* Helper function for VIDIOC_S_CTRL compatibility */
788 static int set_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 ch_flags)
789 {
790         struct v4l2_ctrl *master = ctrl->cluster[0];
791         int ret;
792         int i;
793
794         /* Reset the 'is_new' flags of the cluster */
795         for (i = 0; i < master->ncontrols; i++)
796                 if (master->cluster[i])
797                         master->cluster[i]->is_new = 0;
798
799         ret = validate_new(ctrl, ctrl->p_new);
800         if (ret)
801                 return ret;
802
803         /*
804          * For autoclusters with volatiles that are switched from auto to
805          * manual mode we have to update the current volatile values since
806          * those will become the initial manual values after such a switch.
807          */
808         if (master->is_auto && master->has_volatiles && ctrl == master &&
809             !is_cur_manual(master) && ctrl->val == master->manual_mode_value)
810                 update_from_auto_cluster(master);
811
812         ctrl->is_new = 1;
813         return try_or_set_cluster(fh, master, true, ch_flags);
814 }
815
816 /* Helper function for VIDIOC_S_CTRL compatibility */
817 static int set_ctrl_lock(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl,
818                          struct v4l2_ext_control *c)
819 {
820         int ret;
821
822         v4l2_ctrl_lock(ctrl);
823         user_to_new(c, ctrl);
824         ret = set_ctrl(fh, ctrl, 0);
825         if (!ret)
826                 cur_to_user(c, ctrl);
827         v4l2_ctrl_unlock(ctrl);
828         return ret;
829 }
830
831 int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl,
832                 struct v4l2_control *control)
833 {
834         struct v4l2_ctrl *ctrl = v4l2_ctrl_find(hdl, control->id);
835         struct v4l2_ext_control c = { control->id };
836         int ret;
837
838         if (!ctrl || !ctrl->is_int)
839                 return -EINVAL;
840
841         if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
842                 return -EACCES;
843
844         c.value = control->value;
845         ret = set_ctrl_lock(fh, ctrl, &c);
846         control->value = c.value;
847         return ret;
848 }
849 EXPORT_SYMBOL(v4l2_s_ctrl);
850
851 /*
852  * Helper functions for drivers to get/set controls.
853  */
854
855 s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl)
856 {
857         struct v4l2_ext_control c;
858
859         /* It's a driver bug if this happens. */
860         if (WARN_ON(!ctrl->is_int))
861                 return 0;
862         c.value = 0;
863         get_ctrl(ctrl, &c);
864         return c.value;
865 }
866 EXPORT_SYMBOL(v4l2_ctrl_g_ctrl);
867
868 s64 v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl *ctrl)
869 {
870         struct v4l2_ext_control c;
871
872         /* It's a driver bug if this happens. */
873         if (WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64))
874                 return 0;
875         c.value64 = 0;
876         get_ctrl(ctrl, &c);
877         return c.value64;
878 }
879 EXPORT_SYMBOL(v4l2_ctrl_g_ctrl_int64);
880
881 int __v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
882 {
883         lockdep_assert_held(ctrl->handler->lock);
884
885         /* It's a driver bug if this happens. */
886         if (WARN_ON(!ctrl->is_int))
887                 return -EINVAL;
888         ctrl->val = val;
889         return set_ctrl(NULL, ctrl, 0);
890 }
891 EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl);
892
893 int __v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val)
894 {
895         lockdep_assert_held(ctrl->handler->lock);
896
897         /* It's a driver bug if this happens. */
898         if (WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64))
899                 return -EINVAL;
900         *ctrl->p_new.p_s64 = val;
901         return set_ctrl(NULL, ctrl, 0);
902 }
903 EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_int64);
904
905 int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
906 {
907         lockdep_assert_held(ctrl->handler->lock);
908
909         /* It's a driver bug if this happens. */
910         if (WARN_ON(ctrl->type != V4L2_CTRL_TYPE_STRING))
911                 return -EINVAL;
912         strscpy(ctrl->p_new.p_char, s, ctrl->maximum + 1);
913         return set_ctrl(NULL, ctrl, 0);
914 }
915 EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_string);
916
917 int __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl,
918                                 enum v4l2_ctrl_type type, const void *p)
919 {
920         lockdep_assert_held(ctrl->handler->lock);
921
922         /* It's a driver bug if this happens. */
923         if (WARN_ON(ctrl->type != type))
924                 return -EINVAL;
925         /* Setting dynamic arrays is not (yet?) supported. */
926         if (WARN_ON(ctrl->is_dyn_array))
927                 return -EINVAL;
928         memcpy(ctrl->p_new.p, p, ctrl->elems * ctrl->elem_size);
929         return set_ctrl(NULL, ctrl, 0);
930 }
931 EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_compound);
932
933 /*
934  * Modify the range of a control.
935  */
936 int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
937                              s64 min, s64 max, u64 step, s64 def)
938 {
939         bool value_changed;
940         bool range_changed = false;
941         int ret;
942
943         lockdep_assert_held(ctrl->handler->lock);
944
945         switch (ctrl->type) {
946         case V4L2_CTRL_TYPE_INTEGER:
947         case V4L2_CTRL_TYPE_INTEGER64:
948         case V4L2_CTRL_TYPE_BOOLEAN:
949         case V4L2_CTRL_TYPE_MENU:
950         case V4L2_CTRL_TYPE_INTEGER_MENU:
951         case V4L2_CTRL_TYPE_BITMASK:
952         case V4L2_CTRL_TYPE_U8:
953         case V4L2_CTRL_TYPE_U16:
954         case V4L2_CTRL_TYPE_U32:
955                 if (ctrl->is_array)
956                         return -EINVAL;
957                 ret = check_range(ctrl->type, min, max, step, def);
958                 if (ret)
959                         return ret;
960                 break;
961         default:
962                 return -EINVAL;
963         }
964         if (ctrl->minimum != min || ctrl->maximum != max ||
965             ctrl->step != step || ctrl->default_value != def) {
966                 range_changed = true;
967                 ctrl->minimum = min;
968                 ctrl->maximum = max;
969                 ctrl->step = step;
970                 ctrl->default_value = def;
971         }
972         cur_to_new(ctrl);
973         if (validate_new(ctrl, ctrl->p_new)) {
974                 if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
975                         *ctrl->p_new.p_s64 = def;
976                 else
977                         *ctrl->p_new.p_s32 = def;
978         }
979
980         if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
981                 value_changed = *ctrl->p_new.p_s64 != *ctrl->p_cur.p_s64;
982         else
983                 value_changed = *ctrl->p_new.p_s32 != *ctrl->p_cur.p_s32;
984         if (value_changed)
985                 ret = set_ctrl(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
986         else if (range_changed)
987                 send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
988         return ret;
989 }
990 EXPORT_SYMBOL(__v4l2_ctrl_modify_range);
991
992 /* Implement VIDIOC_QUERY_EXT_CTRL */
993 int v4l2_query_ext_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_query_ext_ctrl *qc)
994 {
995         const unsigned int next_flags = V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
996         u32 id = qc->id & V4L2_CTRL_ID_MASK;
997         struct v4l2_ctrl_ref *ref;
998         struct v4l2_ctrl *ctrl;
999
1000         if (!hdl)
1001                 return -EINVAL;
1002
1003         mutex_lock(hdl->lock);
1004
1005         /* Try to find it */
1006         ref = find_ref(hdl, id);
1007
1008         if ((qc->id & next_flags) && !list_empty(&hdl->ctrl_refs)) {
1009                 bool is_compound;
1010                 /* Match any control that is not hidden */
1011                 unsigned int mask = 1;
1012                 bool match = false;
1013
1014                 if ((qc->id & next_flags) == V4L2_CTRL_FLAG_NEXT_COMPOUND) {
1015                         /* Match any hidden control */
1016                         match = true;
1017                 } else if ((qc->id & next_flags) == next_flags) {
1018                         /* Match any control, compound or not */
1019                         mask = 0;
1020                 }
1021
1022                 /* Find the next control with ID > qc->id */
1023
1024                 /* Did we reach the end of the control list? */
1025                 if (id >= node2id(hdl->ctrl_refs.prev)) {
1026                         ref = NULL; /* Yes, so there is no next control */
1027                 } else if (ref) {
1028                         /*
1029                          * We found a control with the given ID, so just get
1030                          * the next valid one in the list.
1031                          */
1032                         list_for_each_entry_continue(ref, &hdl->ctrl_refs, node) {
1033                                 is_compound = ref->ctrl->is_array ||
1034                                         ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
1035                                 if (id < ref->ctrl->id &&
1036                                     (is_compound & mask) == match)
1037                                         break;
1038                         }
1039                         if (&ref->node == &hdl->ctrl_refs)
1040                                 ref = NULL;
1041                 } else {
1042                         /*
1043                          * No control with the given ID exists, so start
1044                          * searching for the next largest ID. We know there
1045                          * is one, otherwise the first 'if' above would have
1046                          * been true.
1047                          */
1048                         list_for_each_entry(ref, &hdl->ctrl_refs, node) {
1049                                 is_compound = ref->ctrl->is_array ||
1050                                         ref->ctrl->type >= V4L2_CTRL_COMPOUND_TYPES;
1051                                 if (id < ref->ctrl->id &&
1052                                     (is_compound & mask) == match)
1053                                         break;
1054                         }
1055                         if (&ref->node == &hdl->ctrl_refs)
1056                                 ref = NULL;
1057                 }
1058         }
1059         mutex_unlock(hdl->lock);
1060
1061         if (!ref)
1062                 return -EINVAL;
1063
1064         ctrl = ref->ctrl;
1065         memset(qc, 0, sizeof(*qc));
1066         if (id >= V4L2_CID_PRIVATE_BASE)
1067                 qc->id = id;
1068         else
1069                 qc->id = ctrl->id;
1070         strscpy(qc->name, ctrl->name, sizeof(qc->name));
1071         qc->flags = user_flags(ctrl);
1072         qc->type = ctrl->type;
1073         qc->elem_size = ctrl->elem_size;
1074         qc->elems = ctrl->elems;
1075         qc->nr_of_dims = ctrl->nr_of_dims;
1076         memcpy(qc->dims, ctrl->dims, qc->nr_of_dims * sizeof(qc->dims[0]));
1077         qc->minimum = ctrl->minimum;
1078         qc->maximum = ctrl->maximum;
1079         qc->default_value = ctrl->default_value;
1080         if (ctrl->type == V4L2_CTRL_TYPE_MENU ||
1081             ctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU)
1082                 qc->step = 1;
1083         else
1084                 qc->step = ctrl->step;
1085         return 0;
1086 }
1087 EXPORT_SYMBOL(v4l2_query_ext_ctrl);
1088
1089 /* Implement VIDIOC_QUERYCTRL */
1090 int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc)
1091 {
1092         struct v4l2_query_ext_ctrl qec = { qc->id };
1093         int rc;
1094
1095         rc = v4l2_query_ext_ctrl(hdl, &qec);
1096         if (rc)
1097                 return rc;
1098
1099         qc->id = qec.id;
1100         qc->type = qec.type;
1101         qc->flags = qec.flags;
1102         strscpy(qc->name, qec.name, sizeof(qc->name));
1103         switch (qc->type) {
1104         case V4L2_CTRL_TYPE_INTEGER:
1105         case V4L2_CTRL_TYPE_BOOLEAN:
1106         case V4L2_CTRL_TYPE_MENU:
1107         case V4L2_CTRL_TYPE_INTEGER_MENU:
1108         case V4L2_CTRL_TYPE_STRING:
1109         case V4L2_CTRL_TYPE_BITMASK:
1110                 qc->minimum = qec.minimum;
1111                 qc->maximum = qec.maximum;
1112                 qc->step = qec.step;
1113                 qc->default_value = qec.default_value;
1114                 break;
1115         default:
1116                 qc->minimum = 0;
1117                 qc->maximum = 0;
1118                 qc->step = 0;
1119                 qc->default_value = 0;
1120                 break;
1121         }
1122         return 0;
1123 }
1124 EXPORT_SYMBOL(v4l2_queryctrl);
1125
1126 /* Implement VIDIOC_QUERYMENU */
1127 int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm)
1128 {
1129         struct v4l2_ctrl *ctrl;
1130         u32 i = qm->index;
1131
1132         ctrl = v4l2_ctrl_find(hdl, qm->id);
1133         if (!ctrl)
1134                 return -EINVAL;
1135
1136         qm->reserved = 0;
1137         /* Sanity checks */
1138         switch (ctrl->type) {
1139         case V4L2_CTRL_TYPE_MENU:
1140                 if (!ctrl->qmenu)
1141                         return -EINVAL;
1142                 break;
1143         case V4L2_CTRL_TYPE_INTEGER_MENU:
1144                 if (!ctrl->qmenu_int)
1145                         return -EINVAL;
1146                 break;
1147         default:
1148                 return -EINVAL;
1149         }
1150
1151         if (i < ctrl->minimum || i > ctrl->maximum)
1152                 return -EINVAL;
1153
1154         /* Use mask to see if this menu item should be skipped */
1155         if (ctrl->menu_skip_mask & (1ULL << i))
1156                 return -EINVAL;
1157         /* Empty menu items should also be skipped */
1158         if (ctrl->type == V4L2_CTRL_TYPE_MENU) {
1159                 if (!ctrl->qmenu[i] || ctrl->qmenu[i][0] == '\0')
1160                         return -EINVAL;
1161                 strscpy(qm->name, ctrl->qmenu[i], sizeof(qm->name));
1162         } else {
1163                 qm->value = ctrl->qmenu_int[i];
1164         }
1165         return 0;
1166 }
1167 EXPORT_SYMBOL(v4l2_querymenu);
1168
1169 /*
1170  * VIDIOC_LOG_STATUS helpers
1171  */
1172
1173 int v4l2_ctrl_log_status(struct file *file, void *fh)
1174 {
1175         struct video_device *vfd = video_devdata(file);
1176         struct v4l2_fh *vfh = file->private_data;
1177
1178         if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) && vfd->v4l2_dev)
1179                 v4l2_ctrl_handler_log_status(vfh->ctrl_handler,
1180                                              vfd->v4l2_dev->name);
1181         return 0;
1182 }
1183 EXPORT_SYMBOL(v4l2_ctrl_log_status);
1184
1185 int v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd)
1186 {
1187         v4l2_ctrl_handler_log_status(sd->ctrl_handler, sd->name);
1188         return 0;
1189 }
1190 EXPORT_SYMBOL(v4l2_ctrl_subdev_log_status);
1191
1192 /*
1193  * VIDIOC_(UN)SUBSCRIBE_EVENT implementation
1194  */
1195
1196 static int v4l2_ctrl_add_event(struct v4l2_subscribed_event *sev,
1197                                unsigned int elems)
1198 {
1199         struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);
1200
1201         if (!ctrl)
1202                 return -EINVAL;
1203
1204         v4l2_ctrl_lock(ctrl);
1205         list_add_tail(&sev->node, &ctrl->ev_subs);
1206         if (ctrl->type != V4L2_CTRL_TYPE_CTRL_CLASS &&
1207             (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL))
1208                 send_initial_event(sev->fh, ctrl);
1209         v4l2_ctrl_unlock(ctrl);
1210         return 0;
1211 }
1212
1213 static void v4l2_ctrl_del_event(struct v4l2_subscribed_event *sev)
1214 {
1215         struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);
1216
1217         if (!ctrl)
1218                 return;
1219
1220         v4l2_ctrl_lock(ctrl);
1221         list_del(&sev->node);
1222         v4l2_ctrl_unlock(ctrl);
1223 }
1224
1225 void v4l2_ctrl_replace(struct v4l2_event *old, const struct v4l2_event *new)
1226 {
1227         u32 old_changes = old->u.ctrl.changes;
1228
1229         old->u.ctrl = new->u.ctrl;
1230         old->u.ctrl.changes |= old_changes;
1231 }
1232 EXPORT_SYMBOL(v4l2_ctrl_replace);
1233
1234 void v4l2_ctrl_merge(const struct v4l2_event *old, struct v4l2_event *new)
1235 {
1236         new->u.ctrl.changes |= old->u.ctrl.changes;
1237 }
1238 EXPORT_SYMBOL(v4l2_ctrl_merge);
1239
1240 const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops = {
1241         .add = v4l2_ctrl_add_event,
1242         .del = v4l2_ctrl_del_event,
1243         .replace = v4l2_ctrl_replace,
1244         .merge = v4l2_ctrl_merge,
1245 };
1246 EXPORT_SYMBOL(v4l2_ctrl_sub_ev_ops);
1247
1248 int v4l2_ctrl_subscribe_event(struct v4l2_fh *fh,
1249                               const struct v4l2_event_subscription *sub)
1250 {
1251         if (sub->type == V4L2_EVENT_CTRL)
1252                 return v4l2_event_subscribe(fh, sub, 0, &v4l2_ctrl_sub_ev_ops);
1253         return -EINVAL;
1254 }
1255 EXPORT_SYMBOL(v4l2_ctrl_subscribe_event);
1256
1257 int v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
1258                                      struct v4l2_event_subscription *sub)
1259 {
1260         if (!sd->ctrl_handler)
1261                 return -EINVAL;
1262         return v4l2_ctrl_subscribe_event(fh, sub);
1263 }
1264 EXPORT_SYMBOL(v4l2_ctrl_subdev_subscribe_event);
1265
1266 /*
1267  * poll helper
1268  */
1269 __poll_t v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait)
1270 {
1271         struct v4l2_fh *fh = file->private_data;
1272
1273         poll_wait(file, &fh->wait, wait);
1274         if (v4l2_event_pending(fh))
1275                 return EPOLLPRI;
1276         return 0;
1277 }
1278 EXPORT_SYMBOL(v4l2_ctrl_poll);
This page took 0.11145 seconds and 4 git commands to generate.