const: mark struct vm_struct_operations
[safe/jmp/linux-2.6] / drivers / media / video / sn9c102 / sn9c102_core.c
1 /***************************************************************************
2  * V4L2 driver for SN9C1xx PC Camera Controllers                           *
3  *                                                                         *
4  * Copyright (C) 2004-2007 by Luca Risolia <luca.risolia@studio.unibo.it>  *
5  *                                                                         *
6  * This program is free software; you can redistribute it and/or modify    *
7  * it under the terms of the GNU General Public License as published by    *
8  * the Free Software Foundation; either version 2 of the License, or       *
9  * (at your option) any later version.                                     *
10  *                                                                         *
11  * This program is distributed in the hope that it will be useful,         *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
14  * GNU General Public License 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             *
18  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               *
19  ***************************************************************************/
20
21 #include <linux/module.h>
22 #include <linux/init.h>
23 #include <linux/kernel.h>
24 #include <linux/param.h>
25 #include <linux/errno.h>
26 #include <linux/slab.h>
27 #include <linux/device.h>
28 #include <linux/fs.h>
29 #include <linux/delay.h>
30 #include <linux/compiler.h>
31 #include <linux/ioctl.h>
32 #include <linux/poll.h>
33 #include <linux/stat.h>
34 #include <linux/mm.h>
35 #include <linux/vmalloc.h>
36 #include <linux/page-flags.h>
37 #include <asm/byteorder.h>
38 #include <asm/page.h>
39 #include <asm/uaccess.h>
40
41 #include "sn9c102.h"
42
43 /*****************************************************************************/
44
45 #define SN9C102_MODULE_NAME     "V4L2 driver for SN9C1xx PC Camera Controllers"
46 #define SN9C102_MODULE_ALIAS    "sn9c1xx"
47 #define SN9C102_MODULE_AUTHOR   "(C) 2004-2007 Luca Risolia"
48 #define SN9C102_AUTHOR_EMAIL    "<luca.risolia@studio.unibo.it>"
49 #define SN9C102_MODULE_LICENSE  "GPL"
50 #define SN9C102_MODULE_VERSION  "1:1.47pre49"
51 #define SN9C102_MODULE_VERSION_CODE  KERNEL_VERSION(1, 1, 47)
52
53 /*****************************************************************************/
54
55 MODULE_DEVICE_TABLE(usb, sn9c102_id_table);
56
57 MODULE_AUTHOR(SN9C102_MODULE_AUTHOR " " SN9C102_AUTHOR_EMAIL);
58 MODULE_DESCRIPTION(SN9C102_MODULE_NAME);
59 MODULE_ALIAS(SN9C102_MODULE_ALIAS);
60 MODULE_VERSION(SN9C102_MODULE_VERSION);
61 MODULE_LICENSE(SN9C102_MODULE_LICENSE);
62
63 static short video_nr[] = {[0 ... SN9C102_MAX_DEVICES-1] = -1};
64 module_param_array(video_nr, short, NULL, 0444);
65 MODULE_PARM_DESC(video_nr,
66                  " <-1|n[,...]>"
67                  "\nSpecify V4L2 minor mode number."
68                  "\n-1 = use next available (default)"
69                  "\n n = use minor number n (integer >= 0)"
70                  "\nYou can specify up to "__MODULE_STRING(SN9C102_MAX_DEVICES)
71                  " cameras this way."
72                  "\nFor example:"
73                  "\nvideo_nr=-1,2,-1 would assign minor number 2 to"
74                  "\nthe second camera and use auto for the first"
75                  "\none and for every other camera."
76                  "\n");
77
78 static short force_munmap[] = {[0 ... SN9C102_MAX_DEVICES-1] =
79                                SN9C102_FORCE_MUNMAP};
80 module_param_array(force_munmap, bool, NULL, 0444);
81 MODULE_PARM_DESC(force_munmap,
82                  " <0|1[,...]>"
83                  "\nForce the application to unmap previously"
84                  "\nmapped buffer memory before calling any VIDIOC_S_CROP or"
85                  "\nVIDIOC_S_FMT ioctl's. Not all the applications support"
86                  "\nthis feature. This parameter is specific for each"
87                  "\ndetected camera."
88                  "\n0 = do not force memory unmapping"
89                  "\n1 = force memory unmapping (save memory)"
90                  "\nDefault value is "__MODULE_STRING(SN9C102_FORCE_MUNMAP)"."
91                  "\n");
92
93 static unsigned int frame_timeout[] = {[0 ... SN9C102_MAX_DEVICES-1] =
94                                        SN9C102_FRAME_TIMEOUT};
95 module_param_array(frame_timeout, uint, NULL, 0644);
96 MODULE_PARM_DESC(frame_timeout,
97                  " <0|n[,...]>"
98                  "\nTimeout for a video frame in seconds before"
99                  "\nreturning an I/O error; 0 for infinity."
100                  "\nThis parameter is specific for each detected camera."
101                  "\nDefault value is "__MODULE_STRING(SN9C102_FRAME_TIMEOUT)"."
102                  "\n");
103
104 #ifdef SN9C102_DEBUG
105 static unsigned short debug = SN9C102_DEBUG_LEVEL;
106 module_param(debug, ushort, 0644);
107 MODULE_PARM_DESC(debug,
108                  " <n>"
109                  "\nDebugging information level, from 0 to 3:"
110                  "\n0 = none (use carefully)"
111                  "\n1 = critical errors"
112                  "\n2 = significant informations"
113                  "\n3 = more verbose messages"
114                  "\nLevel 3 is useful for testing only."
115                  "\nDefault value is "__MODULE_STRING(SN9C102_DEBUG_LEVEL)"."
116                  "\n");
117 #endif
118
119 /*
120    Add the probe entries to this table. Be sure to add the entry in the right
121    place, since, on failure, the next probing routine is called according to
122    the order of the list below, from top to bottom.
123 */
124 static int (*sn9c102_sensor_table[])(struct sn9c102_device *) = {
125         &sn9c102_probe_hv7131d, /* strong detection based on SENSOR ids */
126         &sn9c102_probe_hv7131r, /* strong detection based on SENSOR ids */
127         &sn9c102_probe_mi0343, /* strong detection based on SENSOR ids */
128         &sn9c102_probe_mi0360, /* strong detection based on SENSOR ids */
129         &sn9c102_probe_mt9v111, /* strong detection based on SENSOR ids */
130         &sn9c102_probe_pas106b, /* strong detection based on SENSOR ids */
131         &sn9c102_probe_pas202bcb, /* strong detection based on SENSOR ids */
132         &sn9c102_probe_ov7630, /* strong detection based on SENSOR ids */
133         &sn9c102_probe_ov7660, /* strong detection based on SENSOR ids */
134         &sn9c102_probe_tas5110c1b, /* detection based on USB pid/vid */
135         &sn9c102_probe_tas5110d, /* detection based on USB pid/vid */
136         &sn9c102_probe_tas5130d1b, /* detection based on USB pid/vid */
137 };
138
139 /*****************************************************************************/
140
141 static u32
142 sn9c102_request_buffers(struct sn9c102_device* cam, u32 count,
143                         enum sn9c102_io_method io)
144 {
145         struct v4l2_pix_format* p = &(cam->sensor.pix_format);
146         struct v4l2_rect* r = &(cam->sensor.cropcap.bounds);
147         size_t imagesize = cam->module_param.force_munmap || io == IO_READ ?
148                            (p->width * p->height * p->priv) / 8 :
149                            (r->width * r->height * p->priv) / 8;
150         void* buff = NULL;
151         u32 i;
152
153         if (count > SN9C102_MAX_FRAMES)
154                 count = SN9C102_MAX_FRAMES;
155
156         if (cam->bridge == BRIDGE_SN9C105 || cam->bridge == BRIDGE_SN9C120)
157                 imagesize += 589 + 2; /* length of JPEG header + EOI marker */
158
159         cam->nbuffers = count;
160         while (cam->nbuffers > 0) {
161                 if ((buff = vmalloc_32_user(cam->nbuffers *
162                                             PAGE_ALIGN(imagesize))))
163                         break;
164                 cam->nbuffers--;
165         }
166
167         for (i = 0; i < cam->nbuffers; i++) {
168                 cam->frame[i].bufmem = buff + i*PAGE_ALIGN(imagesize);
169                 cam->frame[i].buf.index = i;
170                 cam->frame[i].buf.m.offset = i*PAGE_ALIGN(imagesize);
171                 cam->frame[i].buf.length = imagesize;
172                 cam->frame[i].buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
173                 cam->frame[i].buf.sequence = 0;
174                 cam->frame[i].buf.field = V4L2_FIELD_NONE;
175                 cam->frame[i].buf.memory = V4L2_MEMORY_MMAP;
176                 cam->frame[i].buf.flags = 0;
177         }
178
179         return cam->nbuffers;
180 }
181
182
183 static void sn9c102_release_buffers(struct sn9c102_device* cam)
184 {
185         if (cam->nbuffers) {
186                 vfree(cam->frame[0].bufmem);
187                 cam->nbuffers = 0;
188         }
189         cam->frame_current = NULL;
190 }
191
192
193 static void sn9c102_empty_framequeues(struct sn9c102_device* cam)
194 {
195         u32 i;
196
197         INIT_LIST_HEAD(&cam->inqueue);
198         INIT_LIST_HEAD(&cam->outqueue);
199
200         for (i = 0; i < SN9C102_MAX_FRAMES; i++) {
201                 cam->frame[i].state = F_UNUSED;
202                 cam->frame[i].buf.bytesused = 0;
203         }
204 }
205
206
207 static void sn9c102_requeue_outqueue(struct sn9c102_device* cam)
208 {
209         struct sn9c102_frame_t *i;
210
211         list_for_each_entry(i, &cam->outqueue, frame) {
212                 i->state = F_QUEUED;
213                 list_add(&i->frame, &cam->inqueue);
214         }
215
216         INIT_LIST_HEAD(&cam->outqueue);
217 }
218
219
220 static void sn9c102_queue_unusedframes(struct sn9c102_device* cam)
221 {
222         unsigned long lock_flags;
223         u32 i;
224
225         for (i = 0; i < cam->nbuffers; i++)
226                 if (cam->frame[i].state == F_UNUSED) {
227                         cam->frame[i].state = F_QUEUED;
228                         spin_lock_irqsave(&cam->queue_lock, lock_flags);
229                         list_add_tail(&cam->frame[i].frame, &cam->inqueue);
230                         spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
231                 }
232 }
233
234 /*****************************************************************************/
235
236 /*
237    Write a sequence of count value/register pairs. Returns -1 after the first
238    failed write, or 0 for no errors.
239 */
240 int sn9c102_write_regs(struct sn9c102_device* cam, const u8 valreg[][2],
241                        int count)
242 {
243         struct usb_device* udev = cam->usbdev;
244         u8* buff = cam->control_buffer;
245         int i, res;
246
247         for (i = 0; i < count; i++) {
248                 u8 index = valreg[i][1];
249
250                 /*
251                    index is a u8, so it must be <256 and can't be out of range.
252                    If we put in a check anyway, gcc annoys us with a warning
253                    hat our check is useless. People get all uppity when they
254                    see warnings in the kernel compile.
255                 */
256
257                 *buff = valreg[i][0];
258
259                 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08,
260                                       0x41, index, 0, buff, 1,
261                                       SN9C102_CTRL_TIMEOUT);
262
263                 if (res < 0) {
264                         DBG(3, "Failed to write a register (value 0x%02X, "
265                                "index 0x%02X, error %d)", *buff, index, res);
266                         return -1;
267                 }
268
269                 cam->reg[index] = *buff;
270         }
271
272         return 0;
273 }
274
275
276 int sn9c102_write_reg(struct sn9c102_device* cam, u8 value, u16 index)
277 {
278         struct usb_device* udev = cam->usbdev;
279         u8* buff = cam->control_buffer;
280         int res;
281
282         if (index >= ARRAY_SIZE(cam->reg))
283                 return -1;
284
285         *buff = value;
286
287         res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
288                               index, 0, buff, 1, SN9C102_CTRL_TIMEOUT);
289         if (res < 0) {
290                 DBG(3, "Failed to write a register (value 0x%02X, index "
291                        "0x%02X, error %d)", value, index, res);
292                 return -1;
293         }
294
295         cam->reg[index] = value;
296
297         return 0;
298 }
299
300
301 /* NOTE: with the SN9C10[123] reading some registers always returns 0 */
302 int sn9c102_read_reg(struct sn9c102_device* cam, u16 index)
303 {
304         struct usb_device* udev = cam->usbdev;
305         u8* buff = cam->control_buffer;
306         int res;
307
308         res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, 0xc1,
309                               index, 0, buff, 1, SN9C102_CTRL_TIMEOUT);
310         if (res < 0)
311                 DBG(3, "Failed to read a register (index 0x%02X, error %d)",
312                     index, res);
313
314         return (res >= 0) ? (int)(*buff) : -1;
315 }
316
317
318 int sn9c102_pread_reg(struct sn9c102_device* cam, u16 index)
319 {
320         if (index >= ARRAY_SIZE(cam->reg))
321                 return -1;
322
323         return cam->reg[index];
324 }
325
326
327 static int
328 sn9c102_i2c_wait(struct sn9c102_device* cam,
329                  const struct sn9c102_sensor* sensor)
330 {
331         int i, r;
332
333         for (i = 1; i <= 5; i++) {
334                 r = sn9c102_read_reg(cam, 0x08);
335                 if (r < 0)
336                         return -EIO;
337                 if (r & 0x04)
338                         return 0;
339                 if (sensor->frequency & SN9C102_I2C_400KHZ)
340                         udelay(5*16);
341                 else
342                         udelay(16*16);
343         }
344         return -EBUSY;
345 }
346
347
348 static int
349 sn9c102_i2c_detect_read_error(struct sn9c102_device* cam,
350                               const struct sn9c102_sensor* sensor)
351 {
352         int r , err = 0;
353
354         r = sn9c102_read_reg(cam, 0x08);
355         if (r < 0)
356                 err += r;
357
358         if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102) {
359                 if (!(r & 0x08))
360                         err += -1;
361         } else {
362                 if (r & 0x08)
363                         err += -1;
364         }
365
366         return err ? -EIO : 0;
367 }
368
369
370 static int
371 sn9c102_i2c_detect_write_error(struct sn9c102_device* cam,
372                                const struct sn9c102_sensor* sensor)
373 {
374         int r;
375         r = sn9c102_read_reg(cam, 0x08);
376         return (r < 0 || (r >= 0 && (r & 0x08))) ? -EIO : 0;
377 }
378
379
380 int
381 sn9c102_i2c_try_raw_read(struct sn9c102_device* cam,
382                          const struct sn9c102_sensor* sensor, u8 data0,
383                          u8 data1, u8 n, u8 buffer[])
384 {
385         struct usb_device* udev = cam->usbdev;
386         u8* data = cam->control_buffer;
387         int i = 0, err = 0, res;
388
389         /* Write cycle */
390         data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
391                   ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0) | 0x10;
392         data[1] = data0; /* I2C slave id */
393         data[2] = data1; /* address */
394         data[7] = 0x10;
395         res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
396                               0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
397         if (res < 0)
398                 err += res;
399
400         err += sn9c102_i2c_wait(cam, sensor);
401
402         /* Read cycle - n bytes */
403         data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
404                   ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0) |
405                   (n << 4) | 0x02;
406         data[1] = data0;
407         data[7] = 0x10;
408         res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
409                               0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
410         if (res < 0)
411                 err += res;
412
413         err += sn9c102_i2c_wait(cam, sensor);
414
415         /* The first read byte will be placed in data[4] */
416         res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, 0xc1,
417                               0x0a, 0, data, 5, SN9C102_CTRL_TIMEOUT);
418         if (res < 0)
419                 err += res;
420
421         err += sn9c102_i2c_detect_read_error(cam, sensor);
422
423         PDBGG("I2C read: address 0x%02X, first read byte: 0x%02X", data1,
424               data[4]);
425
426         if (err) {
427                 DBG(3, "I2C read failed for %s image sensor", sensor->name);
428                 return -1;
429         }
430
431         if (buffer)
432                 for (i = 0; i < n && i < 5; i++)
433                         buffer[n-i-1] = data[4-i];
434
435         return (int)data[4];
436 }
437
438
439 int
440 sn9c102_i2c_try_raw_write(struct sn9c102_device* cam,
441                           const struct sn9c102_sensor* sensor, u8 n, u8 data0,
442                           u8 data1, u8 data2, u8 data3, u8 data4, u8 data5)
443 {
444         struct usb_device* udev = cam->usbdev;
445         u8* data = cam->control_buffer;
446         int err = 0, res;
447
448         /* Write cycle. It usually is address + value */
449         data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
450                   ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0)
451                   | ((n - 1) << 4);
452         data[1] = data0;
453         data[2] = data1;
454         data[3] = data2;
455         data[4] = data3;
456         data[5] = data4;
457         data[6] = data5;
458         data[7] = 0x17;
459         res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
460                               0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
461         if (res < 0)
462                 err += res;
463
464         err += sn9c102_i2c_wait(cam, sensor);
465         err += sn9c102_i2c_detect_write_error(cam, sensor);
466
467         if (err)
468                 DBG(3, "I2C write failed for %s image sensor", sensor->name);
469
470         PDBGG("I2C raw write: %u bytes, data0 = 0x%02X, data1 = 0x%02X, "
471               "data2 = 0x%02X, data3 = 0x%02X, data4 = 0x%02X, data5 = 0x%02X",
472               n, data0, data1, data2, data3, data4, data5);
473
474         return err ? -1 : 0;
475 }
476
477
478 int
479 sn9c102_i2c_try_read(struct sn9c102_device* cam,
480                      const struct sn9c102_sensor* sensor, u8 address)
481 {
482         return sn9c102_i2c_try_raw_read(cam, sensor, sensor->i2c_slave_id,
483                                         address, 1, NULL);
484 }
485
486
487 static int sn9c102_i2c_try_write(struct sn9c102_device* cam,
488                                  const struct sn9c102_sensor* sensor,
489                                  u8 address, u8 value)
490 {
491         return sn9c102_i2c_try_raw_write(cam, sensor, 3,
492                                          sensor->i2c_slave_id, address,
493                                          value, 0, 0, 0);
494 }
495
496
497 int sn9c102_i2c_read(struct sn9c102_device* cam, u8 address)
498 {
499         return sn9c102_i2c_try_read(cam, &cam->sensor, address);
500 }
501
502
503 int sn9c102_i2c_write(struct sn9c102_device* cam, u8 address, u8 value)
504 {
505         return sn9c102_i2c_try_write(cam, &cam->sensor, address, value);
506 }
507
508 /*****************************************************************************/
509
510 static size_t sn9c102_sof_length(struct sn9c102_device* cam)
511 {
512         switch (cam->bridge) {
513         case BRIDGE_SN9C101:
514         case BRIDGE_SN9C102:
515                 return 12;
516         case BRIDGE_SN9C103:
517                 return 18;
518         case BRIDGE_SN9C105:
519         case BRIDGE_SN9C120:
520                 return 62;
521         }
522
523         return 0;
524 }
525
526
527 static void*
528 sn9c102_find_sof_header(struct sn9c102_device* cam, void* mem, size_t len)
529 {
530         static const char marker[6] = {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96};
531         const char *m = mem;
532         size_t soflen = 0, i, j;
533
534         soflen = sn9c102_sof_length(cam);
535
536         for (i = 0; i < len; i++) {
537                 size_t b;
538
539                 /* Read the variable part of the header */
540                 if (unlikely(cam->sof.bytesread >= sizeof(marker))) {
541                         cam->sof.header[cam->sof.bytesread] = *(m+i);
542                         if (++cam->sof.bytesread == soflen) {
543                                 cam->sof.bytesread = 0;
544                                 return mem + i;
545                         }
546                         continue;
547                 }
548
549                 /* Search for the SOF marker (fixed part) in the header */
550                 for (j = 0, b=cam->sof.bytesread; j+b < sizeof(marker); j++) {
551                         if (unlikely(i+j == len))
552                                 return NULL;
553                         if (*(m+i+j) == marker[cam->sof.bytesread]) {
554                                 cam->sof.header[cam->sof.bytesread] = *(m+i+j);
555                                 if (++cam->sof.bytesread == sizeof(marker)) {
556                                         PDBGG("Bytes to analyze: %zd. SOF "
557                                               "starts at byte #%zd", len, i);
558                                         i += j+1;
559                                         break;
560                                 }
561                         } else {
562                                 cam->sof.bytesread = 0;
563                                 break;
564                         }
565                 }
566         }
567
568         return NULL;
569 }
570
571
572 static void*
573 sn9c102_find_eof_header(struct sn9c102_device* cam, void* mem, size_t len)
574 {
575         static const u8 eof_header[4][4] = {
576                 {0x00, 0x00, 0x00, 0x00},
577                 {0x40, 0x00, 0x00, 0x00},
578                 {0x80, 0x00, 0x00, 0x00},
579                 {0xc0, 0x00, 0x00, 0x00},
580         };
581         size_t i, j;
582
583         /* The EOF header does not exist in compressed data */
584         if (cam->sensor.pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X ||
585             cam->sensor.pix_format.pixelformat == V4L2_PIX_FMT_JPEG)
586                 return NULL;
587
588         /*
589            The EOF header might cross the packet boundary, but this is not a
590            problem, since the end of a frame is determined by checking its size
591            in the first place.
592         */
593         for (i = 0; (len >= 4) && (i <= len - 4); i++)
594                 for (j = 0; j < ARRAY_SIZE(eof_header); j++)
595                         if (!memcmp(mem + i, eof_header[j], 4))
596                                 return mem + i;
597
598         return NULL;
599 }
600
601
602 static void
603 sn9c102_write_jpegheader(struct sn9c102_device* cam, struct sn9c102_frame_t* f)
604 {
605         static const u8 jpeg_header[589] = {
606                 0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x06, 0x04, 0x05,
607                 0x06, 0x05, 0x04, 0x06, 0x06, 0x05, 0x06, 0x07, 0x07, 0x06,
608                 0x08, 0x0a, 0x10, 0x0a, 0x0a, 0x09, 0x09, 0x0a, 0x14, 0x0e,
609                 0x0f, 0x0c, 0x10, 0x17, 0x14, 0x18, 0x18, 0x17, 0x14, 0x16,
610                 0x16, 0x1a, 0x1d, 0x25, 0x1f, 0x1a, 0x1b, 0x23, 0x1c, 0x16,
611                 0x16, 0x20, 0x2c, 0x20, 0x23, 0x26, 0x27, 0x29, 0x2a, 0x29,
612                 0x19, 0x1f, 0x2d, 0x30, 0x2d, 0x28, 0x30, 0x25, 0x28, 0x29,
613                 0x28, 0x01, 0x07, 0x07, 0x07, 0x0a, 0x08, 0x0a, 0x13, 0x0a,
614                 0x0a, 0x13, 0x28, 0x1a, 0x16, 0x1a, 0x28, 0x28, 0x28, 0x28,
615                 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
616                 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
617                 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
618                 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
619                 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0xff, 0xc4, 0x01, 0xa2,
620                 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
621                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02,
622                 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01,
623                 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
624                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
625                 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00,
626                 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04,
627                 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
628                 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
629                 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23,
630                 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62,
631                 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
632                 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38,
633                 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
634                 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,
635                 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
636                 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
637                 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
638                 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,
639                 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
640                 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3,
641                 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3,
642                 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3,
643                 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02,
644                 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04,
645                 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
646                 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
647                 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
648                 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1,
649                 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19,
650                 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
651                 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
652                 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,
653                 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
654                 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
655                 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
656                 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
657                 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba,
658                 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
659                 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3,
660                 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4,
661                 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xc0, 0x00, 0x11,
662                 0x08, 0x01, 0xe0, 0x02, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02,
663                 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xda, 0x00, 0x0c, 0x03,
664                 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
665         };
666         u8 *pos = f->bufmem;
667
668         memcpy(pos, jpeg_header, sizeof(jpeg_header));
669         *(pos + 6) = 0x00;
670         *(pos + 7 + 64) = 0x01;
671         if (cam->compression.quality == 0) {
672                 memcpy(pos + 7, SN9C102_Y_QTABLE0, 64);
673                 memcpy(pos + 8 + 64, SN9C102_UV_QTABLE0, 64);
674         } else if (cam->compression.quality == 1) {
675                 memcpy(pos + 7, SN9C102_Y_QTABLE1, 64);
676                 memcpy(pos + 8 + 64, SN9C102_UV_QTABLE1, 64);
677         }
678         *(pos + 564) = cam->sensor.pix_format.width & 0xFF;
679         *(pos + 563) = (cam->sensor.pix_format.width >> 8) & 0xFF;
680         *(pos + 562) = cam->sensor.pix_format.height & 0xFF;
681         *(pos + 561) = (cam->sensor.pix_format.height >> 8) & 0xFF;
682         *(pos + 567) = 0x21;
683
684         f->buf.bytesused += sizeof(jpeg_header);
685 }
686
687
688 static void sn9c102_urb_complete(struct urb *urb)
689 {
690         struct sn9c102_device* cam = urb->context;
691         struct sn9c102_frame_t** f;
692         size_t imagesize, soflen;
693         u8 i;
694         int err = 0;
695
696         if (urb->status == -ENOENT)
697                 return;
698
699         f = &cam->frame_current;
700
701         if (cam->stream == STREAM_INTERRUPT) {
702                 cam->stream = STREAM_OFF;
703                 if ((*f))
704                         (*f)->state = F_QUEUED;
705                 cam->sof.bytesread = 0;
706                 DBG(3, "Stream interrupted by application");
707                 wake_up(&cam->wait_stream);
708         }
709
710         if (cam->state & DEV_DISCONNECTED)
711                 return;
712
713         if (cam->state & DEV_MISCONFIGURED) {
714                 wake_up_interruptible(&cam->wait_frame);
715                 return;
716         }
717
718         if (cam->stream == STREAM_OFF || list_empty(&cam->inqueue))
719                 goto resubmit_urb;
720
721         if (!(*f))
722                 (*f) = list_entry(cam->inqueue.next, struct sn9c102_frame_t,
723                                   frame);
724
725         imagesize = (cam->sensor.pix_format.width *
726                      cam->sensor.pix_format.height *
727                      cam->sensor.pix_format.priv) / 8;
728         if (cam->sensor.pix_format.pixelformat == V4L2_PIX_FMT_JPEG)
729                 imagesize += 589; /* length of jpeg header */
730         soflen = sn9c102_sof_length(cam);
731
732         for (i = 0; i < urb->number_of_packets; i++) {
733                 unsigned int img, len, status;
734                 void *pos, *sof, *eof;
735
736                 len = urb->iso_frame_desc[i].actual_length;
737                 status = urb->iso_frame_desc[i].status;
738                 pos = urb->iso_frame_desc[i].offset + urb->transfer_buffer;
739
740                 if (status) {
741                         DBG(3, "Error in isochronous frame");
742                         (*f)->state = F_ERROR;
743                         cam->sof.bytesread = 0;
744                         continue;
745                 }
746
747                 PDBGG("Isochrnous frame: length %u, #%u i", len, i);
748
749 redo:
750                 sof = sn9c102_find_sof_header(cam, pos, len);
751                 if (likely(!sof)) {
752                         eof = sn9c102_find_eof_header(cam, pos, len);
753                         if ((*f)->state == F_GRABBING) {
754 end_of_frame:
755                                 img = len;
756
757                                 if (eof)
758                                         img = (eof > pos) ? eof - pos - 1 : 0;
759
760                                 if ((*f)->buf.bytesused + img > imagesize) {
761                                         u32 b;
762                                         b = (*f)->buf.bytesused + img -
763                                             imagesize;
764                                         img = imagesize - (*f)->buf.bytesused;
765                                         PDBGG("Expected EOF not found: video "
766                                               "frame cut");
767                                         if (eof)
768                                                 DBG(3, "Exceeded limit: +%u "
769                                                        "bytes", (unsigned)(b));
770                                 }
771
772                                 memcpy((*f)->bufmem + (*f)->buf.bytesused, pos,
773                                        img);
774
775                                 if ((*f)->buf.bytesused == 0)
776                                         do_gettimeofday(&(*f)->buf.timestamp);
777
778                                 (*f)->buf.bytesused += img;
779
780                                 if ((*f)->buf.bytesused == imagesize ||
781                                     ((cam->sensor.pix_format.pixelformat ==
782                                       V4L2_PIX_FMT_SN9C10X ||
783                                       cam->sensor.pix_format.pixelformat ==
784                                       V4L2_PIX_FMT_JPEG) && eof)) {
785                                         u32 b;
786
787                                         b = (*f)->buf.bytesused;
788                                         (*f)->state = F_DONE;
789                                         (*f)->buf.sequence= ++cam->frame_count;
790
791                                         spin_lock(&cam->queue_lock);
792                                         list_move_tail(&(*f)->frame,
793                                                        &cam->outqueue);
794                                         if (!list_empty(&cam->inqueue))
795                                                 (*f) = list_entry(
796                                                         cam->inqueue.next,
797                                                         struct sn9c102_frame_t,
798                                                         frame );
799                                         else
800                                                 (*f) = NULL;
801                                         spin_unlock(&cam->queue_lock);
802
803                                         memcpy(cam->sysfs.frame_header,
804                                                cam->sof.header, soflen);
805
806                                         DBG(3, "Video frame captured: %lu "
807                                                "bytes", (unsigned long)(b));
808
809                                         if (!(*f))
810                                                 goto resubmit_urb;
811
812                                 } else if (eof) {
813                                         (*f)->state = F_ERROR;
814                                         DBG(3, "Not expected EOF after %lu "
815                                                "bytes of image data",
816                                             (unsigned long)
817                                             ((*f)->buf.bytesused));
818                                 }
819
820                                 if (sof) /* (1) */
821                                         goto start_of_frame;
822
823                         } else if (eof) {
824                                 DBG(3, "EOF without SOF");
825                                 continue;
826
827                         } else {
828                                 PDBGG("Ignoring pointless isochronous frame");
829                                 continue;
830                         }
831
832                 } else if ((*f)->state == F_QUEUED || (*f)->state == F_ERROR) {
833 start_of_frame:
834                         (*f)->state = F_GRABBING;
835                         (*f)->buf.bytesused = 0;
836                         len -= (sof - pos);
837                         pos = sof;
838                         if (cam->sensor.pix_format.pixelformat ==
839                             V4L2_PIX_FMT_JPEG)
840                                 sn9c102_write_jpegheader(cam, (*f));
841                         DBG(3, "SOF detected: new video frame");
842                         if (len)
843                                 goto redo;
844
845                 } else if ((*f)->state == F_GRABBING) {
846                         eof = sn9c102_find_eof_header(cam, pos, len);
847                         if (eof && eof < sof)
848                                 goto end_of_frame; /* (1) */
849                         else {
850                                 if (cam->sensor.pix_format.pixelformat ==
851                                     V4L2_PIX_FMT_SN9C10X ||
852                                     cam->sensor.pix_format.pixelformat ==
853                                     V4L2_PIX_FMT_JPEG) {
854                                         if (sof - pos >= soflen) {
855                                                 eof = sof - soflen;
856                                         } else { /* remove header */
857                                                 eof = pos;
858                                                 (*f)->buf.bytesused -=
859                                                         (soflen - (sof - pos));
860                                         }
861                                         goto end_of_frame;
862                                 } else {
863                                         DBG(3, "SOF before expected EOF after "
864                                                "%lu bytes of image data",
865                                             (unsigned long)
866                                             ((*f)->buf.bytesused));
867                                         goto start_of_frame;
868                                 }
869                         }
870                 }
871         }
872
873 resubmit_urb:
874         urb->dev = cam->usbdev;
875         err = usb_submit_urb(urb, GFP_ATOMIC);
876         if (err < 0 && err != -EPERM) {
877                 cam->state |= DEV_MISCONFIGURED;
878                 DBG(1, "usb_submit_urb() failed");
879         }
880
881         wake_up_interruptible(&cam->wait_frame);
882 }
883
884
885 static int sn9c102_start_transfer(struct sn9c102_device* cam)
886 {
887         struct usb_device *udev = cam->usbdev;
888         struct urb* urb;
889         struct usb_host_interface* altsetting = usb_altnum_to_altsetting(
890                                                     usb_ifnum_to_if(udev, 0),
891                                                     SN9C102_ALTERNATE_SETTING);
892         const unsigned int psz = le16_to_cpu(altsetting->
893                                              endpoint[0].desc.wMaxPacketSize);
894         s8 i, j;
895         int err = 0;
896
897         for (i = 0; i < SN9C102_URBS; i++) {
898                 cam->transfer_buffer[i] = kzalloc(SN9C102_ISO_PACKETS * psz,
899                                                   GFP_KERNEL);
900                 if (!cam->transfer_buffer[i]) {
901                         err = -ENOMEM;
902                         DBG(1, "Not enough memory");
903                         goto free_buffers;
904                 }
905         }
906
907         for (i = 0; i < SN9C102_URBS; i++) {
908                 urb = usb_alloc_urb(SN9C102_ISO_PACKETS, GFP_KERNEL);
909                 cam->urb[i] = urb;
910                 if (!urb) {
911                         err = -ENOMEM;
912                         DBG(1, "usb_alloc_urb() failed");
913                         goto free_urbs;
914                 }
915                 urb->dev = udev;
916                 urb->context = cam;
917                 urb->pipe = usb_rcvisocpipe(udev, 1);
918                 urb->transfer_flags = URB_ISO_ASAP;
919                 urb->number_of_packets = SN9C102_ISO_PACKETS;
920                 urb->complete = sn9c102_urb_complete;
921                 urb->transfer_buffer = cam->transfer_buffer[i];
922                 urb->transfer_buffer_length = psz * SN9C102_ISO_PACKETS;
923                 urb->interval = 1;
924                 for (j = 0; j < SN9C102_ISO_PACKETS; j++) {
925                         urb->iso_frame_desc[j].offset = psz * j;
926                         urb->iso_frame_desc[j].length = psz;
927                 }
928         }
929
930         /* Enable video */
931         if (!(cam->reg[0x01] & 0x04)) {
932                 err = sn9c102_write_reg(cam, cam->reg[0x01] | 0x04, 0x01);
933                 if (err) {
934                         err = -EIO;
935                         DBG(1, "I/O hardware error");
936                         goto free_urbs;
937                 }
938         }
939
940         err = usb_set_interface(udev, 0, SN9C102_ALTERNATE_SETTING);
941         if (err) {
942                 DBG(1, "usb_set_interface() failed");
943                 goto free_urbs;
944         }
945
946         cam->frame_current = NULL;
947         cam->sof.bytesread = 0;
948
949         for (i = 0; i < SN9C102_URBS; i++) {
950                 err = usb_submit_urb(cam->urb[i], GFP_KERNEL);
951                 if (err) {
952                         for (j = i-1; j >= 0; j--)
953                                 usb_kill_urb(cam->urb[j]);
954                         DBG(1, "usb_submit_urb() failed, error %d", err);
955                         goto free_urbs;
956                 }
957         }
958
959         return 0;
960
961 free_urbs:
962         for (i = 0; (i < SN9C102_URBS) && cam->urb[i]; i++)
963                 usb_free_urb(cam->urb[i]);
964
965 free_buffers:
966         for (i = 0; (i < SN9C102_URBS) && cam->transfer_buffer[i]; i++)
967                 kfree(cam->transfer_buffer[i]);
968
969         return err;
970 }
971
972
973 static int sn9c102_stop_transfer(struct sn9c102_device* cam)
974 {
975         struct usb_device *udev = cam->usbdev;
976         s8 i;
977         int err = 0;
978
979         if (cam->state & DEV_DISCONNECTED)
980                 return 0;
981
982         for (i = SN9C102_URBS-1; i >= 0; i--) {
983                 usb_kill_urb(cam->urb[i]);
984                 usb_free_urb(cam->urb[i]);
985                 kfree(cam->transfer_buffer[i]);
986         }
987
988         err = usb_set_interface(udev, 0, 0); /* 0 Mb/s */
989         if (err)
990                 DBG(3, "usb_set_interface() failed");
991
992         return err;
993 }
994
995
996 static int sn9c102_stream_interrupt(struct sn9c102_device* cam)
997 {
998         long timeout;
999
1000         cam->stream = STREAM_INTERRUPT;
1001         timeout = wait_event_timeout(cam->wait_stream,
1002                                      (cam->stream == STREAM_OFF) ||
1003                                      (cam->state & DEV_DISCONNECTED),
1004                                      SN9C102_URB_TIMEOUT);
1005         if (cam->state & DEV_DISCONNECTED)
1006                 return -ENODEV;
1007         else if (cam->stream != STREAM_OFF) {
1008                 cam->state |= DEV_MISCONFIGURED;
1009                 DBG(1, "URB timeout reached. The camera is misconfigured. "
1010                        "To use it, close and open /dev/video%d again.",
1011                     cam->v4ldev->num);
1012                 return -EIO;
1013         }
1014
1015         return 0;
1016 }
1017
1018 /*****************************************************************************/
1019
1020 #ifdef CONFIG_VIDEO_ADV_DEBUG
1021 static u16 sn9c102_strtou16(const char* buff, size_t len, ssize_t* count)
1022 {
1023         char str[7];
1024         char* endp;
1025         unsigned long val;
1026
1027         if (len < 6) {
1028                 strncpy(str, buff, len);
1029                 str[len] = '\0';
1030         } else {
1031                 strncpy(str, buff, 6);
1032                 str[6] = '\0';
1033         }
1034
1035         val = simple_strtoul(str, &endp, 0);
1036
1037         *count = 0;
1038         if (val <= 0xffff)
1039                 *count = (ssize_t)(endp - str);
1040         if ((*count) && (len == *count+1) && (buff[*count] == '\n'))
1041                 *count += 1;
1042
1043         return (u16)val;
1044 }
1045
1046 /*
1047    NOTE 1: being inside one of the following methods implies that the v4l
1048            device exists for sure (see kobjects and reference counters)
1049    NOTE 2: buffers are PAGE_SIZE long
1050 */
1051
1052 static ssize_t sn9c102_show_reg(struct device* cd,
1053                                 struct device_attribute *attr, char* buf)
1054 {
1055         struct sn9c102_device* cam;
1056         ssize_t count;
1057
1058         if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1059                 return -ERESTARTSYS;
1060
1061         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1062         if (!cam) {
1063                 mutex_unlock(&sn9c102_sysfs_lock);
1064                 return -ENODEV;
1065         }
1066
1067         count = sprintf(buf, "%u\n", cam->sysfs.reg);
1068
1069         mutex_unlock(&sn9c102_sysfs_lock);
1070
1071         return count;
1072 }
1073
1074
1075 static ssize_t
1076 sn9c102_store_reg(struct device* cd, struct device_attribute *attr,
1077                   const char* buf, size_t len)
1078 {
1079         struct sn9c102_device* cam;
1080         u16 index;
1081         ssize_t count;
1082
1083         if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1084                 return -ERESTARTSYS;
1085
1086         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1087         if (!cam) {
1088                 mutex_unlock(&sn9c102_sysfs_lock);
1089                 return -ENODEV;
1090         }
1091
1092         index = sn9c102_strtou16(buf, len, &count);
1093         if (index >= ARRAY_SIZE(cam->reg) || !count) {
1094                 mutex_unlock(&sn9c102_sysfs_lock);
1095                 return -EINVAL;
1096         }
1097
1098         cam->sysfs.reg = index;
1099
1100         DBG(2, "Moved SN9C1XX register index to 0x%02X", cam->sysfs.reg);
1101         DBG(3, "Written bytes: %zd", count);
1102
1103         mutex_unlock(&sn9c102_sysfs_lock);
1104
1105         return count;
1106 }
1107
1108
1109 static ssize_t sn9c102_show_val(struct device* cd,
1110                                 struct device_attribute *attr, char* buf)
1111 {
1112         struct sn9c102_device* cam;
1113         ssize_t count;
1114         int val;
1115
1116         if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1117                 return -ERESTARTSYS;
1118
1119         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1120         if (!cam) {
1121                 mutex_unlock(&sn9c102_sysfs_lock);
1122                 return -ENODEV;
1123         }
1124
1125         if ((val = sn9c102_read_reg(cam, cam->sysfs.reg)) < 0) {
1126                 mutex_unlock(&sn9c102_sysfs_lock);
1127                 return -EIO;
1128         }
1129
1130         count = sprintf(buf, "%d\n", val);
1131
1132         DBG(3, "Read bytes: %zd, value: %d", count, val);
1133
1134         mutex_unlock(&sn9c102_sysfs_lock);
1135
1136         return count;
1137 }
1138
1139
1140 static ssize_t
1141 sn9c102_store_val(struct device* cd, struct device_attribute *attr,
1142                   const char* buf, size_t len)
1143 {
1144         struct sn9c102_device* cam;
1145         u16 value;
1146         ssize_t count;
1147         int err;
1148
1149         if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1150                 return -ERESTARTSYS;
1151
1152         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1153         if (!cam) {
1154                 mutex_unlock(&sn9c102_sysfs_lock);
1155                 return -ENODEV;
1156         }
1157
1158         value = sn9c102_strtou16(buf, len, &count);
1159         if (!count) {
1160                 mutex_unlock(&sn9c102_sysfs_lock);
1161                 return -EINVAL;
1162         }
1163
1164         err = sn9c102_write_reg(cam, value, cam->sysfs.reg);
1165         if (err) {
1166                 mutex_unlock(&sn9c102_sysfs_lock);
1167                 return -EIO;
1168         }
1169
1170         DBG(2, "Written SN9C1XX reg. 0x%02X, val. 0x%02X",
1171             cam->sysfs.reg, value);
1172         DBG(3, "Written bytes: %zd", count);
1173
1174         mutex_unlock(&sn9c102_sysfs_lock);
1175
1176         return count;
1177 }
1178
1179
1180 static ssize_t sn9c102_show_i2c_reg(struct device* cd,
1181                                     struct device_attribute *attr, char* buf)
1182 {
1183         struct sn9c102_device* cam;
1184         ssize_t count;
1185
1186         if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1187                 return -ERESTARTSYS;
1188
1189         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1190         if (!cam) {
1191                 mutex_unlock(&sn9c102_sysfs_lock);
1192                 return -ENODEV;
1193         }
1194
1195         count = sprintf(buf, "%u\n", cam->sysfs.i2c_reg);
1196
1197         DBG(3, "Read bytes: %zd", count);
1198
1199         mutex_unlock(&sn9c102_sysfs_lock);
1200
1201         return count;
1202 }
1203
1204
1205 static ssize_t
1206 sn9c102_store_i2c_reg(struct device* cd, struct device_attribute *attr,
1207                       const char* buf, size_t len)
1208 {
1209         struct sn9c102_device* cam;
1210         u16 index;
1211         ssize_t count;
1212
1213         if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1214                 return -ERESTARTSYS;
1215
1216         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1217         if (!cam) {
1218                 mutex_unlock(&sn9c102_sysfs_lock);
1219                 return -ENODEV;
1220         }
1221
1222         index = sn9c102_strtou16(buf, len, &count);
1223         if (!count) {
1224                 mutex_unlock(&sn9c102_sysfs_lock);
1225                 return -EINVAL;
1226         }
1227
1228         cam->sysfs.i2c_reg = index;
1229
1230         DBG(2, "Moved sensor register index to 0x%02X", cam->sysfs.i2c_reg);
1231         DBG(3, "Written bytes: %zd", count);
1232
1233         mutex_unlock(&sn9c102_sysfs_lock);
1234
1235         return count;
1236 }
1237
1238
1239 static ssize_t sn9c102_show_i2c_val(struct device* cd,
1240                                     struct device_attribute *attr, char* buf)
1241 {
1242         struct sn9c102_device* cam;
1243         ssize_t count;
1244         int val;
1245
1246         if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1247                 return -ERESTARTSYS;
1248
1249         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1250         if (!cam) {
1251                 mutex_unlock(&sn9c102_sysfs_lock);
1252                 return -ENODEV;
1253         }
1254
1255         if (!(cam->sensor.sysfs_ops & SN9C102_I2C_READ)) {
1256                 mutex_unlock(&sn9c102_sysfs_lock);
1257                 return -ENOSYS;
1258         }
1259
1260         if ((val = sn9c102_i2c_read(cam, cam->sysfs.i2c_reg)) < 0) {
1261                 mutex_unlock(&sn9c102_sysfs_lock);
1262                 return -EIO;
1263         }
1264
1265         count = sprintf(buf, "%d\n", val);
1266
1267         DBG(3, "Read bytes: %zd, value: %d", count, val);
1268
1269         mutex_unlock(&sn9c102_sysfs_lock);
1270
1271         return count;
1272 }
1273
1274
1275 static ssize_t
1276 sn9c102_store_i2c_val(struct device* cd, struct device_attribute *attr,
1277                       const char* buf, size_t len)
1278 {
1279         struct sn9c102_device* cam;
1280         u16 value;
1281         ssize_t count;
1282         int err;
1283
1284         if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1285                 return -ERESTARTSYS;
1286
1287         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1288         if (!cam) {
1289                 mutex_unlock(&sn9c102_sysfs_lock);
1290                 return -ENODEV;
1291         }
1292
1293         if (!(cam->sensor.sysfs_ops & SN9C102_I2C_WRITE)) {
1294                 mutex_unlock(&sn9c102_sysfs_lock);
1295                 return -ENOSYS;
1296         }
1297
1298         value = sn9c102_strtou16(buf, len, &count);
1299         if (!count) {
1300                 mutex_unlock(&sn9c102_sysfs_lock);
1301                 return -EINVAL;
1302         }
1303
1304         err = sn9c102_i2c_write(cam, cam->sysfs.i2c_reg, value);
1305         if (err) {
1306                 mutex_unlock(&sn9c102_sysfs_lock);
1307                 return -EIO;
1308         }
1309
1310         DBG(2, "Written sensor reg. 0x%02X, val. 0x%02X",
1311             cam->sysfs.i2c_reg, value);
1312         DBG(3, "Written bytes: %zd", count);
1313
1314         mutex_unlock(&sn9c102_sysfs_lock);
1315
1316         return count;
1317 }
1318
1319
1320 static ssize_t
1321 sn9c102_store_green(struct device* cd, struct device_attribute *attr,
1322                     const char* buf, size_t len)
1323 {
1324         struct sn9c102_device* cam;
1325         enum sn9c102_bridge bridge;
1326         ssize_t res = 0;
1327         u16 value;
1328         ssize_t count;
1329
1330         if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1331                 return -ERESTARTSYS;
1332
1333         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1334         if (!cam) {
1335                 mutex_unlock(&sn9c102_sysfs_lock);
1336                 return -ENODEV;
1337         }
1338
1339         bridge = cam->bridge;
1340
1341         mutex_unlock(&sn9c102_sysfs_lock);
1342
1343         value = sn9c102_strtou16(buf, len, &count);
1344         if (!count)
1345                 return -EINVAL;
1346
1347         switch (bridge) {
1348         case BRIDGE_SN9C101:
1349         case BRIDGE_SN9C102:
1350                 if (value > 0x0f)
1351                         return -EINVAL;
1352                 if ((res = sn9c102_store_reg(cd, attr, "0x11", 4)) >= 0)
1353                         res = sn9c102_store_val(cd, attr, buf, len);
1354                 break;
1355         case BRIDGE_SN9C103:
1356         case BRIDGE_SN9C105:
1357         case BRIDGE_SN9C120:
1358                 if (value > 0x7f)
1359                         return -EINVAL;
1360                 if ((res = sn9c102_store_reg(cd, attr, "0x07", 4)) >= 0)
1361                         res = sn9c102_store_val(cd, attr, buf, len);
1362                 break;
1363         }
1364
1365         return res;
1366 }
1367
1368
1369 static ssize_t
1370 sn9c102_store_blue(struct device* cd, struct device_attribute *attr,
1371                    const char* buf, size_t len)
1372 {
1373         ssize_t res = 0;
1374         u16 value;
1375         ssize_t count;
1376
1377         value = sn9c102_strtou16(buf, len, &count);
1378         if (!count || value > 0x7f)
1379                 return -EINVAL;
1380
1381         if ((res = sn9c102_store_reg(cd, attr, "0x06", 4)) >= 0)
1382                 res = sn9c102_store_val(cd, attr, buf, len);
1383
1384         return res;
1385 }
1386
1387
1388 static ssize_t
1389 sn9c102_store_red(struct device* cd, struct device_attribute *attr,
1390                   const char* buf, size_t len)
1391 {
1392         ssize_t res = 0;
1393         u16 value;
1394         ssize_t count;
1395
1396         value = sn9c102_strtou16(buf, len, &count);
1397         if (!count || value > 0x7f)
1398                 return -EINVAL;
1399
1400         if ((res = sn9c102_store_reg(cd, attr, "0x05", 4)) >= 0)
1401                 res = sn9c102_store_val(cd, attr, buf, len);
1402
1403         return res;
1404 }
1405
1406
1407 static ssize_t sn9c102_show_frame_header(struct device* cd,
1408                                          struct device_attribute *attr,
1409                                          char* buf)
1410 {
1411         struct sn9c102_device* cam;
1412         ssize_t count;
1413
1414         cam = video_get_drvdata(container_of(cd, struct video_device, dev));
1415         if (!cam)
1416                 return -ENODEV;
1417
1418         count = sizeof(cam->sysfs.frame_header);
1419         memcpy(buf, cam->sysfs.frame_header, count);
1420
1421         DBG(3, "Frame header, read bytes: %zd", count);
1422
1423         return count;
1424 }
1425
1426
1427 static DEVICE_ATTR(reg, S_IRUGO | S_IWUSR, sn9c102_show_reg, sn9c102_store_reg);
1428 static DEVICE_ATTR(val, S_IRUGO | S_IWUSR, sn9c102_show_val, sn9c102_store_val);
1429 static DEVICE_ATTR(i2c_reg, S_IRUGO | S_IWUSR,
1430                    sn9c102_show_i2c_reg, sn9c102_store_i2c_reg);
1431 static DEVICE_ATTR(i2c_val, S_IRUGO | S_IWUSR,
1432                    sn9c102_show_i2c_val, sn9c102_store_i2c_val);
1433 static DEVICE_ATTR(green, S_IWUGO, NULL, sn9c102_store_green);
1434 static DEVICE_ATTR(blue, S_IWUGO, NULL, sn9c102_store_blue);
1435 static DEVICE_ATTR(red, S_IWUGO, NULL, sn9c102_store_red);
1436 static DEVICE_ATTR(frame_header, S_IRUGO, sn9c102_show_frame_header, NULL);
1437
1438
1439 static int sn9c102_create_sysfs(struct sn9c102_device* cam)
1440 {
1441         struct device *dev = &(cam->v4ldev->dev);
1442         int err = 0;
1443
1444         if ((err = device_create_file(dev, &dev_attr_reg)))
1445                 goto err_out;
1446         if ((err = device_create_file(dev, &dev_attr_val)))
1447                 goto err_reg;
1448         if ((err = device_create_file(dev, &dev_attr_frame_header)))
1449                 goto err_val;
1450
1451         if (cam->sensor.sysfs_ops) {
1452                 if ((err = device_create_file(dev, &dev_attr_i2c_reg)))
1453                         goto err_frame_header;
1454                 if ((err = device_create_file(dev, &dev_attr_i2c_val)))
1455                         goto err_i2c_reg;
1456         }
1457
1458         if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102) {
1459                 if ((err = device_create_file(dev, &dev_attr_green)))
1460                         goto err_i2c_val;
1461         } else {
1462                 if ((err = device_create_file(dev, &dev_attr_blue)))
1463                         goto err_i2c_val;
1464                 if ((err = device_create_file(dev, &dev_attr_red)))
1465                         goto err_blue;
1466         }
1467
1468         return 0;
1469
1470 err_blue:
1471         device_remove_file(dev, &dev_attr_blue);
1472 err_i2c_val:
1473         if (cam->sensor.sysfs_ops)
1474                 device_remove_file(dev, &dev_attr_i2c_val);
1475 err_i2c_reg:
1476         if (cam->sensor.sysfs_ops)
1477                 device_remove_file(dev, &dev_attr_i2c_reg);
1478 err_frame_header:
1479         device_remove_file(dev, &dev_attr_frame_header);
1480 err_val:
1481         device_remove_file(dev, &dev_attr_val);
1482 err_reg:
1483         device_remove_file(dev, &dev_attr_reg);
1484 err_out:
1485         return err;
1486 }
1487 #endif /* CONFIG_VIDEO_ADV_DEBUG */
1488
1489 /*****************************************************************************/
1490
1491 static int
1492 sn9c102_set_pix_format(struct sn9c102_device* cam, struct v4l2_pix_format* pix)
1493 {
1494         int err = 0;
1495
1496         if (pix->pixelformat == V4L2_PIX_FMT_SN9C10X ||
1497             pix->pixelformat == V4L2_PIX_FMT_JPEG) {
1498                 switch (cam->bridge) {
1499                 case BRIDGE_SN9C101:
1500                 case BRIDGE_SN9C102:
1501                 case BRIDGE_SN9C103:
1502                         err += sn9c102_write_reg(cam, cam->reg[0x18] | 0x80,
1503                                                  0x18);
1504                         break;
1505                 case BRIDGE_SN9C105:
1506                 case BRIDGE_SN9C120:
1507                         err += sn9c102_write_reg(cam, cam->reg[0x18] & 0x7f,
1508                                                  0x18);
1509                         break;
1510                 }
1511         } else {
1512                 switch (cam->bridge) {
1513                 case BRIDGE_SN9C101:
1514                 case BRIDGE_SN9C102:
1515                 case BRIDGE_SN9C103:
1516                         err += sn9c102_write_reg(cam, cam->reg[0x18] & 0x7f,
1517                                                  0x18);
1518                         break;
1519                 case BRIDGE_SN9C105:
1520                 case BRIDGE_SN9C120:
1521                         err += sn9c102_write_reg(cam, cam->reg[0x18] | 0x80,
1522                                                  0x18);
1523                         break;
1524                 }
1525         }
1526
1527         return err ? -EIO : 0;
1528 }
1529
1530
1531 static int
1532 sn9c102_set_compression(struct sn9c102_device* cam,
1533                         struct v4l2_jpegcompression* compression)
1534 {
1535         int i, err = 0;
1536
1537         switch (cam->bridge) {
1538         case BRIDGE_SN9C101:
1539         case BRIDGE_SN9C102:
1540         case BRIDGE_SN9C103:
1541                 if (compression->quality == 0)
1542                         err += sn9c102_write_reg(cam, cam->reg[0x17] | 0x01,
1543                                                  0x17);
1544                 else if (compression->quality == 1)
1545                         err += sn9c102_write_reg(cam, cam->reg[0x17] & 0xfe,
1546                                                  0x17);
1547                 break;
1548         case BRIDGE_SN9C105:
1549         case BRIDGE_SN9C120:
1550                 if (compression->quality == 0) {
1551                         for (i = 0; i <= 63; i++) {
1552                                 err += sn9c102_write_reg(cam,
1553                                                          SN9C102_Y_QTABLE1[i],
1554                                                          0x100 + i);
1555                                 err += sn9c102_write_reg(cam,
1556                                                          SN9C102_UV_QTABLE1[i],
1557                                                          0x140 + i);
1558                         }
1559                         err += sn9c102_write_reg(cam, cam->reg[0x18] & 0xbf,
1560                                                  0x18);
1561                 } else if (compression->quality == 1) {
1562                         for (i = 0; i <= 63; i++) {
1563                                 err += sn9c102_write_reg(cam,
1564                                                          SN9C102_Y_QTABLE1[i],
1565                                                          0x100 + i);
1566                                 err += sn9c102_write_reg(cam,
1567                                                          SN9C102_UV_QTABLE1[i],
1568                                                          0x140 + i);
1569                         }
1570                         err += sn9c102_write_reg(cam, cam->reg[0x18] | 0x40,
1571                                                  0x18);
1572                 }
1573                 break;
1574         }
1575
1576         return err ? -EIO : 0;
1577 }
1578
1579
1580 static int sn9c102_set_scale(struct sn9c102_device* cam, u8 scale)
1581 {
1582         u8 r = 0;
1583         int err = 0;
1584
1585         if (scale == 1)
1586                 r = cam->reg[0x18] & 0xcf;
1587         else if (scale == 2) {
1588                 r = cam->reg[0x18] & 0xcf;
1589                 r |= 0x10;
1590         } else if (scale == 4)
1591                 r = cam->reg[0x18] | 0x20;
1592
1593         err += sn9c102_write_reg(cam, r, 0x18);
1594         if (err)
1595                 return -EIO;
1596
1597         PDBGG("Scaling factor: %u", scale);
1598
1599         return 0;
1600 }
1601
1602
1603 static int sn9c102_set_crop(struct sn9c102_device* cam, struct v4l2_rect* rect)
1604 {
1605         struct sn9c102_sensor* s = &cam->sensor;
1606         u8 h_start = (u8)(rect->left - s->cropcap.bounds.left),
1607            v_start = (u8)(rect->top - s->cropcap.bounds.top),
1608            h_size = (u8)(rect->width / 16),
1609            v_size = (u8)(rect->height / 16);
1610         int err = 0;
1611
1612         err += sn9c102_write_reg(cam, h_start, 0x12);
1613         err += sn9c102_write_reg(cam, v_start, 0x13);
1614         err += sn9c102_write_reg(cam, h_size, 0x15);
1615         err += sn9c102_write_reg(cam, v_size, 0x16);
1616         if (err)
1617                 return -EIO;
1618
1619         PDBGG("h_start, v_start, h_size, v_size, ho_size, vo_size "
1620               "%u %u %u %u", h_start, v_start, h_size, v_size);
1621
1622         return 0;
1623 }
1624
1625
1626 static int sn9c102_init(struct sn9c102_device* cam)
1627 {
1628         struct sn9c102_sensor* s = &cam->sensor;
1629         struct v4l2_control ctrl;
1630         struct v4l2_queryctrl *qctrl;
1631         struct v4l2_rect* rect;
1632         u8 i = 0;
1633         int err = 0;
1634
1635         if (!(cam->state & DEV_INITIALIZED)) {
1636                 mutex_init(&cam->open_mutex);
1637                 init_waitqueue_head(&cam->wait_open);
1638                 qctrl = s->qctrl;
1639                 rect = &(s->cropcap.defrect);
1640         } else { /* use current values */
1641                 qctrl = s->_qctrl;
1642                 rect = &(s->_rect);
1643         }
1644
1645         err += sn9c102_set_scale(cam, rect->width / s->pix_format.width);
1646         err += sn9c102_set_crop(cam, rect);
1647         if (err)
1648                 return err;
1649
1650         if (s->init) {
1651                 err = s->init(cam);
1652                 if (err) {
1653                         DBG(3, "Sensor initialization failed");
1654                         return err;
1655                 }
1656         }
1657
1658         if (!(cam->state & DEV_INITIALIZED))
1659                 if (cam->bridge == BRIDGE_SN9C101 ||
1660                     cam->bridge == BRIDGE_SN9C102 ||
1661                     cam->bridge == BRIDGE_SN9C103) {
1662                         if (s->pix_format.pixelformat == V4L2_PIX_FMT_JPEG)
1663                                 s->pix_format.pixelformat= V4L2_PIX_FMT_SBGGR8;
1664                         cam->compression.quality =  cam->reg[0x17] & 0x01 ?
1665                                                     0 : 1;
1666                 } else {
1667                         if (s->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X)
1668                                 s->pix_format.pixelformat = V4L2_PIX_FMT_JPEG;
1669                         cam->compression.quality =  cam->reg[0x18] & 0x40 ?
1670                                                     0 : 1;
1671                         err += sn9c102_set_compression(cam, &cam->compression);
1672                 }
1673         else
1674                 err += sn9c102_set_compression(cam, &cam->compression);
1675         err += sn9c102_set_pix_format(cam, &s->pix_format);
1676         if (s->set_pix_format)
1677                 err += s->set_pix_format(cam, &s->pix_format);
1678         if (err)
1679                 return err;
1680
1681         if (s->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X ||
1682             s->pix_format.pixelformat == V4L2_PIX_FMT_JPEG)
1683                 DBG(3, "Compressed video format is active, quality %d",
1684                     cam->compression.quality);
1685         else
1686                 DBG(3, "Uncompressed video format is active");
1687
1688         if (s->set_crop)
1689                 if ((err = s->set_crop(cam, rect))) {
1690                         DBG(3, "set_crop() failed");
1691                         return err;
1692                 }
1693
1694         if (s->set_ctrl) {
1695                 for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
1696                         if (s->qctrl[i].id != 0 &&
1697                             !(s->qctrl[i].flags & V4L2_CTRL_FLAG_DISABLED)) {
1698                                 ctrl.id = s->qctrl[i].id;
1699                                 ctrl.value = qctrl[i].default_value;
1700                                 err = s->set_ctrl(cam, &ctrl);
1701                                 if (err) {
1702                                         DBG(3, "Set %s control failed",
1703                                             s->qctrl[i].name);
1704                                         return err;
1705                                 }
1706                                 DBG(3, "Image sensor supports '%s' control",
1707                                     s->qctrl[i].name);
1708                         }
1709         }
1710
1711         if (!(cam->state & DEV_INITIALIZED)) {
1712                 mutex_init(&cam->fileop_mutex);
1713                 spin_lock_init(&cam->queue_lock);
1714                 init_waitqueue_head(&cam->wait_frame);
1715                 init_waitqueue_head(&cam->wait_stream);
1716                 cam->nreadbuffers = 2;
1717                 memcpy(s->_qctrl, s->qctrl, sizeof(s->qctrl));
1718                 memcpy(&(s->_rect), &(s->cropcap.defrect),
1719                        sizeof(struct v4l2_rect));
1720                 cam->state |= DEV_INITIALIZED;
1721         }
1722
1723         DBG(2, "Initialization succeeded");
1724         return 0;
1725 }
1726
1727 /*****************************************************************************/
1728
1729 static void sn9c102_release_resources(struct kref *kref)
1730 {
1731         struct sn9c102_device *cam;
1732
1733         mutex_lock(&sn9c102_sysfs_lock);
1734
1735         cam = container_of(kref, struct sn9c102_device, kref);
1736
1737         DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->num);
1738         video_set_drvdata(cam->v4ldev, NULL);
1739         video_unregister_device(cam->v4ldev);
1740         usb_put_dev(cam->usbdev);
1741         kfree(cam->control_buffer);
1742         kfree(cam);
1743
1744         mutex_unlock(&sn9c102_sysfs_lock);
1745
1746 }
1747
1748
1749 static int sn9c102_open(struct file *filp)
1750 {
1751         struct sn9c102_device* cam;
1752         int err = 0;
1753
1754         /*
1755            A read_trylock() in open() is the only safe way to prevent race
1756            conditions with disconnect(), one close() and multiple (not
1757            necessarily simultaneous) attempts to open(). For example, it
1758            prevents from waiting for a second access, while the device
1759            structure is being deallocated, after a possible disconnect() and
1760            during a following close() holding the write lock: given that, after
1761            this deallocation, no access will be possible anymore, using the
1762            non-trylock version would have let open() gain the access to the
1763            device structure improperly.
1764            For this reason the lock must also not be per-device.
1765         */
1766         if (!down_read_trylock(&sn9c102_dev_lock))
1767                 return -ERESTARTSYS;
1768
1769         cam = video_drvdata(filp);
1770
1771         if (wait_for_completion_interruptible(&cam->probe)) {
1772                 up_read(&sn9c102_dev_lock);
1773                 return -ERESTARTSYS;
1774         }
1775
1776         kref_get(&cam->kref);
1777
1778         /*
1779             Make sure to isolate all the simultaneous opens.
1780         */
1781         if (mutex_lock_interruptible(&cam->open_mutex)) {
1782                 kref_put(&cam->kref, sn9c102_release_resources);
1783                 up_read(&sn9c102_dev_lock);
1784                 return -ERESTARTSYS;
1785         }
1786
1787         if (cam->state & DEV_DISCONNECTED) {
1788                 DBG(1, "Device not present");
1789                 err = -ENODEV;
1790                 goto out;
1791         }
1792
1793         if (cam->users) {
1794                 DBG(2, "Device /dev/video%d is already in use",
1795                        cam->v4ldev->num);
1796                 DBG(3, "Simultaneous opens are not supported");
1797                 /*
1798                    open() must follow the open flags and should block
1799                    eventually while the device is in use.
1800                 */
1801                 if ((filp->f_flags & O_NONBLOCK) ||
1802                     (filp->f_flags & O_NDELAY)) {
1803                         err = -EWOULDBLOCK;
1804                         goto out;
1805                 }
1806                 DBG(2, "A blocking open() has been requested. Wait for the "
1807                        "device to be released...");
1808                 up_read(&sn9c102_dev_lock);
1809                 /*
1810                    We will not release the "open_mutex" lock, so that only one
1811                    process can be in the wait queue below. This way the process
1812                    will be sleeping while holding the lock, without loosing its
1813                    priority after any wake_up().
1814                 */
1815                 err = wait_event_interruptible_exclusive(cam->wait_open,
1816                                                 (cam->state & DEV_DISCONNECTED)
1817                                                          || !cam->users);
1818                 down_read(&sn9c102_dev_lock);
1819                 if (err)
1820                         goto out;
1821                 if (cam->state & DEV_DISCONNECTED) {
1822                         err = -ENODEV;
1823                         goto out;
1824                 }
1825         }
1826
1827         if (cam->state & DEV_MISCONFIGURED) {
1828                 err = sn9c102_init(cam);
1829                 if (err) {
1830                         DBG(1, "Initialization failed again. "
1831                                "I will retry on next open().");
1832                         goto out;
1833                 }
1834                 cam->state &= ~DEV_MISCONFIGURED;
1835         }
1836
1837         if ((err = sn9c102_start_transfer(cam)))
1838                 goto out;
1839
1840         filp->private_data = cam;
1841         cam->users++;
1842         cam->io = IO_NONE;
1843         cam->stream = STREAM_OFF;
1844         cam->nbuffers = 0;
1845         cam->frame_count = 0;
1846         sn9c102_empty_framequeues(cam);
1847
1848         DBG(3, "Video device /dev/video%d is open", cam->v4ldev->num);
1849
1850 out:
1851         mutex_unlock(&cam->open_mutex);
1852         if (err)
1853                 kref_put(&cam->kref, sn9c102_release_resources);
1854
1855         up_read(&sn9c102_dev_lock);
1856         return err;
1857 }
1858
1859
1860 static int sn9c102_release(struct file *filp)
1861 {
1862         struct sn9c102_device* cam;
1863
1864         down_write(&sn9c102_dev_lock);
1865
1866         cam = video_drvdata(filp);
1867
1868         sn9c102_stop_transfer(cam);
1869         sn9c102_release_buffers(cam);
1870         cam->users--;
1871         wake_up_interruptible_nr(&cam->wait_open, 1);
1872
1873         DBG(3, "Video device /dev/video%d closed", cam->v4ldev->num);
1874
1875         kref_put(&cam->kref, sn9c102_release_resources);
1876
1877         up_write(&sn9c102_dev_lock);
1878
1879         return 0;
1880 }
1881
1882
1883 static ssize_t
1884 sn9c102_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos)
1885 {
1886         struct sn9c102_device *cam = video_drvdata(filp);
1887         struct sn9c102_frame_t* f, * i;
1888         unsigned long lock_flags;
1889         long timeout;
1890         int err = 0;
1891
1892         if (mutex_lock_interruptible(&cam->fileop_mutex))
1893                 return -ERESTARTSYS;
1894
1895         if (cam->state & DEV_DISCONNECTED) {
1896                 DBG(1, "Device not present");
1897                 mutex_unlock(&cam->fileop_mutex);
1898                 return -ENODEV;
1899         }
1900
1901         if (cam->state & DEV_MISCONFIGURED) {
1902                 DBG(1, "The camera is misconfigured. Close and open it "
1903                        "again.");
1904                 mutex_unlock(&cam->fileop_mutex);
1905                 return -EIO;
1906         }
1907
1908         if (cam->io == IO_MMAP) {
1909                 DBG(3, "Close and open the device again to choose "
1910                        "the read method");
1911                 mutex_unlock(&cam->fileop_mutex);
1912                 return -EBUSY;
1913         }
1914
1915         if (cam->io == IO_NONE) {
1916                 if (!sn9c102_request_buffers(cam,cam->nreadbuffers, IO_READ)) {
1917                         DBG(1, "read() failed, not enough memory");
1918                         mutex_unlock(&cam->fileop_mutex);
1919                         return -ENOMEM;
1920                 }
1921                 cam->io = IO_READ;
1922                 cam->stream = STREAM_ON;
1923         }
1924
1925         if (list_empty(&cam->inqueue)) {
1926                 if (!list_empty(&cam->outqueue))
1927                         sn9c102_empty_framequeues(cam);
1928                 sn9c102_queue_unusedframes(cam);
1929         }
1930
1931         if (!count) {
1932                 mutex_unlock(&cam->fileop_mutex);
1933                 return 0;
1934         }
1935
1936         if (list_empty(&cam->outqueue)) {
1937                 if (filp->f_flags & O_NONBLOCK) {
1938                         mutex_unlock(&cam->fileop_mutex);
1939                         return -EAGAIN;
1940                 }
1941                 if (!cam->module_param.frame_timeout) {
1942                         err = wait_event_interruptible
1943                               ( cam->wait_frame,
1944                                 (!list_empty(&cam->outqueue)) ||
1945                                 (cam->state & DEV_DISCONNECTED) ||
1946                                 (cam->state & DEV_MISCONFIGURED) );
1947                         if (err) {
1948                                 mutex_unlock(&cam->fileop_mutex);
1949                                 return err;
1950                         }
1951                 } else {
1952                         timeout = wait_event_interruptible_timeout
1953                                   ( cam->wait_frame,
1954                                     (!list_empty(&cam->outqueue)) ||
1955                                     (cam->state & DEV_DISCONNECTED) ||
1956                                     (cam->state & DEV_MISCONFIGURED),
1957                                     msecs_to_jiffies(
1958                                         cam->module_param.frame_timeout * 1000
1959                                     )
1960                                   );
1961                         if (timeout < 0) {
1962                                 mutex_unlock(&cam->fileop_mutex);
1963                                 return timeout;
1964                         } else if (timeout == 0 &&
1965                                    !(cam->state & DEV_DISCONNECTED)) {
1966                                 DBG(1, "Video frame timeout elapsed");
1967                                 mutex_unlock(&cam->fileop_mutex);
1968                                 return -EIO;
1969                         }
1970                 }
1971                 if (cam->state & DEV_DISCONNECTED) {
1972                         mutex_unlock(&cam->fileop_mutex);
1973                         return -ENODEV;
1974                 }
1975                 if (cam->state & DEV_MISCONFIGURED) {
1976                         mutex_unlock(&cam->fileop_mutex);
1977                         return -EIO;
1978                 }
1979         }
1980
1981         f = list_entry(cam->outqueue.prev, struct sn9c102_frame_t, frame);
1982
1983         if (count > f->buf.bytesused)
1984                 count = f->buf.bytesused;
1985
1986         if (copy_to_user(buf, f->bufmem, count)) {
1987                 err = -EFAULT;
1988                 goto exit;
1989         }
1990         *f_pos += count;
1991
1992 exit:
1993         spin_lock_irqsave(&cam->queue_lock, lock_flags);
1994         list_for_each_entry(i, &cam->outqueue, frame)
1995                 i->state = F_UNUSED;
1996         INIT_LIST_HEAD(&cam->outqueue);
1997         spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
1998
1999         sn9c102_queue_unusedframes(cam);
2000
2001         PDBGG("Frame #%lu, bytes read: %zu",
2002               (unsigned long)f->buf.index, count);
2003
2004         mutex_unlock(&cam->fileop_mutex);
2005
2006         return count;
2007 }
2008
2009
2010 static unsigned int sn9c102_poll(struct file *filp, poll_table *wait)
2011 {
2012         struct sn9c102_device *cam = video_drvdata(filp);
2013         struct sn9c102_frame_t* f;
2014         unsigned long lock_flags;
2015         unsigned int mask = 0;
2016
2017         if (mutex_lock_interruptible(&cam->fileop_mutex))
2018                 return POLLERR;
2019
2020         if (cam->state & DEV_DISCONNECTED) {
2021                 DBG(1, "Device not present");
2022                 goto error;
2023         }
2024
2025         if (cam->state & DEV_MISCONFIGURED) {
2026                 DBG(1, "The camera is misconfigured. Close and open it "
2027                        "again.");
2028                 goto error;
2029         }
2030
2031         if (cam->io == IO_NONE) {
2032                 if (!sn9c102_request_buffers(cam, cam->nreadbuffers,
2033                                              IO_READ)) {
2034                         DBG(1, "poll() failed, not enough memory");
2035                         goto error;
2036                 }
2037                 cam->io = IO_READ;
2038                 cam->stream = STREAM_ON;
2039         }
2040
2041         if (cam->io == IO_READ) {
2042                 spin_lock_irqsave(&cam->queue_lock, lock_flags);
2043                 list_for_each_entry(f, &cam->outqueue, frame)
2044                         f->state = F_UNUSED;
2045                 INIT_LIST_HEAD(&cam->outqueue);
2046                 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
2047                 sn9c102_queue_unusedframes(cam);
2048         }
2049
2050         poll_wait(filp, &cam->wait_frame, wait);
2051
2052         if (!list_empty(&cam->outqueue))
2053                 mask |= POLLIN | POLLRDNORM;
2054
2055         mutex_unlock(&cam->fileop_mutex);
2056
2057         return mask;
2058
2059 error:
2060         mutex_unlock(&cam->fileop_mutex);
2061         return POLLERR;
2062 }
2063
2064
2065 static void sn9c102_vm_open(struct vm_area_struct* vma)
2066 {
2067         struct sn9c102_frame_t* f = vma->vm_private_data;
2068         f->vma_use_count++;
2069 }
2070
2071
2072 static void sn9c102_vm_close(struct vm_area_struct* vma)
2073 {
2074         /* NOTE: buffers are not freed here */
2075         struct sn9c102_frame_t* f = vma->vm_private_data;
2076         f->vma_use_count--;
2077 }
2078
2079
2080 static const struct vm_operations_struct sn9c102_vm_ops = {
2081         .open = sn9c102_vm_open,
2082         .close = sn9c102_vm_close,
2083 };
2084
2085
2086 static int sn9c102_mmap(struct file* filp, struct vm_area_struct *vma)
2087 {
2088         struct sn9c102_device *cam = video_drvdata(filp);
2089         unsigned long size = vma->vm_end - vma->vm_start,
2090                       start = vma->vm_start;
2091         void *pos;
2092         u32 i;
2093
2094         if (mutex_lock_interruptible(&cam->fileop_mutex))
2095                 return -ERESTARTSYS;
2096
2097         if (cam->state & DEV_DISCONNECTED) {
2098                 DBG(1, "Device not present");
2099                 mutex_unlock(&cam->fileop_mutex);
2100                 return -ENODEV;
2101         }
2102
2103         if (cam->state & DEV_MISCONFIGURED) {
2104                 DBG(1, "The camera is misconfigured. Close and open it "
2105                        "again.");
2106                 mutex_unlock(&cam->fileop_mutex);
2107                 return -EIO;
2108         }
2109
2110         if (!(vma->vm_flags & (VM_WRITE | VM_READ))) {
2111                 mutex_unlock(&cam->fileop_mutex);
2112                 return -EACCES;
2113         }
2114
2115         if (cam->io != IO_MMAP ||
2116             size != PAGE_ALIGN(cam->frame[0].buf.length)) {
2117                 mutex_unlock(&cam->fileop_mutex);
2118                 return -EINVAL;
2119         }
2120
2121         for (i = 0; i < cam->nbuffers; i++) {
2122                 if ((cam->frame[i].buf.m.offset>>PAGE_SHIFT) == vma->vm_pgoff)
2123                         break;
2124         }
2125         if (i == cam->nbuffers) {
2126                 mutex_unlock(&cam->fileop_mutex);
2127                 return -EINVAL;
2128         }
2129
2130         vma->vm_flags |= VM_IO;
2131         vma->vm_flags |= VM_RESERVED;
2132
2133         pos = cam->frame[i].bufmem;
2134         while (size > 0) { /* size is page-aligned */
2135                 if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
2136                         mutex_unlock(&cam->fileop_mutex);
2137                         return -EAGAIN;
2138                 }
2139                 start += PAGE_SIZE;
2140                 pos += PAGE_SIZE;
2141                 size -= PAGE_SIZE;
2142         }
2143
2144         vma->vm_ops = &sn9c102_vm_ops;
2145         vma->vm_private_data = &cam->frame[i];
2146         sn9c102_vm_open(vma);
2147
2148         mutex_unlock(&cam->fileop_mutex);
2149
2150         return 0;
2151 }
2152
2153 /*****************************************************************************/
2154
2155 static int
2156 sn9c102_vidioc_querycap(struct sn9c102_device* cam, void __user * arg)
2157 {
2158         struct v4l2_capability cap = {
2159                 .driver = "sn9c102",
2160                 .version = SN9C102_MODULE_VERSION_CODE,
2161                 .capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
2162                                 V4L2_CAP_STREAMING,
2163         };
2164
2165         strlcpy(cap.card, cam->v4ldev->name, sizeof(cap.card));
2166         if (usb_make_path(cam->usbdev, cap.bus_info, sizeof(cap.bus_info)) < 0)
2167                 strlcpy(cap.bus_info, dev_name(&cam->usbdev->dev),
2168                         sizeof(cap.bus_info));
2169
2170         if (copy_to_user(arg, &cap, sizeof(cap)))
2171                 return -EFAULT;
2172
2173         return 0;
2174 }
2175
2176
2177 static int
2178 sn9c102_vidioc_enuminput(struct sn9c102_device* cam, void __user * arg)
2179 {
2180         struct v4l2_input i;
2181
2182         if (copy_from_user(&i, arg, sizeof(i)))
2183                 return -EFAULT;
2184
2185         if (i.index)
2186                 return -EINVAL;
2187
2188         memset(&i, 0, sizeof(i));
2189         strcpy(i.name, "Camera");
2190         i.type = V4L2_INPUT_TYPE_CAMERA;
2191
2192         if (copy_to_user(arg, &i, sizeof(i)))
2193                 return -EFAULT;
2194
2195         return 0;
2196 }
2197
2198
2199 static int
2200 sn9c102_vidioc_g_input(struct sn9c102_device* cam, void __user * arg)
2201 {
2202         int index = 0;
2203
2204         if (copy_to_user(arg, &index, sizeof(index)))
2205                 return -EFAULT;
2206
2207         return 0;
2208 }
2209
2210
2211 static int
2212 sn9c102_vidioc_s_input(struct sn9c102_device* cam, void __user * arg)
2213 {
2214         int index;
2215
2216         if (copy_from_user(&index, arg, sizeof(index)))
2217                 return -EFAULT;
2218
2219         if (index != 0)
2220                 return -EINVAL;
2221
2222         return 0;
2223 }
2224
2225
2226 static int
2227 sn9c102_vidioc_query_ctrl(struct sn9c102_device* cam, void __user * arg)
2228 {
2229         struct sn9c102_sensor* s = &cam->sensor;
2230         struct v4l2_queryctrl qc;
2231         u8 i;
2232
2233         if (copy_from_user(&qc, arg, sizeof(qc)))
2234                 return -EFAULT;
2235
2236         for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
2237                 if (qc.id && qc.id == s->qctrl[i].id) {
2238                         memcpy(&qc, &(s->qctrl[i]), sizeof(qc));
2239                         if (copy_to_user(arg, &qc, sizeof(qc)))
2240                                 return -EFAULT;
2241                         return 0;
2242                 }
2243
2244         return -EINVAL;
2245 }
2246
2247
2248 static int
2249 sn9c102_vidioc_g_ctrl(struct sn9c102_device* cam, void __user * arg)
2250 {
2251         struct sn9c102_sensor* s = &cam->sensor;
2252         struct v4l2_control ctrl;
2253         int err = 0;
2254         u8 i;
2255
2256         if (!s->get_ctrl && !s->set_ctrl)
2257                 return -EINVAL;
2258
2259         if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
2260                 return -EFAULT;
2261
2262         if (!s->get_ctrl) {
2263                 for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
2264                         if (ctrl.id && ctrl.id == s->qctrl[i].id) {
2265                                 ctrl.value = s->_qctrl[i].default_value;
2266                                 goto exit;
2267                         }
2268                 return -EINVAL;
2269         } else
2270                 err = s->get_ctrl(cam, &ctrl);
2271
2272 exit:
2273         if (copy_to_user(arg, &ctrl, sizeof(ctrl)))
2274                 return -EFAULT;
2275
2276         PDBGG("VIDIOC_G_CTRL: id %lu, value %lu",
2277               (unsigned long)ctrl.id, (unsigned long)ctrl.value);
2278
2279         return err;
2280 }
2281
2282
2283 static int
2284 sn9c102_vidioc_s_ctrl(struct sn9c102_device* cam, void __user * arg)
2285 {
2286         struct sn9c102_sensor* s = &cam->sensor;
2287         struct v4l2_control ctrl;
2288         u8 i;
2289         int err = 0;
2290
2291         if (!s->set_ctrl)
2292                 return -EINVAL;
2293
2294         if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
2295                 return -EFAULT;
2296
2297         for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
2298                 if (ctrl.id == s->qctrl[i].id) {
2299                         if (s->qctrl[i].flags & V4L2_CTRL_FLAG_DISABLED)
2300                                 return -EINVAL;
2301                         if (ctrl.value < s->qctrl[i].minimum ||
2302                             ctrl.value > s->qctrl[i].maximum)
2303                                 return -ERANGE;
2304                         ctrl.value -= ctrl.value % s->qctrl[i].step;
2305                         break;
2306                 }
2307
2308         if ((err = s->set_ctrl(cam, &ctrl)))
2309                 return err;
2310
2311         s->_qctrl[i].default_value = ctrl.value;
2312
2313         PDBGG("VIDIOC_S_CTRL: id %lu, value %lu",
2314               (unsigned long)ctrl.id, (unsigned long)ctrl.value);
2315
2316         return 0;
2317 }
2318
2319
2320 static int
2321 sn9c102_vidioc_cropcap(struct sn9c102_device* cam, void __user * arg)
2322 {
2323         struct v4l2_cropcap* cc = &(cam->sensor.cropcap);
2324
2325         cc->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2326         cc->pixelaspect.numerator = 1;
2327         cc->pixelaspect.denominator = 1;
2328
2329         if (copy_to_user(arg, cc, sizeof(*cc)))
2330                 return -EFAULT;
2331
2332         return 0;
2333 }
2334
2335
2336 static int
2337 sn9c102_vidioc_g_crop(struct sn9c102_device* cam, void __user * arg)
2338 {
2339         struct sn9c102_sensor* s = &cam->sensor;
2340         struct v4l2_crop crop = {
2341                 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
2342         };
2343
2344         memcpy(&(crop.c), &(s->_rect), sizeof(struct v4l2_rect));
2345
2346         if (copy_to_user(arg, &crop, sizeof(crop)))
2347                 return -EFAULT;
2348
2349         return 0;
2350 }
2351
2352
2353 static int
2354 sn9c102_vidioc_s_crop(struct sn9c102_device* cam, void __user * arg)
2355 {
2356         struct sn9c102_sensor* s = &cam->sensor;
2357         struct v4l2_crop crop;
2358         struct v4l2_rect* rect;
2359         struct v4l2_rect* bounds = &(s->cropcap.bounds);
2360         struct v4l2_pix_format* pix_format = &(s->pix_format);
2361         u8 scale;
2362         const enum sn9c102_stream_state stream = cam->stream;
2363         const u32 nbuffers = cam->nbuffers;
2364         u32 i;
2365         int err = 0;
2366
2367         if (copy_from_user(&crop, arg, sizeof(crop)))
2368                 return -EFAULT;
2369
2370         rect = &(crop.c);
2371
2372         if (crop.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2373                 return -EINVAL;
2374
2375         if (cam->module_param.force_munmap)
2376                 for (i = 0; i < cam->nbuffers; i++)
2377                         if (cam->frame[i].vma_use_count) {
2378                                 DBG(3, "VIDIOC_S_CROP failed. "
2379                                        "Unmap the buffers first.");
2380                                 return -EBUSY;
2381                         }
2382
2383         /* Preserve R,G or B origin */
2384         rect->left = (s->_rect.left & 1L) ? rect->left | 1L : rect->left & ~1L;
2385         rect->top = (s->_rect.top & 1L) ? rect->top | 1L : rect->top & ~1L;
2386
2387         if (rect->width < 16)
2388                 rect->width = 16;
2389         if (rect->height < 16)
2390                 rect->height = 16;
2391         if (rect->width > bounds->width)
2392                 rect->width = bounds->width;
2393         if (rect->height > bounds->height)
2394                 rect->height = bounds->height;
2395         if (rect->left < bounds->left)
2396                 rect->left = bounds->left;
2397         if (rect->top < bounds->top)
2398                 rect->top = bounds->top;
2399         if (rect->left + rect->width > bounds->left + bounds->width)
2400                 rect->left = bounds->left+bounds->width - rect->width;
2401         if (rect->top + rect->height > bounds->top + bounds->height)
2402                 rect->top = bounds->top+bounds->height - rect->height;
2403
2404         rect->width &= ~15L;
2405         rect->height &= ~15L;
2406
2407         if (SN9C102_PRESERVE_IMGSCALE) {
2408                 /* Calculate the actual scaling factor */
2409                 u32 a, b;
2410                 a = rect->width * rect->height;
2411                 b = pix_format->width * pix_format->height;
2412                 scale = b ? (u8)((a / b) < 4 ? 1 : ((a / b) < 16 ? 2 : 4)) : 1;
2413         } else
2414                 scale = 1;
2415
2416         if (cam->stream == STREAM_ON)
2417                 if ((err = sn9c102_stream_interrupt(cam)))
2418                         return err;
2419
2420         if (copy_to_user(arg, &crop, sizeof(crop))) {
2421                 cam->stream = stream;
2422                 return -EFAULT;
2423         }
2424
2425         if (cam->module_param.force_munmap || cam->io == IO_READ)
2426                 sn9c102_release_buffers(cam);
2427
2428         err = sn9c102_set_crop(cam, rect);
2429         if (s->set_crop)
2430                 err += s->set_crop(cam, rect);
2431         err += sn9c102_set_scale(cam, scale);
2432
2433         if (err) { /* atomic, no rollback in ioctl() */
2434                 cam->state |= DEV_MISCONFIGURED;
2435                 DBG(1, "VIDIOC_S_CROP failed because of hardware problems. To "
2436                        "use the camera, close and open /dev/video%d again.",
2437                     cam->v4ldev->num);
2438                 return -EIO;
2439         }
2440
2441         s->pix_format.width = rect->width/scale;
2442         s->pix_format.height = rect->height/scale;
2443         memcpy(&(s->_rect), rect, sizeof(*rect));
2444
2445         if ((cam->module_param.force_munmap || cam->io == IO_READ) &&
2446             nbuffers != sn9c102_request_buffers(cam, nbuffers, cam->io)) {
2447                 cam->state |= DEV_MISCONFIGURED;
2448                 DBG(1, "VIDIOC_S_CROP failed because of not enough memory. To "
2449                        "use the camera, close and open /dev/video%d again.",
2450                     cam->v4ldev->num);
2451                 return -ENOMEM;
2452         }
2453
2454         if (cam->io == IO_READ)
2455                 sn9c102_empty_framequeues(cam);
2456         else if (cam->module_param.force_munmap)
2457                 sn9c102_requeue_outqueue(cam);
2458
2459         cam->stream = stream;
2460
2461         return 0;
2462 }
2463
2464
2465 static int
2466 sn9c102_vidioc_enum_framesizes(struct sn9c102_device* cam, void __user * arg)
2467 {
2468         struct v4l2_frmsizeenum frmsize;
2469
2470         if (copy_from_user(&frmsize, arg, sizeof(frmsize)))
2471                 return -EFAULT;
2472
2473         if (frmsize.index != 0)
2474                 return -EINVAL;
2475
2476         switch (cam->bridge) {
2477         case BRIDGE_SN9C101:
2478         case BRIDGE_SN9C102:
2479         case BRIDGE_SN9C103:
2480                 if (frmsize.pixel_format != V4L2_PIX_FMT_SN9C10X &&
2481                     frmsize.pixel_format != V4L2_PIX_FMT_SBGGR8)
2482                         return -EINVAL;
2483         case BRIDGE_SN9C105:
2484         case BRIDGE_SN9C120:
2485                 if (frmsize.pixel_format != V4L2_PIX_FMT_JPEG &&
2486                     frmsize.pixel_format != V4L2_PIX_FMT_SBGGR8)
2487                         return -EINVAL;
2488         }
2489
2490         frmsize.type = V4L2_FRMSIZE_TYPE_STEPWISE;
2491         frmsize.stepwise.min_width = frmsize.stepwise.step_width = 16;
2492         frmsize.stepwise.min_height = frmsize.stepwise.step_height = 16;
2493         frmsize.stepwise.max_width = cam->sensor.cropcap.bounds.width;
2494         frmsize.stepwise.max_height = cam->sensor.cropcap.bounds.height;
2495         memset(&frmsize.reserved, 0, sizeof(frmsize.reserved));
2496
2497         if (copy_to_user(arg, &frmsize, sizeof(frmsize)))
2498                 return -EFAULT;
2499
2500         return 0;
2501 }
2502
2503
2504 static int
2505 sn9c102_vidioc_enum_fmt(struct sn9c102_device* cam, void __user * arg)
2506 {
2507         struct v4l2_fmtdesc fmtd;
2508
2509         if (copy_from_user(&fmtd, arg, sizeof(fmtd)))
2510                 return -EFAULT;
2511
2512         if (fmtd.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2513                 return -EINVAL;
2514
2515         if (fmtd.index == 0) {
2516                 strcpy(fmtd.description, "bayer rgb");
2517                 fmtd.pixelformat = V4L2_PIX_FMT_SBGGR8;
2518         } else if (fmtd.index == 1) {
2519                 switch (cam->bridge) {
2520                 case BRIDGE_SN9C101:
2521                 case BRIDGE_SN9C102:
2522                 case BRIDGE_SN9C103:
2523                         strcpy(fmtd.description, "compressed");
2524                         fmtd.pixelformat = V4L2_PIX_FMT_SN9C10X;
2525                         break;
2526                 case BRIDGE_SN9C105:
2527                 case BRIDGE_SN9C120:
2528                         strcpy(fmtd.description, "JPEG");
2529                         fmtd.pixelformat = V4L2_PIX_FMT_JPEG;
2530                         break;
2531                 }
2532                 fmtd.flags = V4L2_FMT_FLAG_COMPRESSED;
2533         } else
2534                 return -EINVAL;
2535
2536         fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2537         memset(&fmtd.reserved, 0, sizeof(fmtd.reserved));
2538
2539         if (copy_to_user(arg, &fmtd, sizeof(fmtd)))
2540                 return -EFAULT;
2541
2542         return 0;
2543 }
2544
2545
2546 static int
2547 sn9c102_vidioc_g_fmt(struct sn9c102_device* cam, void __user * arg)
2548 {
2549         struct v4l2_format format;
2550         struct v4l2_pix_format* pfmt = &(cam->sensor.pix_format);
2551
2552         if (copy_from_user(&format, arg, sizeof(format)))
2553                 return -EFAULT;
2554
2555         if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2556                 return -EINVAL;
2557
2558         pfmt->colorspace = (pfmt->pixelformat == V4L2_PIX_FMT_JPEG) ?
2559                            V4L2_COLORSPACE_JPEG : V4L2_COLORSPACE_SRGB;
2560         pfmt->bytesperline = (pfmt->pixelformat == V4L2_PIX_FMT_SN9C10X ||
2561                               pfmt->pixelformat == V4L2_PIX_FMT_JPEG)
2562                              ? 0 : (pfmt->width * pfmt->priv) / 8;
2563         pfmt->sizeimage = pfmt->height * ((pfmt->width*pfmt->priv)/8);
2564         pfmt->field = V4L2_FIELD_NONE;
2565         memcpy(&(format.fmt.pix), pfmt, sizeof(*pfmt));
2566
2567         if (copy_to_user(arg, &format, sizeof(format)))
2568                 return -EFAULT;
2569
2570         return 0;
2571 }
2572
2573
2574 static int
2575 sn9c102_vidioc_try_s_fmt(struct sn9c102_device* cam, unsigned int cmd,
2576                          void __user * arg)
2577 {
2578         struct sn9c102_sensor* s = &cam->sensor;
2579         struct v4l2_format format;
2580         struct v4l2_pix_format* pix;
2581         struct v4l2_pix_format* pfmt = &(s->pix_format);
2582         struct v4l2_rect* bounds = &(s->cropcap.bounds);
2583         struct v4l2_rect rect;
2584         u8 scale;
2585         const enum sn9c102_stream_state stream = cam->stream;
2586         const u32 nbuffers = cam->nbuffers;
2587         u32 i;
2588         int err = 0;
2589
2590         if (copy_from_user(&format, arg, sizeof(format)))
2591                 return -EFAULT;
2592
2593         pix = &(format.fmt.pix);
2594
2595         if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2596                 return -EINVAL;
2597
2598         memcpy(&rect, &(s->_rect), sizeof(rect));
2599
2600         { /* calculate the actual scaling factor */
2601                 u32 a, b;
2602                 a = rect.width * rect.height;
2603                 b = pix->width * pix->height;
2604                 scale = b ? (u8)((a / b) < 4 ? 1 : ((a / b) < 16 ? 2 : 4)) : 1;
2605         }
2606
2607         rect.width = scale * pix->width;
2608         rect.height = scale * pix->height;
2609
2610         if (rect.width < 16)
2611                 rect.width = 16;
2612         if (rect.height < 16)
2613                 rect.height = 16;
2614         if (rect.width > bounds->left + bounds->width - rect.left)
2615                 rect.width = bounds->left + bounds->width - rect.left;
2616         if (rect.height > bounds->top + bounds->height - rect.top)
2617                 rect.height = bounds->top + bounds->height - rect.top;
2618
2619         rect.width &= ~15L;
2620         rect.height &= ~15L;
2621
2622         { /* adjust the scaling factor */
2623                 u32 a, b;
2624                 a = rect.width * rect.height;
2625                 b = pix->width * pix->height;
2626                 scale = b ? (u8)((a / b) < 4 ? 1 : ((a / b) < 16 ? 2 : 4)) : 1;
2627         }
2628
2629         pix->width = rect.width / scale;
2630         pix->height = rect.height / scale;
2631
2632         switch (cam->bridge) {
2633         case BRIDGE_SN9C101:
2634         case BRIDGE_SN9C102:
2635         case BRIDGE_SN9C103:
2636                 if (pix->pixelformat != V4L2_PIX_FMT_SN9C10X &&
2637                     pix->pixelformat != V4L2_PIX_FMT_SBGGR8)
2638                         pix->pixelformat = pfmt->pixelformat;
2639                 break;
2640         case BRIDGE_SN9C105:
2641         case BRIDGE_SN9C120:
2642                 if (pix->pixelformat != V4L2_PIX_FMT_JPEG &&
2643                     pix->pixelformat != V4L2_PIX_FMT_SBGGR8)
2644                         pix->pixelformat = pfmt->pixelformat;
2645                 break;
2646         }
2647         pix->priv = pfmt->priv; /* bpp */
2648         pix->colorspace = (pix->pixelformat == V4L2_PIX_FMT_JPEG) ?
2649                           V4L2_COLORSPACE_JPEG : V4L2_COLORSPACE_SRGB;
2650         pix->bytesperline = (pix->pixelformat == V4L2_PIX_FMT_SN9C10X ||
2651                              pix->pixelformat == V4L2_PIX_FMT_JPEG)
2652                             ? 0 : (pix->width * pix->priv) / 8;
2653         pix->sizeimage = pix->height * ((pix->width * pix->priv) / 8);
2654         pix->field = V4L2_FIELD_NONE;
2655
2656         if (cmd == VIDIOC_TRY_FMT) {
2657                 if (copy_to_user(arg, &format, sizeof(format)))
2658                         return -EFAULT;
2659                 return 0;
2660         }
2661
2662         if (cam->module_param.force_munmap)
2663                 for (i = 0; i < cam->nbuffers; i++)
2664                         if (cam->frame[i].vma_use_count) {
2665                                 DBG(3, "VIDIOC_S_FMT failed. Unmap the "
2666                                        "buffers first.");
2667                                 return -EBUSY;
2668                         }
2669
2670         if (cam->stream == STREAM_ON)
2671                 if ((err = sn9c102_stream_interrupt(cam)))
2672                         return err;
2673
2674         if (copy_to_user(arg, &format, sizeof(format))) {
2675                 cam->stream = stream;
2676                 return -EFAULT;
2677         }
2678
2679         if (cam->module_param.force_munmap  || cam->io == IO_READ)
2680                 sn9c102_release_buffers(cam);
2681
2682         err += sn9c102_set_pix_format(cam, pix);
2683         err += sn9c102_set_crop(cam, &rect);
2684         if (s->set_pix_format)
2685                 err += s->set_pix_format(cam, pix);
2686         if (s->set_crop)
2687                 err += s->set_crop(cam, &rect);
2688         err += sn9c102_set_scale(cam, scale);
2689
2690         if (err) { /* atomic, no rollback in ioctl() */
2691                 cam->state |= DEV_MISCONFIGURED;
2692                 DBG(1, "VIDIOC_S_FMT failed because of hardware problems. To "
2693                        "use the camera, close and open /dev/video%d again.",
2694                     cam->v4ldev->num);
2695                 return -EIO;
2696         }
2697
2698         memcpy(pfmt, pix, sizeof(*pix));
2699         memcpy(&(s->_rect), &rect, sizeof(rect));
2700
2701         if ((cam->module_param.force_munmap  || cam->io == IO_READ) &&
2702             nbuffers != sn9c102_request_buffers(cam, nbuffers, cam->io)) {
2703                 cam->state |= DEV_MISCONFIGURED;
2704                 DBG(1, "VIDIOC_S_FMT failed because of not enough memory. To "
2705                        "use the camera, close and open /dev/video%d again.",
2706                     cam->v4ldev->num);
2707                 return -ENOMEM;
2708         }
2709
2710         if (cam->io == IO_READ)
2711                 sn9c102_empty_framequeues(cam);
2712         else if (cam->module_param.force_munmap)
2713                 sn9c102_requeue_outqueue(cam);
2714
2715         cam->stream = stream;
2716
2717         return 0;
2718 }
2719
2720
2721 static int
2722 sn9c102_vidioc_g_jpegcomp(struct sn9c102_device* cam, void __user * arg)
2723 {
2724         if (copy_to_user(arg, &cam->compression, sizeof(cam->compression)))
2725                 return -EFAULT;
2726
2727         return 0;
2728 }
2729
2730
2731 static int
2732 sn9c102_vidioc_s_jpegcomp(struct sn9c102_device* cam, void __user * arg)
2733 {
2734         struct v4l2_jpegcompression jc;
2735         const enum sn9c102_stream_state stream = cam->stream;
2736         int err = 0;
2737
2738         if (copy_from_user(&jc, arg, sizeof(jc)))
2739                 return -EFAULT;
2740
2741         if (jc.quality != 0 && jc.quality != 1)
2742                 return -EINVAL;
2743
2744         if (cam->stream == STREAM_ON)
2745                 if ((err = sn9c102_stream_interrupt(cam)))
2746                         return err;
2747
2748         err += sn9c102_set_compression(cam, &jc);
2749         if (err) { /* atomic, no rollback in ioctl() */
2750                 cam->state |= DEV_MISCONFIGURED;
2751                 DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware "
2752                        "problems. To use the camera, close and open "
2753                        "/dev/video%d again.", cam->v4ldev->num);
2754                 return -EIO;
2755         }
2756
2757         cam->compression.quality = jc.quality;
2758
2759         cam->stream = stream;
2760
2761         return 0;
2762 }
2763
2764
2765 static int
2766 sn9c102_vidioc_reqbufs(struct sn9c102_device* cam, void __user * arg)
2767 {
2768         struct v4l2_requestbuffers rb;
2769         u32 i;
2770         int err;
2771
2772         if (copy_from_user(&rb, arg, sizeof(rb)))
2773                 return -EFAULT;
2774
2775         if (rb.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2776             rb.memory != V4L2_MEMORY_MMAP)
2777                 return -EINVAL;
2778
2779         if (cam->io == IO_READ) {
2780                 DBG(3, "Close and open the device again to choose the mmap "
2781                        "I/O method");
2782                 return -EBUSY;
2783         }
2784
2785         for (i = 0; i < cam->nbuffers; i++)
2786                 if (cam->frame[i].vma_use_count) {
2787                         DBG(3, "VIDIOC_REQBUFS failed. Previous buffers are "
2788                                "still mapped.");
2789                         return -EBUSY;
2790                 }
2791
2792         if (cam->stream == STREAM_ON)
2793                 if ((err = sn9c102_stream_interrupt(cam)))
2794                         return err;
2795
2796         sn9c102_empty_framequeues(cam);
2797
2798         sn9c102_release_buffers(cam);
2799         if (rb.count)
2800                 rb.count = sn9c102_request_buffers(cam, rb.count, IO_MMAP);
2801
2802         if (copy_to_user(arg, &rb, sizeof(rb))) {
2803                 sn9c102_release_buffers(cam);
2804                 cam->io = IO_NONE;
2805                 return -EFAULT;
2806         }
2807
2808         cam->io = rb.count ? IO_MMAP : IO_NONE;
2809
2810         return 0;
2811 }
2812
2813
2814 static int
2815 sn9c102_vidioc_querybuf(struct sn9c102_device* cam, void __user * arg)
2816 {
2817         struct v4l2_buffer b;
2818
2819         if (copy_from_user(&b, arg, sizeof(b)))
2820                 return -EFAULT;
2821
2822         if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2823             b.index >= cam->nbuffers || cam->io != IO_MMAP)
2824                 return -EINVAL;
2825
2826         memcpy(&b, &cam->frame[b.index].buf, sizeof(b));
2827
2828         if (cam->frame[b.index].vma_use_count)
2829                 b.flags |= V4L2_BUF_FLAG_MAPPED;
2830
2831         if (cam->frame[b.index].state == F_DONE)
2832                 b.flags |= V4L2_BUF_FLAG_DONE;
2833         else if (cam->frame[b.index].state != F_UNUSED)
2834                 b.flags |= V4L2_BUF_FLAG_QUEUED;
2835
2836         if (copy_to_user(arg, &b, sizeof(b)))
2837                 return -EFAULT;
2838
2839         return 0;
2840 }
2841
2842
2843 static int
2844 sn9c102_vidioc_qbuf(struct sn9c102_device* cam, void __user * arg)
2845 {
2846         struct v4l2_buffer b;
2847         unsigned long lock_flags;
2848
2849         if (copy_from_user(&b, arg, sizeof(b)))
2850                 return -EFAULT;
2851
2852         if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2853             b.index >= cam->nbuffers || cam->io != IO_MMAP)
2854                 return -EINVAL;
2855
2856         if (cam->frame[b.index].state != F_UNUSED)
2857                 return -EINVAL;
2858
2859         cam->frame[b.index].state = F_QUEUED;
2860
2861         spin_lock_irqsave(&cam->queue_lock, lock_flags);
2862         list_add_tail(&cam->frame[b.index].frame, &cam->inqueue);
2863         spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
2864
2865         PDBGG("Frame #%lu queued", (unsigned long)b.index);
2866
2867         return 0;
2868 }
2869
2870
2871 static int
2872 sn9c102_vidioc_dqbuf(struct sn9c102_device* cam, struct file* filp,
2873                      void __user * arg)
2874 {
2875         struct v4l2_buffer b;
2876         struct sn9c102_frame_t *f;
2877         unsigned long lock_flags;
2878         long timeout;
2879         int err = 0;
2880
2881         if (copy_from_user(&b, arg, sizeof(b)))
2882                 return -EFAULT;
2883
2884         if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2885                 return -EINVAL;
2886
2887         if (list_empty(&cam->outqueue)) {
2888                 if (cam->stream == STREAM_OFF)
2889                         return -EINVAL;
2890                 if (filp->f_flags & O_NONBLOCK)
2891                         return -EAGAIN;
2892                 if (!cam->module_param.frame_timeout) {
2893                         err = wait_event_interruptible
2894                               ( cam->wait_frame,
2895                                 (!list_empty(&cam->outqueue)) ||
2896                                 (cam->state & DEV_DISCONNECTED) ||
2897                                 (cam->state & DEV_MISCONFIGURED) );
2898                         if (err)
2899                                 return err;
2900                 } else {
2901                         timeout = wait_event_interruptible_timeout
2902                                   ( cam->wait_frame,
2903                                     (!list_empty(&cam->outqueue)) ||
2904                                     (cam->state & DEV_DISCONNECTED) ||
2905                                     (cam->state & DEV_MISCONFIGURED),
2906                                     cam->module_param.frame_timeout *
2907                                     1000 * msecs_to_jiffies(1) );
2908                         if (timeout < 0)
2909                                 return timeout;
2910                         else if (timeout == 0 &&
2911                                  !(cam->state & DEV_DISCONNECTED)) {
2912                                 DBG(1, "Video frame timeout elapsed");
2913                                 return -EIO;
2914                         }
2915                 }
2916                 if (cam->state & DEV_DISCONNECTED)
2917                         return -ENODEV;
2918                 if (cam->state & DEV_MISCONFIGURED)
2919                         return -EIO;
2920         }
2921
2922         spin_lock_irqsave(&cam->queue_lock, lock_flags);
2923         f = list_entry(cam->outqueue.next, struct sn9c102_frame_t, frame);
2924         list_del(cam->outqueue.next);
2925         spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
2926
2927         f->state = F_UNUSED;
2928
2929         memcpy(&b, &f->buf, sizeof(b));
2930         if (f->vma_use_count)
2931                 b.flags |= V4L2_BUF_FLAG_MAPPED;
2932
2933         if (copy_to_user(arg, &b, sizeof(b)))
2934                 return -EFAULT;
2935
2936         PDBGG("Frame #%lu dequeued", (unsigned long)f->buf.index);
2937
2938         return 0;
2939 }
2940
2941
2942 static int
2943 sn9c102_vidioc_streamon(struct sn9c102_device* cam, void __user * arg)
2944 {
2945         int type;
2946
2947         if (copy_from_user(&type, arg, sizeof(type)))
2948                 return -EFAULT;
2949
2950         if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2951                 return -EINVAL;
2952
2953         cam->stream = STREAM_ON;
2954
2955         DBG(3, "Stream on");
2956
2957         return 0;
2958 }
2959
2960
2961 static int
2962 sn9c102_vidioc_streamoff(struct sn9c102_device* cam, void __user * arg)
2963 {
2964         int type, err;
2965
2966         if (copy_from_user(&type, arg, sizeof(type)))
2967                 return -EFAULT;
2968
2969         if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2970                 return -EINVAL;
2971
2972         if (cam->stream == STREAM_ON)
2973                 if ((err = sn9c102_stream_interrupt(cam)))
2974                         return err;
2975
2976         sn9c102_empty_framequeues(cam);
2977
2978         DBG(3, "Stream off");
2979
2980         return 0;
2981 }
2982
2983
2984 static int
2985 sn9c102_vidioc_g_parm(struct sn9c102_device* cam, void __user * arg)
2986 {
2987         struct v4l2_streamparm sp;
2988
2989         if (copy_from_user(&sp, arg, sizeof(sp)))
2990                 return -EFAULT;
2991
2992         if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2993                 return -EINVAL;
2994
2995         sp.parm.capture.extendedmode = 0;
2996         sp.parm.capture.readbuffers = cam->nreadbuffers;
2997
2998         if (copy_to_user(arg, &sp, sizeof(sp)))
2999                 return -EFAULT;
3000
3001         return 0;
3002 }
3003
3004
3005 static int
3006 sn9c102_vidioc_s_parm(struct sn9c102_device* cam, void __user * arg)
3007 {
3008         struct v4l2_streamparm sp;
3009
3010         if (copy_from_user(&sp, arg, sizeof(sp)))
3011                 return -EFAULT;
3012
3013         if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
3014                 return -EINVAL;
3015
3016         sp.parm.capture.extendedmode = 0;
3017
3018         if (sp.parm.capture.readbuffers == 0)
3019                 sp.parm.capture.readbuffers = cam->nreadbuffers;
3020
3021         if (sp.parm.capture.readbuffers > SN9C102_MAX_FRAMES)
3022                 sp.parm.capture.readbuffers = SN9C102_MAX_FRAMES;
3023
3024         if (copy_to_user(arg, &sp, sizeof(sp)))
3025                 return -EFAULT;
3026
3027         cam->nreadbuffers = sp.parm.capture.readbuffers;
3028
3029         return 0;
3030 }
3031
3032
3033 static int
3034 sn9c102_vidioc_enumaudio(struct sn9c102_device* cam, void __user * arg)
3035 {
3036         struct v4l2_audio audio;
3037
3038         if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
3039                 return -EINVAL;
3040
3041         if (copy_from_user(&audio, arg, sizeof(audio)))
3042                 return -EFAULT;
3043
3044         if (audio.index != 0)
3045                 return -EINVAL;
3046
3047         strcpy(audio.name, "Microphone");
3048         audio.capability = 0;
3049         audio.mode = 0;
3050
3051         if (copy_to_user(arg, &audio, sizeof(audio)))
3052                 return -EFAULT;
3053
3054         return 0;
3055 }
3056
3057
3058 static int
3059 sn9c102_vidioc_g_audio(struct sn9c102_device* cam, void __user * arg)
3060 {
3061         struct v4l2_audio audio;
3062
3063         if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
3064                 return -EINVAL;
3065
3066         if (copy_from_user(&audio, arg, sizeof(audio)))
3067                 return -EFAULT;
3068
3069         memset(&audio, 0, sizeof(audio));
3070         strcpy(audio.name, "Microphone");
3071
3072         if (copy_to_user(arg, &audio, sizeof(audio)))
3073                 return -EFAULT;
3074
3075         return 0;
3076 }
3077
3078
3079 static int
3080 sn9c102_vidioc_s_audio(struct sn9c102_device* cam, void __user * arg)
3081 {
3082         struct v4l2_audio audio;
3083
3084         if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
3085                 return -EINVAL;
3086
3087         if (copy_from_user(&audio, arg, sizeof(audio)))
3088                 return -EFAULT;
3089
3090         if (audio.index != 0)
3091                 return -EINVAL;
3092
3093         return 0;
3094 }
3095
3096
3097 static long sn9c102_ioctl_v4l2(struct file *filp,
3098                               unsigned int cmd, void __user *arg)
3099 {
3100         struct sn9c102_device *cam = video_drvdata(filp);
3101
3102         switch (cmd) {
3103
3104         case VIDIOC_QUERYCAP:
3105                 return sn9c102_vidioc_querycap(cam, arg);
3106
3107         case VIDIOC_ENUMINPUT:
3108                 return sn9c102_vidioc_enuminput(cam, arg);
3109
3110         case VIDIOC_G_INPUT:
3111                 return sn9c102_vidioc_g_input(cam, arg);
3112
3113         case VIDIOC_S_INPUT:
3114                 return sn9c102_vidioc_s_input(cam, arg);
3115
3116         case VIDIOC_QUERYCTRL:
3117                 return sn9c102_vidioc_query_ctrl(cam, arg);
3118
3119         case VIDIOC_G_CTRL:
3120                 return sn9c102_vidioc_g_ctrl(cam, arg);
3121
3122         case VIDIOC_S_CTRL:
3123                 return sn9c102_vidioc_s_ctrl(cam, arg);
3124
3125         case VIDIOC_CROPCAP:
3126                 return sn9c102_vidioc_cropcap(cam, arg);
3127
3128         case VIDIOC_G_CROP:
3129                 return sn9c102_vidioc_g_crop(cam, arg);
3130
3131         case VIDIOC_S_CROP:
3132                 return sn9c102_vidioc_s_crop(cam, arg);
3133
3134         case VIDIOC_ENUM_FRAMESIZES:
3135                 return sn9c102_vidioc_enum_framesizes(cam, arg);
3136
3137         case VIDIOC_ENUM_FMT:
3138                 return sn9c102_vidioc_enum_fmt(cam, arg);
3139
3140         case VIDIOC_G_FMT:
3141                 return sn9c102_vidioc_g_fmt(cam, arg);
3142
3143         case VIDIOC_TRY_FMT:
3144         case VIDIOC_S_FMT:
3145                 return sn9c102_vidioc_try_s_fmt(cam, cmd, arg);
3146
3147         case VIDIOC_G_JPEGCOMP:
3148                 return sn9c102_vidioc_g_jpegcomp(cam, arg);
3149
3150         case VIDIOC_S_JPEGCOMP:
3151                 return sn9c102_vidioc_s_jpegcomp(cam, arg);
3152
3153         case VIDIOC_REQBUFS:
3154                 return sn9c102_vidioc_reqbufs(cam, arg);
3155
3156         case VIDIOC_QUERYBUF:
3157                 return sn9c102_vidioc_querybuf(cam, arg);
3158
3159         case VIDIOC_QBUF:
3160                 return sn9c102_vidioc_qbuf(cam, arg);
3161
3162         case VIDIOC_DQBUF:
3163                 return sn9c102_vidioc_dqbuf(cam, filp, arg);
3164
3165         case VIDIOC_STREAMON:
3166                 return sn9c102_vidioc_streamon(cam, arg);
3167
3168         case VIDIOC_STREAMOFF:
3169                 return sn9c102_vidioc_streamoff(cam, arg);
3170
3171         case VIDIOC_G_PARM:
3172                 return sn9c102_vidioc_g_parm(cam, arg);
3173
3174         case VIDIOC_S_PARM:
3175                 return sn9c102_vidioc_s_parm(cam, arg);
3176
3177         case VIDIOC_ENUMAUDIO:
3178                 return sn9c102_vidioc_enumaudio(cam, arg);
3179
3180         case VIDIOC_G_AUDIO:
3181                 return sn9c102_vidioc_g_audio(cam, arg);
3182
3183         case VIDIOC_S_AUDIO:
3184                 return sn9c102_vidioc_s_audio(cam, arg);
3185
3186         case VIDIOC_G_STD:
3187         case VIDIOC_S_STD:
3188         case VIDIOC_QUERYSTD:
3189         case VIDIOC_ENUMSTD:
3190         case VIDIOC_QUERYMENU:
3191         case VIDIOC_ENUM_FRAMEINTERVALS:
3192                 return -EINVAL;
3193
3194         default:
3195                 return -EINVAL;
3196
3197         }
3198 }
3199
3200
3201 static long sn9c102_ioctl(struct file *filp,
3202                          unsigned int cmd, unsigned long arg)
3203 {
3204         struct sn9c102_device *cam = video_drvdata(filp);
3205         int err = 0;
3206
3207         if (mutex_lock_interruptible(&cam->fileop_mutex))
3208                 return -ERESTARTSYS;
3209
3210         if (cam->state & DEV_DISCONNECTED) {
3211                 DBG(1, "Device not present");
3212                 mutex_unlock(&cam->fileop_mutex);
3213                 return -ENODEV;
3214         }
3215
3216         if (cam->state & DEV_MISCONFIGURED) {
3217                 DBG(1, "The camera is misconfigured. Close and open it "
3218                        "again.");
3219                 mutex_unlock(&cam->fileop_mutex);
3220                 return -EIO;
3221         }
3222
3223         V4LDBG(3, "sn9c102", cmd);
3224
3225         err = sn9c102_ioctl_v4l2(filp, cmd, (void __user *)arg);
3226
3227         mutex_unlock(&cam->fileop_mutex);
3228
3229         return err;
3230 }
3231
3232 /*****************************************************************************/
3233
3234 static const struct v4l2_file_operations sn9c102_fops = {
3235         .owner = THIS_MODULE,
3236         .open = sn9c102_open,
3237         .release = sn9c102_release,
3238         .ioctl = sn9c102_ioctl,
3239         .read = sn9c102_read,
3240         .poll = sn9c102_poll,
3241         .mmap = sn9c102_mmap,
3242 };
3243
3244 /*****************************************************************************/
3245
3246 /* It exists a single interface only. We do not need to validate anything. */
3247 static int
3248 sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
3249 {
3250         struct usb_device *udev = interface_to_usbdev(intf);
3251         struct sn9c102_device* cam;
3252         static unsigned int dev_nr;
3253         unsigned int i;
3254         int err = 0, r;
3255
3256         if (!(cam = kzalloc(sizeof(struct sn9c102_device), GFP_KERNEL)))
3257                 return -ENOMEM;
3258
3259         cam->usbdev = udev;
3260
3261         if (!(cam->control_buffer = kzalloc(8, GFP_KERNEL))) {
3262                 DBG(1, "kzalloc() failed");
3263                 err = -ENOMEM;
3264                 goto fail;
3265         }
3266
3267         if (!(cam->v4ldev = video_device_alloc())) {
3268                 DBG(1, "video_device_alloc() failed");
3269                 err = -ENOMEM;
3270                 goto fail;
3271         }
3272
3273         r = sn9c102_read_reg(cam, 0x00);
3274         if (r < 0 || (r != 0x10 && r != 0x11 && r != 0x12)) {
3275                 DBG(1, "Sorry, this is not a SN9C1xx-based camera "
3276                        "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3277                 err = -ENODEV;
3278                 goto fail;
3279         }
3280
3281         cam->bridge = id->driver_info;
3282         switch (cam->bridge) {
3283         case BRIDGE_SN9C101:
3284         case BRIDGE_SN9C102:
3285                 DBG(2, "SN9C10[12] PC Camera Controller detected "
3286                        "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3287                 break;
3288         case BRIDGE_SN9C103:
3289                 DBG(2, "SN9C103 PC Camera Controller detected "
3290                        "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3291                 break;
3292         case BRIDGE_SN9C105:
3293                 DBG(2, "SN9C105 PC Camera Controller detected "
3294                        "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3295                 break;
3296         case BRIDGE_SN9C120:
3297                 DBG(2, "SN9C120 PC Camera Controller detected "
3298                        "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3299                 break;
3300         }
3301
3302         for  (i = 0; i < ARRAY_SIZE(sn9c102_sensor_table); i++) {
3303                 err = sn9c102_sensor_table[i](cam);
3304                 if (!err)
3305                         break;
3306         }
3307
3308         if (!err) {
3309                 DBG(2, "%s image sensor detected", cam->sensor.name);
3310                 DBG(3, "Support for %s maintained by %s",
3311                     cam->sensor.name, cam->sensor.maintainer);
3312         } else {
3313                 DBG(1, "No supported image sensor detected for this bridge");
3314                 err = -ENODEV;
3315                 goto fail;
3316         }
3317
3318         if (!(cam->bridge & cam->sensor.supported_bridge)) {
3319                 DBG(1, "Bridge not supported");
3320                 err = -ENODEV;
3321                 goto fail;
3322         }
3323
3324         if (sn9c102_init(cam)) {
3325                 DBG(1, "Initialization failed. I will retry on open().");
3326                 cam->state |= DEV_MISCONFIGURED;
3327         }
3328
3329         strcpy(cam->v4ldev->name, "SN9C1xx PC Camera");
3330         cam->v4ldev->fops = &sn9c102_fops;
3331         cam->v4ldev->minor = video_nr[dev_nr];
3332         cam->v4ldev->release = video_device_release;
3333         cam->v4ldev->parent = &udev->dev;
3334
3335         init_completion(&cam->probe);
3336
3337         err = video_register_device(cam->v4ldev, VFL_TYPE_GRABBER,
3338                                     video_nr[dev_nr]);
3339         if (err) {
3340                 DBG(1, "V4L2 device registration failed");
3341                 if (err == -ENFILE && video_nr[dev_nr] == -1)
3342                         DBG(1, "Free /dev/videoX node not found");
3343                 video_nr[dev_nr] = -1;
3344                 dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
3345                 complete_all(&cam->probe);
3346                 goto fail;
3347         }
3348
3349         DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->num);
3350
3351         video_set_drvdata(cam->v4ldev, cam);
3352         cam->module_param.force_munmap = force_munmap[dev_nr];
3353         cam->module_param.frame_timeout = frame_timeout[dev_nr];
3354
3355         dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
3356
3357 #ifdef CONFIG_VIDEO_ADV_DEBUG
3358         err = sn9c102_create_sysfs(cam);
3359         if (!err)
3360                 DBG(2, "Optional device control through 'sysfs' "
3361                        "interface ready");
3362         else
3363                 DBG(2, "Failed to create optional 'sysfs' interface for "
3364                        "device controlling. Error #%d", err);
3365 #else
3366         DBG(2, "Optional device control through 'sysfs' interface disabled");
3367         DBG(3, "Compile the kernel with the 'CONFIG_VIDEO_ADV_DEBUG' "
3368                "configuration option to enable it.");
3369 #endif
3370
3371         usb_set_intfdata(intf, cam);
3372         kref_init(&cam->kref);
3373         usb_get_dev(cam->usbdev);
3374
3375         complete_all(&cam->probe);
3376
3377         return 0;
3378
3379 fail:
3380         if (cam) {
3381                 kfree(cam->control_buffer);
3382                 if (cam->v4ldev)
3383                         video_device_release(cam->v4ldev);
3384                 kfree(cam);
3385         }
3386         return err;
3387 }
3388
3389
3390 static void sn9c102_usb_disconnect(struct usb_interface* intf)
3391 {
3392         struct sn9c102_device* cam;
3393
3394         down_write(&sn9c102_dev_lock);
3395
3396         cam = usb_get_intfdata(intf);
3397
3398         DBG(2, "Disconnecting %s...", cam->v4ldev->name);
3399
3400         if (cam->users) {
3401                 DBG(2, "Device /dev/video%d is open! Deregistration and "
3402                        "memory deallocation are deferred.",
3403                     cam->v4ldev->num);
3404                 cam->state |= DEV_MISCONFIGURED;
3405                 sn9c102_stop_transfer(cam);
3406                 cam->state |= DEV_DISCONNECTED;
3407                 wake_up_interruptible(&cam->wait_frame);
3408                 wake_up(&cam->wait_stream);
3409         } else
3410                 cam->state |= DEV_DISCONNECTED;
3411
3412         wake_up_interruptible_all(&cam->wait_open);
3413
3414         kref_put(&cam->kref, sn9c102_release_resources);
3415
3416         up_write(&sn9c102_dev_lock);
3417 }
3418
3419
3420 static struct usb_driver sn9c102_usb_driver = {
3421         .name =       "sn9c102",
3422         .id_table =   sn9c102_id_table,
3423         .probe =      sn9c102_usb_probe,
3424         .disconnect = sn9c102_usb_disconnect,
3425 };
3426
3427 /*****************************************************************************/
3428
3429 static int __init sn9c102_module_init(void)
3430 {
3431         int err = 0;
3432
3433         KDBG(2, SN9C102_MODULE_NAME " v" SN9C102_MODULE_VERSION);
3434         KDBG(3, SN9C102_MODULE_AUTHOR);
3435
3436         if ((err = usb_register(&sn9c102_usb_driver)))
3437                 KDBG(1, "usb_register() failed");
3438
3439         return err;
3440 }
3441
3442
3443 static void __exit sn9c102_module_exit(void)
3444 {
3445         usb_deregister(&sn9c102_usb_driver);
3446 }
3447
3448
3449 module_init(sn9c102_module_init);
3450 module_exit(sn9c102_module_exit);