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