V4L/DVB (13896): gspca - zc3xx: Adjust the pas202b exchanges.
[deliverable/linux.git] / drivers / media / video / gspca / gspca.c
CommitLineData
63eb9546
JFM
1/*
2 * Main USB camera driver
3 *
11bd199a 4 * Copyright (C) 2008-2009 Jean-Francois Moine (http://moinejf.free.fr)
63eb9546
JFM
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21#define MODULE_NAME "gspca"
22
23#include <linux/init.h>
cf0fe08d 24#include <linux/version.h>
63eb9546
JFM
25#include <linux/fs.h>
26#include <linux/vmalloc.h>
27#include <linux/sched.h>
28#include <linux/slab.h>
29#include <linux/mm.h>
30#include <linux/string.h>
31#include <linux/pagemap.h>
956e42d2 32#include <linux/io.h>
63eb9546 33#include <asm/page.h>
956e42d2 34#include <linux/uaccess.h>
63eb9546 35#include <linux/jiffies.h>
35ea11ff 36#include <media/v4l2-ioctl.h>
63eb9546
JFM
37
38#include "gspca.h"
39
d43fa32f 40/* global values */
8fee8453
JFM
41#define DEF_NURBS 3 /* default number of URBs */
42#if DEF_NURBS > MAX_NURBS
43#error "DEF_NURBS too big"
44#endif
d43fa32f 45
63eb9546
JFM
46MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>");
47MODULE_DESCRIPTION("GSPCA USB Camera Driver");
48MODULE_LICENSE("GPL");
49
77ee3318 50#define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 8, 0)
63eb9546 51
335b3f88 52#ifdef GSPCA_DEBUG
63eb9546
JFM
53int gspca_debug = D_ERR | D_PROBE;
54EXPORT_SYMBOL(gspca_debug);
55
56static void PDEBUG_MODE(char *txt, __u32 pixfmt, int w, int h)
57{
58 if ((pixfmt >> 24) >= '0' && (pixfmt >> 24) <= 'z') {
59 PDEBUG(D_CONF|D_STREAM, "%s %c%c%c%c %dx%d",
60 txt,
61 pixfmt & 0xff,
62 (pixfmt >> 8) & 0xff,
63 (pixfmt >> 16) & 0xff,
64 pixfmt >> 24,
65 w, h);
66 } else {
67 PDEBUG(D_CONF|D_STREAM, "%s 0x%08x %dx%d",
68 txt,
69 pixfmt,
70 w, h);
71 }
72}
73#else
74#define PDEBUG_MODE(txt, pixfmt, w, h)
75#endif
76
77ee3318 77/* specific memory types - !! should be different from V4L2_MEMORY_xxx */
d43fa32f
JFM
78#define GSPCA_MEMORY_NO 0 /* V4L2_MEMORY_xxx starts from 1 */
79#define GSPCA_MEMORY_READ 7
80
d43fa32f 81#define BUF_ALL_FLAGS (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE)
d43fa32f 82
63eb9546
JFM
83/*
84 * VMA operations.
85 */
86static void gspca_vm_open(struct vm_area_struct *vma)
87{
88 struct gspca_frame *frame = vma->vm_private_data;
89
90 frame->vma_use_count++;
91 frame->v4l2_buf.flags |= V4L2_BUF_FLAG_MAPPED;
92}
93
94static void gspca_vm_close(struct vm_area_struct *vma)
95{
96 struct gspca_frame *frame = vma->vm_private_data;
97
98 if (--frame->vma_use_count <= 0)
99 frame->v4l2_buf.flags &= ~V4L2_BUF_FLAG_MAPPED;
100}
101
f0f37e2f 102static const struct vm_operations_struct gspca_vm_ops = {
63eb9546
JFM
103 .open = gspca_vm_open,
104 .close = gspca_vm_close,
105};
106
1b60e1ad
JFM
107/* get the current input frame buffer */
108struct gspca_frame *gspca_get_i_frame(struct gspca_dev *gspca_dev)
109{
110 struct gspca_frame *frame;
1b60e1ad 111
db870875 112 frame = gspca_dev->cur_frame;
1b60e1ad
JFM
113 if ((frame->v4l2_buf.flags & BUF_ALL_FLAGS)
114 != V4L2_BUF_FLAG_QUEUED)
115 return NULL;
116 return frame;
117}
118EXPORT_SYMBOL(gspca_get_i_frame);
119
63eb9546 120/*
d43fa32f 121 * fill a video frame from an URB and resubmit
63eb9546 122 */
d43fa32f
JFM
123static void fill_frame(struct gspca_dev *gspca_dev,
124 struct urb *urb)
63eb9546 125{
8d584a53 126 u8 *data; /* address of data in the iso message */
1b60e1ad 127 int i, len, st;
63eb9546
JFM
128 cam_pkt_op pkt_scan;
129
6a7eba24 130 if (urb->status != 0) {
090264e5
JFM
131 if (urb->status == -ESHUTDOWN)
132 return; /* disconnection */
62ee8eee 133#ifdef CONFIG_PM
6a540bdf
HG
134 if (gspca_dev->frozen)
135 return;
62ee8eee 136#endif
6a540bdf 137 PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status);
8157852f 138 urb->status = 0;
bf926adf 139 goto resubmit;
6a7eba24 140 }
63eb9546
JFM
141 pkt_scan = gspca_dev->sd_desc->pkt_scan;
142 for (i = 0; i < urb->number_of_packets; i++) {
143
63eb9546
JFM
144 /* check the packet status and length */
145 len = urb->iso_frame_desc[i].actual_length;
ff374747
JFM
146 if (len == 0) {
147 if (gspca_dev->empty_packet == 0)
148 gspca_dev->empty_packet = 1;
6a7eba24 149 continue;
ff374747 150 }
63eb9546
JFM
151 st = urb->iso_frame_desc[i].status;
152 if (st) {
6a7eba24
JFM
153 PDEBUG(D_ERR,
154 "ISOC data error: [%d] len=%d, status=%d",
63eb9546
JFM
155 i, len, st);
156 gspca_dev->last_packet_type = DISCARD_PACKET;
157 continue;
158 }
63eb9546
JFM
159
160 /* let the packet be analyzed by the subdriver */
161 PDEBUG(D_PACK, "packet [%d] o:%d l:%d",
162 i, urb->iso_frame_desc[i].offset, len);
8d584a53 163 data = (u8 *) urb->transfer_buffer
63eb9546 164 + urb->iso_frame_desc[i].offset;
76dd272b 165 pkt_scan(gspca_dev, data, len);
63eb9546
JFM
166 }
167
bf926adf 168resubmit:
63eb9546 169 /* resubmit the URB */
63eb9546
JFM
170 st = usb_submit_urb(urb, GFP_ATOMIC);
171 if (st < 0)
172 PDEBUG(D_ERR|D_PACK, "usb_submit_urb() ret %d", st);
173}
174
d43fa32f
JFM
175/*
176 * ISOC message interrupt from the USB device
177 *
ac0d6df6 178 * Analyse each packet and call the subdriver for copy to the frame buffer.
d43fa32f 179 */
8d584a53 180static void isoc_irq(struct urb *urb)
d43fa32f
JFM
181{
182 struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context;
183
3647fea8 184 PDEBUG(D_PACK, "isoc irq");
d43fa32f
JFM
185 if (!gspca_dev->streaming)
186 return;
187 fill_frame(gspca_dev, urb);
188}
189
0be01004
JFM
190/*
191 * bulk message interrupt from the USB device
192 */
8d584a53 193static void bulk_irq(struct urb *urb)
0be01004
JFM
194{
195 struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context;
dff369aa 196 int st;
0be01004
JFM
197
198 PDEBUG(D_PACK, "bulk irq");
199 if (!gspca_dev->streaming)
200 return;
880ae24d
JFM
201 switch (urb->status) {
202 case 0:
203 break;
090264e5
JFM
204 case -ESHUTDOWN:
205 return; /* disconnection */
880ae24d 206 default:
0be01004 207#ifdef CONFIG_PM
6a540bdf
HG
208 if (gspca_dev->frozen)
209 return;
0be01004 210#endif
6a540bdf 211 PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status);
8157852f 212 urb->status = 0;
bf926adf 213 goto resubmit;
0be01004
JFM
214 }
215
d131c3c9
JFM
216 PDEBUG(D_PACK, "packet l:%d", urb->actual_length);
217 gspca_dev->sd_desc->pkt_scan(gspca_dev,
d131c3c9
JFM
218 urb->transfer_buffer,
219 urb->actual_length);
dff369aa 220
bf926adf 221resubmit:
dff369aa
AO
222 /* resubmit the URB */
223 if (gspca_dev->cam.bulk_nurbs != 0) {
224 st = usb_submit_urb(urb, GFP_ATOMIC);
225 if (st < 0)
226 PDEBUG(D_ERR|D_PACK, "usb_submit_urb() ret %d", st);
227 }
0be01004
JFM
228}
229
63eb9546
JFM
230/*
231 * add data to the current frame
232 *
ac0d6df6
JFM
233 * This function is called by the subdrivers at interrupt level.
234 *
63eb9546
JFM
235 * To build a frame, these ones must add
236 * - one FIRST_PACKET
237 * - 0 or many INTER_PACKETs
238 * - one LAST_PACKET
239 * DISCARD_PACKET invalidates the whole frame.
240 * On LAST_PACKET, a new frame is returned.
241 */
76dd272b
JFM
242void gspca_frame_add(struct gspca_dev *gspca_dev,
243 enum gspca_packet_type packet_type,
244 const u8 *data,
245 int len)
63eb9546 246{
3ec342f2 247 struct gspca_frame *frame;
63eb9546
JFM
248 int i, j;
249
e2997a72 250 PDEBUG(D_PACK, "add t:%d l:%d", packet_type, len);
d131c3c9
JFM
251
252 /* check the availability of the frame buffer */
3ec342f2 253 frame = gspca_dev->cur_frame;
d131c3c9
JFM
254 if ((frame->v4l2_buf.flags & BUF_ALL_FLAGS)
255 != V4L2_BUF_FLAG_QUEUED) {
256 gspca_dev->last_packet_type = DISCARD_PACKET;
76dd272b 257 return;
d131c3c9 258 }
63eb9546
JFM
259
260 /* when start of a new frame, if the current frame buffer
261 * is not queued, discard the whole frame */
262 if (packet_type == FIRST_PACKET) {
63eb9546
JFM
263 frame->data_end = frame->data;
264 jiffies_to_timeval(get_jiffies_64(),
265 &frame->v4l2_buf.timestamp);
266 frame->v4l2_buf.sequence = ++gspca_dev->sequence;
d43fa32f 267 } else if (gspca_dev->last_packet_type == DISCARD_PACKET) {
06ca78fa
JFM
268 if (packet_type == LAST_PACKET)
269 gspca_dev->last_packet_type = packet_type;
76dd272b 270 return;
d43fa32f 271 }
63eb9546 272
d43fa32f 273 /* append the packet to the frame buffer */
63eb9546
JFM
274 if (len > 0) {
275 if (frame->data_end - frame->data + len
276 > frame->v4l2_buf.length) {
a9e11134 277 PDEBUG(D_ERR|D_PACK, "frame overflow %zd > %d",
63eb9546
JFM
278 frame->data_end - frame->data + len,
279 frame->v4l2_buf.length);
280 packet_type = DISCARD_PACKET;
281 } else {
ac0d6df6 282 memcpy(frame->data_end, data, len);
63eb9546
JFM
283 frame->data_end += len;
284 }
285 }
286 gspca_dev->last_packet_type = packet_type;
287
219423c1 288 /* if last packet, wake up the application and advance in the queue */
63eb9546
JFM
289 if (packet_type == LAST_PACKET) {
290 frame->v4l2_buf.bytesused = frame->data_end - frame->data;
291 frame->v4l2_buf.flags &= ~V4L2_BUF_FLAG_QUEUED;
292 frame->v4l2_buf.flags |= V4L2_BUF_FLAG_DONE;
63eb9546 293 wake_up_interruptible(&gspca_dev->wq); /* event = new frame */
d43fa32f
JFM
294 i = (gspca_dev->fr_i + 1) % gspca_dev->nframes;
295 gspca_dev->fr_i = i;
63eb9546
JFM
296 PDEBUG(D_FRAM, "frame complete len:%d q:%d i:%d o:%d",
297 frame->v4l2_buf.bytesused,
298 gspca_dev->fr_q,
299 i,
300 gspca_dev->fr_o);
301 j = gspca_dev->fr_queue[i];
76dd272b 302 gspca_dev->cur_frame = &gspca_dev->frame[j];
63eb9546 303 }
63eb9546
JFM
304}
305EXPORT_SYMBOL(gspca_frame_add);
306
307static int gspca_is_compressed(__u32 format)
308{
309 switch (format) {
310 case V4L2_PIX_FMT_MJPEG:
311 case V4L2_PIX_FMT_JPEG:
50a871fe 312 case V4L2_PIX_FMT_SPCA561:
ab8f12cf 313 case V4L2_PIX_FMT_PAC207:
d661e622 314 case V4L2_PIX_FMT_MR97310A:
63eb9546
JFM
315 return 1;
316 }
317 return 0;
318}
319
d50e257e 320static void *rvmalloc(long size)
63eb9546
JFM
321{
322 void *mem;
323 unsigned long adr;
324
63eb9546 325 mem = vmalloc_32(size);
efab8211 326 if (mem != NULL) {
63eb9546 327 adr = (unsigned long) mem;
d50e257e 328 while (size > 0) {
63eb9546
JFM
329 SetPageReserved(vmalloc_to_page((void *) adr));
330 adr += PAGE_SIZE;
331 size -= PAGE_SIZE;
332 }
333 }
334 return mem;
335}
336
ac0d6df6 337static void rvfree(void *mem, long size)
63eb9546
JFM
338{
339 unsigned long adr;
340
63eb9546 341 adr = (unsigned long) mem;
ac0d6df6 342 while (size > 0) {
63eb9546
JFM
343 ClearPageReserved(vmalloc_to_page((void *) adr));
344 adr += PAGE_SIZE;
345 size -= PAGE_SIZE;
346 }
347 vfree(mem);
348}
349
350static int frame_alloc(struct gspca_dev *gspca_dev,
d43fa32f 351 unsigned int count)
63eb9546 352{
d43fa32f
JFM
353 struct gspca_frame *frame;
354 unsigned int frsz;
355 int i;
63eb9546 356
c2446b3e
JFM
357 i = gspca_dev->curr_mode;
358 frsz = gspca_dev->cam.cam_mode[i].sizeimage;
63eb9546 359 PDEBUG(D_STREAM, "frame alloc frsz: %d", frsz);
63eb9546 360 frsz = PAGE_ALIGN(frsz);
63eb9546 361 gspca_dev->frsz = frsz;
c2446b3e
JFM
362 if (count > GSPCA_MAX_FRAMES)
363 count = GSPCA_MAX_FRAMES;
ac0d6df6
JFM
364 gspca_dev->frbuf = rvmalloc(frsz * count);
365 if (!gspca_dev->frbuf) {
366 err("frame alloc failed");
367 return -ENOMEM;
63eb9546
JFM
368 }
369 gspca_dev->nframes = count;
370 for (i = 0; i < count; i++) {
d43fa32f
JFM
371 frame = &gspca_dev->frame[i];
372 frame->v4l2_buf.index = i;
373 frame->v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
374 frame->v4l2_buf.flags = 0;
375 frame->v4l2_buf.field = V4L2_FIELD_NONE;
376 frame->v4l2_buf.length = frsz;
377 frame->v4l2_buf.memory = gspca_dev->memory;
378 frame->v4l2_buf.sequence = 0;
ac0d6df6 379 frame->data = frame->data_end =
d43fa32f 380 gspca_dev->frbuf + i * frsz;
ac0d6df6 381 frame->v4l2_buf.m.offset = i * frsz;
63eb9546
JFM
382 }
383 gspca_dev->fr_i = gspca_dev->fr_o = gspca_dev->fr_q = 0;
3ec342f2 384 gspca_dev->cur_frame = &gspca_dev->frame[0];
63eb9546
JFM
385 gspca_dev->last_packet_type = DISCARD_PACKET;
386 gspca_dev->sequence = 0;
d43fa32f 387 return 0;
63eb9546
JFM
388}
389
390static void frame_free(struct gspca_dev *gspca_dev)
391{
392 int i;
393
394 PDEBUG(D_STREAM, "frame free");
efab8211 395 if (gspca_dev->frbuf != NULL) {
63eb9546
JFM
396 rvfree(gspca_dev->frbuf,
397 gspca_dev->nframes * gspca_dev->frsz);
398 gspca_dev->frbuf = NULL;
399 for (i = 0; i < gspca_dev->nframes; i++)
400 gspca_dev->frame[i].data = NULL;
401 }
402 gspca_dev->nframes = 0;
403}
404
d43fa32f 405static void destroy_urbs(struct gspca_dev *gspca_dev)
63eb9546
JFM
406{
407 struct urb *urb;
408 unsigned int i;
409
410 PDEBUG(D_STREAM, "kill transfer");
44732819 411 for (i = 0; i < MAX_NURBS; i++) {
4aa0d037 412 urb = gspca_dev->urb[i];
63eb9546 413 if (urb == NULL)
d43fa32f 414 break;
63eb9546 415
4aa0d037 416 gspca_dev->urb[i] = NULL;
090264e5 417 usb_kill_urb(urb);
efab8211 418 if (urb->transfer_buffer != NULL)
63eb9546
JFM
419 usb_buffer_free(gspca_dev->dev,
420 urb->transfer_buffer_length,
4aa0d037 421 urb->transfer_buffer,
63eb9546 422 urb->transfer_dma);
63eb9546
JFM
423 usb_free_urb(urb);
424 }
63eb9546
JFM
425}
426
427/*
219423c1 428 * look for an input transfer endpoint in an alternate setting
63eb9546 429 */
0be01004 430static struct usb_host_endpoint *alt_xfer(struct usb_host_interface *alt,
6929dc6b 431 int xfer)
63eb9546
JFM
432{
433 struct usb_host_endpoint *ep;
434 int i, attr;
435
63eb9546
JFM
436 for (i = 0; i < alt->desc.bNumEndpoints; i++) {
437 ep = &alt->endpoint[i];
50e06dee 438 attr = ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
30d35e49
JFM
439 if (attr == xfer
440 && ep->desc.wMaxPacketSize != 0)
50e06dee 441 return ep;
63eb9546
JFM
442 }
443 return NULL;
444}
445
446/*
219423c1 447 * look for an input (isoc or bulk) endpoint
63eb9546
JFM
448 *
449 * The endpoint is defined by the subdriver.
450 * Use only the first isoc (some Zoran - 0x0572:0x0001 - have two such ep).
451 * This routine may be called many times when the bandwidth is too small
452 * (the bandwidth is checked on urb submit).
453 */
0be01004 454static struct usb_host_endpoint *get_ep(struct gspca_dev *gspca_dev)
63eb9546
JFM
455{
456 struct usb_interface *intf;
457 struct usb_host_endpoint *ep;
6929dc6b 458 int xfer, i, ret;
63eb9546
JFM
459
460 intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface);
6a7eba24 461 ep = NULL;
6929dc6b
JFM
462 xfer = gspca_dev->cam.bulk ? USB_ENDPOINT_XFER_BULK
463 : USB_ENDPOINT_XFER_ISOC;
63eb9546 464 i = gspca_dev->alt; /* previous alt setting */
a511ba94
HG
465 if (gspca_dev->cam.reverse_alts) {
466 while (++i < gspca_dev->nbalt) {
467 ep = alt_xfer(&intf->altsetting[i], xfer);
468 if (ep)
469 break;
470 }
471 } else {
472 while (--i >= 0) {
473 ep = alt_xfer(&intf->altsetting[i], xfer);
474 if (ep)
475 break;
476 }
63eb9546 477 }
6a7eba24 478 if (ep == NULL) {
6929dc6b
JFM
479 err("no transfer endpoint found");
480 return NULL;
63eb9546 481 }
0be01004 482 PDEBUG(D_STREAM, "use alt %d ep 0x%02x",
63eb9546 483 i, ep->desc.bEndpointAddress);
1c8336d3 484 gspca_dev->alt = i; /* memorize the current alt setting */
8dd07ef1 485 if (gspca_dev->nbalt > 1) {
95d9142c
JFM
486 ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, i);
487 if (ret < 0) {
6929dc6b 488 err("set alt %d err %d", i, ret);
95d9142c
JFM
489 return NULL;
490 }
63eb9546 491 }
63eb9546
JFM
492 return ep;
493}
494
495/*
0be01004 496 * create the URBs for image transfer
63eb9546
JFM
497 */
498static int create_urbs(struct gspca_dev *gspca_dev,
499 struct usb_host_endpoint *ep)
500{
501 struct urb *urb;
d43fa32f 502 int n, nurbs, i, psize, npkt, bsize;
63eb9546
JFM
503
504 /* calculate the packet size and the number of packets */
63eb9546 505 psize = le16_to_cpu(ep->desc.wMaxPacketSize);
d43fa32f 506
6929dc6b 507 if (!gspca_dev->cam.bulk) { /* isoc */
95d9142c
JFM
508
509 /* See paragraph 5.9 / table 5-11 of the usb 2.0 spec. */
1f53b0b0
JFM
510 if (gspca_dev->pkt_size == 0)
511 psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3));
512 else
513 psize = gspca_dev->pkt_size;
49cb6b04
JFM
514 npkt = gspca_dev->cam.npkt;
515 if (npkt == 0)
516 npkt = 32; /* default value */
0be01004
JFM
517 bsize = psize * npkt;
518 PDEBUG(D_STREAM,
519 "isoc %d pkts size %d = bsize:%d",
520 npkt, psize, bsize);
51977a8d 521 nurbs = DEF_NURBS;
95d9142c 522 } else { /* bulk */
0be01004 523 npkt = 0;
dff369aa 524 bsize = gspca_dev->cam.bulk_size;
95d9142c
JFM
525 if (bsize == 0)
526 bsize = psize;
0be01004 527 PDEBUG(D_STREAM, "bulk bsize:%d", bsize);
dff369aa
AO
528 if (gspca_dev->cam.bulk_nurbs != 0)
529 nurbs = gspca_dev->cam.bulk_nurbs;
530 else
531 nurbs = 1;
0be01004
JFM
532 }
533
d43fa32f 534 for (n = 0; n < nurbs; n++) {
63eb9546
JFM
535 urb = usb_alloc_urb(npkt, GFP_KERNEL);
536 if (!urb) {
537 err("usb_alloc_urb failed");
538 return -ENOMEM;
539 }
db870875 540 gspca_dev->urb[n] = urb;
4aa0d037 541 urb->transfer_buffer = usb_buffer_alloc(gspca_dev->dev,
63eb9546
JFM
542 bsize,
543 GFP_KERNEL,
544 &urb->transfer_dma);
545
4aa0d037 546 if (urb->transfer_buffer == NULL) {
db870875 547 err("usb_buffer_alloc failed");
63eb9546
JFM
548 return -ENOMEM;
549 }
63eb9546
JFM
550 urb->dev = gspca_dev->dev;
551 urb->context = gspca_dev;
63eb9546 552 urb->transfer_buffer_length = bsize;
0be01004
JFM
553 if (npkt != 0) { /* ISOC */
554 urb->pipe = usb_rcvisocpipe(gspca_dev->dev,
555 ep->desc.bEndpointAddress);
6c49da7f
FZ
556 urb->transfer_flags = URB_ISO_ASAP
557 | URB_NO_TRANSFER_DMA_MAP;
0be01004
JFM
558 urb->interval = ep->desc.bInterval;
559 urb->complete = isoc_irq;
560 urb->number_of_packets = npkt;
561 for (i = 0; i < npkt; i++) {
562 urb->iso_frame_desc[i].length = psize;
563 urb->iso_frame_desc[i].offset = psize * i;
564 }
565 } else { /* bulk */
566 urb->pipe = usb_rcvbulkpipe(gspca_dev->dev,
567 ep->desc.bEndpointAddress),
6c49da7f 568 urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
0be01004 569 urb->complete = bulk_irq;
63eb9546
JFM
570 }
571 }
572 return 0;
573}
574
575/*
576 * start the USB transfer
577 */
578static int gspca_init_transfer(struct gspca_dev *gspca_dev)
579{
63eb9546 580 struct usb_host_endpoint *ep;
db870875 581 struct urb *urb;
63eb9546
JFM
582 int n, ret;
583
e2997a72
HG
584 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
585 return -ERESTARTSYS;
63eb9546 586
090264e5
JFM
587 if (!gspca_dev->present) {
588 ret = -ENODEV;
589 goto out;
590 }
591
d43fa32f
JFM
592 /* set the higher alternate setting and
593 * loop until urb submit succeeds */
a511ba94
HG
594 if (gspca_dev->cam.reverse_alts)
595 gspca_dev->alt = 0;
596 else
597 gspca_dev->alt = gspca_dev->nbalt;
598
1f53b0b0
JFM
599 if (gspca_dev->sd_desc->isoc_init) {
600 ret = gspca_dev->sd_desc->isoc_init(gspca_dev);
601 if (ret < 0)
602 goto out;
603 }
604 ep = get_ep(gspca_dev);
605 if (ep == NULL) {
606 ret = -EIO;
607 goto out;
608 }
63eb9546 609 for (;;) {
47aaca96
JFM
610 if (!gspca_dev->cam.no_urb_create) {
611 PDEBUG(D_STREAM, "init transfer alt %d",
612 gspca_dev->alt);
613 ret = create_urbs(gspca_dev, ep);
614 if (ret < 0) {
615 destroy_urbs(gspca_dev);
616 goto out;
617 }
db870875 618 }
63eb9546 619
8fe2f1d5 620 /* clear the bulk endpoint */
6929dc6b 621 if (gspca_dev->cam.bulk)
8fe2f1d5 622 usb_clear_halt(gspca_dev->dev,
50e06dee 623 gspca_dev->urb[0]->pipe);
8fe2f1d5 624
63eb9546 625 /* start the cam */
72ab97ce
JFM
626 ret = gspca_dev->sd_desc->start(gspca_dev);
627 if (ret < 0) {
628 destroy_urbs(gspca_dev);
629 goto out;
630 }
63eb9546 631 gspca_dev->streaming = 1;
63eb9546 632
dff369aa 633 /* some bulk transfers are started by the subdriver */
6929dc6b 634 if (gspca_dev->cam.bulk && gspca_dev->cam.bulk_nurbs == 0)
51977a8d
JFM
635 break;
636
63eb9546 637 /* submit the URBs */
db870875
JFM
638 for (n = 0; n < MAX_NURBS; n++) {
639 urb = gspca_dev->urb[n];
640 if (urb == NULL)
641 break;
642 ret = usb_submit_urb(urb, GFP_KERNEL);
1f53b0b0
JFM
643 if (ret < 0)
644 break;
63eb9546
JFM
645 }
646 if (ret >= 0)
647 break;
1f53b0b0
JFM
648 gspca_dev->streaming = 0;
649 destroy_urbs(gspca_dev);
4bdf4a83
JFM
650 if (ret != -ENOSPC) {
651 PDEBUG(D_ERR|D_STREAM,
652 "usb_submit_urb alt %d err %d",
653 gspca_dev->alt, ret);
1f53b0b0 654 goto out;
4bdf4a83 655 }
1f53b0b0
JFM
656
657 /* the bandwidth is not wide enough
658 * negociate or try a lower alternate setting */
4bdf4a83
JFM
659 PDEBUG(D_ERR|D_STREAM,
660 "bandwidth not wide enough - trying again");
1f53b0b0
JFM
661 msleep(20); /* wait for kill complete */
662 if (gspca_dev->sd_desc->isoc_nego) {
663 ret = gspca_dev->sd_desc->isoc_nego(gspca_dev);
664 if (ret < 0)
665 goto out;
666 } else {
667 ep = get_ep(gspca_dev);
668 if (ep == NULL) {
669 ret = -EIO;
670 goto out;
671 }
672 }
63eb9546
JFM
673 }
674out:
675 mutex_unlock(&gspca_dev->usb_lock);
676 return ret;
677}
678
679static int gspca_set_alt0(struct gspca_dev *gspca_dev)
680{
681 int ret;
682
8dd07ef1
JFM
683 if (gspca_dev->alt == 0)
684 return 0;
63eb9546
JFM
685 ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, 0);
686 if (ret < 0)
f955c4fc 687 PDEBUG(D_ERR|D_STREAM, "set alt 0 err %d", ret);
63eb9546
JFM
688 return ret;
689}
690
219423c1 691/* Note: both the queue and the usb locks should be held when calling this */
63eb9546
JFM
692static void gspca_stream_off(struct gspca_dev *gspca_dev)
693{
63eb9546 694 gspca_dev->streaming = 0;
090264e5
JFM
695 if (gspca_dev->present) {
696 if (gspca_dev->sd_desc->stopN)
697 gspca_dev->sd_desc->stopN(gspca_dev);
698 destroy_urbs(gspca_dev);
d08e2ce0 699 gspca_set_alt0(gspca_dev);
090264e5
JFM
700 }
701
702 /* always call stop0 to free the subdriver's resources */
98522a7b
JFM
703 if (gspca_dev->sd_desc->stop0)
704 gspca_dev->sd_desc->stop0(gspca_dev);
705 PDEBUG(D_STREAM, "stream off OK");
63eb9546
JFM
706}
707
d43fa32f 708static void gspca_set_default_mode(struct gspca_dev *gspca_dev)
63eb9546
JFM
709{
710 int i;
711
712 i = gspca_dev->cam.nmodes - 1; /* take the highest mode */
713 gspca_dev->curr_mode = i;
714 gspca_dev->width = gspca_dev->cam.cam_mode[i].width;
715 gspca_dev->height = gspca_dev->cam.cam_mode[i].height;
c2446b3e 716 gspca_dev->pixfmt = gspca_dev->cam.cam_mode[i].pixelformat;
63eb9546
JFM
717}
718
719static int wxh_to_mode(struct gspca_dev *gspca_dev,
720 int width, int height)
721{
722 int i;
723
d43fa32f
JFM
724 for (i = gspca_dev->cam.nmodes; --i > 0; ) {
725 if (width >= gspca_dev->cam.cam_mode[i].width
726 && height >= gspca_dev->cam.cam_mode[i].height)
63eb9546
JFM
727 break;
728 }
63eb9546
JFM
729 return i;
730}
731
63eb9546
JFM
732/*
733 * search a mode with the right pixel format
734 */
735static int gspca_get_mode(struct gspca_dev *gspca_dev,
736 int mode,
737 int pixfmt)
738{
739 int modeU, modeD;
740
741 modeU = modeD = mode;
742 while ((modeU < gspca_dev->cam.nmodes) || modeD >= 0) {
743 if (--modeD >= 0) {
c2446b3e
JFM
744 if (gspca_dev->cam.cam_mode[modeD].pixelformat
745 == pixfmt)
63eb9546
JFM
746 return modeD;
747 }
748 if (++modeU < gspca_dev->cam.nmodes) {
c2446b3e
JFM
749 if (gspca_dev->cam.cam_mode[modeU].pixelformat
750 == pixfmt)
63eb9546
JFM
751 return modeU;
752 }
753 }
754 return -EINVAL;
755}
756
af1d9afa
BJ
757#ifdef CONFIG_VIDEO_ADV_DEBUG
758static int vidioc_g_register(struct file *file, void *priv,
759 struct v4l2_dbg_register *reg)
760{
761 int ret;
762 struct gspca_dev *gspca_dev = priv;
763
764 if (!gspca_dev->sd_desc->get_chip_ident)
765 return -EINVAL;
766
767 if (!gspca_dev->sd_desc->get_register)
768 return -EINVAL;
769
770 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
771 return -ERESTARTSYS;
8c4ebae4 772 gspca_dev->usb_err = 0;
af1d9afa
BJ
773 if (gspca_dev->present)
774 ret = gspca_dev->sd_desc->get_register(gspca_dev, reg);
775 else
776 ret = -ENODEV;
777 mutex_unlock(&gspca_dev->usb_lock);
778
779 return ret;
780}
781
782static int vidioc_s_register(struct file *file, void *priv,
783 struct v4l2_dbg_register *reg)
784{
785 int ret;
786 struct gspca_dev *gspca_dev = priv;
787
788 if (!gspca_dev->sd_desc->get_chip_ident)
789 return -EINVAL;
790
791 if (!gspca_dev->sd_desc->set_register)
792 return -EINVAL;
793
794 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
795 return -ERESTARTSYS;
8c4ebae4 796 gspca_dev->usb_err = 0;
af1d9afa
BJ
797 if (gspca_dev->present)
798 ret = gspca_dev->sd_desc->set_register(gspca_dev, reg);
799 else
800 ret = -ENODEV;
801 mutex_unlock(&gspca_dev->usb_lock);
802
803 return ret;
804}
805#endif
806
807static int vidioc_g_chip_ident(struct file *file, void *priv,
808 struct v4l2_dbg_chip_ident *chip)
809{
810 int ret;
811 struct gspca_dev *gspca_dev = priv;
812
813 if (!gspca_dev->sd_desc->get_chip_ident)
814 return -EINVAL;
815
816 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
817 return -ERESTARTSYS;
8c4ebae4 818 gspca_dev->usb_err = 0;
af1d9afa
BJ
819 if (gspca_dev->present)
820 ret = gspca_dev->sd_desc->get_chip_ident(gspca_dev, chip);
821 else
822 ret = -ENODEV;
823 mutex_unlock(&gspca_dev->usb_lock);
824
825 return ret;
826}
827
e078770a 828static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
63eb9546
JFM
829 struct v4l2_fmtdesc *fmtdesc)
830{
831 struct gspca_dev *gspca_dev = priv;
6a7eba24 832 int i, j, index;
63eb9546
JFM
833 __u32 fmt_tb[8];
834
63eb9546
JFM
835 /* give an index to each format */
836 index = 0;
837 j = 0;
838 for (i = gspca_dev->cam.nmodes; --i >= 0; ) {
c2446b3e 839 fmt_tb[index] = gspca_dev->cam.cam_mode[i].pixelformat;
63eb9546
JFM
840 j = 0;
841 for (;;) {
842 if (fmt_tb[j] == fmt_tb[index])
843 break;
844 j++;
845 }
846 if (j == index) {
847 if (fmtdesc->index == index)
848 break; /* new format */
849 index++;
80297125 850 if (index >= ARRAY_SIZE(fmt_tb))
63eb9546
JFM
851 return -EINVAL;
852 }
853 }
854 if (i < 0)
855 return -EINVAL; /* no more format */
856
63eb9546
JFM
857 fmtdesc->pixelformat = fmt_tb[index];
858 if (gspca_is_compressed(fmt_tb[index]))
859 fmtdesc->flags = V4L2_FMT_FLAG_COMPRESSED;
860 fmtdesc->description[0] = fmtdesc->pixelformat & 0xff;
861 fmtdesc->description[1] = (fmtdesc->pixelformat >> 8) & 0xff;
862 fmtdesc->description[2] = (fmtdesc->pixelformat >> 16) & 0xff;
863 fmtdesc->description[3] = fmtdesc->pixelformat >> 24;
864 fmtdesc->description[4] = '\0';
865 return 0;
866}
867
e078770a 868static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
63eb9546
JFM
869 struct v4l2_format *fmt)
870{
871 struct gspca_dev *gspca_dev = priv;
c2446b3e 872 int mode;
63eb9546 873
c2446b3e
JFM
874 mode = gspca_dev->curr_mode;
875 memcpy(&fmt->fmt.pix, &gspca_dev->cam.cam_mode[mode],
876 sizeof fmt->fmt.pix);
63eb9546
JFM
877 return 0;
878}
879
e078770a 880static int try_fmt_vid_cap(struct gspca_dev *gspca_dev,
63eb9546
JFM
881 struct v4l2_format *fmt)
882{
24c530b4 883 int w, h, mode, mode2;
63eb9546 884
4aa0d037
JFM
885 w = fmt->fmt.pix.width;
886 h = fmt->fmt.pix.height;
d43fa32f 887
335b3f88 888#ifdef GSPCA_DEBUG
63eb9546
JFM
889 if (gspca_debug & D_CONF)
890 PDEBUG_MODE("try fmt cap", fmt->fmt.pix.pixelformat, w, h);
891#endif
892 /* search the closest mode for width and height */
893 mode = wxh_to_mode(gspca_dev, w, h);
894
895 /* OK if right palette */
c2446b3e
JFM
896 if (gspca_dev->cam.cam_mode[mode].pixelformat
897 != fmt->fmt.pix.pixelformat) {
63eb9546
JFM
898
899 /* else, search the closest mode with the same pixel format */
900 mode2 = gspca_get_mode(gspca_dev, mode,
901 fmt->fmt.pix.pixelformat);
c2446b3e 902 if (mode2 >= 0)
63eb9546 903 mode = mode2;
c2446b3e
JFM
904/* else
905 ; * no chance, return this mode */
63eb9546 906 }
c2446b3e
JFM
907 memcpy(&fmt->fmt.pix, &gspca_dev->cam.cam_mode[mode],
908 sizeof fmt->fmt.pix);
63eb9546
JFM
909 return mode; /* used when s_fmt */
910}
911
e078770a 912static int vidioc_try_fmt_vid_cap(struct file *file,
63eb9546
JFM
913 void *priv,
914 struct v4l2_format *fmt)
915{
4aa0d037 916 struct gspca_dev *gspca_dev = priv;
63eb9546
JFM
917 int ret;
918
e078770a 919 ret = try_fmt_vid_cap(gspca_dev, fmt);
63eb9546
JFM
920 if (ret < 0)
921 return ret;
922 return 0;
923}
924
e078770a 925static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
63eb9546
JFM
926 struct v4l2_format *fmt)
927{
928 struct gspca_dev *gspca_dev = priv;
d43fa32f 929 int ret;
63eb9546 930
e2997a72
HG
931 if (mutex_lock_interruptible(&gspca_dev->queue_lock))
932 return -ERESTARTSYS;
d43fa32f 933
e078770a 934 ret = try_fmt_vid_cap(gspca_dev, fmt);
63eb9546
JFM
935 if (ret < 0)
936 goto out;
937
d43fa32f
JFM
938 if (gspca_dev->nframes != 0
939 && fmt->fmt.pix.sizeimage > gspca_dev->frsz) {
940 ret = -EINVAL;
941 goto out;
942 }
943
50a871fe
JFM
944 if (ret == gspca_dev->curr_mode) {
945 ret = 0;
63eb9546 946 goto out; /* same mode */
50a871fe 947 }
d43fa32f
JFM
948
949 if (gspca_dev->streaming) {
950 ret = -EBUSY;
951 goto out;
e2997a72 952 }
4aa0d037
JFM
953 gspca_dev->width = fmt->fmt.pix.width;
954 gspca_dev->height = fmt->fmt.pix.height;
63eb9546
JFM
955 gspca_dev->pixfmt = fmt->fmt.pix.pixelformat;
956 gspca_dev->curr_mode = ret;
d43fa32f 957
d43fa32f 958 ret = 0;
63eb9546
JFM
959out:
960 mutex_unlock(&gspca_dev->queue_lock);
961 return ret;
962}
963
11c635a2
HG
964static int vidioc_enum_framesizes(struct file *file, void *priv,
965 struct v4l2_frmsizeenum *fsize)
966{
967 struct gspca_dev *gspca_dev = priv;
968 int i;
969 __u32 index = 0;
970
971 for (i = 0; i < gspca_dev->cam.nmodes; i++) {
972 if (fsize->pixel_format !=
973 gspca_dev->cam.cam_mode[i].pixelformat)
974 continue;
975
976 if (fsize->index == index) {
977 fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
978 fsize->discrete.width =
979 gspca_dev->cam.cam_mode[i].width;
980 fsize->discrete.height =
981 gspca_dev->cam.cam_mode[i].height;
982 return 0;
983 }
984 index++;
985 }
986
987 return -EINVAL;
988}
989
28ffe77f
AO
990static int vidioc_enum_frameintervals(struct file *filp, void *priv,
991 struct v4l2_frmivalenum *fival)
992{
993 struct gspca_dev *gspca_dev = priv;
994 int mode = wxh_to_mode(gspca_dev, fival->width, fival->height);
995 __u32 i;
996
997 if (gspca_dev->cam.mode_framerates == NULL ||
998 gspca_dev->cam.mode_framerates[mode].nrates == 0)
999 return -EINVAL;
1000
1001 if (fival->pixel_format !=
1002 gspca_dev->cam.cam_mode[mode].pixelformat)
1003 return -EINVAL;
1004
1005 for (i = 0; i < gspca_dev->cam.mode_framerates[mode].nrates; i++) {
1006 if (fival->index == i) {
1007 fival->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1008 fival->discrete.numerator = 1;
1009 fival->discrete.denominator =
1010 gspca_dev->cam.mode_framerates[mode].rates[i];
1011 return 0;
1012 }
1013 }
1014
1015 return -EINVAL;
1016}
1017
d0182306 1018static void gspca_release(struct video_device *vfd)
6b060ffe 1019{
d0182306 1020 struct gspca_dev *gspca_dev = container_of(vfd, struct gspca_dev, vdev);
6b060ffe 1021
38c7c036
LP
1022 PDEBUG(D_PROBE, "%s released",
1023 video_device_node_name(&gspca_dev->vdev));
6b060ffe
FZ
1024
1025 kfree(gspca_dev->usb_buf);
1026 kfree(gspca_dev);
1027}
1028
bec43661 1029static int dev_open(struct file *file)
63eb9546
JFM
1030{
1031 struct gspca_dev *gspca_dev;
1032 int ret;
1033
0d07e240 1034 PDEBUG(D_STREAM, "[%s] open", current->comm);
a12ca6a6 1035 gspca_dev = (struct gspca_dev *) video_devdata(file);
e2997a72
HG
1036 if (mutex_lock_interruptible(&gspca_dev->queue_lock))
1037 return -ERESTARTSYS;
63eb9546
JFM
1038 if (!gspca_dev->present) {
1039 ret = -ENODEV;
1040 goto out;
1041 }
1042
012d6b02 1043 if (gspca_dev->users > 4) { /* (arbitrary value) */
63eb9546
JFM
1044 ret = -EBUSY;
1045 goto out;
1046 }
5c4fa002
JFM
1047
1048 /* protect the subdriver against rmmod */
1049 if (!try_module_get(gspca_dev->module)) {
1050 ret = -ENODEV;
1051 goto out;
1052 }
1053
63eb9546 1054 gspca_dev->users++;
6b060ffe 1055
63eb9546 1056 file->private_data = gspca_dev;
335b3f88 1057#ifdef GSPCA_DEBUG
63eb9546 1058 /* activate the v4l2 debug */
d43fa32f 1059 if (gspca_debug & D_V4L2)
a12ca6a6 1060 gspca_dev->vdev.debug |= V4L2_DEBUG_IOCTL
9de436cf 1061 | V4L2_DEBUG_IOCTL_ARG;
63eb9546 1062 else
a12ca6a6 1063 gspca_dev->vdev.debug &= ~(V4L2_DEBUG_IOCTL
9de436cf 1064 | V4L2_DEBUG_IOCTL_ARG);
63eb9546 1065#endif
012d6b02 1066 ret = 0;
63eb9546
JFM
1067out:
1068 mutex_unlock(&gspca_dev->queue_lock);
1069 if (ret != 0)
1070 PDEBUG(D_ERR|D_STREAM, "open failed err %d", ret);
1071 else
d43fa32f 1072 PDEBUG(D_STREAM, "open done");
63eb9546
JFM
1073 return ret;
1074}
1075
bec43661 1076static int dev_close(struct file *file)
63eb9546
JFM
1077{
1078 struct gspca_dev *gspca_dev = file->private_data;
1079
0d07e240 1080 PDEBUG(D_STREAM, "[%s] close", current->comm);
e2997a72
HG
1081 if (mutex_lock_interruptible(&gspca_dev->queue_lock))
1082 return -ERESTARTSYS;
1083 gspca_dev->users--;
e2997a72 1084
5b77ae77 1085 /* if the file did the capture, free the streaming resources */
4aa0d037 1086 if (gspca_dev->capt_file == file) {
a1e8288b
JFM
1087 if (gspca_dev->streaming) {
1088 mutex_lock(&gspca_dev->usb_lock);
8c4ebae4 1089 gspca_dev->usb_err = 0;
a1e8288b
JFM
1090 gspca_stream_off(gspca_dev);
1091 mutex_unlock(&gspca_dev->usb_lock);
1092 }
4aa0d037 1093 frame_free(gspca_dev);
efab8211 1094 gspca_dev->capt_file = NULL;
d43fa32f 1095 gspca_dev->memory = GSPCA_MEMORY_NO;
4aa0d037 1096 }
d43fa32f 1097 file->private_data = NULL;
5c4fa002 1098 module_put(gspca_dev->module);
63eb9546 1099 mutex_unlock(&gspca_dev->queue_lock);
6b060ffe 1100
d43fa32f 1101 PDEBUG(D_STREAM, "close done");
6b060ffe 1102
63eb9546
JFM
1103 return 0;
1104}
1105
1106static int vidioc_querycap(struct file *file, void *priv,
1107 struct v4l2_capability *cap)
1108{
1109 struct gspca_dev *gspca_dev = priv;
090264e5 1110 int ret;
63eb9546 1111
090264e5
JFM
1112 /* protect the access to the usb device */
1113 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
1114 return -ERESTARTSYS;
1115 if (!gspca_dev->present) {
1116 ret = -ENODEV;
1117 goto out;
1118 }
63eb9546 1119 strncpy(cap->driver, gspca_dev->sd_desc->name, sizeof cap->driver);
c6edaf16
JFM
1120 if (gspca_dev->dev->product != NULL) {
1121 strncpy(cap->card, gspca_dev->dev->product,
1122 sizeof cap->card);
1123 } else {
1124 snprintf(cap->card, sizeof cap->card,
1125 "USB Camera (%04x:%04x)",
1126 le16_to_cpu(gspca_dev->dev->descriptor.idVendor),
1127 le16_to_cpu(gspca_dev->dev->descriptor.idProduct));
1128 }
5932028f 1129 usb_make_path(gspca_dev->dev, cap->bus_info, sizeof(cap->bus_info));
63eb9546
JFM
1130 cap->version = DRIVER_VERSION_NUMBER;
1131 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE
1132 | V4L2_CAP_STREAMING
1133 | V4L2_CAP_READWRITE;
090264e5
JFM
1134 ret = 0;
1135out:
1136 mutex_unlock(&gspca_dev->usb_lock);
1137 return ret;
63eb9546
JFM
1138}
1139
a0001a28
HG
1140static const struct ctrl *get_ctrl(struct gspca_dev *gspca_dev,
1141 int id)
1142{
1143 const struct ctrl *ctrls;
1144 int i;
1145
1146 for (i = 0, ctrls = gspca_dev->sd_desc->ctrls;
1147 i < gspca_dev->sd_desc->nctrls;
1148 i++, ctrls++) {
1149 if (gspca_dev->ctrl_dis & (1 << i))
1150 continue;
1151 if (id == ctrls->qctrl.id)
1152 return ctrls;
1153 }
1154 return NULL;
1155}
1156
63eb9546
JFM
1157static int vidioc_queryctrl(struct file *file, void *priv,
1158 struct v4l2_queryctrl *q_ctrl)
1159{
1160 struct gspca_dev *gspca_dev = priv;
a0001a28
HG
1161 const struct ctrl *ctrls;
1162 int i;
6a7eba24
JFM
1163 u32 id;
1164
a0001a28 1165 ctrls = NULL;
6a7eba24
JFM
1166 id = q_ctrl->id;
1167 if (id & V4L2_CTRL_FLAG_NEXT_CTRL) {
1168 id &= V4L2_CTRL_ID_MASK;
1169 id++;
1170 for (i = 0; i < gspca_dev->sd_desc->nctrls; i++) {
a0001a28 1171 if (gspca_dev->ctrl_dis & (1 << i))
f50ba1be 1172 continue;
b8bfb5fb 1173 if (gspca_dev->sd_desc->ctrls[i].qctrl.id < id)
f50ba1be 1174 continue;
b8bfb5fb 1175 if (ctrls && gspca_dev->sd_desc->ctrls[i].qctrl.id
a0001a28 1176 > ctrls->qctrl.id)
b8bfb5fb 1177 continue;
a0001a28 1178 ctrls = &gspca_dev->sd_desc->ctrls[i];
63eb9546 1179 }
83955556
JFM
1180 if (ctrls == NULL)
1181 return -EINVAL;
a0001a28
HG
1182 } else {
1183 ctrls = get_ctrl(gspca_dev, id);
83955556
JFM
1184 if (ctrls == NULL)
1185 return -EINVAL;
4af85668 1186 i = ctrls - gspca_dev->sd_desc->ctrls;
63eb9546 1187 }
a0001a28 1188 memcpy(q_ctrl, ctrls, sizeof *q_ctrl);
4af85668
JFM
1189 if (gspca_dev->ctrl_inac & (1 << i))
1190 q_ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
f50ba1be 1191 return 0;
63eb9546
JFM
1192}
1193
1194static int vidioc_s_ctrl(struct file *file, void *priv,
1195 struct v4l2_control *ctrl)
1196{
1197 struct gspca_dev *gspca_dev = priv;
a5ae2062 1198 const struct ctrl *ctrls;
a0001a28 1199 int ret;
63eb9546 1200
a0001a28
HG
1201 ctrls = get_ctrl(gspca_dev, ctrl->id);
1202 if (ctrls == NULL)
1203 return -EINVAL;
1204
1205 if (ctrl->value < ctrls->qctrl.minimum
1206 || ctrl->value > ctrls->qctrl.maximum)
1207 return -ERANGE;
1208 PDEBUG(D_CONF, "set ctrl [%08x] = %d", ctrl->id, ctrl->value);
1209 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
1210 return -ERESTARTSYS;
8c4ebae4 1211 gspca_dev->usb_err = 0;
a0001a28
HG
1212 if (gspca_dev->present)
1213 ret = ctrls->set(gspca_dev, ctrl->value);
1214 else
1215 ret = -ENODEV;
1216 mutex_unlock(&gspca_dev->usb_lock);
1217 return ret;
63eb9546
JFM
1218}
1219
1220static int vidioc_g_ctrl(struct file *file, void *priv,
1221 struct v4l2_control *ctrl)
1222{
1223 struct gspca_dev *gspca_dev = priv;
a5ae2062 1224 const struct ctrl *ctrls;
a0001a28 1225 int ret;
63eb9546 1226
a0001a28
HG
1227 ctrls = get_ctrl(gspca_dev, ctrl->id);
1228 if (ctrls == NULL)
1229 return -EINVAL;
1230
1231 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
1232 return -ERESTARTSYS;
8c4ebae4 1233 gspca_dev->usb_err = 0;
a0001a28
HG
1234 if (gspca_dev->present)
1235 ret = ctrls->get(gspca_dev, &ctrl->value);
1236 else
1237 ret = -ENODEV;
1238 mutex_unlock(&gspca_dev->usb_lock);
1239 return ret;
63eb9546
JFM
1240}
1241
f955c4fc
JFM
1242/*fixme: have an audio flag in gspca_dev?*/
1243static int vidioc_s_audio(struct file *file, void *priv,
1244 struct v4l2_audio *audio)
1245{
1246 if (audio->index != 0)
1247 return -EINVAL;
1248 return 0;
1249}
1250
1251static int vidioc_g_audio(struct file *file, void *priv,
1252 struct v4l2_audio *audio)
1253{
f955c4fc
JFM
1254 strcpy(audio->name, "Microphone");
1255 return 0;
1256}
1257
1258static int vidioc_enumaudio(struct file *file, void *priv,
1259 struct v4l2_audio *audio)
1260{
1261 if (audio->index != 0)
1262 return -EINVAL;
1263
1264 strcpy(audio->name, "Microphone");
1265 audio->capability = 0;
1266 audio->mode = 0;
1267 return 0;
1268}
1269
63eb9546
JFM
1270static int vidioc_querymenu(struct file *file, void *priv,
1271 struct v4l2_querymenu *qmenu)
1272{
1273 struct gspca_dev *gspca_dev = priv;
1274
1275 if (!gspca_dev->sd_desc->querymenu)
1276 return -EINVAL;
1277 return gspca_dev->sd_desc->querymenu(gspca_dev, qmenu);
1278}
1279
1280static int vidioc_enum_input(struct file *file, void *priv,
1281 struct v4l2_input *input)
1282{
1283 struct gspca_dev *gspca_dev = priv;
1284
1285 if (input->index != 0)
1286 return -EINVAL;
63eb9546 1287 input->type = V4L2_INPUT_TYPE_CAMERA;
dfa76fa2 1288 input->status = gspca_dev->cam.input_flags;
63eb9546
JFM
1289 strncpy(input->name, gspca_dev->sd_desc->name,
1290 sizeof input->name);
1291 return 0;
1292}
1293
1294static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1295{
1296 *i = 0;
1297 return 0;
1298}
1299
1300static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1301{
1302 if (i > 0)
1303 return -EINVAL;
1304 return (0);
1305}
1306
1307static int vidioc_reqbufs(struct file *file, void *priv,
1308 struct v4l2_requestbuffers *rb)
1309{
1310 struct gspca_dev *gspca_dev = priv;
d43fa32f 1311 int i, ret = 0;
63eb9546 1312
d43fa32f 1313 switch (rb->memory) {
5b77ae77 1314 case GSPCA_MEMORY_READ: /* (internal call) */
d43fa32f 1315 case V4L2_MEMORY_MMAP:
d43fa32f 1316 case V4L2_MEMORY_USERPTR:
6a7eba24 1317 break;
d43fa32f 1318 default:
63eb9546 1319 return -EINVAL;
d43fa32f 1320 }
e2997a72
HG
1321 if (mutex_lock_interruptible(&gspca_dev->queue_lock))
1322 return -ERESTARTSYS;
d43fa32f 1323
5b77ae77
JFM
1324 if (gspca_dev->memory != GSPCA_MEMORY_NO
1325 && gspca_dev->memory != rb->memory) {
4aa0d037
JFM
1326 ret = -EBUSY;
1327 goto out;
1328 }
d43fa32f 1329
5b77ae77
JFM
1330 /* only one file may do the capture */
1331 if (gspca_dev->capt_file != NULL
1332 && gspca_dev->capt_file != file) {
1333 ret = -EBUSY;
1334 goto out;
1335 }
1336
1337 /* if allocated, the buffers must not be mapped */
1338 for (i = 0; i < gspca_dev->nframes; i++) {
1339 if (gspca_dev->frame[i].vma_use_count) {
ac0d6df6
JFM
1340 ret = -EBUSY;
1341 goto out;
1342 }
5b77ae77
JFM
1343 }
1344
1345 /* stop streaming */
1346 if (gspca_dev->streaming) {
1347 mutex_lock(&gspca_dev->usb_lock);
8c4ebae4 1348 gspca_dev->usb_err = 0;
5b77ae77
JFM
1349 gspca_stream_off(gspca_dev);
1350 mutex_unlock(&gspca_dev->usb_lock);
1351 }
1352
1353 /* free the previous allocated buffers, if any */
1354 if (gspca_dev->nframes != 0) {
1355 frame_free(gspca_dev);
1356 gspca_dev->capt_file = NULL;
1357 }
1358 if (rb->count == 0) /* unrequest */
1359 goto out;
1360 gspca_dev->memory = rb->memory;
1361 ret = frame_alloc(gspca_dev, rb->count);
1362 if (ret == 0) {
1363 rb->count = gspca_dev->nframes;
1364 gspca_dev->capt_file = file;
4aa0d037
JFM
1365 }
1366out:
63eb9546
JFM
1367 mutex_unlock(&gspca_dev->queue_lock);
1368 PDEBUG(D_STREAM, "reqbufs st:%d c:%d", ret, rb->count);
1369 return ret;
1370}
1371
1372static int vidioc_querybuf(struct file *file, void *priv,
1373 struct v4l2_buffer *v4l2_buf)
1374{
1375 struct gspca_dev *gspca_dev = priv;
1376 struct gspca_frame *frame;
1377
13752bd9 1378 if (v4l2_buf->index < 0
63eb9546
JFM
1379 || v4l2_buf->index >= gspca_dev->nframes)
1380 return -EINVAL;
1381
1382 frame = &gspca_dev->frame[v4l2_buf->index];
1383 memcpy(v4l2_buf, &frame->v4l2_buf, sizeof *v4l2_buf);
1384 return 0;
1385}
1386
1387static int vidioc_streamon(struct file *file, void *priv,
1388 enum v4l2_buf_type buf_type)
1389{
1390 struct gspca_dev *gspca_dev = priv;
1391 int ret;
1392
63eb9546
JFM
1393 if (buf_type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1394 return -EINVAL;
e2997a72
HG
1395 if (mutex_lock_interruptible(&gspca_dev->queue_lock))
1396 return -ERESTARTSYS;
090264e5 1397
1edabe71
JFM
1398 if (gspca_dev->nframes == 0
1399 || !(gspca_dev->frame[0].v4l2_buf.flags & V4L2_BUF_FLAG_QUEUED)) {
63eb9546
JFM
1400 ret = -EINVAL;
1401 goto out;
1402 }
1403 if (!gspca_dev->streaming) {
1404 ret = gspca_init_transfer(gspca_dev);
1405 if (ret < 0)
1406 goto out;
1407 }
335b3f88 1408#ifdef GSPCA_DEBUG
63eb9546
JFM
1409 if (gspca_debug & D_STREAM) {
1410 PDEBUG_MODE("stream on OK",
1411 gspca_dev->pixfmt,
1412 gspca_dev->width,
1413 gspca_dev->height);
1414 }
1415#endif
e2997a72 1416 ret = 0;
63eb9546
JFM
1417out:
1418 mutex_unlock(&gspca_dev->queue_lock);
1419 return ret;
1420}
1421
1422static int vidioc_streamoff(struct file *file, void *priv,
1423 enum v4l2_buf_type buf_type)
1424{
1425 struct gspca_dev *gspca_dev = priv;
5b77ae77 1426 int i, ret;
63eb9546 1427
63eb9546
JFM
1428 if (buf_type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1429 return -EINVAL;
4aa0d037
JFM
1430 if (!gspca_dev->streaming)
1431 return 0;
1432 if (mutex_lock_interruptible(&gspca_dev->queue_lock))
1433 return -ERESTARTSYS;
5b77ae77
JFM
1434
1435 /* stop streaming */
4aa0d037
JFM
1436 if (mutex_lock_interruptible(&gspca_dev->usb_lock)) {
1437 ret = -ERESTARTSYS;
1438 goto out;
63eb9546 1439 }
8c4ebae4 1440 gspca_dev->usb_err = 0;
4aa0d037 1441 gspca_stream_off(gspca_dev);
4aa0d037 1442 mutex_unlock(&gspca_dev->usb_lock);
5b77ae77
JFM
1443
1444 /* empty the application queues */
1445 for (i = 0; i < gspca_dev->nframes; i++)
1446 gspca_dev->frame[i].v4l2_buf.flags &= ~BUF_ALL_FLAGS;
1447 gspca_dev->fr_i = gspca_dev->fr_o = gspca_dev->fr_q = 0;
1448 gspca_dev->last_packet_type = DISCARD_PACKET;
1449 gspca_dev->sequence = 0;
5b77ae77 1450 ret = 0;
4aa0d037
JFM
1451out:
1452 mutex_unlock(&gspca_dev->queue_lock);
1453 return ret;
63eb9546
JFM
1454}
1455
1456static int vidioc_g_jpegcomp(struct file *file, void *priv,
1457 struct v4l2_jpegcompression *jpegcomp)
1458{
1459 struct gspca_dev *gspca_dev = priv;
1460 int ret;
1461
1462 if (!gspca_dev->sd_desc->get_jcomp)
1463 return -EINVAL;
e2997a72
HG
1464 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
1465 return -ERESTARTSYS;
8c4ebae4 1466 gspca_dev->usb_err = 0;
090264e5
JFM
1467 if (gspca_dev->present)
1468 ret = gspca_dev->sd_desc->get_jcomp(gspca_dev, jpegcomp);
1469 else
1470 ret = -ENODEV;
63eb9546
JFM
1471 mutex_unlock(&gspca_dev->usb_lock);
1472 return ret;
1473}
1474
1475static int vidioc_s_jpegcomp(struct file *file, void *priv,
1476 struct v4l2_jpegcompression *jpegcomp)
1477{
1478 struct gspca_dev *gspca_dev = priv;
1479 int ret;
1480
63eb9546
JFM
1481 if (!gspca_dev->sd_desc->set_jcomp)
1482 return -EINVAL;
f86d4a91
JP
1483 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
1484 return -ERESTARTSYS;
8c4ebae4 1485 gspca_dev->usb_err = 0;
090264e5
JFM
1486 if (gspca_dev->present)
1487 ret = gspca_dev->sd_desc->set_jcomp(gspca_dev, jpegcomp);
1488 else
1489 ret = -ENODEV;
63eb9546
JFM
1490 mutex_unlock(&gspca_dev->usb_lock);
1491 return ret;
1492}
1493
1494static int vidioc_g_parm(struct file *filp, void *priv,
1495 struct v4l2_streamparm *parm)
1496{
1497 struct gspca_dev *gspca_dev = priv;
1498
63eb9546 1499 parm->parm.capture.readbuffers = gspca_dev->nbufread;
627a5ef7
JP
1500
1501 if (gspca_dev->sd_desc->get_streamparm) {
1502 int ret;
1503
1504 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
1505 return -ERESTARTSYS;
8c4ebae4 1506 gspca_dev->usb_err = 0;
090264e5
JFM
1507 if (gspca_dev->present)
1508 ret = gspca_dev->sd_desc->get_streamparm(gspca_dev,
1509 parm);
1510 else
1511 ret = -ENODEV;
627a5ef7
JP
1512 mutex_unlock(&gspca_dev->usb_lock);
1513 return ret;
1514 }
1515
63eb9546
JFM
1516 return 0;
1517}
1518
1519static int vidioc_s_parm(struct file *filp, void *priv,
1520 struct v4l2_streamparm *parm)
1521{
1522 struct gspca_dev *gspca_dev = priv;
1523 int n;
1524
63eb9546
JFM
1525 n = parm->parm.capture.readbuffers;
1526 if (n == 0 || n > GSPCA_MAX_FRAMES)
1527 parm->parm.capture.readbuffers = gspca_dev->nbufread;
1528 else
1529 gspca_dev->nbufread = n;
627a5ef7
JP
1530
1531 if (gspca_dev->sd_desc->set_streamparm) {
1532 int ret;
1533
1534 if (mutex_lock_interruptible(&gspca_dev->usb_lock))
1535 return -ERESTARTSYS;
8c4ebae4 1536 gspca_dev->usb_err = 0;
090264e5
JFM
1537 if (gspca_dev->present)
1538 ret = gspca_dev->sd_desc->set_streamparm(gspca_dev,
1539 parm);
1540 else
1541 ret = -ENODEV;
627a5ef7
JP
1542 mutex_unlock(&gspca_dev->usb_lock);
1543 return ret;
1544 }
1545
63eb9546
JFM
1546 return 0;
1547}
1548
1549#ifdef CONFIG_VIDEO_V4L1_COMPAT
1550static int vidiocgmbuf(struct file *file, void *priv,
1551 struct video_mbuf *mbuf)
1552{
1553 struct gspca_dev *gspca_dev = file->private_data;
1554 int i;
1555
1556 PDEBUG(D_STREAM, "cgmbuf");
1557 if (gspca_dev->nframes == 0) {
63eb9546 1558 int ret;
6a7eba24
JFM
1559
1560 {
1561 struct v4l2_format fmt;
1562
6a7eba24
JFM
1563 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1564 i = gspca_dev->cam.nmodes - 1; /* highest mode */
1565 fmt.fmt.pix.width = gspca_dev->cam.cam_mode[i].width;
1566 fmt.fmt.pix.height = gspca_dev->cam.cam_mode[i].height;
1567 fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24;
e078770a 1568 ret = vidioc_s_fmt_vid_cap(file, priv, &fmt);
6a7eba24
JFM
1569 if (ret != 0)
1570 return ret;
1571 }
1572 {
1573 struct v4l2_requestbuffers rb;
1574
1575 memset(&rb, 0, sizeof rb);
1576 rb.count = 4;
1577 rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1578 rb.memory = V4L2_MEMORY_MMAP;
1579 ret = vidioc_reqbufs(file, priv, &rb);
1580 if (ret != 0)
1581 return ret;
1582 }
63eb9546
JFM
1583 }
1584 mbuf->frames = gspca_dev->nframes;
1585 mbuf->size = gspca_dev->frsz * gspca_dev->nframes;
1586 for (i = 0; i < mbuf->frames; i++)
1587 mbuf->offsets[i] = gspca_dev->frame[i].v4l2_buf.m.offset;
1588 return 0;
1589}
1590#endif
1591
1592static int dev_mmap(struct file *file, struct vm_area_struct *vma)
1593{
1594 struct gspca_dev *gspca_dev = file->private_data;
efab8211 1595 struct gspca_frame *frame;
63eb9546
JFM
1596 struct page *page;
1597 unsigned long addr, start, size;
1598 int i, ret;
63eb9546
JFM
1599
1600 start = vma->vm_start;
1601 size = vma->vm_end - vma->vm_start;
1602 PDEBUG(D_STREAM, "mmap start:%08x size:%d", (int) start, (int) size);
1603
e2997a72
HG
1604 if (mutex_lock_interruptible(&gspca_dev->queue_lock))
1605 return -ERESTARTSYS;
63eb9546
JFM
1606 if (!gspca_dev->present) {
1607 ret = -ENODEV;
4aa0d037
JFM
1608 goto out;
1609 }
1610 if (gspca_dev->capt_file != file) {
1611 ret = -EINVAL;
1612 goto out;
63eb9546
JFM
1613 }
1614
efab8211 1615 frame = NULL;
63eb9546
JFM
1616 for (i = 0; i < gspca_dev->nframes; ++i) {
1617 if (gspca_dev->frame[i].v4l2_buf.memory != V4L2_MEMORY_MMAP) {
1618 PDEBUG(D_STREAM, "mmap bad memory type");
1619 break;
1620 }
1621 if ((gspca_dev->frame[i].v4l2_buf.m.offset >> PAGE_SHIFT)
1622 == vma->vm_pgoff) {
1623 frame = &gspca_dev->frame[i];
1624 break;
1625 }
1626 }
efab8211 1627 if (frame == NULL) {
63eb9546
JFM
1628 PDEBUG(D_STREAM, "mmap no frame buffer found");
1629 ret = -EINVAL;
4aa0d037 1630 goto out;
63eb9546
JFM
1631 }
1632#ifdef CONFIG_VIDEO_V4L1_COMPAT
ac0d6df6
JFM
1633 /* v4l1 maps all the buffers */
1634 if (i != 0
1635 || size != frame->v4l2_buf.length * gspca_dev->nframes)
63eb9546 1636#endif
ac0d6df6 1637 if (size != frame->v4l2_buf.length) {
63eb9546
JFM
1638 PDEBUG(D_STREAM, "mmap bad size");
1639 ret = -EINVAL;
4aa0d037 1640 goto out;
63eb9546
JFM
1641 }
1642
1643 /*
1644 * - VM_IO marks the area as being a mmaped region for I/O to a
1645 * device. It also prevents the region from being core dumped.
1646 */
1647 vma->vm_flags |= VM_IO;
1648
1649 addr = (unsigned long) frame->data;
1650 while (size > 0) {
1651 page = vmalloc_to_page((void *) addr);
1652 ret = vm_insert_page(vma, start, page);
1653 if (ret < 0)
4aa0d037 1654 goto out;
63eb9546
JFM
1655 start += PAGE_SIZE;
1656 addr += PAGE_SIZE;
1657 size -= PAGE_SIZE;
1658 }
1659
d50e257e 1660 vma->vm_ops = &gspca_vm_ops;
63eb9546
JFM
1661 vma->vm_private_data = frame;
1662 gspca_vm_open(vma);
e2997a72 1663 ret = 0;
4aa0d037 1664out:
63eb9546
JFM
1665 mutex_unlock(&gspca_dev->queue_lock);
1666 return ret;
1667}
1668
63eb9546
JFM
1669/*
1670 * wait for a video frame
1671 *
1672 * If a frame is ready, its index is returned.
1673 */
d43fa32f 1674static int frame_wait(struct gspca_dev *gspca_dev,
63eb9546
JFM
1675 int nonblock_ing)
1676{
1677 struct gspca_frame *frame;
1678 int i, j, ret;
1679
d43fa32f 1680 /* check if a frame is ready */
63eb9546
JFM
1681 i = gspca_dev->fr_o;
1682 j = gspca_dev->fr_queue[i];
1683 frame = &gspca_dev->frame[j];
63eb9546 1684
181b704f
HG
1685 if (!(frame->v4l2_buf.flags & V4L2_BUF_FLAG_DONE)) {
1686 if (nonblock_ing)
1687 return -EAGAIN;
1688
1689 /* wait till a frame is ready */
4aa0d037 1690 ret = wait_event_interruptible_timeout(gspca_dev->wq,
181b704f
HG
1691 (frame->v4l2_buf.flags & V4L2_BUF_FLAG_DONE) ||
1692 !gspca_dev->streaming || !gspca_dev->present,
1693 msecs_to_jiffies(3000));
1694 if (ret < 0)
1695 return ret;
1696 if (ret == 0 || !gspca_dev->streaming || !gspca_dev->present)
e2997a72 1697 return -EIO;
63eb9546 1698 }
181b704f 1699
63eb9546
JFM
1700 gspca_dev->fr_o = (i + 1) % gspca_dev->nframes;
1701 PDEBUG(D_FRAM, "frame wait q:%d i:%d o:%d",
1702 gspca_dev->fr_q,
1703 gspca_dev->fr_i,
1704 gspca_dev->fr_o);
e2997a72 1705
739570bb
JFM
1706 if (gspca_dev->sd_desc->dq_callback) {
1707 mutex_lock(&gspca_dev->usb_lock);
8c4ebae4 1708 gspca_dev->usb_err = 0;
090264e5
JFM
1709 if (gspca_dev->present)
1710 gspca_dev->sd_desc->dq_callback(gspca_dev);
739570bb
JFM
1711 mutex_unlock(&gspca_dev->usb_lock);
1712 }
63eb9546
JFM
1713 return j;
1714}
1715
1716/*
1717 * dequeue a video buffer
1718 *
1719 * If nonblock_ing is false, block until a buffer is available.
1720 */
1721static int vidioc_dqbuf(struct file *file, void *priv,
1722 struct v4l2_buffer *v4l2_buf)
1723{
1724 struct gspca_dev *gspca_dev = priv;
1725 struct gspca_frame *frame;
1726 int i, ret;
1727
1728 PDEBUG(D_FRAM, "dqbuf");
ac0d6df6 1729 if (v4l2_buf->memory != gspca_dev->memory)
63eb9546 1730 return -EINVAL;
5b77ae77 1731
090264e5
JFM
1732 if (!gspca_dev->present)
1733 return -ENODEV;
1734
5b77ae77
JFM
1735 /* if not streaming, be sure the application will not loop forever */
1736 if (!(file->f_flags & O_NONBLOCK)
1737 && !gspca_dev->streaming && gspca_dev->users == 1)
63eb9546
JFM
1738 return -EINVAL;
1739
5b77ae77
JFM
1740 /* only the capturing file may dequeue */
1741 if (gspca_dev->capt_file != file)
1742 return -EINVAL;
1743
1744 /* only one dequeue / read at a time */
63eb9546
JFM
1745 if (mutex_lock_interruptible(&gspca_dev->read_lock))
1746 return -ERESTARTSYS;
1747
d43fa32f 1748 ret = frame_wait(gspca_dev, file->f_flags & O_NONBLOCK);
63eb9546 1749 if (ret < 0)
4aa0d037 1750 goto out;
63eb9546
JFM
1751 i = ret; /* frame index */
1752 frame = &gspca_dev->frame[i];
ac0d6df6 1753 if (gspca_dev->memory == V4L2_MEMORY_USERPTR) {
c6eb8eaf 1754 if (copy_to_user((__u8 __user *) frame->v4l2_buf.m.userptr,
ac0d6df6
JFM
1755 frame->data,
1756 frame->v4l2_buf.bytesused)) {
1757 PDEBUG(D_ERR|D_STREAM,
1758 "dqbuf cp to user failed");
1759 ret = -EFAULT;
1760 goto out;
1761 }
1762 }
63eb9546
JFM
1763 frame->v4l2_buf.flags &= ~V4L2_BUF_FLAG_DONE;
1764 memcpy(v4l2_buf, &frame->v4l2_buf, sizeof *v4l2_buf);
1765 PDEBUG(D_FRAM, "dqbuf %d", i);
1766 ret = 0;
4aa0d037 1767out:
63eb9546
JFM
1768 mutex_unlock(&gspca_dev->read_lock);
1769 return ret;
1770}
1771
1772/*
1773 * queue a video buffer
1774 *
1775 * Attempting to queue a buffer that has already been
1776 * queued will return -EINVAL.
1777 */
1778static int vidioc_qbuf(struct file *file, void *priv,
1779 struct v4l2_buffer *v4l2_buf)
1780{
1781 struct gspca_dev *gspca_dev = priv;
1782 struct gspca_frame *frame;
1783 int i, index, ret;
1784
1785 PDEBUG(D_FRAM, "qbuf %d", v4l2_buf->index);
63eb9546 1786
5b77ae77
JFM
1787 if (mutex_lock_interruptible(&gspca_dev->queue_lock))
1788 return -ERESTARTSYS;
1789
63eb9546
JFM
1790 index = v4l2_buf->index;
1791 if ((unsigned) index >= gspca_dev->nframes) {
d43fa32f 1792 PDEBUG(D_FRAM,
63eb9546 1793 "qbuf idx %d >= %d", index, gspca_dev->nframes);
5b77ae77
JFM
1794 ret = -EINVAL;
1795 goto out;
63eb9546 1796 }
5b77ae77 1797 if (v4l2_buf->memory != gspca_dev->memory) {
d43fa32f 1798 PDEBUG(D_FRAM, "qbuf bad memory type");
5b77ae77
JFM
1799 ret = -EINVAL;
1800 goto out;
63eb9546 1801 }
e2997a72 1802
5b77ae77 1803 frame = &gspca_dev->frame[index];
d43fa32f
JFM
1804 if (frame->v4l2_buf.flags & BUF_ALL_FLAGS) {
1805 PDEBUG(D_FRAM, "qbuf bad state");
63eb9546
JFM
1806 ret = -EINVAL;
1807 goto out;
1808 }
1809
1810 frame->v4l2_buf.flags |= V4L2_BUF_FLAG_QUEUED;
63eb9546 1811
d43fa32f 1812 if (frame->v4l2_buf.memory == V4L2_MEMORY_USERPTR) {
63eb9546
JFM
1813 frame->v4l2_buf.m.userptr = v4l2_buf->m.userptr;
1814 frame->v4l2_buf.length = v4l2_buf->length;
1815 }
1816
1817 /* put the buffer in the 'queued' queue */
1818 i = gspca_dev->fr_q;
1819 gspca_dev->fr_queue[i] = index;
8c32aa59
JFM
1820 if (gspca_dev->fr_i == i)
1821 gspca_dev->cur_frame = frame;
63eb9546
JFM
1822 gspca_dev->fr_q = (i + 1) % gspca_dev->nframes;
1823 PDEBUG(D_FRAM, "qbuf q:%d i:%d o:%d",
1824 gspca_dev->fr_q,
1825 gspca_dev->fr_i,
1826 gspca_dev->fr_o);
1827
1828 v4l2_buf->flags |= V4L2_BUF_FLAG_QUEUED;
1829 v4l2_buf->flags &= ~V4L2_BUF_FLAG_DONE;
1830 ret = 0;
1831out:
1832 mutex_unlock(&gspca_dev->queue_lock);
1833 return ret;
1834}
1835
d43fa32f
JFM
1836/*
1837 * allocate the resources for read()
1838 */
1839static int read_alloc(struct gspca_dev *gspca_dev,
1840 struct file *file)
63eb9546 1841{
63eb9546 1842 struct v4l2_buffer v4l2_buf;
d43fa32f 1843 int i, ret;
63eb9546 1844
d43fa32f 1845 PDEBUG(D_STREAM, "read alloc");
63eb9546
JFM
1846 if (gspca_dev->nframes == 0) {
1847 struct v4l2_requestbuffers rb;
1848
1849 memset(&rb, 0, sizeof rb);
1850 rb.count = gspca_dev->nbufread;
1851 rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
ac0d6df6 1852 rb.memory = GSPCA_MEMORY_READ;
63eb9546
JFM
1853 ret = vidioc_reqbufs(file, gspca_dev, &rb);
1854 if (ret != 0) {
d43fa32f 1855 PDEBUG(D_STREAM, "read reqbuf err %d", ret);
63eb9546
JFM
1856 return ret;
1857 }
1858 memset(&v4l2_buf, 0, sizeof v4l2_buf);
1859 v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
ac0d6df6 1860 v4l2_buf.memory = GSPCA_MEMORY_READ;
63eb9546
JFM
1861 for (i = 0; i < gspca_dev->nbufread; i++) {
1862 v4l2_buf.index = i;
63eb9546
JFM
1863 ret = vidioc_qbuf(file, gspca_dev, &v4l2_buf);
1864 if (ret != 0) {
1865 PDEBUG(D_STREAM, "read qbuf err: %d", ret);
1866 return ret;
1867 }
1868 }
d43fa32f
JFM
1869 gspca_dev->memory = GSPCA_MEMORY_READ;
1870 }
4aa0d037 1871
d43fa32f
JFM
1872 /* start streaming */
1873 ret = vidioc_streamon(file, gspca_dev, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1874 if (ret != 0)
1875 PDEBUG(D_STREAM, "read streamon err %d", ret);
1876 return ret;
1877}
1878
1879static unsigned int dev_poll(struct file *file, poll_table *wait)
1880{
1881 struct gspca_dev *gspca_dev = file->private_data;
1882 int i, ret;
1883
1884 PDEBUG(D_FRAM, "poll");
1885
1886 poll_wait(file, &gspca_dev->wq, wait);
d43fa32f 1887
5b77ae77
JFM
1888 /* if reqbufs is not done, the user would use read() */
1889 if (gspca_dev->nframes == 0) {
1890 if (gspca_dev->memory != GSPCA_MEMORY_NO)
1891 return POLLERR; /* not the 1st time */
d43fa32f 1892 ret = read_alloc(gspca_dev, file);
5b77ae77
JFM
1893 if (ret != 0)
1894 return POLLERR;
63eb9546
JFM
1895 }
1896
d43fa32f
JFM
1897 if (mutex_lock_interruptible(&gspca_dev->queue_lock) != 0)
1898 return POLLERR;
d43fa32f 1899
5b77ae77 1900 /* check the next incoming buffer */
d43fa32f
JFM
1901 i = gspca_dev->fr_o;
1902 i = gspca_dev->fr_queue[i];
1903 if (gspca_dev->frame[i].v4l2_buf.flags & V4L2_BUF_FLAG_DONE)
1904 ret = POLLIN | POLLRDNORM; /* something to read */
1905 else
1906 ret = 0;
d43fa32f 1907 mutex_unlock(&gspca_dev->queue_lock);
090264e5
JFM
1908 if (!gspca_dev->present)
1909 return POLLHUP;
d43fa32f
JFM
1910 return ret;
1911}
1912
1913static ssize_t dev_read(struct file *file, char __user *data,
1914 size_t count, loff_t *ppos)
1915{
1916 struct gspca_dev *gspca_dev = file->private_data;
1917 struct gspca_frame *frame;
1918 struct v4l2_buffer v4l2_buf;
1919 struct timeval timestamp;
82643d0e 1920 int n, ret, ret2;
d43fa32f 1921
a9e11134 1922 PDEBUG(D_FRAM, "read (%zd)", count);
d43fa32f
JFM
1923 if (!gspca_dev->present)
1924 return -ENODEV;
1925 switch (gspca_dev->memory) {
1926 case GSPCA_MEMORY_NO: /* first time */
1927 ret = read_alloc(gspca_dev, file);
1928 if (ret != 0)
1929 return ret;
1930 break;
1931 case GSPCA_MEMORY_READ:
82643d0e
JFM
1932 if (gspca_dev->capt_file == file)
1933 break;
1934 /* fall thru */
d43fa32f
JFM
1935 default:
1936 return -EINVAL;
1937 }
1938
63eb9546
JFM
1939 /* get a frame */
1940 jiffies_to_timeval(get_jiffies_64(), &timestamp);
1941 timestamp.tv_sec--;
82643d0e
JFM
1942 n = 2;
1943 for (;;) {
63eb9546
JFM
1944 memset(&v4l2_buf, 0, sizeof v4l2_buf);
1945 v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
ac0d6df6 1946 v4l2_buf.memory = GSPCA_MEMORY_READ;
63eb9546
JFM
1947 ret = vidioc_dqbuf(file, gspca_dev, &v4l2_buf);
1948 if (ret != 0) {
1949 PDEBUG(D_STREAM, "read dqbuf err %d", ret);
1950 return ret;
1951 }
1952
1953 /* if the process slept for more than 1 second,
219423c1 1954 * get a newer frame */
63eb9546 1955 frame = &gspca_dev->frame[v4l2_buf.index];
82643d0e
JFM
1956 if (--n < 0)
1957 break; /* avoid infinite loop */
63eb9546
JFM
1958 if (frame->v4l2_buf.timestamp.tv_sec >= timestamp.tv_sec)
1959 break;
1960 ret = vidioc_qbuf(file, gspca_dev, &v4l2_buf);
1961 if (ret != 0) {
1962 PDEBUG(D_STREAM, "read qbuf err %d", ret);
1963 return ret;
1964 }
1965 }
1966
1967 /* copy the frame */
ac0d6df6
JFM
1968 if (count > frame->v4l2_buf.bytesused)
1969 count = frame->v4l2_buf.bytesused;
63eb9546
JFM
1970 ret = copy_to_user(data, frame->data, count);
1971 if (ret != 0) {
1972 PDEBUG(D_ERR|D_STREAM,
a9e11134 1973 "read cp to user lack %d / %zd", ret, count);
63eb9546
JFM
1974 ret = -EFAULT;
1975 goto out;
1976 }
1977 ret = count;
1978out:
1979 /* in each case, requeue the buffer */
1980 ret2 = vidioc_qbuf(file, gspca_dev, &v4l2_buf);
1981 if (ret2 != 0)
1982 return ret2;
1983 return ret;
1984}
1985
bec43661 1986static struct v4l2_file_operations dev_fops = {
63eb9546
JFM
1987 .owner = THIS_MODULE,
1988 .open = dev_open,
1989 .release = dev_close,
1990 .read = dev_read,
1991 .mmap = dev_mmap,
bec43661 1992 .unlocked_ioctl = video_ioctl2,
63eb9546
JFM
1993 .poll = dev_poll,
1994};
1995
a399810c 1996static const struct v4l2_ioctl_ops dev_ioctl_ops = {
63eb9546
JFM
1997 .vidioc_querycap = vidioc_querycap,
1998 .vidioc_dqbuf = vidioc_dqbuf,
1999 .vidioc_qbuf = vidioc_qbuf,
e078770a
MCC
2000 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
2001 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
2002 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
2003 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
63eb9546
JFM
2004 .vidioc_streamon = vidioc_streamon,
2005 .vidioc_queryctrl = vidioc_queryctrl,
2006 .vidioc_g_ctrl = vidioc_g_ctrl,
2007 .vidioc_s_ctrl = vidioc_s_ctrl,
f955c4fc
JFM
2008 .vidioc_g_audio = vidioc_g_audio,
2009 .vidioc_s_audio = vidioc_s_audio,
2010 .vidioc_enumaudio = vidioc_enumaudio,
63eb9546
JFM
2011 .vidioc_querymenu = vidioc_querymenu,
2012 .vidioc_enum_input = vidioc_enum_input,
2013 .vidioc_g_input = vidioc_g_input,
2014 .vidioc_s_input = vidioc_s_input,
2015 .vidioc_reqbufs = vidioc_reqbufs,
2016 .vidioc_querybuf = vidioc_querybuf,
2017 .vidioc_streamoff = vidioc_streamoff,
2018 .vidioc_g_jpegcomp = vidioc_g_jpegcomp,
2019 .vidioc_s_jpegcomp = vidioc_s_jpegcomp,
2020 .vidioc_g_parm = vidioc_g_parm,
2021 .vidioc_s_parm = vidioc_s_parm,
11c635a2 2022 .vidioc_enum_framesizes = vidioc_enum_framesizes,
28ffe77f 2023 .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
af1d9afa
BJ
2024#ifdef CONFIG_VIDEO_ADV_DEBUG
2025 .vidioc_g_register = vidioc_g_register,
2026 .vidioc_s_register = vidioc_s_register,
2027#endif
2028 .vidioc_g_chip_ident = vidioc_g_chip_ident,
63eb9546
JFM
2029#ifdef CONFIG_VIDEO_V4L1_COMPAT
2030 .vidiocgmbuf = vidiocgmbuf,
2031#endif
2032};
2033
a399810c
HV
2034static struct video_device gspca_template = {
2035 .name = "gspca main driver",
a399810c
HV
2036 .fops = &dev_fops,
2037 .ioctl_ops = &dev_ioctl_ops,
d0182306 2038 .release = gspca_release,
a399810c
HV
2039};
2040
63eb9546
JFM
2041/*
2042 * probe and create a new gspca device
2043 *
2044 * This function must be called by the sub-driver when it is
2045 * called for probing a new device.
2046 */
2047int gspca_dev_probe(struct usb_interface *intf,
2048 const struct usb_device_id *id,
2049 const struct sd_desc *sd_desc,
d43fa32f
JFM
2050 int dev_size,
2051 struct module *module)
63eb9546
JFM
2052{
2053 struct usb_interface_descriptor *interface;
2054 struct gspca_dev *gspca_dev;
2055 struct usb_device *dev = interface_to_usbdev(intf);
2056 int ret;
63eb9546 2057
6a7eba24 2058 PDEBUG(D_PROBE, "probing %04x:%04x", id->idVendor, id->idProduct);
63eb9546
JFM
2059
2060 /* we don't handle multi-config cameras */
0d07e240
JFM
2061 if (dev->descriptor.bNumConfigurations != 1) {
2062 PDEBUG(D_ERR, "Too many config");
63eb9546 2063 return -ENODEV;
0d07e240 2064 }
63eb9546 2065 interface = &intf->cur_altsetting->desc;
0d07e240
JFM
2066 if (interface->bInterfaceNumber > 0) {
2067 PDEBUG(D_ERR, "intf != 0");
63eb9546 2068 return -ENODEV;
0d07e240 2069 }
63eb9546
JFM
2070
2071 /* create the device */
2072 if (dev_size < sizeof *gspca_dev)
2073 dev_size = sizeof *gspca_dev;
2074 gspca_dev = kzalloc(dev_size, GFP_KERNEL);
e293e599 2075 if (!gspca_dev) {
63eb9546 2076 err("couldn't kzalloc gspca struct");
e293e599 2077 return -ENOMEM;
63eb9546 2078 }
8295d99e
JFM
2079 gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL);
2080 if (!gspca_dev->usb_buf) {
2081 err("out of memory");
e293e599 2082 ret = -ENOMEM;
8295d99e
JFM
2083 goto out;
2084 }
63eb9546
JFM
2085 gspca_dev->dev = dev;
2086 gspca_dev->iface = interface->bInterfaceNumber;
d43fa32f 2087 gspca_dev->nbalt = intf->num_altsetting;
63eb9546 2088 gspca_dev->sd_desc = sd_desc;
63eb9546 2089 gspca_dev->nbufread = 2;
ff374747 2090 gspca_dev->empty_packet = -1; /* don't check the empty packets */
63eb9546 2091
012d6b02 2092 /* configure the subdriver and initialize the USB device */
ba38ee8e 2093 ret = sd_desc->config(gspca_dev, id);
012d6b02
JFM
2094 if (ret < 0)
2095 goto out;
ba38ee8e 2096 ret = sd_desc->init(gspca_dev);
63eb9546
JFM
2097 if (ret < 0)
2098 goto out;
2099 gspca_set_default_mode(gspca_dev);
2100
2101 mutex_init(&gspca_dev->usb_lock);
2102 mutex_init(&gspca_dev->read_lock);
2103 mutex_init(&gspca_dev->queue_lock);
2104 init_waitqueue_head(&gspca_dev->wq);
2105
2106 /* init video stuff */
ba38ee8e 2107 memcpy(&gspca_dev->vdev, &gspca_template, sizeof gspca_template);
24441631 2108 gspca_dev->vdev.parent = &intf->dev;
5c4fa002 2109 gspca_dev->module = module;
ee56a4d3 2110 gspca_dev->present = 1;
a12ca6a6 2111 ret = video_register_device(&gspca_dev->vdev,
63eb9546 2112 VFL_TYPE_GRABBER,
8d584a53 2113 -1);
63eb9546
JFM
2114 if (ret < 0) {
2115 err("video_register_device err %d", ret);
2116 goto out;
2117 }
2118
63eb9546 2119 usb_set_intfdata(intf, gspca_dev);
38c7c036 2120 PDEBUG(D_PROBE, "%s created", video_device_node_name(&gspca_dev->vdev));
63eb9546
JFM
2121 return 0;
2122out:
e07a1d8a
JFM
2123 kfree(gspca_dev->usb_buf);
2124 kfree(gspca_dev);
63eb9546
JFM
2125 return ret;
2126}
2127EXPORT_SYMBOL(gspca_dev_probe);
2128
2129/*
2130 * USB disconnection
2131 *
2132 * This function must be called by the sub-driver
2133 * when the device disconnects, after the specific resources are freed.
2134 */
2135void gspca_disconnect(struct usb_interface *intf)
2136{
4aa0d037 2137 struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
63eb9546 2138
38c7c036
LP
2139 PDEBUG(D_PROBE, "%s disconnect",
2140 video_device_node_name(&gspca_dev->vdev));
ad28127d 2141 mutex_lock(&gspca_dev->usb_lock);
6e4ae872 2142 gspca_dev->present = 0;
6e4ae872 2143
090264e5
JFM
2144 if (gspca_dev->streaming) {
2145 destroy_urbs(gspca_dev);
2146 wake_up_interruptible(&gspca_dev->wq);
2147 }
2148
2149 /* the device is freed at exit of this function */
ad28127d 2150 gspca_dev->dev = NULL;
090264e5
JFM
2151 mutex_unlock(&gspca_dev->usb_lock);
2152
6b060ffe
FZ
2153 usb_set_intfdata(intf, NULL);
2154
a12ca6a6
JFM
2155 /* release the device */
2156 /* (this will call gspca_release() immediatly or on last close) */
2157 video_unregister_device(&gspca_dev->vdev);
3145b8c1 2158
0d07e240 2159/* PDEBUG(D_PROBE, "disconnect complete"); */
63eb9546
JFM
2160}
2161EXPORT_SYMBOL(gspca_disconnect);
2162
6a709749
JFM
2163#ifdef CONFIG_PM
2164int gspca_suspend(struct usb_interface *intf, pm_message_t message)
2165{
2166 struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
2167
2168 if (!gspca_dev->streaming)
2169 return 0;
2170 gspca_dev->frozen = 1; /* avoid urb error messages */
012d6b02
JFM
2171 if (gspca_dev->sd_desc->stopN)
2172 gspca_dev->sd_desc->stopN(gspca_dev);
6a709749
JFM
2173 destroy_urbs(gspca_dev);
2174 gspca_set_alt0(gspca_dev);
012d6b02
JFM
2175 if (gspca_dev->sd_desc->stop0)
2176 gspca_dev->sd_desc->stop0(gspca_dev);
6a709749
JFM
2177 return 0;
2178}
2179EXPORT_SYMBOL(gspca_suspend);
2180
2181int gspca_resume(struct usb_interface *intf)
2182{
2183 struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
2184
2185 gspca_dev->frozen = 0;
012d6b02
JFM
2186 gspca_dev->sd_desc->init(gspca_dev);
2187 if (gspca_dev->streaming)
2188 return gspca_init_transfer(gspca_dev);
1e89e2da 2189 return 0;
6a709749
JFM
2190}
2191EXPORT_SYMBOL(gspca_resume);
2192#endif
dcef3237
HG
2193/* -- cam driver utility functions -- */
2194
2195/* auto gain and exposure algorithm based on the knee algorithm described here:
2196 http://ytse.tricolour.net/docs/LowLightOptimization.html
2197
2198 Returns 0 if no changes were made, 1 if the gain and or exposure settings
2199 where changed. */
2200int gspca_auto_gain_n_exposure(struct gspca_dev *gspca_dev, int avg_lum,
2201 int desired_avg_lum, int deadzone, int gain_knee, int exposure_knee)
2202{
2203 int i, steps, gain, orig_gain, exposure, orig_exposure, autogain;
2204 const struct ctrl *gain_ctrl = NULL;
2205 const struct ctrl *exposure_ctrl = NULL;
2206 const struct ctrl *autogain_ctrl = NULL;
2207 int retval = 0;
2208
2209 for (i = 0; i < gspca_dev->sd_desc->nctrls; i++) {
2210 if (gspca_dev->sd_desc->ctrls[i].qctrl.id == V4L2_CID_GAIN)
2211 gain_ctrl = &gspca_dev->sd_desc->ctrls[i];
2212 if (gspca_dev->sd_desc->ctrls[i].qctrl.id == V4L2_CID_EXPOSURE)
2213 exposure_ctrl = &gspca_dev->sd_desc->ctrls[i];
2214 if (gspca_dev->sd_desc->ctrls[i].qctrl.id == V4L2_CID_AUTOGAIN)
2215 autogain_ctrl = &gspca_dev->sd_desc->ctrls[i];
2216 }
2217 if (!gain_ctrl || !exposure_ctrl || !autogain_ctrl) {
2218 PDEBUG(D_ERR, "Error: gspca_auto_gain_n_exposure called "
2219 "on cam without (auto)gain/exposure");
2220 return 0;
2221 }
2222
2223 if (gain_ctrl->get(gspca_dev, &gain) ||
2224 exposure_ctrl->get(gspca_dev, &exposure) ||
2225 autogain_ctrl->get(gspca_dev, &autogain) || !autogain)
2226 return 0;
2227
2228 orig_gain = gain;
2229 orig_exposure = exposure;
2230
2231 /* If we are of a multiple of deadzone, do multiple steps to reach the
2232 desired lumination fast (with the risc of a slight overshoot) */
2233 steps = abs(desired_avg_lum - avg_lum) / deadzone;
2234
1c44d81d 2235 PDEBUG(D_FRAM, "autogain: lum: %d, desired: %d, steps: %d",
dcef3237
HG
2236 avg_lum, desired_avg_lum, steps);
2237
2238 for (i = 0; i < steps; i++) {
2239 if (avg_lum > desired_avg_lum) {
2240 if (gain > gain_knee)
2241 gain--;
2242 else if (exposure > exposure_knee)
2243 exposure--;
2244 else if (gain > gain_ctrl->qctrl.default_value)
2245 gain--;
2246 else if (exposure > exposure_ctrl->qctrl.minimum)
2247 exposure--;
2248 else if (gain > gain_ctrl->qctrl.minimum)
2249 gain--;
2250 else
2251 break;
2252 } else {
2253 if (gain < gain_ctrl->qctrl.default_value)
2254 gain++;
2255 else if (exposure < exposure_knee)
2256 exposure++;
2257 else if (gain < gain_knee)
2258 gain++;
2259 else if (exposure < exposure_ctrl->qctrl.maximum)
2260 exposure++;
2261 else if (gain < gain_ctrl->qctrl.maximum)
2262 gain++;
2263 else
2264 break;
2265 }
2266 }
2267
2268 if (gain != orig_gain) {
2269 gain_ctrl->set(gspca_dev, gain);
2270 retval = 1;
2271 }
2272 if (exposure != orig_exposure) {
2273 exposure_ctrl->set(gspca_dev, exposure);
2274 retval = 1;
2275 }
2276
2277 return retval;
2278}
2279EXPORT_SYMBOL(gspca_auto_gain_n_exposure);
2280
63eb9546
JFM
2281/* -- module insert / remove -- */
2282static int __init gspca_init(void)
2283{
bb64e86c
JFM
2284 info("main v%d.%d.%d registered",
2285 (DRIVER_VERSION_NUMBER >> 16) & 0xff,
2286 (DRIVER_VERSION_NUMBER >> 8) & 0xff,
2287 DRIVER_VERSION_NUMBER & 0xff);
63eb9546
JFM
2288 return 0;
2289}
2290static void __exit gspca_exit(void)
2291{
2292 info("main deregistered");
2293}
2294
2295module_init(gspca_init);
2296module_exit(gspca_exit);
2297
335b3f88 2298#ifdef GSPCA_DEBUG
63eb9546
JFM
2299module_param_named(debug, gspca_debug, int, 0644);
2300MODULE_PARM_DESC(debug,
2301 "Debug (bit) 0x01:error 0x02:probe 0x04:config"
d43fa32f
JFM
2302 " 0x08:stream 0x10:frame 0x20:packet 0x40:USBin 0x80:USBout"
2303 " 0x0100: v4l2");
6a7eba24 2304#endif
This page took 0.422025 seconds and 5 git commands to generate.