iwlwifi: Fix TKIP update key and get_free_ucode_key
[linux/fpc-iii.git] / drivers / media / video / sn9c102 / sn9c102_core.c
blobc40ba3adab21ccc24ff8ab27a3f6ffeef1bb04a1
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 ***************************************************************************/
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 <linux/byteorder/generic.h>
38 #include <asm/page.h>
39 #include <asm/uaccess.h>
41 #include "sn9c102.h"
43 /*****************************************************************************/
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)
53 /*****************************************************************************/
55 MODULE_DEVICE_TABLE(usb, sn9c102_id_table);
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);
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");
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");
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");
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
119 /*****************************************************************************/
121 static u32
122 sn9c102_request_buffers(struct sn9c102_device* cam, u32 count,
123 enum sn9c102_io_method io)
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;
133 if (count > SN9C102_MAX_FRAMES)
134 count = SN9C102_MAX_FRAMES;
136 if (cam->bridge == BRIDGE_SN9C105 || cam->bridge == BRIDGE_SN9C120)
137 imagesize += 589 + 2; /* length of JPEG header + EOI marker */
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--;
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;
159 return cam->nbuffers;
163 static void sn9c102_release_buffers(struct sn9c102_device* cam)
165 if (cam->nbuffers) {
166 vfree(cam->frame[0].bufmem);
167 cam->nbuffers = 0;
169 cam->frame_current = NULL;
173 static void sn9c102_empty_framequeues(struct sn9c102_device* cam)
175 u32 i;
177 INIT_LIST_HEAD(&cam->inqueue);
178 INIT_LIST_HEAD(&cam->outqueue);
180 for (i = 0; i < SN9C102_MAX_FRAMES; i++) {
181 cam->frame[i].state = F_UNUSED;
182 cam->frame[i].buf.bytesused = 0;
187 static void sn9c102_requeue_outqueue(struct sn9c102_device* cam)
189 struct sn9c102_frame_t *i;
191 list_for_each_entry(i, &cam->outqueue, frame) {
192 i->state = F_QUEUED;
193 list_add(&i->frame, &cam->inqueue);
196 INIT_LIST_HEAD(&cam->outqueue);
200 static void sn9c102_queue_unusedframes(struct sn9c102_device* cam)
202 unsigned long lock_flags;
203 u32 i;
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);
214 /*****************************************************************************/
217 Write a sequence of count value/register pairs. Returns -1 after the first
218 failed write, or 0 for no errors.
220 int sn9c102_write_regs(struct sn9c102_device* cam, const u8 valreg[][2],
221 int count)
223 struct usb_device* udev = cam->usbdev;
224 u8* buff = cam->control_buffer;
225 int i, res;
227 for (i = 0; i < count; i++) {
228 u8 index = valreg[i][1];
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.
237 *buff = valreg[i][0];
239 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08,
240 0x41, index, 0, buff, 1,
241 SN9C102_CTRL_TIMEOUT);
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;
249 cam->reg[index] = *buff;
252 return 0;
256 int sn9c102_write_reg(struct sn9c102_device* cam, u8 value, u16 index)
258 struct usb_device* udev = cam->usbdev;
259 u8* buff = cam->control_buffer;
260 int res;
262 if (index >= ARRAY_SIZE(cam->reg))
263 return -1;
265 *buff = value;
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;
275 cam->reg[index] = value;
277 return 0;
281 /* NOTE: with the SN9C10[123] reading some registers always returns 0 */
282 int sn9c102_read_reg(struct sn9c102_device* cam, u16 index)
284 struct usb_device* udev = cam->usbdev;
285 u8* buff = cam->control_buffer;
286 int res;
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);
294 return (res >= 0) ? (int)(*buff) : -1;
298 int sn9c102_pread_reg(struct sn9c102_device* cam, u16 index)
300 if (index >= ARRAY_SIZE(cam->reg))
301 return -1;
303 return cam->reg[index];
307 static int
308 sn9c102_i2c_wait(struct sn9c102_device* cam,
309 const struct sn9c102_sensor* sensor)
311 int i, r;
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);
324 return -EBUSY;
328 static int
329 sn9c102_i2c_detect_read_error(struct sn9c102_device* cam,
330 const struct sn9c102_sensor* sensor)
332 int r , err = 0;
334 r = sn9c102_read_reg(cam, 0x08);
335 if (r < 0)
336 err += r;
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;
346 return err ? -EIO : 0;
350 static int
351 sn9c102_i2c_detect_write_error(struct sn9c102_device* cam,
352 const struct sn9c102_sensor* sensor)
354 int r;
355 r = sn9c102_read_reg(cam, 0x08);
356 return (r < 0 || (r >= 0 && (r & 0x08))) ? -EIO : 0;
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[])
365 struct usb_device* udev = cam->usbdev;
366 u8* data = cam->control_buffer;
367 int i = 0, err = 0, res;
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;
380 err += sn9c102_i2c_wait(cam, sensor);
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;
393 err += sn9c102_i2c_wait(cam, sensor);
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;
401 err += sn9c102_i2c_detect_read_error(cam, sensor);
403 PDBGG("I2C read: address 0x%02X, first read byte: 0x%02X", data1,
404 data[4]);
406 if (err) {
407 DBG(3, "I2C read failed for %s image sensor", sensor->name);
408 return -1;
411 if (buffer)
412 for (i = 0; i < n && i < 5; i++)
413 buffer[n-i-1] = data[4-i];
415 return (int)data[4];
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)
424 struct usb_device* udev = cam->usbdev;
425 u8* data = cam->control_buffer;
426 int err = 0, res;
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;
444 err += sn9c102_i2c_wait(cam, sensor);
445 err += sn9c102_i2c_detect_write_error(cam, sensor);
447 if (err)
448 DBG(3, "I2C write failed for %s image sensor", sensor->name);
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);
454 return err ? -1 : 0;
459 sn9c102_i2c_try_read(struct sn9c102_device* cam,
460 const struct sn9c102_sensor* sensor, u8 address)
462 return sn9c102_i2c_try_raw_read(cam, sensor, sensor->i2c_slave_id,
463 address, 1, NULL);
468 sn9c102_i2c_try_write(struct sn9c102_device* cam,
469 const struct sn9c102_sensor* sensor, u8 address, u8 value)
471 return sn9c102_i2c_try_raw_write(cam, sensor, 3,
472 sensor->i2c_slave_id, address,
473 value, 0, 0, 0);
477 int sn9c102_i2c_read(struct sn9c102_device* cam, u8 address)
479 return sn9c102_i2c_try_read(cam, &cam->sensor, address);
483 int sn9c102_i2c_write(struct sn9c102_device* cam, u8 address, u8 value)
485 return sn9c102_i2c_try_write(cam, &cam->sensor, address, value);
488 /*****************************************************************************/
490 static size_t sn9c102_sof_length(struct sn9c102_device* cam)
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;
503 return 0;
507 static void*
508 sn9c102_find_sof_header(struct sn9c102_device* cam, void* mem, size_t len)
510 static const char marker[6] = {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96};
511 const char *m = mem;
512 size_t soflen = 0, i, j;
514 soflen = sn9c102_sof_length(cam);
516 for (i = 0; i < len; i++) {
517 size_t b;
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;
526 continue;
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;
541 } else {
542 cam->sof.bytesread = 0;
543 break;
548 return NULL;
552 static void*
553 sn9c102_find_eof_header(struct sn9c102_device* cam, void* mem, size_t len)
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},
561 size_t i, j;
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;
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.
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;
578 return NULL;
582 static void
583 sn9c102_write_jpegheader(struct sn9c102_device* cam, struct sn9c102_frame_t* f)
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
646 u8 *pos = f->bufmem;
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);
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;
664 f->buf.bytesused += sizeof(jpeg_header);
668 static void sn9c102_urb_complete(struct urb *urb)
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;
676 if (urb->status == -ENOENT)
677 return;
679 f = &cam->frame_current;
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);
690 if (cam->state & DEV_DISCONNECTED)
691 return;
693 if (cam->state & DEV_MISCONFIGURED) {
694 wake_up_interruptible(&cam->wait_frame);
695 return;
698 if (cam->stream == STREAM_OFF || list_empty(&cam->inqueue))
699 goto resubmit_urb;
701 if (!(*f))
702 (*f) = list_entry(cam->inqueue.next, struct sn9c102_frame_t,
703 frame);
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);
712 for (i = 0; i < urb->number_of_packets; i++) {
713 unsigned int img, len, status;
714 void *pos, *sof, *eof;
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;
720 if (status) {
721 DBG(3, "Error in isochronous frame");
722 (*f)->state = F_ERROR;
723 cam->sof.bytesread = 0;
724 continue;
727 PDBGG("Isochrnous frame: length %u, #%u i", len, i);
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;
737 if (eof)
738 img = (eof > pos) ? eof - pos - 1 : 0;
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));
752 memcpy((*f)->bufmem + (*f)->buf.bytesused, pos,
753 img);
755 if ((*f)->buf.bytesused == 0)
756 do_gettimeofday(&(*f)->buf.timestamp);
758 (*f)->buf.bytesused += img;
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;
767 b = (*f)->buf.bytesused;
768 (*f)->state = F_DONE;
769 (*f)->buf.sequence= ++cam->frame_count;
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);
783 memcpy(cam->sysfs.frame_header,
784 cam->sof.header, soflen);
786 DBG(3, "Video frame captured: %lu "
787 "bytes", (unsigned long)(b));
789 if (!(*f))
790 goto resubmit_urb;
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));
800 if (sof) /* (1) */
801 goto start_of_frame;
803 } else if (eof) {
804 DBG(3, "EOF without SOF");
805 continue;
807 } else {
808 PDBGG("Ignoring pointless isochronous frame");
809 continue;
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;
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));
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;
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");
861 wake_up_interruptible(&cam->wait_frame);
865 static int sn9c102_start_transfer(struct sn9c102_device* cam)
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;
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;
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;
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;
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;
920 err = usb_set_interface(udev, 0, SN9C102_ALTERNATE_SETTING);
921 if (err) {
922 DBG(1, "usb_set_interface() failed");
923 goto free_urbs;
926 cam->frame_current = NULL;
927 cam->sof.bytesread = 0;
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;
939 return 0;
941 free_urbs:
942 for (i = 0; (i < SN9C102_URBS) && cam->urb[i]; i++)
943 usb_free_urb(cam->urb[i]);
945 free_buffers:
946 for (i = 0; (i < SN9C102_URBS) && cam->transfer_buffer[i]; i++)
947 kfree(cam->transfer_buffer[i]);
949 return err;
953 static int sn9c102_stop_transfer(struct sn9c102_device* cam)
955 struct usb_device *udev = cam->usbdev;
956 s8 i;
957 int err = 0;
959 if (cam->state & DEV_DISCONNECTED)
960 return 0;
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]);
968 err = usb_set_interface(udev, 0, 0); /* 0 Mb/s */
969 if (err)
970 DBG(3, "usb_set_interface() failed");
972 return err;
976 static int sn9c102_stream_interrupt(struct sn9c102_device* cam)
978 long timeout;
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;
995 return 0;
998 /*****************************************************************************/
1000 #ifdef CONFIG_VIDEO_ADV_DEBUG
1001 static u16 sn9c102_strtou16(const char* buff, size_t len, ssize_t* count)
1003 char str[7];
1004 char* endp;
1005 unsigned long val;
1007 if (len < 6) {
1008 strncpy(str, buff, len);
1009 str[len] = '\0';
1010 } else {
1011 strncpy(str, buff, 6);
1012 str[6] = '\0';
1015 val = simple_strtoul(str, &endp, 0);
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;
1023 return (u16)val;
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
1032 static ssize_t sn9c102_show_reg(struct device* cd,
1033 struct device_attribute *attr, char* buf)
1035 struct sn9c102_device* cam;
1036 ssize_t count;
1038 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1039 return -ERESTARTSYS;
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;
1048 count = sprintf(buf, "%u\n", cam->sysfs.reg);
1050 mutex_unlock(&sn9c102_sysfs_lock);
1052 return count;
1056 static ssize_t
1057 sn9c102_store_reg(struct device* cd, struct device_attribute *attr,
1058 const char* buf, size_t len)
1060 struct sn9c102_device* cam;
1061 u16 index;
1062 ssize_t count;
1064 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1065 return -ERESTARTSYS;
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;
1074 index = sn9c102_strtou16(buf, len, &count);
1075 if (index >= ARRAY_SIZE(cam->reg) || !count) {
1076 mutex_unlock(&sn9c102_sysfs_lock);
1077 return -EINVAL;
1080 cam->sysfs.reg = index;
1082 DBG(2, "Moved SN9C1XX register index to 0x%02X", cam->sysfs.reg);
1083 DBG(3, "Written bytes: %zd", count);
1085 mutex_unlock(&sn9c102_sysfs_lock);
1087 return count;
1091 static ssize_t sn9c102_show_val(struct device* cd,
1092 struct device_attribute *attr, char* buf)
1094 struct sn9c102_device* cam;
1095 ssize_t count;
1096 int val;
1098 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1099 return -ERESTARTSYS;
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;
1108 if ((val = sn9c102_read_reg(cam, cam->sysfs.reg)) < 0) {
1109 mutex_unlock(&sn9c102_sysfs_lock);
1110 return -EIO;
1113 count = sprintf(buf, "%d\n", val);
1115 DBG(3, "Read bytes: %zd, value: %d", count, val);
1117 mutex_unlock(&sn9c102_sysfs_lock);
1119 return count;
1123 static ssize_t
1124 sn9c102_store_val(struct device* cd, struct device_attribute *attr,
1125 const char* buf, size_t len)
1127 struct sn9c102_device* cam;
1128 u16 value;
1129 ssize_t count;
1130 int err;
1132 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1133 return -ERESTARTSYS;
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;
1142 value = sn9c102_strtou16(buf, len, &count);
1143 if (!count) {
1144 mutex_unlock(&sn9c102_sysfs_lock);
1145 return -EINVAL;
1148 err = sn9c102_write_reg(cam, value, cam->sysfs.reg);
1149 if (err) {
1150 mutex_unlock(&sn9c102_sysfs_lock);
1151 return -EIO;
1154 DBG(2, "Written SN9C1XX reg. 0x%02X, val. 0x%02X",
1155 cam->sysfs.reg, value);
1156 DBG(3, "Written bytes: %zd", count);
1158 mutex_unlock(&sn9c102_sysfs_lock);
1160 return count;
1164 static ssize_t sn9c102_show_i2c_reg(struct device* cd,
1165 struct device_attribute *attr, char* buf)
1167 struct sn9c102_device* cam;
1168 ssize_t count;
1170 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1171 return -ERESTARTSYS;
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;
1180 count = sprintf(buf, "%u\n", cam->sysfs.i2c_reg);
1182 DBG(3, "Read bytes: %zd", count);
1184 mutex_unlock(&sn9c102_sysfs_lock);
1186 return count;
1190 static ssize_t
1191 sn9c102_store_i2c_reg(struct device* cd, struct device_attribute *attr,
1192 const char* buf, size_t len)
1194 struct sn9c102_device* cam;
1195 u16 index;
1196 ssize_t count;
1198 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1199 return -ERESTARTSYS;
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;
1208 index = sn9c102_strtou16(buf, len, &count);
1209 if (!count) {
1210 mutex_unlock(&sn9c102_sysfs_lock);
1211 return -EINVAL;
1214 cam->sysfs.i2c_reg = index;
1216 DBG(2, "Moved sensor register index to 0x%02X", cam->sysfs.i2c_reg);
1217 DBG(3, "Written bytes: %zd", count);
1219 mutex_unlock(&sn9c102_sysfs_lock);
1221 return count;
1225 static ssize_t sn9c102_show_i2c_val(struct device* cd,
1226 struct device_attribute *attr, char* buf)
1228 struct sn9c102_device* cam;
1229 ssize_t count;
1230 int val;
1232 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1233 return -ERESTARTSYS;
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;
1242 if (!(cam->sensor.sysfs_ops & SN9C102_I2C_READ)) {
1243 mutex_unlock(&sn9c102_sysfs_lock);
1244 return -ENOSYS;
1247 if ((val = sn9c102_i2c_read(cam, cam->sysfs.i2c_reg)) < 0) {
1248 mutex_unlock(&sn9c102_sysfs_lock);
1249 return -EIO;
1252 count = sprintf(buf, "%d\n", val);
1254 DBG(3, "Read bytes: %zd, value: %d", count, val);
1256 mutex_unlock(&sn9c102_sysfs_lock);
1258 return count;
1262 static ssize_t
1263 sn9c102_store_i2c_val(struct device* cd, struct device_attribute *attr,
1264 const char* buf, size_t len)
1266 struct sn9c102_device* cam;
1267 u16 value;
1268 ssize_t count;
1269 int err;
1271 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1272 return -ERESTARTSYS;
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;
1281 if (!(cam->sensor.sysfs_ops & SN9C102_I2C_WRITE)) {
1282 mutex_unlock(&sn9c102_sysfs_lock);
1283 return -ENOSYS;
1286 value = sn9c102_strtou16(buf, len, &count);
1287 if (!count) {
1288 mutex_unlock(&sn9c102_sysfs_lock);
1289 return -EINVAL;
1292 err = sn9c102_i2c_write(cam, cam->sysfs.i2c_reg, value);
1293 if (err) {
1294 mutex_unlock(&sn9c102_sysfs_lock);
1295 return -EIO;
1298 DBG(2, "Written sensor reg. 0x%02X, val. 0x%02X",
1299 cam->sysfs.i2c_reg, value);
1300 DBG(3, "Written bytes: %zd", count);
1302 mutex_unlock(&sn9c102_sysfs_lock);
1304 return count;
1308 static ssize_t
1309 sn9c102_store_green(struct device* cd, struct device_attribute *attr,
1310 const char* buf, size_t len)
1312 struct sn9c102_device* cam;
1313 enum sn9c102_bridge bridge;
1314 ssize_t res = 0;
1315 u16 value;
1316 ssize_t count;
1318 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1319 return -ERESTARTSYS;
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;
1328 bridge = cam->bridge;
1330 mutex_unlock(&sn9c102_sysfs_lock);
1332 value = sn9c102_strtou16(buf, len, &count);
1333 if (!count)
1334 return -EINVAL;
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;
1354 return res;
1358 static ssize_t
1359 sn9c102_store_blue(struct device* cd, struct device_attribute *attr,
1360 const char* buf, size_t len)
1362 ssize_t res = 0;
1363 u16 value;
1364 ssize_t count;
1366 value = sn9c102_strtou16(buf, len, &count);
1367 if (!count || value > 0x7f)
1368 return -EINVAL;
1370 if ((res = sn9c102_store_reg(cd, attr, "0x06", 4)) >= 0)
1371 res = sn9c102_store_val(cd, attr, buf, len);
1373 return res;
1377 static ssize_t
1378 sn9c102_store_red(struct device* cd, struct device_attribute *attr,
1379 const char* buf, size_t len)
1381 ssize_t res = 0;
1382 u16 value;
1383 ssize_t count;
1385 value = sn9c102_strtou16(buf, len, &count);
1386 if (!count || value > 0x7f)
1387 return -EINVAL;
1389 if ((res = sn9c102_store_reg(cd, attr, "0x05", 4)) >= 0)
1390 res = sn9c102_store_val(cd, attr, buf, len);
1392 return res;
1396 static ssize_t sn9c102_show_frame_header(struct device* cd,
1397 struct device_attribute *attr,
1398 char* buf)
1400 struct sn9c102_device* cam;
1401 ssize_t count;
1403 cam = video_get_drvdata(container_of(cd, struct video_device,
1404 class_dev));
1405 if (!cam)
1406 return -ENODEV;
1408 count = sizeof(cam->sysfs.frame_header);
1409 memcpy(buf, cam->sysfs.frame_header, count);
1411 DBG(3, "Frame header, read bytes: %zd", count);
1413 return count;
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);
1429 static int sn9c102_create_sysfs(struct sn9c102_device* cam)
1431 struct device *classdev = &(cam->v4ldev->class_dev);
1432 int err = 0;
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;
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;
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;
1458 return 0;
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;
1477 #endif /* CONFIG_VIDEO_ADV_DEBUG */
1479 /*****************************************************************************/
1481 static int
1482 sn9c102_set_pix_format(struct sn9c102_device* cam, struct v4l2_pix_format* pix)
1484 int err = 0;
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;
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;
1517 return err ? -EIO : 0;
1521 static int
1522 sn9c102_set_compression(struct sn9c102_device* cam,
1523 struct v4l2_jpegcompression* compression)
1525 int i, err = 0;
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);
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);
1560 err += sn9c102_write_reg(cam, cam->reg[0x18] | 0x40,
1561 0x18);
1563 break;
1566 return err ? -EIO : 0;
1570 static int sn9c102_set_scale(struct sn9c102_device* cam, u8 scale)
1572 u8 r = 0;
1573 int err = 0;
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;
1583 err += sn9c102_write_reg(cam, r, 0x18);
1584 if (err)
1585 return -EIO;
1587 PDBGG("Scaling factor: %u", scale);
1589 return 0;
1593 static int sn9c102_set_crop(struct sn9c102_device* cam, struct v4l2_rect* rect)
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;
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;
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);
1612 return 0;
1616 static int sn9c102_init(struct sn9c102_device* cam)
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;
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);
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;
1640 if (s->init) {
1641 err = s->init(cam);
1642 if (err) {
1643 DBG(3, "Sensor initialization failed");
1644 return err;
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);
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;
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");
1678 if (s->set_crop)
1679 if ((err = s->set_crop(cam, rect))) {
1680 DBG(3, "set_crop() failed");
1681 return err;
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;
1696 DBG(3, "Image sensor supports '%s' control",
1697 s->qctrl[i].name);
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;
1713 DBG(2, "Initialization succeeded");
1714 return 0;
1717 /*****************************************************************************/
1719 static void sn9c102_release_resources(struct kref *kref)
1721 struct sn9c102_device *cam;
1723 mutex_lock(&sn9c102_sysfs_lock);
1725 cam = container_of(kref, struct sn9c102_device, kref);
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);
1734 mutex_unlock(&sn9c102_sysfs_lock);
1739 static int sn9c102_open(struct inode* inode, struct file* filp)
1741 struct sn9c102_device* cam;
1742 int err = 0;
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.
1756 if (!down_read_trylock(&sn9c102_dev_lock))
1757 return -ERESTARTSYS;
1759 cam = video_get_drvdata(video_devdata(filp));
1761 if (wait_for_completion_interruptible(&cam->probe)) {
1762 up_read(&sn9c102_dev_lock);
1763 return -ERESTARTSYS;
1766 kref_get(&cam->kref);
1769 Make sure to isolate all the simultaneous opens.
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;
1777 if (cam->state & DEV_DISCONNECTED) {
1778 DBG(1, "Device not present");
1779 err = -ENODEV;
1780 goto out;
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");
1788 open() must follow the open flags and should block
1789 eventually while the device is in use.
1791 if ((filp->f_flags & O_NONBLOCK) ||
1792 (filp->f_flags & O_NDELAY)) {
1793 err = -EWOULDBLOCK;
1794 goto out;
1796 DBG(2, "A blocking open() has been requested. Wait for the "
1797 "device to be released...");
1798 up_read(&sn9c102_dev_lock);
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().
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;
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;
1824 cam->state &= ~DEV_MISCONFIGURED;
1827 if ((err = sn9c102_start_transfer(cam)))
1828 goto out;
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);
1838 DBG(3, "Video device /dev/video%d is open", cam->v4ldev->minor);
1840 out:
1841 mutex_unlock(&cam->open_mutex);
1842 if (err)
1843 kref_put(&cam->kref, sn9c102_release_resources);
1845 up_read(&sn9c102_dev_lock);
1846 return err;
1850 static int sn9c102_release(struct inode* inode, struct file* filp)
1852 struct sn9c102_device* cam;
1854 down_write(&sn9c102_dev_lock);
1856 cam = video_get_drvdata(video_devdata(filp));
1858 sn9c102_stop_transfer(cam);
1859 sn9c102_release_buffers(cam);
1860 cam->users--;
1861 wake_up_interruptible_nr(&cam->wait_open, 1);
1863 DBG(3, "Video device /dev/video%d closed", cam->v4ldev->minor);
1865 kref_put(&cam->kref, sn9c102_release_resources);
1867 up_write(&sn9c102_dev_lock);
1869 return 0;
1873 static ssize_t
1874 sn9c102_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos)
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;
1882 if (mutex_lock_interruptible(&cam->fileop_mutex))
1883 return -ERESTARTSYS;
1885 if (cam->state & DEV_DISCONNECTED) {
1886 DBG(1, "Device not present");
1887 mutex_unlock(&cam->fileop_mutex);
1888 return -ENODEV;
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;
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;
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;
1911 cam->io = IO_READ;
1912 cam->stream = STREAM_ON;
1915 if (list_empty(&cam->inqueue)) {
1916 if (!list_empty(&cam->outqueue))
1917 sn9c102_empty_framequeues(cam);
1918 sn9c102_queue_unusedframes(cam);
1921 if (!count) {
1922 mutex_unlock(&cam->fileop_mutex);
1923 return 0;
1926 if (list_empty(&cam->outqueue)) {
1927 if (filp->f_flags & O_NONBLOCK) {
1928 mutex_unlock(&cam->fileop_mutex);
1929 return -EAGAIN;
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;
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;
1959 if (cam->state & DEV_DISCONNECTED) {
1960 mutex_unlock(&cam->fileop_mutex);
1961 return -ENODEV;
1963 if (cam->state & DEV_MISCONFIGURED) {
1964 mutex_unlock(&cam->fileop_mutex);
1965 return -EIO;
1969 f = list_entry(cam->outqueue.prev, struct sn9c102_frame_t, frame);
1971 if (count > f->buf.bytesused)
1972 count = f->buf.bytesused;
1974 if (copy_to_user(buf, f->bufmem, count)) {
1975 err = -EFAULT;
1976 goto exit;
1978 *f_pos += count;
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);
1987 sn9c102_queue_unusedframes(cam);
1989 PDBGG("Frame #%lu, bytes read: %zu",
1990 (unsigned long)f->buf.index, count);
1992 mutex_unlock(&cam->fileop_mutex);
1994 return count;
1998 static unsigned int sn9c102_poll(struct file *filp, poll_table *wait)
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;
2005 if (mutex_lock_interruptible(&cam->fileop_mutex))
2006 return POLLERR;
2008 if (cam->state & DEV_DISCONNECTED) {
2009 DBG(1, "Device not present");
2010 goto error;
2013 if (cam->state & DEV_MISCONFIGURED) {
2014 DBG(1, "The camera is misconfigured. Close and open it "
2015 "again.");
2016 goto error;
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;
2025 cam->io = IO_READ;
2026 cam->stream = STREAM_ON;
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);
2038 poll_wait(filp, &cam->wait_frame, wait);
2040 if (!list_empty(&cam->outqueue))
2041 mask |= POLLIN | POLLRDNORM;
2043 mutex_unlock(&cam->fileop_mutex);
2045 return mask;
2047 error:
2048 mutex_unlock(&cam->fileop_mutex);
2049 return POLLERR;
2053 static void sn9c102_vm_open(struct vm_area_struct* vma)
2055 struct sn9c102_frame_t* f = vma->vm_private_data;
2056 f->vma_use_count++;
2060 static void sn9c102_vm_close(struct vm_area_struct* vma)
2062 /* NOTE: buffers are not freed here */
2063 struct sn9c102_frame_t* f = vma->vm_private_data;
2064 f->vma_use_count--;
2068 static struct vm_operations_struct sn9c102_vm_ops = {
2069 .open = sn9c102_vm_open,
2070 .close = sn9c102_vm_close,
2074 static int sn9c102_mmap(struct file* filp, struct vm_area_struct *vma)
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;
2082 if (mutex_lock_interruptible(&cam->fileop_mutex))
2083 return -ERESTARTSYS;
2085 if (cam->state & DEV_DISCONNECTED) {
2086 DBG(1, "Device not present");
2087 mutex_unlock(&cam->fileop_mutex);
2088 return -ENODEV;
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;
2098 if (!(vma->vm_flags & (VM_WRITE | VM_READ))) {
2099 mutex_unlock(&cam->fileop_mutex);
2100 return -EACCES;
2103 if (cam->io != IO_MMAP ||
2104 size != PAGE_ALIGN(cam->frame[0].buf.length)) {
2105 mutex_unlock(&cam->fileop_mutex);
2106 return -EINVAL;
2109 for (i = 0; i < cam->nbuffers; i++) {
2110 if ((cam->frame[i].buf.m.offset>>PAGE_SHIFT) == vma->vm_pgoff)
2111 break;
2113 if (i == cam->nbuffers) {
2114 mutex_unlock(&cam->fileop_mutex);
2115 return -EINVAL;
2118 vma->vm_flags |= VM_IO;
2119 vma->vm_flags |= VM_RESERVED;
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;
2127 start += PAGE_SIZE;
2128 pos += PAGE_SIZE;
2129 size -= PAGE_SIZE;
2132 vma->vm_ops = &sn9c102_vm_ops;
2133 vma->vm_private_data = &cam->frame[i];
2134 sn9c102_vm_open(vma);
2136 mutex_unlock(&cam->fileop_mutex);
2138 return 0;
2141 /*****************************************************************************/
2143 static int
2144 sn9c102_vidioc_querycap(struct sn9c102_device* cam, void __user * arg)
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,
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));
2158 if (copy_to_user(arg, &cap, sizeof(cap)))
2159 return -EFAULT;
2161 return 0;
2165 static int
2166 sn9c102_vidioc_enuminput(struct sn9c102_device* cam, void __user * arg)
2168 struct v4l2_input i;
2170 if (copy_from_user(&i, arg, sizeof(i)))
2171 return -EFAULT;
2173 if (i.index)
2174 return -EINVAL;
2176 memset(&i, 0, sizeof(i));
2177 strcpy(i.name, "Camera");
2178 i.type = V4L2_INPUT_TYPE_CAMERA;
2180 if (copy_to_user(arg, &i, sizeof(i)))
2181 return -EFAULT;
2183 return 0;
2187 static int
2188 sn9c102_vidioc_g_input(struct sn9c102_device* cam, void __user * arg)
2190 int index = 0;
2192 if (copy_to_user(arg, &index, sizeof(index)))
2193 return -EFAULT;
2195 return 0;
2199 static int
2200 sn9c102_vidioc_s_input(struct sn9c102_device* cam, void __user * arg)
2202 int index;
2204 if (copy_from_user(&index, arg, sizeof(index)))
2205 return -EFAULT;
2207 if (index != 0)
2208 return -EINVAL;
2210 return 0;
2214 static int
2215 sn9c102_vidioc_query_ctrl(struct sn9c102_device* cam, void __user * arg)
2217 struct sn9c102_sensor* s = &cam->sensor;
2218 struct v4l2_queryctrl qc;
2219 u8 i;
2221 if (copy_from_user(&qc, arg, sizeof(qc)))
2222 return -EFAULT;
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;
2232 return -EINVAL;
2236 static int
2237 sn9c102_vidioc_g_ctrl(struct sn9c102_device* cam, void __user * arg)
2239 struct sn9c102_sensor* s = &cam->sensor;
2240 struct v4l2_control ctrl;
2241 int err = 0;
2242 u8 i;
2244 if (!s->get_ctrl && !s->set_ctrl)
2245 return -EINVAL;
2247 if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
2248 return -EFAULT;
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;
2256 return -EINVAL;
2257 } else
2258 err = s->get_ctrl(cam, &ctrl);
2260 exit:
2261 if (copy_to_user(arg, &ctrl, sizeof(ctrl)))
2262 return -EFAULT;
2264 PDBGG("VIDIOC_G_CTRL: id %lu, value %lu",
2265 (unsigned long)ctrl.id, (unsigned long)ctrl.value);
2267 return err;
2271 static int
2272 sn9c102_vidioc_s_ctrl(struct sn9c102_device* cam, void __user * arg)
2274 struct sn9c102_sensor* s = &cam->sensor;
2275 struct v4l2_control ctrl;
2276 u8 i;
2277 int err = 0;
2279 if (!s->set_ctrl)
2280 return -EINVAL;
2282 if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
2283 return -EFAULT;
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;
2296 if ((err = s->set_ctrl(cam, &ctrl)))
2297 return err;
2299 s->_qctrl[i].default_value = ctrl.value;
2301 PDBGG("VIDIOC_S_CTRL: id %lu, value %lu",
2302 (unsigned long)ctrl.id, (unsigned long)ctrl.value);
2304 return 0;
2308 static int
2309 sn9c102_vidioc_cropcap(struct sn9c102_device* cam, void __user * arg)
2311 struct v4l2_cropcap* cc = &(cam->sensor.cropcap);
2313 cc->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2314 cc->pixelaspect.numerator = 1;
2315 cc->pixelaspect.denominator = 1;
2317 if (copy_to_user(arg, cc, sizeof(*cc)))
2318 return -EFAULT;
2320 return 0;
2324 static int
2325 sn9c102_vidioc_g_crop(struct sn9c102_device* cam, void __user * arg)
2327 struct sn9c102_sensor* s = &cam->sensor;
2328 struct v4l2_crop crop = {
2329 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
2332 memcpy(&(crop.c), &(s->_rect), sizeof(struct v4l2_rect));
2334 if (copy_to_user(arg, &crop, sizeof(crop)))
2335 return -EFAULT;
2337 return 0;
2341 static int
2342 sn9c102_vidioc_s_crop(struct sn9c102_device* cam, void __user * arg)
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;
2355 if (copy_from_user(&crop, arg, sizeof(crop)))
2356 return -EFAULT;
2358 rect = &(crop.c);
2360 if (crop.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2361 return -EINVAL;
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;
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;
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;
2392 rect->width &= ~15L;
2393 rect->height &= ~15L;
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;
2404 if (cam->stream == STREAM_ON)
2405 if ((err = sn9c102_stream_interrupt(cam)))
2406 return err;
2408 if (copy_to_user(arg, &crop, sizeof(crop))) {
2409 cam->stream = stream;
2410 return -EFAULT;
2413 if (cam->module_param.force_munmap || cam->io == IO_READ)
2414 sn9c102_release_buffers(cam);
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);
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;
2429 s->pix_format.width = rect->width/scale;
2430 s->pix_format.height = rect->height/scale;
2431 memcpy(&(s->_rect), rect, sizeof(*rect));
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;
2442 if (cam->io == IO_READ)
2443 sn9c102_empty_framequeues(cam);
2444 else if (cam->module_param.force_munmap)
2445 sn9c102_requeue_outqueue(cam);
2447 cam->stream = stream;
2449 return 0;
2453 static int
2454 sn9c102_vidioc_enum_framesizes(struct sn9c102_device* cam, void __user * arg)
2456 struct v4l2_frmsizeenum frmsize;
2458 if (copy_from_user(&frmsize, arg, sizeof(frmsize)))
2459 return -EFAULT;
2461 if (frmsize.index != 0)
2462 return -EINVAL;
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;
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));
2485 if (copy_to_user(arg, &frmsize, sizeof(frmsize)))
2486 return -EFAULT;
2488 return 0;
2492 static int
2493 sn9c102_vidioc_enum_fmt(struct sn9c102_device* cam, void __user * arg)
2495 struct v4l2_fmtdesc fmtd;
2497 if (copy_from_user(&fmtd, arg, sizeof(fmtd)))
2498 return -EFAULT;
2500 if (fmtd.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2501 return -EINVAL;
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;
2520 fmtd.flags = V4L2_FMT_FLAG_COMPRESSED;
2521 } else
2522 return -EINVAL;
2524 fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2525 memset(&fmtd.reserved, 0, sizeof(fmtd.reserved));
2527 if (copy_to_user(arg, &fmtd, sizeof(fmtd)))
2528 return -EFAULT;
2530 return 0;
2534 static int
2535 sn9c102_vidioc_g_fmt(struct sn9c102_device* cam, void __user * arg)
2537 struct v4l2_format format;
2538 struct v4l2_pix_format* pfmt = &(cam->sensor.pix_format);
2540 if (copy_from_user(&format, arg, sizeof(format)))
2541 return -EFAULT;
2543 if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2544 return -EINVAL;
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));
2555 if (copy_to_user(arg, &format, sizeof(format)))
2556 return -EFAULT;
2558 return 0;
2562 static int
2563 sn9c102_vidioc_try_s_fmt(struct sn9c102_device* cam, unsigned int cmd,
2564 void __user * arg)
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;
2578 if (copy_from_user(&format, arg, sizeof(format)))
2579 return -EFAULT;
2581 pix = &(format.fmt.pix);
2583 if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2584 return -EINVAL;
2586 memcpy(&rect, &(s->_rect), sizeof(rect));
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;
2595 rect.width = scale * pix->width;
2596 rect.height = scale * pix->height;
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;
2607 rect.width &= ~15L;
2608 rect.height &= ~15L;
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;
2617 pix->width = rect.width / scale;
2618 pix->height = rect.height / scale;
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;
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;
2644 if (cmd == VIDIOC_TRY_FMT) {
2645 if (copy_to_user(arg, &format, sizeof(format)))
2646 return -EFAULT;
2647 return 0;
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;
2658 if (cam->stream == STREAM_ON)
2659 if ((err = sn9c102_stream_interrupt(cam)))
2660 return err;
2662 if (copy_to_user(arg, &format, sizeof(format))) {
2663 cam->stream = stream;
2664 return -EFAULT;
2667 if (cam->module_param.force_munmap || cam->io == IO_READ)
2668 sn9c102_release_buffers(cam);
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);
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;
2686 memcpy(pfmt, pix, sizeof(*pix));
2687 memcpy(&(s->_rect), &rect, sizeof(rect));
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;
2698 if (cam->io == IO_READ)
2699 sn9c102_empty_framequeues(cam);
2700 else if (cam->module_param.force_munmap)
2701 sn9c102_requeue_outqueue(cam);
2703 cam->stream = stream;
2705 return 0;
2709 static int
2710 sn9c102_vidioc_g_jpegcomp(struct sn9c102_device* cam, void __user * arg)
2712 if (copy_to_user(arg, &cam->compression, sizeof(cam->compression)))
2713 return -EFAULT;
2715 return 0;
2719 static int
2720 sn9c102_vidioc_s_jpegcomp(struct sn9c102_device* cam, void __user * arg)
2722 struct v4l2_jpegcompression jc;
2723 const enum sn9c102_stream_state stream = cam->stream;
2724 int err = 0;
2726 if (copy_from_user(&jc, arg, sizeof(jc)))
2727 return -EFAULT;
2729 if (jc.quality != 0 && jc.quality != 1)
2730 return -EINVAL;
2732 if (cam->stream == STREAM_ON)
2733 if ((err = sn9c102_stream_interrupt(cam)))
2734 return err;
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;
2745 cam->compression.quality = jc.quality;
2747 cam->stream = stream;
2749 return 0;
2753 static int
2754 sn9c102_vidioc_reqbufs(struct sn9c102_device* cam, void __user * arg)
2756 struct v4l2_requestbuffers rb;
2757 u32 i;
2758 int err;
2760 if (copy_from_user(&rb, arg, sizeof(rb)))
2761 return -EFAULT;
2763 if (rb.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2764 rb.memory != V4L2_MEMORY_MMAP)
2765 return -EINVAL;
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;
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;
2780 if (cam->stream == STREAM_ON)
2781 if ((err = sn9c102_stream_interrupt(cam)))
2782 return err;
2784 sn9c102_empty_framequeues(cam);
2786 sn9c102_release_buffers(cam);
2787 if (rb.count)
2788 rb.count = sn9c102_request_buffers(cam, rb.count, IO_MMAP);
2790 if (copy_to_user(arg, &rb, sizeof(rb))) {
2791 sn9c102_release_buffers(cam);
2792 cam->io = IO_NONE;
2793 return -EFAULT;
2796 cam->io = rb.count ? IO_MMAP : IO_NONE;
2798 return 0;
2802 static int
2803 sn9c102_vidioc_querybuf(struct sn9c102_device* cam, void __user * arg)
2805 struct v4l2_buffer b;
2807 if (copy_from_user(&b, arg, sizeof(b)))
2808 return -EFAULT;
2810 if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2811 b.index >= cam->nbuffers || cam->io != IO_MMAP)
2812 return -EINVAL;
2814 memcpy(&b, &cam->frame[b.index].buf, sizeof(b));
2816 if (cam->frame[b.index].vma_use_count)
2817 b.flags |= V4L2_BUF_FLAG_MAPPED;
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;
2824 if (copy_to_user(arg, &b, sizeof(b)))
2825 return -EFAULT;
2827 return 0;
2831 static int
2832 sn9c102_vidioc_qbuf(struct sn9c102_device* cam, void __user * arg)
2834 struct v4l2_buffer b;
2835 unsigned long lock_flags;
2837 if (copy_from_user(&b, arg, sizeof(b)))
2838 return -EFAULT;
2840 if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2841 b.index >= cam->nbuffers || cam->io != IO_MMAP)
2842 return -EINVAL;
2844 if (cam->frame[b.index].state != F_UNUSED)
2845 return -EINVAL;
2847 cam->frame[b.index].state = F_QUEUED;
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);
2853 PDBGG("Frame #%lu queued", (unsigned long)b.index);
2855 return 0;
2859 static int
2860 sn9c102_vidioc_dqbuf(struct sn9c102_device* cam, struct file* filp,
2861 void __user * arg)
2863 struct v4l2_buffer b;
2864 struct sn9c102_frame_t *f;
2865 unsigned long lock_flags;
2866 long timeout;
2867 int err = 0;
2869 if (copy_from_user(&b, arg, sizeof(b)))
2870 return -EFAULT;
2872 if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2873 return -EINVAL;
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;
2904 if (cam->state & DEV_DISCONNECTED)
2905 return -ENODEV;
2906 if (cam->state & DEV_MISCONFIGURED)
2907 return -EIO;
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);
2915 f->state = F_UNUSED;
2917 memcpy(&b, &f->buf, sizeof(b));
2918 if (f->vma_use_count)
2919 b.flags |= V4L2_BUF_FLAG_MAPPED;
2921 if (copy_to_user(arg, &b, sizeof(b)))
2922 return -EFAULT;
2924 PDBGG("Frame #%lu dequeued", (unsigned long)f->buf.index);
2926 return 0;
2930 static int
2931 sn9c102_vidioc_streamon(struct sn9c102_device* cam, void __user * arg)
2933 int type;
2935 if (copy_from_user(&type, arg, sizeof(type)))
2936 return -EFAULT;
2938 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2939 return -EINVAL;
2941 cam->stream = STREAM_ON;
2943 DBG(3, "Stream on");
2945 return 0;
2949 static int
2950 sn9c102_vidioc_streamoff(struct sn9c102_device* cam, void __user * arg)
2952 int type, err;
2954 if (copy_from_user(&type, arg, sizeof(type)))
2955 return -EFAULT;
2957 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2958 return -EINVAL;
2960 if (cam->stream == STREAM_ON)
2961 if ((err = sn9c102_stream_interrupt(cam)))
2962 return err;
2964 sn9c102_empty_framequeues(cam);
2966 DBG(3, "Stream off");
2968 return 0;
2972 static int
2973 sn9c102_vidioc_g_parm(struct sn9c102_device* cam, void __user * arg)
2975 struct v4l2_streamparm sp;
2977 if (copy_from_user(&sp, arg, sizeof(sp)))
2978 return -EFAULT;
2980 if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2981 return -EINVAL;
2983 sp.parm.capture.extendedmode = 0;
2984 sp.parm.capture.readbuffers = cam->nreadbuffers;
2986 if (copy_to_user(arg, &sp, sizeof(sp)))
2987 return -EFAULT;
2989 return 0;
2993 static int
2994 sn9c102_vidioc_s_parm(struct sn9c102_device* cam, void __user * arg)
2996 struct v4l2_streamparm sp;
2998 if (copy_from_user(&sp, arg, sizeof(sp)))
2999 return -EFAULT;
3001 if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
3002 return -EINVAL;
3004 sp.parm.capture.extendedmode = 0;
3006 if (sp.parm.capture.readbuffers == 0)
3007 sp.parm.capture.readbuffers = cam->nreadbuffers;
3009 if (sp.parm.capture.readbuffers > SN9C102_MAX_FRAMES)
3010 sp.parm.capture.readbuffers = SN9C102_MAX_FRAMES;
3012 if (copy_to_user(arg, &sp, sizeof(sp)))
3013 return -EFAULT;
3015 cam->nreadbuffers = sp.parm.capture.readbuffers;
3017 return 0;
3021 static int
3022 sn9c102_vidioc_enumaudio(struct sn9c102_device* cam, void __user * arg)
3024 struct v4l2_audio audio;
3026 if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
3027 return -EINVAL;
3029 if (copy_from_user(&audio, arg, sizeof(audio)))
3030 return -EFAULT;
3032 if (audio.index != 0)
3033 return -EINVAL;
3035 strcpy(audio.name, "Microphone");
3036 audio.capability = 0;
3037 audio.mode = 0;
3039 if (copy_to_user(arg, &audio, sizeof(audio)))
3040 return -EFAULT;
3042 return 0;
3046 static int
3047 sn9c102_vidioc_g_audio(struct sn9c102_device* cam, void __user * arg)
3049 struct v4l2_audio audio;
3051 if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
3052 return -EINVAL;
3054 if (copy_from_user(&audio, arg, sizeof(audio)))
3055 return -EFAULT;
3057 memset(&audio, 0, sizeof(audio));
3058 strcpy(audio.name, "Microphone");
3060 if (copy_to_user(arg, &audio, sizeof(audio)))
3061 return -EFAULT;
3063 return 0;
3067 static int
3068 sn9c102_vidioc_s_audio(struct sn9c102_device* cam, void __user * arg)
3070 struct v4l2_audio audio;
3072 if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
3073 return -EINVAL;
3075 if (copy_from_user(&audio, arg, sizeof(audio)))
3076 return -EFAULT;
3078 if (audio.index != 0)
3079 return -EINVAL;
3081 return 0;
3085 static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
3086 unsigned int cmd, void __user * arg)
3088 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
3090 switch (cmd) {
3092 case VIDIOC_QUERYCAP:
3093 return sn9c102_vidioc_querycap(cam, arg);
3095 case VIDIOC_ENUMINPUT:
3096 return sn9c102_vidioc_enuminput(cam, arg);
3098 case VIDIOC_G_INPUT:
3099 return sn9c102_vidioc_g_input(cam, arg);
3101 case VIDIOC_S_INPUT:
3102 return sn9c102_vidioc_s_input(cam, arg);
3104 case VIDIOC_QUERYCTRL:
3105 return sn9c102_vidioc_query_ctrl(cam, arg);
3107 case VIDIOC_G_CTRL:
3108 return sn9c102_vidioc_g_ctrl(cam, arg);
3110 case VIDIOC_S_CTRL:
3111 return sn9c102_vidioc_s_ctrl(cam, arg);
3113 case VIDIOC_CROPCAP:
3114 return sn9c102_vidioc_cropcap(cam, arg);
3116 case VIDIOC_G_CROP:
3117 return sn9c102_vidioc_g_crop(cam, arg);
3119 case VIDIOC_S_CROP:
3120 return sn9c102_vidioc_s_crop(cam, arg);
3122 case VIDIOC_ENUM_FRAMESIZES:
3123 return sn9c102_vidioc_enum_framesizes(cam, arg);
3125 case VIDIOC_ENUM_FMT:
3126 return sn9c102_vidioc_enum_fmt(cam, arg);
3128 case VIDIOC_G_FMT:
3129 return sn9c102_vidioc_g_fmt(cam, arg);
3131 case VIDIOC_TRY_FMT:
3132 case VIDIOC_S_FMT:
3133 return sn9c102_vidioc_try_s_fmt(cam, cmd, arg);
3135 case VIDIOC_G_JPEGCOMP:
3136 return sn9c102_vidioc_g_jpegcomp(cam, arg);
3138 case VIDIOC_S_JPEGCOMP:
3139 return sn9c102_vidioc_s_jpegcomp(cam, arg);
3141 case VIDIOC_REQBUFS:
3142 return sn9c102_vidioc_reqbufs(cam, arg);
3144 case VIDIOC_QUERYBUF:
3145 return sn9c102_vidioc_querybuf(cam, arg);
3147 case VIDIOC_QBUF:
3148 return sn9c102_vidioc_qbuf(cam, arg);
3150 case VIDIOC_DQBUF:
3151 return sn9c102_vidioc_dqbuf(cam, filp, arg);
3153 case VIDIOC_STREAMON:
3154 return sn9c102_vidioc_streamon(cam, arg);
3156 case VIDIOC_STREAMOFF:
3157 return sn9c102_vidioc_streamoff(cam, arg);
3159 case VIDIOC_G_PARM:
3160 return sn9c102_vidioc_g_parm(cam, arg);
3162 case VIDIOC_S_PARM:
3163 return sn9c102_vidioc_s_parm(cam, arg);
3165 case VIDIOC_ENUMAUDIO:
3166 return sn9c102_vidioc_enumaudio(cam, arg);
3168 case VIDIOC_G_AUDIO:
3169 return sn9c102_vidioc_g_audio(cam, arg);
3171 case VIDIOC_S_AUDIO:
3172 return sn9c102_vidioc_s_audio(cam, arg);
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;
3182 default:
3183 return -EINVAL;
3189 static int sn9c102_ioctl(struct inode* inode, struct file* filp,
3190 unsigned int cmd, unsigned long arg)
3192 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
3193 int err = 0;
3195 if (mutex_lock_interruptible(&cam->fileop_mutex))
3196 return -ERESTARTSYS;
3198 if (cam->state & DEV_DISCONNECTED) {
3199 DBG(1, "Device not present");
3200 mutex_unlock(&cam->fileop_mutex);
3201 return -ENODEV;
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;
3211 V4LDBG(3, "sn9c102", cmd);
3213 err = sn9c102_ioctl_v4l2(inode, filp, cmd, (void __user *)arg);
3215 mutex_unlock(&cam->fileop_mutex);
3217 return err;
3220 /*****************************************************************************/
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 .compat_ioctl = v4l_compat_ioctl32,
3228 .read = sn9c102_read,
3229 .poll = sn9c102_poll,
3230 .mmap = sn9c102_mmap,
3231 .llseek = no_llseek,
3234 /*****************************************************************************/
3236 /* It exists a single interface only. We do not need to validate anything. */
3237 static int
3238 sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
3240 struct usb_device *udev = interface_to_usbdev(intf);
3241 struct sn9c102_device* cam;
3242 static unsigned int dev_nr = 0;
3243 unsigned int i;
3244 int err = 0, r;
3246 if (!(cam = kzalloc(sizeof(struct sn9c102_device), GFP_KERNEL)))
3247 return -ENOMEM;
3249 cam->usbdev = udev;
3251 if (!(cam->control_buffer = kzalloc(8, GFP_KERNEL))) {
3252 DBG(1, "kzalloc() failed");
3253 err = -ENOMEM;
3254 goto fail;
3257 if (!(cam->v4ldev = video_device_alloc())) {
3258 DBG(1, "video_device_alloc() failed");
3259 err = -ENOMEM;
3260 goto fail;
3263 r = sn9c102_read_reg(cam, 0x00);
3264 if (r < 0 || (r != 0x10 && r != 0x11 && r != 0x12)) {
3265 DBG(1, "Sorry, this is not a SN9C1xx-based camera "
3266 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3267 err = -ENODEV;
3268 goto fail;
3271 cam->bridge = id->driver_info;
3272 switch (cam->bridge) {
3273 case BRIDGE_SN9C101:
3274 case BRIDGE_SN9C102:
3275 DBG(2, "SN9C10[12] PC Camera Controller detected "
3276 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3277 break;
3278 case BRIDGE_SN9C103:
3279 DBG(2, "SN9C103 PC Camera Controller detected "
3280 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3281 break;
3282 case BRIDGE_SN9C105:
3283 DBG(2, "SN9C105 PC Camera Controller detected "
3284 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3285 break;
3286 case BRIDGE_SN9C120:
3287 DBG(2, "SN9C120 PC Camera Controller detected "
3288 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3289 break;
3292 for (i = 0; i < ARRAY_SIZE(sn9c102_sensor_table); i++) {
3293 err = sn9c102_sensor_table[i](cam);
3294 if (!err)
3295 break;
3298 if (!err) {
3299 DBG(2, "%s image sensor detected", cam->sensor.name);
3300 DBG(3, "Support for %s maintained by %s",
3301 cam->sensor.name, cam->sensor.maintainer);
3302 } else {
3303 DBG(1, "No supported image sensor detected for this bridge");
3304 err = -ENODEV;
3305 goto fail;
3308 if (!(cam->bridge & cam->sensor.supported_bridge)) {
3309 DBG(1, "Bridge not supported");
3310 err = -ENODEV;
3311 goto fail;
3314 if (sn9c102_init(cam)) {
3315 DBG(1, "Initialization failed. I will retry on open().");
3316 cam->state |= DEV_MISCONFIGURED;
3319 strcpy(cam->v4ldev->name, "SN9C1xx PC Camera");
3320 cam->v4ldev->owner = THIS_MODULE;
3321 cam->v4ldev->type = VID_TYPE_CAPTURE | VID_TYPE_SCALES;
3322 cam->v4ldev->fops = &sn9c102_fops;
3323 cam->v4ldev->minor = video_nr[dev_nr];
3324 cam->v4ldev->release = video_device_release;
3326 init_completion(&cam->probe);
3328 err = video_register_device(cam->v4ldev, VFL_TYPE_GRABBER,
3329 video_nr[dev_nr]);
3330 if (err) {
3331 DBG(1, "V4L2 device registration failed");
3332 if (err == -ENFILE && video_nr[dev_nr] == -1)
3333 DBG(1, "Free /dev/videoX node not found");
3334 video_nr[dev_nr] = -1;
3335 dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
3336 complete_all(&cam->probe);
3337 goto fail;
3340 DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor);
3342 video_set_drvdata(cam->v4ldev, cam);
3343 cam->module_param.force_munmap = force_munmap[dev_nr];
3344 cam->module_param.frame_timeout = frame_timeout[dev_nr];
3346 dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
3348 #ifdef CONFIG_VIDEO_ADV_DEBUG
3349 err = sn9c102_create_sysfs(cam);
3350 if (!err)
3351 DBG(2, "Optional device control through 'sysfs' "
3352 "interface ready");
3353 else
3354 DBG(2, "Failed to create optional 'sysfs' interface for "
3355 "device controlling. Error #%d", err);
3356 #else
3357 DBG(2, "Optional device control through 'sysfs' interface disabled");
3358 DBG(3, "Compile the kernel with the 'CONFIG_VIDEO_ADV_DEBUG' "
3359 "configuration option to enable it.");
3360 #endif
3362 usb_set_intfdata(intf, cam);
3363 kref_init(&cam->kref);
3364 usb_get_dev(cam->usbdev);
3366 complete_all(&cam->probe);
3368 return 0;
3370 fail:
3371 if (cam) {
3372 kfree(cam->control_buffer);
3373 if (cam->v4ldev)
3374 video_device_release(cam->v4ldev);
3375 kfree(cam);
3377 return err;
3381 static void sn9c102_usb_disconnect(struct usb_interface* intf)
3383 struct sn9c102_device* cam;
3385 down_write(&sn9c102_dev_lock);
3387 cam = usb_get_intfdata(intf);
3389 DBG(2, "Disconnecting %s...", cam->v4ldev->name);
3391 if (cam->users) {
3392 DBG(2, "Device /dev/video%d is open! Deregistration and "
3393 "memory deallocation are deferred.",
3394 cam->v4ldev->minor);
3395 cam->state |= DEV_MISCONFIGURED;
3396 sn9c102_stop_transfer(cam);
3397 cam->state |= DEV_DISCONNECTED;
3398 wake_up_interruptible(&cam->wait_frame);
3399 wake_up(&cam->wait_stream);
3400 } else
3401 cam->state |= DEV_DISCONNECTED;
3403 wake_up_interruptible_all(&cam->wait_open);
3405 kref_put(&cam->kref, sn9c102_release_resources);
3407 up_write(&sn9c102_dev_lock);
3411 static struct usb_driver sn9c102_usb_driver = {
3412 .name = "sn9c102",
3413 .id_table = sn9c102_id_table,
3414 .probe = sn9c102_usb_probe,
3415 .disconnect = sn9c102_usb_disconnect,
3418 /*****************************************************************************/
3420 static int __init sn9c102_module_init(void)
3422 int err = 0;
3424 KDBG(2, SN9C102_MODULE_NAME " v" SN9C102_MODULE_VERSION);
3425 KDBG(3, SN9C102_MODULE_AUTHOR);
3427 if ((err = usb_register(&sn9c102_usb_driver)))
3428 KDBG(1, "usb_register() failed");
3430 return err;
3434 static void __exit sn9c102_module_exit(void)
3436 usb_deregister(&sn9c102_usb_driver);
3440 module_init(sn9c102_module_init);
3441 module_exit(sn9c102_module_exit);