[media] uvcvideo: Ignore GET_RES error for XU controls
[GitHub/LineageOS/android_kernel_samsung_universal7580.git] / drivers / media / video / uvc / uvcvideo.h
CommitLineData
c0efd232
LP
1#ifndef _USB_VIDEO_H_
2#define _USB_VIDEO_H_
3
5f708812 4#ifndef __KERNEL__
227bd5b3
LP
5#error "The uvcvideo.h header is deprecated, use linux/uvcvideo.h instead."
6#endif /* __KERNEL__ */
c0efd232 7
227bd5b3 8#include <linux/kernel.h>
c0efd232 9#include <linux/poll.h>
4ffc2d89 10#include <linux/usb.h>
de05f634 11#include <linux/usb/video.h>
5f708812 12#include <linux/uvcvideo.h>
227bd5b3 13#include <linux/videodev2.h>
5a254d75
LP
14#include <media/media-device.h>
15#include <media/v4l2-device.h>
6998b6fb 16#include <media/videobuf2-core.h>
c0efd232
LP
17
18/* --------------------------------------------------------------------------
19 * UVC constants
20 */
21
c0efd232
LP
22#define UVC_TERM_INPUT 0x0000
23#define UVC_TERM_OUTPUT 0x8000
6241d8ca 24#define UVC_TERM_DIRECTION(term) ((term)->type & 0x8000)
c0efd232
LP
25
26#define UVC_ENTITY_TYPE(entity) ((entity)->type & 0x7fff)
27#define UVC_ENTITY_IS_UNIT(entity) (((entity)->type & 0xff00) == 0)
28#define UVC_ENTITY_IS_TERM(entity) (((entity)->type & 0xff00) != 0)
29#define UVC_ENTITY_IS_ITERM(entity) \
8e113595
LP
30 (UVC_ENTITY_IS_TERM(entity) && \
31 ((entity)->type & 0x8000) == UVC_TERM_INPUT)
c0efd232 32#define UVC_ENTITY_IS_OTERM(entity) \
8e113595
LP
33 (UVC_ENTITY_IS_TERM(entity) && \
34 ((entity)->type & 0x8000) == UVC_TERM_OUTPUT)
c0efd232 35
c0efd232
LP
36
37/* ------------------------------------------------------------------------
38 * GUIDs
39 */
40#define UVC_GUID_UVC_CAMERA \
41 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
43#define UVC_GUID_UVC_OUTPUT \
44 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}
46#define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \
47 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
49#define UVC_GUID_UVC_PROCESSING \
50 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01}
52#define UVC_GUID_UVC_SELECTOR \
53 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}
55
c0efd232
LP
56#define UVC_GUID_FORMAT_MJPEG \
57 { 'M', 'J', 'P', 'G', 0x00, 0x00, 0x10, 0x00, \
58 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
59#define UVC_GUID_FORMAT_YUY2 \
60 { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \
61 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
68f194e0
DR
62#define UVC_GUID_FORMAT_YUY2_ISIGHT \
63 { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \
64 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x9b, 0x71}
c0efd232
LP
65#define UVC_GUID_FORMAT_NV12 \
66 { 'N', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \
67 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
68#define UVC_GUID_FORMAT_YV12 \
69 { 'Y', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \
70 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
71#define UVC_GUID_FORMAT_I420 \
72 { 'I', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \
73 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
74#define UVC_GUID_FORMAT_UYVY \
75 { 'U', 'Y', 'V', 'Y', 0x00, 0x00, 0x10, 0x00, \
76 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
77#define UVC_GUID_FORMAT_Y800 \
78 { 'Y', '8', '0', '0', 0x00, 0x00, 0x10, 0x00, \
79 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
61421206
LP
80#define UVC_GUID_FORMAT_Y16 \
81 { 'Y', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \
82 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
c0efd232
LP
83#define UVC_GUID_FORMAT_BY8 \
84 { 'B', 'Y', '8', ' ', 0x00, 0x00, 0x10, 0x00, \
85 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
50791079
LP
86#define UVC_GUID_FORMAT_RGBP \
87 { 'R', 'G', 'B', 'P', 0x00, 0x00, 0x10, 0x00, \
88 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
7225a1dc
HG
89#define UVC_GUID_FORMAT_M420 \
90 { 'M', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \
91 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
c0efd232 92
25ad8a8d
SL
93#define UVC_GUID_FORMAT_H264 \
94 { 'H', '2', '6', '4', 0x00, 0x00, 0x10, 0x00, \
95 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
96
c0efd232
LP
97/* ------------------------------------------------------------------------
98 * Driver specific constants.
99 */
100
fd3e5824 101#define DRIVER_VERSION "1.1.1"
c0efd232
LP
102
103/* Number of isochronous URBs. */
104#define UVC_URBS 5
efdc8a95
LP
105/* Maximum number of packets per URB. */
106#define UVC_MAX_PACKETS 32
c0efd232
LP
107/* Maximum number of video buffers. */
108#define UVC_MAX_VIDEO_BUFFERS 32
a31a4055
ML
109/* Maximum status buffer size in bytes of interrupt URB. */
110#define UVC_MAX_STATUS_SIZE 16
c0efd232
LP
111
112#define UVC_CTRL_CONTROL_TIMEOUT 300
56d15cd3 113#define UVC_CTRL_STREAMING_TIMEOUT 5000
c0efd232 114
8fb91b33
MR
115/* Maximum allowed number of control mappings per device */
116#define UVC_MAX_CONTROL_MAPPINGS 1024
117
c0efd232
LP
118/* Devices quirks */
119#define UVC_QUIRK_STATUS_INTERVAL 0x00000001
120#define UVC_QUIRK_PROBE_MINMAX 0x00000002
121#define UVC_QUIRK_PROBE_EXTRAFIELDS 0x00000004
122#define UVC_QUIRK_BUILTIN_ISIGHT 0x00000008
123#define UVC_QUIRK_STREAM_NO_FID 0x00000010
124#define UVC_QUIRK_IGNORE_SELECTOR_UNIT 0x00000020
50144aee 125#define UVC_QUIRK_FIX_BANDWIDTH 0x00000080
bab6f66c 126#define UVC_QUIRK_PROBE_DEF 0x00000100
86d8b6ab 127#define UVC_QUIRK_RESTRICT_FRAME_RATE 0x00000200
c0efd232
LP
128
129/* Format flags */
130#define UVC_FMT_FLAG_COMPRESSED 0x00000001
131#define UVC_FMT_FLAG_STREAM 0x00000002
132
133/* ------------------------------------------------------------------------
134 * Structures.
135 */
136
137struct uvc_device;
138
139/* TODO: Put the most frequently accessed fields at the beginning of
140 * structures to maximize cache efficiency.
141 */
c0efd232 142struct uvc_control_info {
c0efd232
LP
143 struct list_head mappings;
144
145 __u8 entity[16];
ba2fa996 146 __u8 index; /* Bit index in bmControls */
c0efd232
LP
147 __u8 selector;
148
149 __u16 size;
150 __u32 flags;
151};
152
153struct uvc_control_mapping {
154 struct list_head list;
155
156 struct uvc_control_info *ctrl;
157
158 __u32 id;
159 __u8 name[32];
160 __u8 entity[16];
161 __u8 selector;
162
163 __u8 size;
164 __u8 offset;
165 enum v4l2_ctrl_type v4l2_type;
166 __u32 data_type;
167
168 struct uvc_menu_info *menu_info;
169 __u32 menu_count;
9768352a
LP
170
171 __s32 (*get) (struct uvc_control_mapping *mapping, __u8 query,
172 const __u8 *data);
173 void (*set) (struct uvc_control_mapping *mapping, __s32 value,
174 __u8 *data);
c0efd232
LP
175};
176
177struct uvc_control {
178 struct uvc_entity *entity;
071c8bb8 179 struct uvc_control_info info;
c0efd232
LP
180
181 __u8 index; /* Used to match the uvc_control entry with a
182 uvc_control_info. */
071c8bb8
LP
183 __u8 dirty:1,
184 loaded:1,
185 modified:1,
186 cached:1,
187 initialized:1;
c0efd232 188
b30ece53 189 __u8 *uvc_data;
c0efd232
LP
190};
191
192struct uvc_format_desc {
193 char *name;
194 __u8 guid[16];
195 __u32 fcc;
196};
197
198/* The term 'entity' refers to both UVC units and UVC terminals.
199 *
200 * The type field is either the terminal type (wTerminalType in the terminal
201 * descriptor), or the unit type (bDescriptorSubtype in the unit descriptor).
202 * As the bDescriptorSubtype field is one byte long, the type value will
203 * always have a null MSB for units. All terminal types defined by the UVC
204 * specification have a non-null MSB, so it is safe to use the MSB to
205 * differentiate between units and terminals as long as the descriptor parsing
206 * code makes sure terminal types have a non-null MSB.
207 *
208 * For terminals, the type's most significant bit stores the terminal
209 * direction (either UVC_TERM_INPUT or UVC_TERM_OUTPUT). The type field should
210 * always be accessed with the UVC_ENTITY_* macros and never directly.
211 */
212
213struct uvc_entity {
214 struct list_head list; /* Entity as part of a UVC device. */
215 struct list_head chain; /* Entity as part of a video device
216 * chain. */
217 __u8 id;
218 __u16 type;
219 char name[64];
220
4ffc2d89 221 /* Media controller-related fields. */
8a65a948 222 struct video_device *vdev;
4ffc2d89
LP
223 struct v4l2_subdev subdev;
224 unsigned int num_pads;
225 unsigned int num_links;
226 struct media_pad *pads;
227
c0efd232
LP
228 union {
229 struct {
230 __u16 wObjectiveFocalLengthMin;
231 __u16 wObjectiveFocalLengthMax;
232 __u16 wOcularFocalLength;
233 __u8 bControlSize;
234 __u8 *bmControls;
235 } camera;
236
237 struct {
238 __u8 bControlSize;
239 __u8 *bmControls;
240 __u8 bTransportModeSize;
241 __u8 *bmTransportModes;
242 } media;
243
244 struct {
c0efd232
LP
245 } output;
246
247 struct {
c0efd232
LP
248 __u16 wMaxMultiplier;
249 __u8 bControlSize;
250 __u8 *bmControls;
251 __u8 bmVideoStandards;
252 } processing;
253
254 struct {
c0efd232
LP
255 } selector;
256
257 struct {
258 __u8 guidExtensionCode[16];
259 __u8 bNumControls;
c0efd232
LP
260 __u8 bControlSize;
261 __u8 *bmControls;
262 __u8 *bmControlsType;
263 } extension;
264 };
265
8ca5a639
LP
266 __u8 bNrInPins;
267 __u8 *baSourceID;
268
c0efd232
LP
269 unsigned int ncontrols;
270 struct uvc_control *controls;
271};
272
273struct uvc_frame {
274 __u8 bFrameIndex;
275 __u8 bmCapabilities;
276 __u16 wWidth;
277 __u16 wHeight;
278 __u32 dwMinBitRate;
279 __u32 dwMaxBitRate;
280 __u32 dwMaxVideoFrameBufferSize;
281 __u8 bFrameIntervalType;
282 __u32 dwDefaultFrameInterval;
283 __u32 *dwFrameInterval;
284};
285
286struct uvc_format {
287 __u8 type;
288 __u8 index;
289 __u8 bpp;
290 __u8 colorspace;
291 __u32 fcc;
292 __u32 flags;
293
294 char name[32];
295
296 unsigned int nframes;
297 struct uvc_frame *frame;
298};
299
300struct uvc_streaming_header {
301 __u8 bNumFormats;
302 __u8 bEndpointAddress;
303 __u8 bTerminalLink;
304 __u8 bControlSize;
305 __u8 *bmaControls;
306 /* The following fields are used by input headers only. */
307 __u8 bmInfo;
308 __u8 bStillCaptureMethod;
309 __u8 bTriggerSupport;
310 __u8 bTriggerUsage;
311};
312
c0efd232 313enum uvc_buffer_state {
2c2d264b
LP
314 UVC_BUF_STATE_IDLE = 0,
315 UVC_BUF_STATE_QUEUED = 1,
316 UVC_BUF_STATE_ACTIVE = 2,
d7c0d439
LP
317 UVC_BUF_STATE_READY = 3,
318 UVC_BUF_STATE_DONE = 4,
319 UVC_BUF_STATE_ERROR = 5,
c0efd232
LP
320};
321
322struct uvc_buffer {
6998b6fb 323 struct vb2_buffer buf;
c0efd232 324 struct list_head queue;
6998b6fb 325
c0efd232 326 enum uvc_buffer_state state;
9bde9f26 327 unsigned int error;
3d95e932
LP
328
329 void *mem;
330 unsigned int length;
331 unsigned int bytesused;
c0efd232
LP
332};
333
6998b6fb
LP
334#define UVC_QUEUE_DISCONNECTED (1 << 0)
335#define UVC_QUEUE_DROP_CORRUPTED (1 << 1)
c0efd232
LP
336
337struct uvc_video_queue {
6998b6fb
LP
338 struct vb2_queue queue;
339 struct mutex mutex; /* Protects queue */
ff924203 340
c0efd232 341 unsigned int flags;
ff924203 342 unsigned int buf_used;
c0efd232 343
6998b6fb 344 spinlock_t irqlock; /* Protects irqqueue */
c0efd232
LP
345 struct list_head irqqueue;
346};
347
8e113595
LP
348struct uvc_video_chain {
349 struct uvc_device *dev;
350 struct list_head list;
351
6241d8ca 352 struct list_head entities; /* All entities */
8e113595
LP
353 struct uvc_entity *processing; /* Processing unit */
354 struct uvc_entity *selector; /* Selector unit */
8e113595 355
27a61c13 356 struct mutex ctrl_mutex; /* Protects ctrl.info */
8e113595
LP
357};
358
35f02a68
LP
359struct uvc_streaming {
360 struct list_head list;
c0efd232
LP
361 struct uvc_device *dev;
362 struct video_device *vdev;
8e113595 363 struct uvc_video_chain *chain;
c0efd232 364 atomic_t active;
c0efd232 365
35f02a68
LP
366 struct usb_interface *intf;
367 int intfnum;
368 __u16 maxpsize;
c0efd232 369
35f02a68
LP
370 struct uvc_streaming_header header;
371 enum v4l2_buf_type type;
372
373 unsigned int nformats;
374 struct uvc_format *format;
c0efd232 375
35f02a68
LP
376 struct uvc_streaming_control ctrl;
377 struct uvc_format *cur_format;
378 struct uvc_frame *cur_frame;
6947756d
LP
379 /* Protect access to ctrl, cur_format, cur_frame and hardware video
380 * probe control.
381 */
35f02a68 382 struct mutex mutex;
c0efd232 383
6998b6fb 384 /* Buffers queue. */
35f02a68
LP
385 unsigned int frozen : 1;
386 struct uvc_video_queue queue;
387 void (*decode) (struct urb *urb, struct uvc_streaming *video,
c0efd232
LP
388 struct uvc_buffer *buf);
389
390 /* Context data used by the bulk completion handler. */
391 struct {
392 __u8 header[256];
393 unsigned int header_size;
394 int skip_payload;
395 __u32 payload_size;
396 __u32 max_payload_size;
397 } bulk;
398
399 struct urb *urb[UVC_URBS];
400 char *urb_buffer[UVC_URBS];
e01117c8
LP
401 dma_addr_t urb_dma[UVC_URBS];
402 unsigned int urb_size;
c0efd232 403
650b95fe 404 __u32 sequence;
c0efd232
LP
405 __u8 last_fid;
406};
407
408enum uvc_device_state {
409 UVC_DEV_DISCONNECTED = 1,
410};
411
412struct uvc_device {
413 struct usb_device *udev;
414 struct usb_interface *intf;
44f0079e 415 unsigned long warnings;
c0efd232
LP
416 __u32 quirks;
417 int intfnum;
418 char name[32];
419
420 enum uvc_device_state state;
04a37e0f 421 atomic_t users;
8fb91b33 422 atomic_t nmappings;
c0efd232
LP
423
424 /* Video control interface */
5a254d75
LP
425#ifdef CONFIG_MEDIA_CONTROLLER
426 struct media_device mdev;
427#endif
428 struct v4l2_device vdev;
c0efd232
LP
429 __u16 uvc_version;
430 __u32 clock_frequency;
431
432 struct list_head entities;
8e113595 433 struct list_head chains;
c0efd232 434
35f02a68
LP
435 /* Video Streaming interfaces */
436 struct list_head streams;
716fdee1 437 atomic_t nstreams;
35f02a68 438
c0efd232
LP
439 /* Status Interrupt Endpoint */
440 struct usb_host_endpoint *int_ep;
441 struct urb *int_urb;
a31a4055 442 __u8 *status;
c0efd232 443 struct input_dev *input;
f1801523 444 char input_phys[64];
c0efd232
LP
445};
446
447enum uvc_handle_state {
448 UVC_HANDLE_PASSIVE = 0,
449 UVC_HANDLE_ACTIVE = 1,
450};
451
452struct uvc_fh {
8e113595 453 struct uvc_video_chain *chain;
35f02a68 454 struct uvc_streaming *stream;
c0efd232
LP
455 enum uvc_handle_state state;
456};
457
458struct uvc_driver {
459 struct usb_driver driver;
c0efd232
LP
460};
461
462/* ------------------------------------------------------------------------
463 * Debugging, printing and logging
464 */
465
466#define UVC_TRACE_PROBE (1 << 0)
467#define UVC_TRACE_DESCR (1 << 1)
468#define UVC_TRACE_CONTROL (1 << 2)
469#define UVC_TRACE_FORMAT (1 << 3)
470#define UVC_TRACE_CAPTURE (1 << 4)
471#define UVC_TRACE_CALLS (1 << 5)
472#define UVC_TRACE_IOCTL (1 << 6)
473#define UVC_TRACE_FRAME (1 << 7)
474#define UVC_TRACE_SUSPEND (1 << 8)
475#define UVC_TRACE_STATUS (1 << 9)
663a4192 476#define UVC_TRACE_VIDEO (1 << 10)
c0efd232 477
44f0079e
LP
478#define UVC_WARN_MINMAX 0
479#define UVC_WARN_PROBE_DEF 1
c4d99f89 480#define UVC_WARN_XU_GET_RES 2
44f0079e 481
310fe524 482extern unsigned int uvc_clock_param;
0fbd8ee6 483extern unsigned int uvc_no_drop_param;
c0efd232 484extern unsigned int uvc_trace_param;
b232a012 485extern unsigned int uvc_timeout_param;
c0efd232
LP
486
487#define uvc_trace(flag, msg...) \
488 do { \
489 if (uvc_trace_param & flag) \
490 printk(KERN_DEBUG "uvcvideo: " msg); \
491 } while (0)
492
44f0079e
LP
493#define uvc_warn_once(dev, warn, msg...) \
494 do { \
495 if (!test_and_set_bit(warn, &dev->warnings)) \
496 printk(KERN_INFO "uvcvideo: " msg); \
497 } while (0)
498
c0efd232
LP
499#define uvc_printk(level, msg...) \
500 printk(level "uvcvideo: " msg)
501
c0efd232
LP
502/* --------------------------------------------------------------------------
503 * Internal functions.
504 */
505
506/* Core driver */
507extern struct uvc_driver uvc_driver;
c0efd232 508
4ffc2d89
LP
509extern struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id);
510
c0efd232 511/* Video buffers queue management. */
ff924203 512extern void uvc_queue_init(struct uvc_video_queue *queue,
9bde9f26 513 enum v4l2_buf_type type, int drop_corrupted);
c0efd232 514extern int uvc_alloc_buffers(struct uvc_video_queue *queue,
6998b6fb
LP
515 struct v4l2_requestbuffers *rb);
516extern void uvc_free_buffers(struct uvc_video_queue *queue);
c0efd232
LP
517extern int uvc_query_buffer(struct uvc_video_queue *queue,
518 struct v4l2_buffer *v4l2_buf);
519extern int uvc_queue_buffer(struct uvc_video_queue *queue,
520 struct v4l2_buffer *v4l2_buf);
521extern int uvc_dequeue_buffer(struct uvc_video_queue *queue,
522 struct v4l2_buffer *v4l2_buf, int nonblocking);
523extern int uvc_queue_enable(struct uvc_video_queue *queue, int enable);
524extern void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect);
525extern struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue,
526 struct uvc_buffer *buf);
4aa27597
LP
527extern int uvc_queue_mmap(struct uvc_video_queue *queue,
528 struct vm_area_struct *vma);
c0efd232
LP
529extern unsigned int uvc_queue_poll(struct uvc_video_queue *queue,
530 struct file *file, poll_table *wait);
72969447
BL
531#ifndef CONFIG_MMU
532extern unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue,
533 unsigned long pgoff);
534#endif
23ff6043 535extern int uvc_queue_allocated(struct uvc_video_queue *queue);
c0efd232
LP
536static inline int uvc_queue_streaming(struct uvc_video_queue *queue)
537{
6998b6fb 538 return vb2_is_streaming(&queue->queue);
c0efd232
LP
539}
540
541/* V4L2 interface */
bec43661 542extern const struct v4l2_file_operations uvc_fops;
c0efd232 543
4ffc2d89
LP
544/* Media controller */
545extern int uvc_mc_register_entities(struct uvc_video_chain *chain);
546extern void uvc_mc_cleanup_entity(struct uvc_entity *entity);
547
c0efd232 548/* Video */
35f02a68
LP
549extern int uvc_video_init(struct uvc_streaming *stream);
550extern int uvc_video_suspend(struct uvc_streaming *stream);
d59a7b1d 551extern int uvc_video_resume(struct uvc_streaming *stream, int reset);
35f02a68
LP
552extern int uvc_video_enable(struct uvc_streaming *stream, int enable);
553extern int uvc_probe_video(struct uvc_streaming *stream,
c0efd232
LP
554 struct uvc_streaming_control *probe);
555extern int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit,
556 __u8 intfnum, __u8 cs, void *data, __u16 size);
c0efd232
LP
557
558/* Status */
559extern int uvc_status_init(struct uvc_device *dev);
560extern void uvc_status_cleanup(struct uvc_device *dev);
04a37e0f
LP
561extern int uvc_status_start(struct uvc_device *dev);
562extern void uvc_status_stop(struct uvc_device *dev);
c0efd232
LP
563extern int uvc_status_suspend(struct uvc_device *dev);
564extern int uvc_status_resume(struct uvc_device *dev);
565
566/* Controls */
8e113595 567extern int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
c0efd232 568 struct v4l2_queryctrl *v4l2_ctrl);
23d9f3ef
LP
569extern int uvc_query_v4l2_menu(struct uvc_video_chain *chain,
570 struct v4l2_querymenu *query_menu);
c0efd232 571
ba2fa996
LP
572extern int uvc_ctrl_add_mapping(struct uvc_video_chain *chain,
573 const struct uvc_control_mapping *mapping);
c0efd232
LP
574extern int uvc_ctrl_init_device(struct uvc_device *dev);
575extern void uvc_ctrl_cleanup_device(struct uvc_device *dev);
576extern int uvc_ctrl_resume_device(struct uvc_device *dev);
c0efd232 577
8e113595
LP
578extern int uvc_ctrl_begin(struct uvc_video_chain *chain);
579extern int __uvc_ctrl_commit(struct uvc_video_chain *chain, int rollback);
580static inline int uvc_ctrl_commit(struct uvc_video_chain *chain)
c0efd232 581{
8e113595 582 return __uvc_ctrl_commit(chain, 0);
c0efd232 583}
8e113595 584static inline int uvc_ctrl_rollback(struct uvc_video_chain *chain)
c0efd232 585{
8e113595 586 return __uvc_ctrl_commit(chain, 1);
c0efd232
LP
587}
588
8e113595 589extern int uvc_ctrl_get(struct uvc_video_chain *chain,
c0efd232 590 struct v4l2_ext_control *xctrl);
8e113595 591extern int uvc_ctrl_set(struct uvc_video_chain *chain,
c0efd232
LP
592 struct v4l2_ext_control *xctrl);
593
8e113595 594extern int uvc_xu_ctrl_query(struct uvc_video_chain *chain,
fe78d187 595 struct uvc_xu_control_query *xqry);
c0efd232
LP
596
597/* Utility functions */
598extern void uvc_simplify_fraction(uint32_t *numerator, uint32_t *denominator,
599 unsigned int n_terms, unsigned int threshold);
600extern uint32_t uvc_fraction_to_interval(uint32_t numerator,
601 uint32_t denominator);
602extern struct usb_host_endpoint *uvc_find_endpoint(
603 struct usb_host_interface *alts, __u8 epaddr);
604
605/* Quirks support */
35f02a68 606void uvc_video_decode_isight(struct urb *urb, struct uvc_streaming *stream,
c0efd232
LP
607 struct uvc_buffer *buf);
608
c0efd232 609#endif