]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/usb/media/sn9c102_core.c
Linux-2.6.12-rc2
[mirror_ubuntu-artful-kernel.git] / drivers / usb / media / sn9c102_core.c
1 /***************************************************************************
2 * V4L2 driver for SN9C10x PC Camera Controllers *
3 * *
4 * Copyright (C) 2004-2005 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/moduleparam.h>
26 #include <linux/errno.h>
27 #include <linux/slab.h>
28 #include <linux/string.h>
29 #include <linux/device.h>
30 #include <linux/fs.h>
31 #include <linux/delay.h>
32 #include <linux/stddef.h>
33 #include <linux/compiler.h>
34 #include <linux/ioctl.h>
35 #include <linux/poll.h>
36 #include <linux/stat.h>
37 #include <linux/mm.h>
38 #include <linux/vmalloc.h>
39 #include <linux/page-flags.h>
40 #include <linux/byteorder/generic.h>
41 #include <asm/page.h>
42 #include <asm/uaccess.h>
43
44 #include "sn9c102.h"
45
46 /*****************************************************************************/
47
48 MODULE_DEVICE_TABLE(usb, sn9c102_id_table);
49
50 MODULE_AUTHOR(SN9C102_MODULE_AUTHOR " " SN9C102_AUTHOR_EMAIL);
51 MODULE_DESCRIPTION(SN9C102_MODULE_NAME);
52 MODULE_VERSION(SN9C102_MODULE_VERSION);
53 MODULE_LICENSE(SN9C102_MODULE_LICENSE);
54
55 static short video_nr[] = {[0 ... SN9C102_MAX_DEVICES-1] = -1};
56 module_param_array(video_nr, short, NULL, 0444);
57 MODULE_PARM_DESC(video_nr,
58 "\n<-1|n[,...]> Specify V4L2 minor mode number."
59 "\n -1 = use next available (default)"
60 "\n n = use minor number n (integer >= 0)"
61 "\nYou can specify up to "__MODULE_STRING(SN9C102_MAX_DEVICES)
62 " cameras this way."
63 "\nFor example:"
64 "\nvideo_nr=-1,2,-1 would assign minor number 2 to"
65 "\nthe second camera and use auto for the first"
66 "\none and for every other camera."
67 "\n");
68
69 static short force_munmap[] = {[0 ... SN9C102_MAX_DEVICES-1] =
70 SN9C102_FORCE_MUNMAP};
71 module_param_array(force_munmap, bool, NULL, 0444);
72 MODULE_PARM_DESC(force_munmap,
73 "\n<0|1[,...]> Force the application to unmap previously "
74 "\nmapped buffer memory before calling any VIDIOC_S_CROP or "
75 "\nVIDIOC_S_FMT ioctl's. Not all the applications support "
76 "\nthis feature. This parameter is specific for each "
77 "\ndetected camera."
78 "\n 0 = do not force memory unmapping"
79 "\n 1 = force memory unmapping (save memory)"
80 "\nDefault value is "__MODULE_STRING(SN9C102_FORCE_MUNMAP)"."
81 "\n");
82
83 #ifdef SN9C102_DEBUG
84 static unsigned short debug = SN9C102_DEBUG_LEVEL;
85 module_param(debug, ushort, 0644);
86 MODULE_PARM_DESC(debug,
87 "\n<n> Debugging information level, from 0 to 3:"
88 "\n0 = none (use carefully)"
89 "\n1 = critical errors"
90 "\n2 = significant informations"
91 "\n3 = more verbose messages"
92 "\nLevel 3 is useful for testing only, when only "
93 "one device is used."
94 "\nDefault value is "__MODULE_STRING(SN9C102_DEBUG_LEVEL)"."
95 "\n");
96 #endif
97
98 /*****************************************************************************/
99
100 static sn9c102_sof_header_t sn9c102_sof_header[] = {
101 {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96, 0x00},
102 {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96, 0x01},
103 };
104
105
106 static sn9c102_eof_header_t sn9c102_eof_header[] = {
107 {0x00, 0x00, 0x00, 0x00},
108 {0x40, 0x00, 0x00, 0x00},
109 {0x80, 0x00, 0x00, 0x00},
110 {0xc0, 0x00, 0x00, 0x00},
111 };
112
113 /*****************************************************************************/
114
115 static void* rvmalloc(size_t size)
116 {
117 void* mem;
118 unsigned long adr;
119
120 size = PAGE_ALIGN(size);
121
122 mem = vmalloc_32((unsigned long)size);
123 if (!mem)
124 return NULL;
125
126 memset(mem, 0, size);
127
128 adr = (unsigned long)mem;
129 while (size > 0) {
130 SetPageReserved(vmalloc_to_page((void *)adr));
131 adr += PAGE_SIZE;
132 size -= PAGE_SIZE;
133 }
134
135 return mem;
136 }
137
138
139 static void rvfree(void* mem, size_t size)
140 {
141 unsigned long adr;
142
143 if (!mem)
144 return;
145
146 size = PAGE_ALIGN(size);
147
148 adr = (unsigned long)mem;
149 while (size > 0) {
150 ClearPageReserved(vmalloc_to_page((void *)adr));
151 adr += PAGE_SIZE;
152 size -= PAGE_SIZE;
153 }
154
155 vfree(mem);
156 }
157
158
159 static u32
160 sn9c102_request_buffers(struct sn9c102_device* cam, u32 count,
161 enum sn9c102_io_method io)
162 {
163 struct v4l2_pix_format* p = &(cam->sensor->pix_format);
164 struct v4l2_rect* r = &(cam->sensor->cropcap.bounds);
165 const size_t imagesize = cam->module_param.force_munmap ||
166 io == IO_READ ?
167 (p->width * p->height * p->priv) / 8 :
168 (r->width * r->height * p->priv) / 8;
169 void* buff = NULL;
170 u32 i;
171
172 if (count > SN9C102_MAX_FRAMES)
173 count = SN9C102_MAX_FRAMES;
174
175 cam->nbuffers = count;
176 while (cam->nbuffers > 0) {
177 if ((buff = rvmalloc(cam->nbuffers * PAGE_ALIGN(imagesize))))
178 break;
179 cam->nbuffers--;
180 }
181
182 for (i = 0; i < cam->nbuffers; i++) {
183 cam->frame[i].bufmem = buff + i*PAGE_ALIGN(imagesize);
184 cam->frame[i].buf.index = i;
185 cam->frame[i].buf.m.offset = i*PAGE_ALIGN(imagesize);
186 cam->frame[i].buf.length = imagesize;
187 cam->frame[i].buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
188 cam->frame[i].buf.sequence = 0;
189 cam->frame[i].buf.field = V4L2_FIELD_NONE;
190 cam->frame[i].buf.memory = V4L2_MEMORY_MMAP;
191 cam->frame[i].buf.flags = 0;
192 }
193
194 return cam->nbuffers;
195 }
196
197
198 static void sn9c102_release_buffers(struct sn9c102_device* cam)
199 {
200 if (cam->nbuffers) {
201 rvfree(cam->frame[0].bufmem,
202 cam->nbuffers * cam->frame[0].buf.length);
203 cam->nbuffers = 0;
204 }
205 }
206
207
208 static void sn9c102_empty_framequeues(struct sn9c102_device* cam)
209 {
210 u32 i;
211
212 INIT_LIST_HEAD(&cam->inqueue);
213 INIT_LIST_HEAD(&cam->outqueue);
214
215 for (i = 0; i < SN9C102_MAX_FRAMES; i++) {
216 cam->frame[i].state = F_UNUSED;
217 cam->frame[i].buf.bytesused = 0;
218 }
219 }
220
221
222 static void sn9c102_queue_unusedframes(struct sn9c102_device* cam)
223 {
224 unsigned long lock_flags;
225 u32 i;
226
227 for (i = 0; i < cam->nbuffers; i++)
228 if (cam->frame[i].state == F_UNUSED) {
229 cam->frame[i].state = F_QUEUED;
230 spin_lock_irqsave(&cam->queue_lock, lock_flags);
231 list_add_tail(&cam->frame[i].frame, &cam->inqueue);
232 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
233 }
234 }
235
236 /*****************************************************************************/
237
238 int sn9c102_write_reg(struct sn9c102_device* cam, u8 value, u16 index)
239 {
240 struct usb_device* udev = cam->usbdev;
241 u8* buff = cam->control_buffer;
242 int res;
243
244 *buff = value;
245
246 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
247 index, 0, buff, 1, SN9C102_CTRL_TIMEOUT);
248 if (res < 0) {
249 DBG(3, "Failed to write a register (value 0x%02X, index "
250 "0x%02X, error %d)", value, index, res)
251 return -1;
252 }
253
254 cam->reg[index] = value;
255
256 return 0;
257 }
258
259
260 /* NOTE: reading some registers always returns 0 */
261 static int sn9c102_read_reg(struct sn9c102_device* cam, u16 index)
262 {
263 struct usb_device* udev = cam->usbdev;
264 u8* buff = cam->control_buffer;
265 int res;
266
267 res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, 0xc1,
268 index, 0, buff, 1, SN9C102_CTRL_TIMEOUT);
269 if (res < 0)
270 DBG(3, "Failed to read a register (index 0x%02X, error %d)",
271 index, res)
272
273 return (res >= 0) ? (int)(*buff) : -1;
274 }
275
276
277 int sn9c102_pread_reg(struct sn9c102_device* cam, u16 index)
278 {
279 if (index > 0x1f)
280 return -EINVAL;
281
282 return cam->reg[index];
283 }
284
285
286 static int
287 sn9c102_i2c_wait(struct sn9c102_device* cam, struct sn9c102_sensor* sensor)
288 {
289 int i, r;
290
291 for (i = 1; i <= 5; i++) {
292 r = sn9c102_read_reg(cam, 0x08);
293 if (r < 0)
294 return -EIO;
295 if (r & 0x04)
296 return 0;
297 if (sensor->frequency & SN9C102_I2C_400KHZ)
298 udelay(5*16);
299 else
300 udelay(16*16);
301 }
302 return -EBUSY;
303 }
304
305
306 static int
307 sn9c102_i2c_detect_read_error(struct sn9c102_device* cam,
308 struct sn9c102_sensor* sensor)
309 {
310 int r;
311 r = sn9c102_read_reg(cam, 0x08);
312 return (r < 0 || (r >= 0 && !(r & 0x08))) ? -EIO : 0;
313 }
314
315
316 static int
317 sn9c102_i2c_detect_write_error(struct sn9c102_device* cam,
318 struct sn9c102_sensor* sensor)
319 {
320 int r;
321 r = sn9c102_read_reg(cam, 0x08);
322 return (r < 0 || (r >= 0 && (r & 0x08))) ? -EIO : 0;
323 }
324
325
326 int
327 sn9c102_i2c_try_raw_read(struct sn9c102_device* cam,
328 struct sn9c102_sensor* sensor, u8 data0, u8 data1,
329 u8 n, u8 buffer[])
330 {
331 struct usb_device* udev = cam->usbdev;
332 u8* data = cam->control_buffer;
333 int err = 0, res;
334
335 /* Write cycle */
336 data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
337 ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0) | 0x10;
338 data[1] = data0; /* I2C slave id */
339 data[2] = data1; /* address */
340 data[7] = 0x10;
341 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
342 0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
343 if (res < 0)
344 err += res;
345
346 err += sn9c102_i2c_wait(cam, sensor);
347
348 /* Read cycle - n bytes */
349 data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
350 ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0) |
351 (n << 4) | 0x02;
352 data[1] = data0;
353 data[7] = 0x10;
354 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
355 0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
356 if (res < 0)
357 err += res;
358
359 err += sn9c102_i2c_wait(cam, sensor);
360
361 /* The first read byte will be placed in data[4] */
362 res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, 0xc1,
363 0x0a, 0, data, 5, SN9C102_CTRL_TIMEOUT);
364 if (res < 0)
365 err += res;
366
367 err += sn9c102_i2c_detect_read_error(cam, sensor);
368
369 PDBGG("I2C read: address 0x%02X, first read byte: 0x%02X", data1,
370 data[4])
371
372 if (err) {
373 DBG(3, "I2C read failed for %s image sensor", sensor->name)
374 return -1;
375 }
376
377 if (buffer)
378 memcpy(buffer, data, sizeof(buffer));
379
380 return (int)data[4];
381 }
382
383
384 int
385 sn9c102_i2c_try_raw_write(struct sn9c102_device* cam,
386 struct sn9c102_sensor* sensor, u8 n, u8 data0,
387 u8 data1, u8 data2, u8 data3, u8 data4, u8 data5)
388 {
389 struct usb_device* udev = cam->usbdev;
390 u8* data = cam->control_buffer;
391 int err = 0, res;
392
393 /* Write cycle. It usually is address + value */
394 data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
395 ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0)
396 | ((n - 1) << 4);
397 data[1] = data0;
398 data[2] = data1;
399 data[3] = data2;
400 data[4] = data3;
401 data[5] = data4;
402 data[6] = data5;
403 data[7] = 0x14;
404 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
405 0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
406 if (res < 0)
407 err += res;
408
409 err += sn9c102_i2c_wait(cam, sensor);
410 err += sn9c102_i2c_detect_write_error(cam, sensor);
411
412 if (err)
413 DBG(3, "I2C write failed for %s image sensor", sensor->name)
414
415 PDBGG("I2C raw write: %u bytes, data0 = 0x%02X, data1 = 0x%02X, "
416 "data2 = 0x%02X, data3 = 0x%02X, data4 = 0x%02X, data5 = 0x%02X",
417 n, data0, data1, data2, data3, data4, data5)
418
419 return err ? -1 : 0;
420 }
421
422
423 int
424 sn9c102_i2c_try_read(struct sn9c102_device* cam,
425 struct sn9c102_sensor* sensor, u8 address)
426 {
427 return sn9c102_i2c_try_raw_read(cam, sensor, sensor->i2c_slave_id,
428 address, 1, NULL);
429 }
430
431
432 int
433 sn9c102_i2c_try_write(struct sn9c102_device* cam,
434 struct sn9c102_sensor* sensor, u8 address, u8 value)
435 {
436 return sn9c102_i2c_try_raw_write(cam, sensor, 3,
437 sensor->i2c_slave_id, address,
438 value, 0, 0, 0);
439 }
440
441
442 int sn9c102_i2c_read(struct sn9c102_device* cam, u8 address)
443 {
444 if (!cam->sensor)
445 return -1;
446
447 return sn9c102_i2c_try_read(cam, cam->sensor, address);
448 }
449
450
451 int sn9c102_i2c_write(struct sn9c102_device* cam, u8 address, u8 value)
452 {
453 if (!cam->sensor)
454 return -1;
455
456 return sn9c102_i2c_try_write(cam, cam->sensor, address, value);
457 }
458
459 /*****************************************************************************/
460
461 static void*
462 sn9c102_find_sof_header(struct sn9c102_device* cam, void* mem, size_t len)
463 {
464 size_t soflen = sizeof(sn9c102_sof_header_t), i;
465 u8 j, n = sizeof(sn9c102_sof_header) / soflen;
466
467 for (i = 0; (len >= soflen) && (i <= len - soflen); i++)
468 for (j = 0; j < n; j++)
469 /* It's enough to compare 7 bytes */
470 if (!memcmp(mem + i, sn9c102_sof_header[j], 7)) {
471 memcpy(cam->sof_header, mem + i, soflen);
472 /* Skip the header */
473 return mem + i + soflen;
474 }
475
476 return NULL;
477 }
478
479
480 static void*
481 sn9c102_find_eof_header(struct sn9c102_device* cam, void* mem, size_t len)
482 {
483 size_t eoflen = sizeof(sn9c102_eof_header_t), i;
484 unsigned j, n = sizeof(sn9c102_eof_header) / eoflen;
485
486 if (cam->sensor->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X)
487 return NULL; /* EOF header does not exist in compressed data */
488
489 for (i = 0; (len >= eoflen) && (i <= len - eoflen); i++)
490 for (j = 0; j < n; j++)
491 if (!memcmp(mem + i, sn9c102_eof_header[j], eoflen))
492 return mem + i;
493
494 return NULL;
495 }
496
497
498 static void sn9c102_urb_complete(struct urb *urb, struct pt_regs* regs)
499 {
500 struct sn9c102_device* cam = urb->context;
501 struct sn9c102_frame_t** f;
502 size_t imagesize;
503 unsigned long lock_flags;
504 u8 i;
505 int err = 0;
506
507 if (urb->status == -ENOENT)
508 return;
509
510 f = &cam->frame_current;
511
512 if (cam->stream == STREAM_INTERRUPT) {
513 cam->stream = STREAM_OFF;
514 if ((*f))
515 (*f)->state = F_QUEUED;
516 DBG(3, "Stream interrupted")
517 wake_up_interruptible(&cam->wait_stream);
518 }
519
520 if (cam->state & DEV_DISCONNECTED)
521 return;
522
523 if (cam->state & DEV_MISCONFIGURED) {
524 wake_up_interruptible(&cam->wait_frame);
525 return;
526 }
527
528 if (cam->stream == STREAM_OFF || list_empty(&cam->inqueue))
529 goto resubmit_urb;
530
531 if (!(*f))
532 (*f) = list_entry(cam->inqueue.next, struct sn9c102_frame_t,
533 frame);
534
535 imagesize = (cam->sensor->pix_format.width *
536 cam->sensor->pix_format.height *
537 cam->sensor->pix_format.priv) / 8;
538
539 for (i = 0; i < urb->number_of_packets; i++) {
540 unsigned int img, len, status;
541 void *pos, *sof, *eof;
542
543 len = urb->iso_frame_desc[i].actual_length;
544 status = urb->iso_frame_desc[i].status;
545 pos = urb->iso_frame_desc[i].offset + urb->transfer_buffer;
546
547 if (status) {
548 DBG(3, "Error in isochronous frame")
549 (*f)->state = F_ERROR;
550 continue;
551 }
552
553 PDBGG("Isochrnous frame: length %u, #%u i", len, i)
554
555 /*
556 NOTE: It is probably correct to assume that SOF and EOF
557 headers do not occur between two consecutive packets,
558 but who knows..Whatever is the truth, this assumption
559 doesn't introduce bugs.
560 */
561
562 redo:
563 sof = sn9c102_find_sof_header(cam, pos, len);
564 if (!sof) {
565 eof = sn9c102_find_eof_header(cam, pos, len);
566 if ((*f)->state == F_GRABBING) {
567 end_of_frame:
568 img = len;
569
570 if (eof)
571 img = (eof > pos) ? eof - pos - 1 : 0;
572
573 if ((*f)->buf.bytesused+img > imagesize) {
574 u32 b = (*f)->buf.bytesused + img -
575 imagesize;
576 img = imagesize - (*f)->buf.bytesused;
577 DBG(3, "Expected EOF not found: "
578 "video frame cut")
579 if (eof)
580 DBG(3, "Exceeded limit: +%u "
581 "bytes", (unsigned)(b))
582 }
583
584 memcpy((*f)->bufmem + (*f)->buf.bytesused, pos,
585 img);
586
587 if ((*f)->buf.bytesused == 0)
588 do_gettimeofday(&(*f)->buf.timestamp);
589
590 (*f)->buf.bytesused += img;
591
592 if ((*f)->buf.bytesused == imagesize ||
593 (cam->sensor->pix_format.pixelformat ==
594 V4L2_PIX_FMT_SN9C10X && eof)) {
595 u32 b = (*f)->buf.bytesused;
596 (*f)->state = F_DONE;
597 (*f)->buf.sequence= ++cam->frame_count;
598 spin_lock_irqsave(&cam->queue_lock,
599 lock_flags);
600 list_move_tail(&(*f)->frame,
601 &cam->outqueue);
602 if (!list_empty(&cam->inqueue))
603 (*f) = list_entry(
604 cam->inqueue.next,
605 struct sn9c102_frame_t,
606 frame );
607 else
608 (*f) = NULL;
609 spin_unlock_irqrestore(&cam->queue_lock
610 , lock_flags);
611 memcpy(cam->sysfs.frame_header,
612 cam->sof_header,
613 sizeof(sn9c102_sof_header_t));
614 DBG(3, "Video frame captured: "
615 "%lu bytes", (unsigned long)(b))
616
617 if (!(*f))
618 goto resubmit_urb;
619
620 } else if (eof) {
621 (*f)->state = F_ERROR;
622 DBG(3, "Not expected EOF after %lu "
623 "bytes of image data",
624 (unsigned long)((*f)->buf.bytesused))
625 }
626
627 if (sof) /* (1) */
628 goto start_of_frame;
629
630 } else if (eof) {
631 DBG(3, "EOF without SOF")
632 continue;
633
634 } else {
635 PDBGG("Ignoring pointless isochronous frame")
636 continue;
637 }
638
639 } else if ((*f)->state == F_QUEUED || (*f)->state == F_ERROR) {
640 start_of_frame:
641 (*f)->state = F_GRABBING;
642 (*f)->buf.bytesused = 0;
643 len -= (sof - pos);
644 pos = sof;
645 DBG(3, "SOF detected: new video frame")
646 if (len)
647 goto redo;
648
649 } else if ((*f)->state == F_GRABBING) {
650 eof = sn9c102_find_eof_header(cam, pos, len);
651 if (eof && eof < sof)
652 goto end_of_frame; /* (1) */
653 else {
654 if (cam->sensor->pix_format.pixelformat ==
655 V4L2_PIX_FMT_SN9C10X) {
656 eof = sof-sizeof(sn9c102_sof_header_t);
657 goto end_of_frame;
658 } else {
659 DBG(3, "SOF before expected EOF after "
660 "%lu bytes of image data",
661 (unsigned long)((*f)->buf.bytesused))
662 goto start_of_frame;
663 }
664 }
665 }
666 }
667
668 resubmit_urb:
669 urb->dev = cam->usbdev;
670 err = usb_submit_urb(urb, GFP_ATOMIC);
671 if (err < 0 && err != -EPERM) {
672 cam->state |= DEV_MISCONFIGURED;
673 DBG(1, "usb_submit_urb() failed")
674 }
675
676 wake_up_interruptible(&cam->wait_frame);
677 }
678
679
680 static int sn9c102_start_transfer(struct sn9c102_device* cam)
681 {
682 struct usb_device *udev = cam->usbdev;
683 struct urb* urb;
684 const unsigned int wMaxPacketSize[] = {0, 128, 256, 384, 512,
685 680, 800, 900, 1023};
686 const unsigned int psz = wMaxPacketSize[SN9C102_ALTERNATE_SETTING];
687 s8 i, j;
688 int err = 0;
689
690 for (i = 0; i < SN9C102_URBS; i++) {
691 cam->transfer_buffer[i] = kmalloc(SN9C102_ISO_PACKETS * psz,
692 GFP_KERNEL);
693 if (!cam->transfer_buffer[i]) {
694 err = -ENOMEM;
695 DBG(1, "Not enough memory")
696 goto free_buffers;
697 }
698 }
699
700 for (i = 0; i < SN9C102_URBS; i++) {
701 urb = usb_alloc_urb(SN9C102_ISO_PACKETS, GFP_KERNEL);
702 cam->urb[i] = urb;
703 if (!urb) {
704 err = -ENOMEM;
705 DBG(1, "usb_alloc_urb() failed")
706 goto free_urbs;
707 }
708 urb->dev = udev;
709 urb->context = cam;
710 urb->pipe = usb_rcvisocpipe(udev, 1);
711 urb->transfer_flags = URB_ISO_ASAP;
712 urb->number_of_packets = SN9C102_ISO_PACKETS;
713 urb->complete = sn9c102_urb_complete;
714 urb->transfer_buffer = cam->transfer_buffer[i];
715 urb->transfer_buffer_length = psz * SN9C102_ISO_PACKETS;
716 urb->interval = 1;
717 for (j = 0; j < SN9C102_ISO_PACKETS; j++) {
718 urb->iso_frame_desc[j].offset = psz * j;
719 urb->iso_frame_desc[j].length = psz;
720 }
721 }
722
723 /* Enable video */
724 if (!(cam->reg[0x01] & 0x04)) {
725 err = sn9c102_write_reg(cam, cam->reg[0x01] | 0x04, 0x01);
726 if (err) {
727 err = -EIO;
728 DBG(1, "I/O hardware error")
729 goto free_urbs;
730 }
731 }
732
733 err = usb_set_interface(udev, 0, SN9C102_ALTERNATE_SETTING);
734 if (err) {
735 DBG(1, "usb_set_interface() failed")
736 goto free_urbs;
737 }
738
739 cam->frame_current = NULL;
740
741 for (i = 0; i < SN9C102_URBS; i++) {
742 err = usb_submit_urb(cam->urb[i], GFP_KERNEL);
743 if (err) {
744 for (j = i-1; j >= 0; j--)
745 usb_kill_urb(cam->urb[j]);
746 DBG(1, "usb_submit_urb() failed, error %d", err)
747 goto free_urbs;
748 }
749 }
750
751 return 0;
752
753 free_urbs:
754 for (i = 0; (i < SN9C102_URBS) && cam->urb[i]; i++)
755 usb_free_urb(cam->urb[i]);
756
757 free_buffers:
758 for (i = 0; (i < SN9C102_URBS) && cam->transfer_buffer[i]; i++)
759 kfree(cam->transfer_buffer[i]);
760
761 return err;
762 }
763
764
765 static int sn9c102_stop_transfer(struct sn9c102_device* cam)
766 {
767 struct usb_device *udev = cam->usbdev;
768 s8 i;
769 int err = 0;
770
771 if (cam->state & DEV_DISCONNECTED)
772 return 0;
773
774 for (i = SN9C102_URBS-1; i >= 0; i--) {
775 usb_kill_urb(cam->urb[i]);
776 usb_free_urb(cam->urb[i]);
777 kfree(cam->transfer_buffer[i]);
778 }
779
780 err = usb_set_interface(udev, 0, 0); /* 0 Mb/s */
781 if (err)
782 DBG(3, "usb_set_interface() failed")
783
784 return err;
785 }
786
787
788 int sn9c102_stream_interrupt(struct sn9c102_device* cam)
789 {
790 int err = 0;
791
792 cam->stream = STREAM_INTERRUPT;
793 err = wait_event_timeout(cam->wait_stream,
794 (cam->stream == STREAM_OFF) ||
795 (cam->state & DEV_DISCONNECTED),
796 SN9C102_URB_TIMEOUT);
797 if (cam->state & DEV_DISCONNECTED)
798 return -ENODEV;
799 else if (err) {
800 cam->state |= DEV_MISCONFIGURED;
801 DBG(1, "The camera is misconfigured. To use it, close and "
802 "open /dev/video%d again.", cam->v4ldev->minor)
803 return err;
804 }
805
806 return 0;
807 }
808
809 /*****************************************************************************/
810
811 static u8 sn9c102_strtou8(const char* buff, size_t len, ssize_t* count)
812 {
813 char str[5];
814 char* endp;
815 unsigned long val;
816
817 if (len < 4) {
818 strncpy(str, buff, len);
819 str[len+1] = '\0';
820 } else {
821 strncpy(str, buff, 4);
822 str[4] = '\0';
823 }
824
825 val = simple_strtoul(str, &endp, 0);
826
827 *count = 0;
828 if (val <= 0xff)
829 *count = (ssize_t)(endp - str);
830 if ((*count) && (len == *count+1) && (buff[*count] == '\n'))
831 *count += 1;
832
833 return (u8)val;
834 }
835
836 /*
837 NOTE 1: being inside one of the following methods implies that the v4l
838 device exists for sure (see kobjects and reference counters)
839 NOTE 2: buffers are PAGE_SIZE long
840 */
841
842 static ssize_t sn9c102_show_reg(struct class_device* cd, char* buf)
843 {
844 struct sn9c102_device* cam;
845 ssize_t count;
846
847 if (down_interruptible(&sn9c102_sysfs_lock))
848 return -ERESTARTSYS;
849
850 cam = video_get_drvdata(to_video_device(cd));
851 if (!cam) {
852 up(&sn9c102_sysfs_lock);
853 return -ENODEV;
854 }
855
856 count = sprintf(buf, "%u\n", cam->sysfs.reg);
857
858 up(&sn9c102_sysfs_lock);
859
860 return count;
861 }
862
863
864 static ssize_t
865 sn9c102_store_reg(struct class_device* cd, const char* buf, size_t len)
866 {
867 struct sn9c102_device* cam;
868 u8 index;
869 ssize_t count;
870
871 if (down_interruptible(&sn9c102_sysfs_lock))
872 return -ERESTARTSYS;
873
874 cam = video_get_drvdata(to_video_device(cd));
875 if (!cam) {
876 up(&sn9c102_sysfs_lock);
877 return -ENODEV;
878 }
879
880 index = sn9c102_strtou8(buf, len, &count);
881 if (index > 0x1f || !count) {
882 up(&sn9c102_sysfs_lock);
883 return -EINVAL;
884 }
885
886 cam->sysfs.reg = index;
887
888 DBG(2, "Moved SN9C10X register index to 0x%02X", cam->sysfs.reg)
889 DBG(3, "Written bytes: %zd", count)
890
891 up(&sn9c102_sysfs_lock);
892
893 return count;
894 }
895
896
897 static ssize_t sn9c102_show_val(struct class_device* cd, char* buf)
898 {
899 struct sn9c102_device* cam;
900 ssize_t count;
901 int val;
902
903 if (down_interruptible(&sn9c102_sysfs_lock))
904 return -ERESTARTSYS;
905
906 cam = video_get_drvdata(to_video_device(cd));
907 if (!cam) {
908 up(&sn9c102_sysfs_lock);
909 return -ENODEV;
910 }
911
912 if ((val = sn9c102_read_reg(cam, cam->sysfs.reg)) < 0) {
913 up(&sn9c102_sysfs_lock);
914 return -EIO;
915 }
916
917 count = sprintf(buf, "%d\n", val);
918
919 DBG(3, "Read bytes: %zd", count)
920
921 up(&sn9c102_sysfs_lock);
922
923 return count;
924 }
925
926
927 static ssize_t
928 sn9c102_store_val(struct class_device* cd, const char* buf, size_t len)
929 {
930 struct sn9c102_device* cam;
931 u8 value;
932 ssize_t count;
933 int err;
934
935 if (down_interruptible(&sn9c102_sysfs_lock))
936 return -ERESTARTSYS;
937
938 cam = video_get_drvdata(to_video_device(cd));
939 if (!cam) {
940 up(&sn9c102_sysfs_lock);
941 return -ENODEV;
942 }
943
944 value = sn9c102_strtou8(buf, len, &count);
945 if (!count) {
946 up(&sn9c102_sysfs_lock);
947 return -EINVAL;
948 }
949
950 err = sn9c102_write_reg(cam, value, cam->sysfs.reg);
951 if (err) {
952 up(&sn9c102_sysfs_lock);
953 return -EIO;
954 }
955
956 DBG(2, "Written SN9C10X reg. 0x%02X, val. 0x%02X",
957 cam->sysfs.reg, value)
958 DBG(3, "Written bytes: %zd", count)
959
960 up(&sn9c102_sysfs_lock);
961
962 return count;
963 }
964
965
966 static ssize_t sn9c102_show_i2c_reg(struct class_device* cd, char* buf)
967 {
968 struct sn9c102_device* cam;
969 ssize_t count;
970
971 if (down_interruptible(&sn9c102_sysfs_lock))
972 return -ERESTARTSYS;
973
974 cam = video_get_drvdata(to_video_device(cd));
975 if (!cam) {
976 up(&sn9c102_sysfs_lock);
977 return -ENODEV;
978 }
979
980 count = sprintf(buf, "%u\n", cam->sysfs.i2c_reg);
981
982 DBG(3, "Read bytes: %zd", count)
983
984 up(&sn9c102_sysfs_lock);
985
986 return count;
987 }
988
989
990 static ssize_t
991 sn9c102_store_i2c_reg(struct class_device* cd, const char* buf, size_t len)
992 {
993 struct sn9c102_device* cam;
994 u8 index;
995 ssize_t count;
996
997 if (down_interruptible(&sn9c102_sysfs_lock))
998 return -ERESTARTSYS;
999
1000 cam = video_get_drvdata(to_video_device(cd));
1001 if (!cam) {
1002 up(&sn9c102_sysfs_lock);
1003 return -ENODEV;
1004 }
1005
1006 index = sn9c102_strtou8(buf, len, &count);
1007 if (!count) {
1008 up(&sn9c102_sysfs_lock);
1009 return -EINVAL;
1010 }
1011
1012 cam->sysfs.i2c_reg = index;
1013
1014 DBG(2, "Moved sensor register index to 0x%02X", cam->sysfs.i2c_reg)
1015 DBG(3, "Written bytes: %zd", count)
1016
1017 up(&sn9c102_sysfs_lock);
1018
1019 return count;
1020 }
1021
1022
1023 static ssize_t sn9c102_show_i2c_val(struct class_device* cd, char* buf)
1024 {
1025 struct sn9c102_device* cam;
1026 ssize_t count;
1027 int val;
1028
1029 if (down_interruptible(&sn9c102_sysfs_lock))
1030 return -ERESTARTSYS;
1031
1032 cam = video_get_drvdata(to_video_device(cd));
1033 if (!cam) {
1034 up(&sn9c102_sysfs_lock);
1035 return -ENODEV;
1036 }
1037
1038 if (!(cam->sensor->sysfs_ops & SN9C102_I2C_READ)) {
1039 up(&sn9c102_sysfs_lock);
1040 return -ENOSYS;
1041 }
1042
1043 if ((val = sn9c102_i2c_read(cam, cam->sysfs.i2c_reg)) < 0) {
1044 up(&sn9c102_sysfs_lock);
1045 return -EIO;
1046 }
1047
1048 count = sprintf(buf, "%d\n", val);
1049
1050 DBG(3, "Read bytes: %zd", count)
1051
1052 up(&sn9c102_sysfs_lock);
1053
1054 return count;
1055 }
1056
1057
1058 static ssize_t
1059 sn9c102_store_i2c_val(struct class_device* cd, const char* buf, size_t len)
1060 {
1061 struct sn9c102_device* cam;
1062 u8 value;
1063 ssize_t count;
1064 int err;
1065
1066 if (down_interruptible(&sn9c102_sysfs_lock))
1067 return -ERESTARTSYS;
1068
1069 cam = video_get_drvdata(to_video_device(cd));
1070 if (!cam) {
1071 up(&sn9c102_sysfs_lock);
1072 return -ENODEV;
1073 }
1074
1075 if (!(cam->sensor->sysfs_ops & SN9C102_I2C_WRITE)) {
1076 up(&sn9c102_sysfs_lock);
1077 return -ENOSYS;
1078 }
1079
1080 value = sn9c102_strtou8(buf, len, &count);
1081 if (!count) {
1082 up(&sn9c102_sysfs_lock);
1083 return -EINVAL;
1084 }
1085
1086 err = sn9c102_i2c_write(cam, cam->sysfs.i2c_reg, value);
1087 if (err) {
1088 up(&sn9c102_sysfs_lock);
1089 return -EIO;
1090 }
1091
1092 DBG(2, "Written sensor reg. 0x%02X, val. 0x%02X",
1093 cam->sysfs.i2c_reg, value)
1094 DBG(3, "Written bytes: %zd", count)
1095
1096 up(&sn9c102_sysfs_lock);
1097
1098 return count;
1099 }
1100
1101
1102 static ssize_t
1103 sn9c102_store_green(struct class_device* cd, const char* buf, size_t len)
1104 {
1105 struct sn9c102_device* cam;
1106 enum sn9c102_bridge bridge;
1107 ssize_t res = 0;
1108 u8 value;
1109 ssize_t count;
1110
1111 if (down_interruptible(&sn9c102_sysfs_lock))
1112 return -ERESTARTSYS;
1113
1114 cam = video_get_drvdata(to_video_device(cd));
1115 if (!cam) {
1116 up(&sn9c102_sysfs_lock);
1117 return -ENODEV;
1118 }
1119
1120 bridge = cam->bridge;
1121
1122 up(&sn9c102_sysfs_lock);
1123
1124 value = sn9c102_strtou8(buf, len, &count);
1125 if (!count)
1126 return -EINVAL;
1127
1128 switch (bridge) {
1129 case BRIDGE_SN9C101:
1130 case BRIDGE_SN9C102:
1131 if (value > 0x0f)
1132 return -EINVAL;
1133 if ((res = sn9c102_store_reg(cd, "0x11", 4)) >= 0)
1134 res = sn9c102_store_val(cd, buf, len);
1135 break;
1136 case BRIDGE_SN9C103:
1137 if (value > 0x7f)
1138 return -EINVAL;
1139 if ((res = sn9c102_store_reg(cd, "0x04", 4)) >= 0)
1140 res = sn9c102_store_val(cd, buf, len);
1141 break;
1142 }
1143
1144 return res;
1145 }
1146
1147
1148 static ssize_t
1149 sn9c102_store_blue(struct class_device* cd, const char* buf, size_t len)
1150 {
1151 ssize_t res = 0;
1152 u8 value;
1153 ssize_t count;
1154
1155 value = sn9c102_strtou8(buf, len, &count);
1156 if (!count || value > 0x7f)
1157 return -EINVAL;
1158
1159 if ((res = sn9c102_store_reg(cd, "0x06", 4)) >= 0)
1160 res = sn9c102_store_val(cd, buf, len);
1161
1162 return res;
1163 }
1164
1165
1166 static ssize_t
1167 sn9c102_store_red(struct class_device* cd, const char* buf, size_t len)
1168 {
1169 ssize_t res = 0;
1170 u8 value;
1171 ssize_t count;
1172
1173 value = sn9c102_strtou8(buf, len, &count);
1174 if (!count || value > 0x7f)
1175 return -EINVAL;
1176
1177 if ((res = sn9c102_store_reg(cd, "0x05", 4)) >= 0)
1178 res = sn9c102_store_val(cd, buf, len);
1179
1180 return res;
1181 }
1182
1183
1184 static ssize_t sn9c102_show_frame_header(struct class_device* cd, char* buf)
1185 {
1186 struct sn9c102_device* cam;
1187 ssize_t count;
1188
1189 cam = video_get_drvdata(to_video_device(cd));
1190 if (!cam)
1191 return -ENODEV;
1192
1193 count = sizeof(cam->sysfs.frame_header);
1194 memcpy(buf, cam->sysfs.frame_header, count);
1195
1196 DBG(3, "Frame header, read bytes: %zd", count)
1197
1198 return count;
1199 }
1200
1201
1202 static CLASS_DEVICE_ATTR(reg, S_IRUGO | S_IWUSR,
1203 sn9c102_show_reg, sn9c102_store_reg);
1204 static CLASS_DEVICE_ATTR(val, S_IRUGO | S_IWUSR,
1205 sn9c102_show_val, sn9c102_store_val);
1206 static CLASS_DEVICE_ATTR(i2c_reg, S_IRUGO | S_IWUSR,
1207 sn9c102_show_i2c_reg, sn9c102_store_i2c_reg);
1208 static CLASS_DEVICE_ATTR(i2c_val, S_IRUGO | S_IWUSR,
1209 sn9c102_show_i2c_val, sn9c102_store_i2c_val);
1210 static CLASS_DEVICE_ATTR(green, S_IWUGO, NULL, sn9c102_store_green);
1211 static CLASS_DEVICE_ATTR(blue, S_IWUGO, NULL, sn9c102_store_blue);
1212 static CLASS_DEVICE_ATTR(red, S_IWUGO, NULL, sn9c102_store_red);
1213 static CLASS_DEVICE_ATTR(frame_header, S_IRUGO,
1214 sn9c102_show_frame_header, NULL);
1215
1216
1217 static void sn9c102_create_sysfs(struct sn9c102_device* cam)
1218 {
1219 struct video_device *v4ldev = cam->v4ldev;
1220
1221 video_device_create_file(v4ldev, &class_device_attr_reg);
1222 video_device_create_file(v4ldev, &class_device_attr_val);
1223 video_device_create_file(v4ldev, &class_device_attr_frame_header);
1224 if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
1225 video_device_create_file(v4ldev, &class_device_attr_green);
1226 else if (cam->bridge == BRIDGE_SN9C103) {
1227 video_device_create_file(v4ldev, &class_device_attr_blue);
1228 video_device_create_file(v4ldev, &class_device_attr_red);
1229 }
1230 if (cam->sensor->sysfs_ops) {
1231 video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
1232 video_device_create_file(v4ldev, &class_device_attr_i2c_val);
1233 }
1234 }
1235
1236 /*****************************************************************************/
1237
1238 static int
1239 sn9c102_set_pix_format(struct sn9c102_device* cam, struct v4l2_pix_format* pix)
1240 {
1241 int err = 0;
1242
1243 if (pix->pixelformat == V4L2_PIX_FMT_SN9C10X)
1244 err += sn9c102_write_reg(cam, cam->reg[0x18] | 0x80, 0x18);
1245 else
1246 err += sn9c102_write_reg(cam, cam->reg[0x18] & 0x7f, 0x18);
1247
1248 return err ? -EIO : 0;
1249 }
1250
1251
1252 static int
1253 sn9c102_set_compression(struct sn9c102_device* cam,
1254 struct v4l2_jpegcompression* compression)
1255 {
1256 int err = 0;
1257
1258 if (compression->quality == 0)
1259 err += sn9c102_write_reg(cam, cam->reg[0x17] | 0x01, 0x17);
1260 else if (compression->quality == 1)
1261 err += sn9c102_write_reg(cam, cam->reg[0x17] & 0xfe, 0x17);
1262
1263 return err ? -EIO : 0;
1264 }
1265
1266
1267 static int sn9c102_set_scale(struct sn9c102_device* cam, u8 scale)
1268 {
1269 u8 r = 0;
1270 int err = 0;
1271
1272 if (scale == 1)
1273 r = cam->reg[0x18] & 0xcf;
1274 else if (scale == 2) {
1275 r = cam->reg[0x18] & 0xcf;
1276 r |= 0x10;
1277 } else if (scale == 4)
1278 r = cam->reg[0x18] | 0x20;
1279
1280 err += sn9c102_write_reg(cam, r, 0x18);
1281 if (err)
1282 return -EIO;
1283
1284 PDBGG("Scaling factor: %u", scale)
1285
1286 return 0;
1287 }
1288
1289
1290 static int sn9c102_set_crop(struct sn9c102_device* cam, struct v4l2_rect* rect)
1291 {
1292 struct sn9c102_sensor* s = cam->sensor;
1293 u8 h_start = (u8)(rect->left - s->cropcap.bounds.left),
1294 v_start = (u8)(rect->top - s->cropcap.bounds.top),
1295 h_size = (u8)(rect->width / 16),
1296 v_size = (u8)(rect->height / 16);
1297 int err = 0;
1298
1299 err += sn9c102_write_reg(cam, h_start, 0x12);
1300 err += sn9c102_write_reg(cam, v_start, 0x13);
1301 err += sn9c102_write_reg(cam, h_size, 0x15);
1302 err += sn9c102_write_reg(cam, v_size, 0x16);
1303 if (err)
1304 return -EIO;
1305
1306 PDBGG("h_start, v_start, h_size, v_size, ho_size, vo_size "
1307 "%u %u %u %u", h_start, v_start, h_size, v_size)
1308
1309 return 0;
1310 }
1311
1312
1313 static int sn9c102_init(struct sn9c102_device* cam)
1314 {
1315 struct sn9c102_sensor* s = cam->sensor;
1316 struct v4l2_control ctrl;
1317 struct v4l2_queryctrl *qctrl;
1318 struct v4l2_rect* rect;
1319 u8 i = 0, n = 0;
1320 int err = 0;
1321
1322 if (!(cam->state & DEV_INITIALIZED)) {
1323 init_waitqueue_head(&cam->open);
1324 qctrl = s->qctrl;
1325 rect = &(s->cropcap.defrect);
1326 } else { /* use current values */
1327 qctrl = s->_qctrl;
1328 rect = &(s->_rect);
1329 }
1330
1331 err += sn9c102_set_scale(cam, rect->width / s->pix_format.width);
1332 err += sn9c102_set_crop(cam, rect);
1333 if (err)
1334 return err;
1335
1336 if (s->init) {
1337 err = s->init(cam);
1338 if (err) {
1339 DBG(3, "Sensor initialization failed")
1340 return err;
1341 }
1342 }
1343
1344 if (!(cam->state & DEV_INITIALIZED))
1345 cam->compression.quality = cam->reg[0x17] & 0x01 ? 0 : 1;
1346 else
1347 err += sn9c102_set_compression(cam, &cam->compression);
1348 err += sn9c102_set_pix_format(cam, &s->pix_format);
1349 if (s->set_pix_format)
1350 err += s->set_pix_format(cam, &s->pix_format);
1351 if (err)
1352 return err;
1353
1354 if (s->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X)
1355 DBG(3, "Compressed video format is active, quality %d",
1356 cam->compression.quality)
1357 else
1358 DBG(3, "Uncompressed video format is active")
1359
1360 if (s->set_crop)
1361 if ((err = s->set_crop(cam, rect))) {
1362 DBG(3, "set_crop() failed")
1363 return err;
1364 }
1365
1366 if (s->set_ctrl) {
1367 n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
1368 for (i = 0; i < n; i++)
1369 if (s->qctrl[i].id != 0 &&
1370 !(s->qctrl[i].flags & V4L2_CTRL_FLAG_DISABLED)) {
1371 ctrl.id = s->qctrl[i].id;
1372 ctrl.value = qctrl[i].default_value;
1373 err = s->set_ctrl(cam, &ctrl);
1374 if (err) {
1375 DBG(3, "Set %s control failed",
1376 s->qctrl[i].name)
1377 return err;
1378 }
1379 DBG(3, "Image sensor supports '%s' control",
1380 s->qctrl[i].name)
1381 }
1382 }
1383
1384 if (!(cam->state & DEV_INITIALIZED)) {
1385 init_MUTEX(&cam->fileop_sem);
1386 spin_lock_init(&cam->queue_lock);
1387 init_waitqueue_head(&cam->wait_frame);
1388 init_waitqueue_head(&cam->wait_stream);
1389 cam->nreadbuffers = 2;
1390 memcpy(s->_qctrl, s->qctrl, sizeof(s->qctrl));
1391 memcpy(&(s->_rect), &(s->cropcap.defrect),
1392 sizeof(struct v4l2_rect));
1393 cam->state |= DEV_INITIALIZED;
1394 }
1395
1396 DBG(2, "Initialization succeeded")
1397 return 0;
1398 }
1399
1400
1401 static void sn9c102_release_resources(struct sn9c102_device* cam)
1402 {
1403 down(&sn9c102_sysfs_lock);
1404
1405 DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->minor)
1406 video_set_drvdata(cam->v4ldev, NULL);
1407 video_unregister_device(cam->v4ldev);
1408
1409 up(&sn9c102_sysfs_lock);
1410
1411 kfree(cam->control_buffer);
1412 }
1413
1414 /*****************************************************************************/
1415
1416 static int sn9c102_open(struct inode* inode, struct file* filp)
1417 {
1418 struct sn9c102_device* cam;
1419 int err = 0;
1420
1421 /*
1422 This is the only safe way to prevent race conditions with
1423 disconnect
1424 */
1425 if (!down_read_trylock(&sn9c102_disconnect))
1426 return -ERESTARTSYS;
1427
1428 cam = video_get_drvdata(video_devdata(filp));
1429
1430 if (down_interruptible(&cam->dev_sem)) {
1431 up_read(&sn9c102_disconnect);
1432 return -ERESTARTSYS;
1433 }
1434
1435 if (cam->users) {
1436 DBG(2, "Device /dev/video%d is busy...", cam->v4ldev->minor)
1437 if ((filp->f_flags & O_NONBLOCK) ||
1438 (filp->f_flags & O_NDELAY)) {
1439 err = -EWOULDBLOCK;
1440 goto out;
1441 }
1442 up(&cam->dev_sem);
1443 err = wait_event_interruptible_exclusive(cam->open,
1444 cam->state & DEV_DISCONNECTED
1445 || !cam->users);
1446 if (err) {
1447 up_read(&sn9c102_disconnect);
1448 return err;
1449 }
1450 if (cam->state & DEV_DISCONNECTED) {
1451 up_read(&sn9c102_disconnect);
1452 return -ENODEV;
1453 }
1454 down(&cam->dev_sem);
1455 }
1456
1457
1458 if (cam->state & DEV_MISCONFIGURED) {
1459 err = sn9c102_init(cam);
1460 if (err) {
1461 DBG(1, "Initialization failed again. "
1462 "I will retry on next open().")
1463 goto out;
1464 }
1465 cam->state &= ~DEV_MISCONFIGURED;
1466 }
1467
1468 if ((err = sn9c102_start_transfer(cam)))
1469 goto out;
1470
1471 filp->private_data = cam;
1472 cam->users++;
1473 cam->io = IO_NONE;
1474 cam->stream = STREAM_OFF;
1475 cam->nbuffers = 0;
1476 cam->frame_count = 0;
1477 sn9c102_empty_framequeues(cam);
1478
1479 DBG(3, "Video device /dev/video%d is open", cam->v4ldev->minor)
1480
1481 out:
1482 up(&cam->dev_sem);
1483 up_read(&sn9c102_disconnect);
1484 return err;
1485 }
1486
1487
1488 static int sn9c102_release(struct inode* inode, struct file* filp)
1489 {
1490 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
1491
1492 down(&cam->dev_sem); /* prevent disconnect() to be called */
1493
1494 sn9c102_stop_transfer(cam);
1495
1496 sn9c102_release_buffers(cam);
1497
1498 if (cam->state & DEV_DISCONNECTED) {
1499 sn9c102_release_resources(cam);
1500 up(&cam->dev_sem);
1501 kfree(cam);
1502 return 0;
1503 }
1504
1505 cam->users--;
1506 wake_up_interruptible_nr(&cam->open, 1);
1507
1508 DBG(3, "Video device /dev/video%d closed", cam->v4ldev->minor)
1509
1510 up(&cam->dev_sem);
1511
1512 return 0;
1513 }
1514
1515
1516 static ssize_t
1517 sn9c102_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos)
1518 {
1519 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
1520 struct sn9c102_frame_t* f, * i;
1521 unsigned long lock_flags;
1522 int err = 0;
1523
1524 if (down_interruptible(&cam->fileop_sem))
1525 return -ERESTARTSYS;
1526
1527 if (cam->state & DEV_DISCONNECTED) {
1528 DBG(1, "Device not present")
1529 up(&cam->fileop_sem);
1530 return -ENODEV;
1531 }
1532
1533 if (cam->state & DEV_MISCONFIGURED) {
1534 DBG(1, "The camera is misconfigured. Close and open it again.")
1535 up(&cam->fileop_sem);
1536 return -EIO;
1537 }
1538
1539 if (cam->io == IO_MMAP) {
1540 DBG(3, "Close and open the device again to choose "
1541 "the read method")
1542 up(&cam->fileop_sem);
1543 return -EINVAL;
1544 }
1545
1546 if (cam->io == IO_NONE) {
1547 if (!sn9c102_request_buffers(cam,cam->nreadbuffers, IO_READ)) {
1548 DBG(1, "read() failed, not enough memory")
1549 up(&cam->fileop_sem);
1550 return -ENOMEM;
1551 }
1552 cam->io = IO_READ;
1553 cam->stream = STREAM_ON;
1554 sn9c102_queue_unusedframes(cam);
1555 }
1556
1557 if (!count) {
1558 up(&cam->fileop_sem);
1559 return 0;
1560 }
1561
1562 if (list_empty(&cam->outqueue)) {
1563 if (filp->f_flags & O_NONBLOCK) {
1564 up(&cam->fileop_sem);
1565 return -EAGAIN;
1566 }
1567 err = wait_event_interruptible
1568 ( cam->wait_frame,
1569 (!list_empty(&cam->outqueue)) ||
1570 (cam->state & DEV_DISCONNECTED) ||
1571 (cam->state & DEV_MISCONFIGURED) );
1572 if (err) {
1573 up(&cam->fileop_sem);
1574 return err;
1575 }
1576 if (cam->state & DEV_DISCONNECTED) {
1577 up(&cam->fileop_sem);
1578 return -ENODEV;
1579 }
1580 if (cam->state & DEV_MISCONFIGURED) {
1581 up(&cam->fileop_sem);
1582 return -EIO;
1583 }
1584 }
1585
1586 f = list_entry(cam->outqueue.prev, struct sn9c102_frame_t, frame);
1587
1588 spin_lock_irqsave(&cam->queue_lock, lock_flags);
1589 list_for_each_entry(i, &cam->outqueue, frame)
1590 i->state = F_UNUSED;
1591 INIT_LIST_HEAD(&cam->outqueue);
1592 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
1593
1594 sn9c102_queue_unusedframes(cam);
1595
1596 if (count > f->buf.bytesused)
1597 count = f->buf.bytesused;
1598
1599 if (copy_to_user(buf, f->bufmem, count)) {
1600 up(&cam->fileop_sem);
1601 return -EFAULT;
1602 }
1603 *f_pos += count;
1604
1605 PDBGG("Frame #%lu, bytes read: %zu", (unsigned long)f->buf.index,count)
1606
1607 up(&cam->fileop_sem);
1608
1609 return count;
1610 }
1611
1612
1613 static unsigned int sn9c102_poll(struct file *filp, poll_table *wait)
1614 {
1615 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
1616 unsigned int mask = 0;
1617
1618 if (down_interruptible(&cam->fileop_sem))
1619 return POLLERR;
1620
1621 if (cam->state & DEV_DISCONNECTED) {
1622 DBG(1, "Device not present")
1623 goto error;
1624 }
1625
1626 if (cam->state & DEV_MISCONFIGURED) {
1627 DBG(1, "The camera is misconfigured. Close and open it again.")
1628 goto error;
1629 }
1630
1631 if (cam->io == IO_NONE) {
1632 if (!sn9c102_request_buffers(cam, cam->nreadbuffers,
1633 IO_READ)) {
1634 DBG(1, "poll() failed, not enough memory")
1635 goto error;
1636 }
1637 cam->io = IO_READ;
1638 cam->stream = STREAM_ON;
1639 }
1640
1641 if (cam->io == IO_READ)
1642 sn9c102_queue_unusedframes(cam);
1643
1644 poll_wait(filp, &cam->wait_frame, wait);
1645
1646 if (!list_empty(&cam->outqueue))
1647 mask |= POLLIN | POLLRDNORM;
1648
1649 up(&cam->fileop_sem);
1650
1651 return mask;
1652
1653 error:
1654 up(&cam->fileop_sem);
1655 return POLLERR;
1656 }
1657
1658
1659 static void sn9c102_vm_open(struct vm_area_struct* vma)
1660 {
1661 struct sn9c102_frame_t* f = vma->vm_private_data;
1662 f->vma_use_count++;
1663 }
1664
1665
1666 static void sn9c102_vm_close(struct vm_area_struct* vma)
1667 {
1668 /* NOTE: buffers are not freed here */
1669 struct sn9c102_frame_t* f = vma->vm_private_data;
1670 f->vma_use_count--;
1671 }
1672
1673
1674 static struct vm_operations_struct sn9c102_vm_ops = {
1675 .open = sn9c102_vm_open,
1676 .close = sn9c102_vm_close,
1677 };
1678
1679
1680 static int sn9c102_mmap(struct file* filp, struct vm_area_struct *vma)
1681 {
1682 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
1683 unsigned long size = vma->vm_end - vma->vm_start,
1684 start = vma->vm_start,
1685 pos,
1686 page;
1687 u32 i;
1688
1689 if (down_interruptible(&cam->fileop_sem))
1690 return -ERESTARTSYS;
1691
1692 if (cam->state & DEV_DISCONNECTED) {
1693 DBG(1, "Device not present")
1694 up(&cam->fileop_sem);
1695 return -ENODEV;
1696 }
1697
1698 if (cam->state & DEV_MISCONFIGURED) {
1699 DBG(1, "The camera is misconfigured. Close and open it again.")
1700 up(&cam->fileop_sem);
1701 return -EIO;
1702 }
1703
1704 if (cam->io != IO_MMAP || !(vma->vm_flags & VM_WRITE) ||
1705 size != PAGE_ALIGN(cam->frame[0].buf.length)) {
1706 up(&cam->fileop_sem);
1707 return -EINVAL;
1708 }
1709
1710 for (i = 0; i < cam->nbuffers; i++) {
1711 if ((cam->frame[i].buf.m.offset>>PAGE_SHIFT) == vma->vm_pgoff)
1712 break;
1713 }
1714 if (i == cam->nbuffers) {
1715 up(&cam->fileop_sem);
1716 return -EINVAL;
1717 }
1718
1719 /* VM_IO is eventually going to replace PageReserved altogether */
1720 vma->vm_flags |= VM_IO;
1721 vma->vm_flags |= VM_RESERVED; /* avoid to swap out this VMA */
1722
1723 pos = (unsigned long)cam->frame[i].bufmem;
1724 while (size > 0) { /* size is page-aligned */
1725 page = vmalloc_to_pfn((void *)pos);
1726 if (remap_pfn_range(vma, start, page, PAGE_SIZE,
1727 vma->vm_page_prot)) {
1728 up(&cam->fileop_sem);
1729 return -EAGAIN;
1730 }
1731 start += PAGE_SIZE;
1732 pos += PAGE_SIZE;
1733 size -= PAGE_SIZE;
1734 }
1735
1736 vma->vm_ops = &sn9c102_vm_ops;
1737 vma->vm_private_data = &cam->frame[i];
1738
1739 sn9c102_vm_open(vma);
1740
1741 up(&cam->fileop_sem);
1742
1743 return 0;
1744 }
1745
1746
1747 static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
1748 unsigned int cmd, void __user * arg)
1749 {
1750 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
1751
1752 switch (cmd) {
1753
1754 case VIDIOC_QUERYCAP:
1755 {
1756 struct v4l2_capability cap = {
1757 .driver = "sn9c102",
1758 .version = SN9C102_MODULE_VERSION_CODE,
1759 .capabilities = V4L2_CAP_VIDEO_CAPTURE |
1760 V4L2_CAP_READWRITE |
1761 V4L2_CAP_STREAMING,
1762 };
1763
1764 strlcpy(cap.card, cam->v4ldev->name, sizeof(cap.card));
1765 if (usb_make_path(cam->usbdev, cap.bus_info,
1766 sizeof(cap.bus_info)) < 0)
1767 strlcpy(cap.bus_info, cam->dev.bus_id,
1768 sizeof(cap.bus_info));
1769
1770 if (copy_to_user(arg, &cap, sizeof(cap)))
1771 return -EFAULT;
1772
1773 return 0;
1774 }
1775
1776 case VIDIOC_ENUMINPUT:
1777 {
1778 struct v4l2_input i;
1779
1780 if (copy_from_user(&i, arg, sizeof(i)))
1781 return -EFAULT;
1782
1783 if (i.index)
1784 return -EINVAL;
1785
1786 memset(&i, 0, sizeof(i));
1787 strcpy(i.name, "USB");
1788
1789 if (copy_to_user(arg, &i, sizeof(i)))
1790 return -EFAULT;
1791
1792 return 0;
1793 }
1794
1795 case VIDIOC_G_INPUT:
1796 case VIDIOC_S_INPUT:
1797 {
1798 int index;
1799
1800 if (copy_from_user(&index, arg, sizeof(index)))
1801 return -EFAULT;
1802
1803 if (index != 0)
1804 return -EINVAL;
1805
1806 return 0;
1807 }
1808
1809 case VIDIOC_QUERYCTRL:
1810 {
1811 struct sn9c102_sensor* s = cam->sensor;
1812 struct v4l2_queryctrl qc;
1813 u8 i, n;
1814
1815 if (copy_from_user(&qc, arg, sizeof(qc)))
1816 return -EFAULT;
1817
1818 n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
1819 for (i = 0; i < n; i++)
1820 if (qc.id && qc.id == s->qctrl[i].id) {
1821 memcpy(&qc, &(s->qctrl[i]), sizeof(qc));
1822 if (copy_to_user(arg, &qc, sizeof(qc)))
1823 return -EFAULT;
1824 return 0;
1825 }
1826
1827 return -EINVAL;
1828 }
1829
1830 case VIDIOC_G_CTRL:
1831 {
1832 struct sn9c102_sensor* s = cam->sensor;
1833 struct v4l2_control ctrl;
1834 int err = 0;
1835
1836 if (!s->get_ctrl)
1837 return -EINVAL;
1838
1839 if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
1840 return -EFAULT;
1841
1842 err = s->get_ctrl(cam, &ctrl);
1843
1844 if (copy_to_user(arg, &ctrl, sizeof(ctrl)))
1845 return -EFAULT;
1846
1847 return err;
1848 }
1849
1850 case VIDIOC_S_CTRL_OLD:
1851 case VIDIOC_S_CTRL:
1852 {
1853 struct sn9c102_sensor* s = cam->sensor;
1854 struct v4l2_control ctrl;
1855 u8 i, n;
1856 int err = 0;
1857
1858 if (!s->set_ctrl)
1859 return -EINVAL;
1860
1861 if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
1862 return -EFAULT;
1863
1864 n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
1865 for (i = 0; i < n; i++)
1866 if (ctrl.id == s->qctrl[i].id) {
1867 if (ctrl.value < s->qctrl[i].minimum ||
1868 ctrl.value > s->qctrl[i].maximum)
1869 return -ERANGE;
1870 ctrl.value -= ctrl.value % s->qctrl[i].step;
1871 break;
1872 }
1873
1874 if ((err = s->set_ctrl(cam, &ctrl)))
1875 return err;
1876
1877 s->_qctrl[i].default_value = ctrl.value;
1878
1879 PDBGG("VIDIOC_S_CTRL: id %lu, value %lu",
1880 (unsigned long)ctrl.id, (unsigned long)ctrl.value)
1881
1882 return 0;
1883 }
1884
1885 case VIDIOC_CROPCAP:
1886 {
1887 struct v4l2_cropcap* cc = &(cam->sensor->cropcap);
1888
1889 cc->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1890 cc->pixelaspect.numerator = 1;
1891 cc->pixelaspect.denominator = 1;
1892
1893 if (copy_to_user(arg, cc, sizeof(*cc)))
1894 return -EFAULT;
1895
1896 return 0;
1897 }
1898
1899 case VIDIOC_G_CROP:
1900 {
1901 struct sn9c102_sensor* s = cam->sensor;
1902 struct v4l2_crop crop = {
1903 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
1904 };
1905
1906 memcpy(&(crop.c), &(s->_rect), sizeof(struct v4l2_rect));
1907
1908 if (copy_to_user(arg, &crop, sizeof(crop)))
1909 return -EFAULT;
1910
1911 return 0;
1912 }
1913
1914 case VIDIOC_S_CROP:
1915 {
1916 struct sn9c102_sensor* s = cam->sensor;
1917 struct v4l2_crop crop;
1918 struct v4l2_rect* rect;
1919 struct v4l2_rect* bounds = &(s->cropcap.bounds);
1920 struct v4l2_pix_format* pix_format = &(s->pix_format);
1921 u8 scale;
1922 const enum sn9c102_stream_state stream = cam->stream;
1923 const u32 nbuffers = cam->nbuffers;
1924 u32 i;
1925 int err = 0;
1926
1927 if (copy_from_user(&crop, arg, sizeof(crop)))
1928 return -EFAULT;
1929
1930 rect = &(crop.c);
1931
1932 if (crop.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1933 return -EINVAL;
1934
1935 if (cam->module_param.force_munmap)
1936 for (i = 0; i < cam->nbuffers; i++)
1937 if (cam->frame[i].vma_use_count) {
1938 DBG(3, "VIDIOC_S_CROP failed. "
1939 "Unmap the buffers first.")
1940 return -EINVAL;
1941 }
1942
1943 /* Preserve R,G or B origin */
1944 rect->left = (s->_rect.left & 1L) ?
1945 rect->left | 1L : rect->left & ~1L;
1946 rect->top = (s->_rect.top & 1L) ?
1947 rect->top | 1L : rect->top & ~1L;
1948
1949 if (rect->width < 16)
1950 rect->width = 16;
1951 if (rect->height < 16)
1952 rect->height = 16;
1953 if (rect->width > bounds->width)
1954 rect->width = bounds->width;
1955 if (rect->height > bounds->height)
1956 rect->height = bounds->height;
1957 if (rect->left < bounds->left)
1958 rect->left = bounds->left;
1959 if (rect->top < bounds->top)
1960 rect->top = bounds->top;
1961 if (rect->left + rect->width > bounds->left + bounds->width)
1962 rect->left = bounds->left+bounds->width - rect->width;
1963 if (rect->top + rect->height > bounds->top + bounds->height)
1964 rect->top = bounds->top+bounds->height - rect->height;
1965
1966 rect->width &= ~15L;
1967 rect->height &= ~15L;
1968
1969 if (SN9C102_PRESERVE_IMGSCALE) {
1970 /* Calculate the actual scaling factor */
1971 u32 a, b;
1972 a = rect->width * rect->height;
1973 b = pix_format->width * pix_format->height;
1974 scale = b ? (u8)((a / b) < 4 ? 1 :
1975 ((a / b) < 16 ? 2 : 4)) : 1;
1976 } else
1977 scale = 1;
1978
1979 if (cam->stream == STREAM_ON)
1980 if ((err = sn9c102_stream_interrupt(cam)))
1981 return err;
1982
1983 if (copy_to_user(arg, &crop, sizeof(crop))) {
1984 cam->stream = stream;
1985 return -EFAULT;
1986 }
1987
1988 if (cam->module_param.force_munmap || cam->io == IO_READ)
1989 sn9c102_release_buffers(cam);
1990
1991 err = sn9c102_set_crop(cam, rect);
1992 if (s->set_crop)
1993 err += s->set_crop(cam, rect);
1994 err += sn9c102_set_scale(cam, scale);
1995
1996 if (err) { /* atomic, no rollback in ioctl() */
1997 cam->state |= DEV_MISCONFIGURED;
1998 DBG(1, "VIDIOC_S_CROP failed because of hardware "
1999 "problems. To use the camera, close and open "
2000 "/dev/video%d again.", cam->v4ldev->minor)
2001 return -EIO;
2002 }
2003
2004 s->pix_format.width = rect->width/scale;
2005 s->pix_format.height = rect->height/scale;
2006 memcpy(&(s->_rect), rect, sizeof(*rect));
2007
2008 if ((cam->module_param.force_munmap || cam->io == IO_READ) &&
2009 nbuffers != sn9c102_request_buffers(cam, nbuffers,
2010 cam->io)) {
2011 cam->state |= DEV_MISCONFIGURED;
2012 DBG(1, "VIDIOC_S_CROP failed because of not enough "
2013 "memory. To use the camera, close and open "
2014 "/dev/video%d again.", cam->v4ldev->minor)
2015 return -ENOMEM;
2016 }
2017
2018 cam->stream = stream;
2019
2020 return 0;
2021 }
2022
2023 case VIDIOC_ENUM_FMT:
2024 {
2025 struct v4l2_fmtdesc fmtd;
2026
2027 if (copy_from_user(&fmtd, arg, sizeof(fmtd)))
2028 return -EFAULT;
2029
2030 if (fmtd.index == 0) {
2031 strcpy(fmtd.description, "bayer rgb");
2032 fmtd.pixelformat = V4L2_PIX_FMT_SBGGR8;
2033 } else if (fmtd.index == 1) {
2034 strcpy(fmtd.description, "compressed");
2035 fmtd.pixelformat = V4L2_PIX_FMT_SN9C10X;
2036 fmtd.flags = V4L2_FMT_FLAG_COMPRESSED;
2037 } else
2038 return -EINVAL;
2039
2040 fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2041 memset(&fmtd.reserved, 0, sizeof(fmtd.reserved));
2042
2043 if (copy_to_user(arg, &fmtd, sizeof(fmtd)))
2044 return -EFAULT;
2045
2046 return 0;
2047 }
2048
2049 case VIDIOC_G_FMT:
2050 {
2051 struct v4l2_format format;
2052 struct v4l2_pix_format* pfmt = &(cam->sensor->pix_format);
2053
2054 if (copy_from_user(&format, arg, sizeof(format)))
2055 return -EFAULT;
2056
2057 if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2058 return -EINVAL;
2059
2060 pfmt->bytesperline = (pfmt->pixelformat==V4L2_PIX_FMT_SN9C10X)
2061 ? 0 : (pfmt->width * pfmt->priv) / 8;
2062 pfmt->sizeimage = pfmt->height * ((pfmt->width*pfmt->priv)/8);
2063 pfmt->field = V4L2_FIELD_NONE;
2064 memcpy(&(format.fmt.pix), pfmt, sizeof(*pfmt));
2065
2066 if (copy_to_user(arg, &format, sizeof(format)))
2067 return -EFAULT;
2068
2069 return 0;
2070 }
2071
2072 case VIDIOC_TRY_FMT:
2073 case VIDIOC_S_FMT:
2074 {
2075 struct sn9c102_sensor* s = cam->sensor;
2076 struct v4l2_format format;
2077 struct v4l2_pix_format* pix;
2078 struct v4l2_pix_format* pfmt = &(s->pix_format);
2079 struct v4l2_rect* bounds = &(s->cropcap.bounds);
2080 struct v4l2_rect rect;
2081 u8 scale;
2082 const enum sn9c102_stream_state stream = cam->stream;
2083 const u32 nbuffers = cam->nbuffers;
2084 u32 i;
2085 int err = 0;
2086
2087 if (copy_from_user(&format, arg, sizeof(format)))
2088 return -EFAULT;
2089
2090 pix = &(format.fmt.pix);
2091
2092 if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2093 return -EINVAL;
2094
2095 memcpy(&rect, &(s->_rect), sizeof(rect));
2096
2097 { /* calculate the actual scaling factor */
2098 u32 a, b;
2099 a = rect.width * rect.height;
2100 b = pix->width * pix->height;
2101 scale = b ? (u8)((a / b) < 4 ? 1 :
2102 ((a / b) < 16 ? 2 : 4)) : 1;
2103 }
2104
2105 rect.width = scale * pix->width;
2106 rect.height = scale * pix->height;
2107
2108 if (rect.width < 16)
2109 rect.width = 16;
2110 if (rect.height < 16)
2111 rect.height = 16;
2112 if (rect.width > bounds->left + bounds->width - rect.left)
2113 rect.width = bounds->left + bounds->width - rect.left;
2114 if (rect.height > bounds->top + bounds->height - rect.top)
2115 rect.height = bounds->top + bounds->height - rect.top;
2116
2117 rect.width &= ~15L;
2118 rect.height &= ~15L;
2119
2120 { /* adjust the scaling factor */
2121 u32 a, b;
2122 a = rect.width * rect.height;
2123 b = pix->width * pix->height;
2124 scale = b ? (u8)((a / b) < 4 ? 1 :
2125 ((a / b) < 16 ? 2 : 4)) : 1;
2126 }
2127
2128 pix->width = rect.width / scale;
2129 pix->height = rect.height / scale;
2130
2131 if (pix->pixelformat != V4L2_PIX_FMT_SN9C10X &&
2132 pix->pixelformat != V4L2_PIX_FMT_SBGGR8)
2133 pix->pixelformat = pfmt->pixelformat;
2134 pix->priv = pfmt->priv; /* bpp */
2135 pix->colorspace = pfmt->colorspace;
2136 pix->bytesperline = (pix->pixelformat == V4L2_PIX_FMT_SN9C10X)
2137 ? 0 : (pix->width * pix->priv) / 8;
2138 pix->sizeimage = pix->height * ((pix->width * pix->priv) / 8);
2139 pix->field = V4L2_FIELD_NONE;
2140
2141 if (cmd == VIDIOC_TRY_FMT) {
2142 if (copy_to_user(arg, &format, sizeof(format)))
2143 return -EFAULT;
2144 return 0;
2145 }
2146
2147 if (cam->module_param.force_munmap)
2148 for (i = 0; i < cam->nbuffers; i++)
2149 if (cam->frame[i].vma_use_count) {
2150 DBG(3, "VIDIOC_S_FMT failed. "
2151 "Unmap the buffers first.")
2152 return -EINVAL;
2153 }
2154
2155 if (cam->stream == STREAM_ON)
2156 if ((err = sn9c102_stream_interrupt(cam)))
2157 return err;
2158
2159 if (copy_to_user(arg, &format, sizeof(format))) {
2160 cam->stream = stream;
2161 return -EFAULT;
2162 }
2163
2164 if (cam->module_param.force_munmap || cam->io == IO_READ)
2165 sn9c102_release_buffers(cam);
2166
2167 err += sn9c102_set_pix_format(cam, pix);
2168 err += sn9c102_set_crop(cam, &rect);
2169 if (s->set_pix_format)
2170 err += s->set_pix_format(cam, pix);
2171 if (s->set_crop)
2172 err += s->set_crop(cam, &rect);
2173 err += sn9c102_set_scale(cam, scale);
2174
2175 if (err) { /* atomic, no rollback in ioctl() */
2176 cam->state |= DEV_MISCONFIGURED;
2177 DBG(1, "VIDIOC_S_FMT failed because of hardware "
2178 "problems. To use the camera, close and open "
2179 "/dev/video%d again.", cam->v4ldev->minor)
2180 return -EIO;
2181 }
2182
2183 memcpy(pfmt, pix, sizeof(*pix));
2184 memcpy(&(s->_rect), &rect, sizeof(rect));
2185
2186 if ((cam->module_param.force_munmap || cam->io == IO_READ) &&
2187 nbuffers != sn9c102_request_buffers(cam, nbuffers,
2188 cam->io)) {
2189 cam->state |= DEV_MISCONFIGURED;
2190 DBG(1, "VIDIOC_S_FMT failed because of not enough "
2191 "memory. To use the camera, close and open "
2192 "/dev/video%d again.", cam->v4ldev->minor)
2193 return -ENOMEM;
2194 }
2195
2196 cam->stream = stream;
2197
2198 return 0;
2199 }
2200
2201 case VIDIOC_G_JPEGCOMP:
2202 {
2203 if (copy_to_user(arg, &cam->compression,
2204 sizeof(cam->compression)))
2205 return -EFAULT;
2206
2207 return 0;
2208 }
2209
2210 case VIDIOC_S_JPEGCOMP:
2211 {
2212 struct v4l2_jpegcompression jc;
2213 const enum sn9c102_stream_state stream = cam->stream;
2214 int err = 0;
2215
2216 if (copy_from_user(&jc, arg, sizeof(jc)))
2217 return -EFAULT;
2218
2219 if (jc.quality != 0 && jc.quality != 1)
2220 return -EINVAL;
2221
2222 if (cam->stream == STREAM_ON)
2223 if ((err = sn9c102_stream_interrupt(cam)))
2224 return err;
2225
2226 err += sn9c102_set_compression(cam, &jc);
2227 if (err) { /* atomic, no rollback in ioctl() */
2228 cam->state |= DEV_MISCONFIGURED;
2229 DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware "
2230 "problems. To use the camera, close and open "
2231 "/dev/video%d again.", cam->v4ldev->minor)
2232 return -EIO;
2233 }
2234
2235 cam->compression.quality = jc.quality;
2236
2237 cam->stream = stream;
2238
2239 return 0;
2240 }
2241
2242 case VIDIOC_REQBUFS:
2243 {
2244 struct v4l2_requestbuffers rb;
2245 u32 i;
2246 int err;
2247
2248 if (copy_from_user(&rb, arg, sizeof(rb)))
2249 return -EFAULT;
2250
2251 if (rb.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2252 rb.memory != V4L2_MEMORY_MMAP)
2253 return -EINVAL;
2254
2255 if (cam->io == IO_READ) {
2256 DBG(3, "Close and open the device again to choose "
2257 "the mmap I/O method")
2258 return -EINVAL;
2259 }
2260
2261 for (i = 0; i < cam->nbuffers; i++)
2262 if (cam->frame[i].vma_use_count) {
2263 DBG(3, "VIDIOC_REQBUFS failed. "
2264 "Previous buffers are still mapped.")
2265 return -EINVAL;
2266 }
2267
2268 if (cam->stream == STREAM_ON)
2269 if ((err = sn9c102_stream_interrupt(cam)))
2270 return err;
2271
2272 sn9c102_empty_framequeues(cam);
2273
2274 sn9c102_release_buffers(cam);
2275 if (rb.count)
2276 rb.count = sn9c102_request_buffers(cam, rb.count,
2277 IO_MMAP);
2278
2279 if (copy_to_user(arg, &rb, sizeof(rb))) {
2280 sn9c102_release_buffers(cam);
2281 cam->io = IO_NONE;
2282 return -EFAULT;
2283 }
2284
2285 cam->io = rb.count ? IO_MMAP : IO_NONE;
2286
2287 return 0;
2288 }
2289
2290 case VIDIOC_QUERYBUF:
2291 {
2292 struct v4l2_buffer b;
2293
2294 if (copy_from_user(&b, arg, sizeof(b)))
2295 return -EFAULT;
2296
2297 if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2298 b.index >= cam->nbuffers || cam->io != IO_MMAP)
2299 return -EINVAL;
2300
2301 memcpy(&b, &cam->frame[b.index].buf, sizeof(b));
2302
2303 if (cam->frame[b.index].vma_use_count)
2304 b.flags |= V4L2_BUF_FLAG_MAPPED;
2305
2306 if (cam->frame[b.index].state == F_DONE)
2307 b.flags |= V4L2_BUF_FLAG_DONE;
2308 else if (cam->frame[b.index].state != F_UNUSED)
2309 b.flags |= V4L2_BUF_FLAG_QUEUED;
2310
2311 if (copy_to_user(arg, &b, sizeof(b)))
2312 return -EFAULT;
2313
2314 return 0;
2315 }
2316
2317 case VIDIOC_QBUF:
2318 {
2319 struct v4l2_buffer b;
2320 unsigned long lock_flags;
2321
2322 if (copy_from_user(&b, arg, sizeof(b)))
2323 return -EFAULT;
2324
2325 if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2326 b.index >= cam->nbuffers || cam->io != IO_MMAP)
2327 return -EINVAL;
2328
2329 if (cam->frame[b.index].state != F_UNUSED)
2330 return -EINVAL;
2331
2332 cam->frame[b.index].state = F_QUEUED;
2333
2334 spin_lock_irqsave(&cam->queue_lock, lock_flags);
2335 list_add_tail(&cam->frame[b.index].frame, &cam->inqueue);
2336 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
2337
2338 PDBGG("Frame #%lu queued", (unsigned long)b.index)
2339
2340 return 0;
2341 }
2342
2343 case VIDIOC_DQBUF:
2344 {
2345 struct v4l2_buffer b;
2346 struct sn9c102_frame_t *f;
2347 unsigned long lock_flags;
2348 int err = 0;
2349
2350 if (copy_from_user(&b, arg, sizeof(b)))
2351 return -EFAULT;
2352
2353 if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io!= IO_MMAP)
2354 return -EINVAL;
2355
2356 if (list_empty(&cam->outqueue)) {
2357 if (cam->stream == STREAM_OFF)
2358 return -EINVAL;
2359 if (filp->f_flags & O_NONBLOCK)
2360 return -EAGAIN;
2361 err = wait_event_interruptible
2362 ( cam->wait_frame,
2363 (!list_empty(&cam->outqueue)) ||
2364 (cam->state & DEV_DISCONNECTED) ||
2365 (cam->state & DEV_MISCONFIGURED) );
2366 if (err)
2367 return err;
2368 if (cam->state & DEV_DISCONNECTED)
2369 return -ENODEV;
2370 if (cam->state & DEV_MISCONFIGURED)
2371 return -EIO;
2372 }
2373
2374 spin_lock_irqsave(&cam->queue_lock, lock_flags);
2375 f = list_entry(cam->outqueue.next, struct sn9c102_frame_t,
2376 frame);
2377 list_del(cam->outqueue.next);
2378 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
2379
2380 f->state = F_UNUSED;
2381
2382 memcpy(&b, &f->buf, sizeof(b));
2383 if (f->vma_use_count)
2384 b.flags |= V4L2_BUF_FLAG_MAPPED;
2385
2386 if (copy_to_user(arg, &b, sizeof(b)))
2387 return -EFAULT;
2388
2389 PDBGG("Frame #%lu dequeued", (unsigned long)f->buf.index)
2390
2391 return 0;
2392 }
2393
2394 case VIDIOC_STREAMON:
2395 {
2396 int type;
2397
2398 if (copy_from_user(&type, arg, sizeof(type)))
2399 return -EFAULT;
2400
2401 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2402 return -EINVAL;
2403
2404 if (list_empty(&cam->inqueue))
2405 return -EINVAL;
2406
2407 cam->stream = STREAM_ON;
2408
2409 DBG(3, "Stream on")
2410
2411 return 0;
2412 }
2413
2414 case VIDIOC_STREAMOFF:
2415 {
2416 int type, err;
2417
2418 if (copy_from_user(&type, arg, sizeof(type)))
2419 return -EFAULT;
2420
2421 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2422 return -EINVAL;
2423
2424 if (cam->stream == STREAM_ON)
2425 if ((err = sn9c102_stream_interrupt(cam)))
2426 return err;
2427
2428 sn9c102_empty_framequeues(cam);
2429
2430 DBG(3, "Stream off")
2431
2432 return 0;
2433 }
2434
2435 case VIDIOC_G_PARM:
2436 {
2437 struct v4l2_streamparm sp;
2438
2439 if (copy_from_user(&sp, arg, sizeof(sp)))
2440 return -EFAULT;
2441
2442 if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2443 return -EINVAL;
2444
2445 sp.parm.capture.extendedmode = 0;
2446 sp.parm.capture.readbuffers = cam->nreadbuffers;
2447
2448 if (copy_to_user(arg, &sp, sizeof(sp)))
2449 return -EFAULT;
2450
2451 return 0;
2452 }
2453
2454 case VIDIOC_S_PARM_OLD:
2455 case VIDIOC_S_PARM:
2456 {
2457 struct v4l2_streamparm sp;
2458
2459 if (copy_from_user(&sp, arg, sizeof(sp)))
2460 return -EFAULT;
2461
2462 if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2463 return -EINVAL;
2464
2465 sp.parm.capture.extendedmode = 0;
2466
2467 if (sp.parm.capture.readbuffers == 0)
2468 sp.parm.capture.readbuffers = cam->nreadbuffers;
2469
2470 if (sp.parm.capture.readbuffers > SN9C102_MAX_FRAMES)
2471 sp.parm.capture.readbuffers = SN9C102_MAX_FRAMES;
2472
2473 if (copy_to_user(arg, &sp, sizeof(sp)))
2474 return -EFAULT;
2475
2476 cam->nreadbuffers = sp.parm.capture.readbuffers;
2477
2478 return 0;
2479 }
2480
2481 case VIDIOC_G_STD:
2482 case VIDIOC_S_STD:
2483 case VIDIOC_QUERYSTD:
2484 case VIDIOC_ENUMSTD:
2485 case VIDIOC_QUERYMENU:
2486 return -EINVAL;
2487
2488 default:
2489 return -EINVAL;
2490
2491 }
2492 }
2493
2494
2495 static int sn9c102_ioctl(struct inode* inode, struct file* filp,
2496 unsigned int cmd, unsigned long arg)
2497 {
2498 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
2499 int err = 0;
2500
2501 if (down_interruptible(&cam->fileop_sem))
2502 return -ERESTARTSYS;
2503
2504 if (cam->state & DEV_DISCONNECTED) {
2505 DBG(1, "Device not present")
2506 up(&cam->fileop_sem);
2507 return -ENODEV;
2508 }
2509
2510 if (cam->state & DEV_MISCONFIGURED) {
2511 DBG(1, "The camera is misconfigured. Close and open it again.")
2512 up(&cam->fileop_sem);
2513 return -EIO;
2514 }
2515
2516 err = sn9c102_ioctl_v4l2(inode, filp, cmd, (void __user *)arg);
2517
2518 up(&cam->fileop_sem);
2519
2520 return err;
2521 }
2522
2523
2524 static struct file_operations sn9c102_fops = {
2525 .owner = THIS_MODULE,
2526 .open = sn9c102_open,
2527 .release = sn9c102_release,
2528 .ioctl = sn9c102_ioctl,
2529 .read = sn9c102_read,
2530 .poll = sn9c102_poll,
2531 .mmap = sn9c102_mmap,
2532 .llseek = no_llseek,
2533 };
2534
2535 /*****************************************************************************/
2536
2537 /* It exists a single interface only. We do not need to validate anything. */
2538 static int
2539 sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
2540 {
2541 struct usb_device *udev = interface_to_usbdev(intf);
2542 struct sn9c102_device* cam;
2543 static unsigned int dev_nr = 0;
2544 unsigned int i, n;
2545 int err = 0, r;
2546
2547 n = sizeof(sn9c102_id_table)/sizeof(sn9c102_id_table[0]);
2548 for (i = 0; i < n-1; i++)
2549 if (le16_to_cpu(udev->descriptor.idVendor) ==
2550 sn9c102_id_table[i].idVendor &&
2551 le16_to_cpu(udev->descriptor.idProduct) ==
2552 sn9c102_id_table[i].idProduct)
2553 break;
2554 if (i == n-1)
2555 return -ENODEV;
2556
2557 if (!(cam = kmalloc(sizeof(struct sn9c102_device), GFP_KERNEL)))
2558 return -ENOMEM;
2559 memset(cam, 0, sizeof(*cam));
2560
2561 cam->usbdev = udev;
2562
2563 memcpy(&cam->dev, &udev->dev, sizeof(struct device));
2564
2565 if (!(cam->control_buffer = kmalloc(8, GFP_KERNEL))) {
2566 DBG(1, "kmalloc() failed")
2567 err = -ENOMEM;
2568 goto fail;
2569 }
2570 memset(cam->control_buffer, 0, 8);
2571
2572 if (!(cam->v4ldev = video_device_alloc())) {
2573 DBG(1, "video_device_alloc() failed")
2574 err = -ENOMEM;
2575 goto fail;
2576 }
2577
2578 init_MUTEX(&cam->dev_sem);
2579
2580 r = sn9c102_read_reg(cam, 0x00);
2581 if (r < 0 || r != 0x10) {
2582 DBG(1, "Sorry, this is not a SN9C10x based camera "
2583 "(vid/pid 0x%04X/0x%04X)",
2584 sn9c102_id_table[i].idVendor,sn9c102_id_table[i].idProduct)
2585 err = -ENODEV;
2586 goto fail;
2587 }
2588
2589 cam->bridge = (sn9c102_id_table[i].idProduct & 0xffc0) == 0x6080 ?
2590 BRIDGE_SN9C103 : BRIDGE_SN9C102;
2591 switch (cam->bridge) {
2592 case BRIDGE_SN9C101:
2593 case BRIDGE_SN9C102:
2594 DBG(2, "SN9C10[12] PC Camera Controller detected "
2595 "(vid/pid 0x%04X/0x%04X)", sn9c102_id_table[i].idVendor,
2596 sn9c102_id_table[i].idProduct)
2597 break;
2598 case BRIDGE_SN9C103:
2599 DBG(2, "SN9C103 PC Camera Controller detected "
2600 "(vid/pid 0x%04X/0x%04X)", sn9c102_id_table[i].idVendor,
2601 sn9c102_id_table[i].idProduct)
2602 break;
2603 }
2604
2605 for (i = 0; sn9c102_sensor_table[i]; i++) {
2606 err = sn9c102_sensor_table[i](cam);
2607 if (!err)
2608 break;
2609 }
2610
2611 if (!err && cam->sensor) {
2612 DBG(2, "%s image sensor detected", cam->sensor->name)
2613 DBG(3, "Support for %s maintained by %s",
2614 cam->sensor->name, cam->sensor->maintainer)
2615 } else {
2616 DBG(1, "No supported image sensor detected")
2617 err = -ENODEV;
2618 goto fail;
2619 }
2620
2621 if (sn9c102_init(cam)) {
2622 DBG(1, "Initialization failed. I will retry on open().")
2623 cam->state |= DEV_MISCONFIGURED;
2624 }
2625
2626 strcpy(cam->v4ldev->name, "SN9C10x PC Camera");
2627 cam->v4ldev->owner = THIS_MODULE;
2628 cam->v4ldev->type = VID_TYPE_CAPTURE | VID_TYPE_SCALES;
2629 cam->v4ldev->hardware = VID_HARDWARE_SN9C102;
2630 cam->v4ldev->fops = &sn9c102_fops;
2631 cam->v4ldev->minor = video_nr[dev_nr];
2632 cam->v4ldev->release = video_device_release;
2633 video_set_drvdata(cam->v4ldev, cam);
2634
2635 down(&cam->dev_sem);
2636
2637 err = video_register_device(cam->v4ldev, VFL_TYPE_GRABBER,
2638 video_nr[dev_nr]);
2639 if (err) {
2640 DBG(1, "V4L2 device registration failed")
2641 if (err == -ENFILE && video_nr[dev_nr] == -1)
2642 DBG(1, "Free /dev/videoX node not found")
2643 video_nr[dev_nr] = -1;
2644 dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
2645 up(&cam->dev_sem);
2646 goto fail;
2647 }
2648
2649 DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor)
2650
2651 cam->module_param.force_munmap = force_munmap[dev_nr];
2652
2653 dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
2654
2655 sn9c102_create_sysfs(cam);
2656 DBG(2, "Optional device control through 'sysfs' interface ready")
2657
2658 usb_set_intfdata(intf, cam);
2659
2660 up(&cam->dev_sem);
2661
2662 return 0;
2663
2664 fail:
2665 if (cam) {
2666 kfree(cam->control_buffer);
2667 if (cam->v4ldev)
2668 video_device_release(cam->v4ldev);
2669 kfree(cam);
2670 }
2671 return err;
2672 }
2673
2674
2675 static void sn9c102_usb_disconnect(struct usb_interface* intf)
2676 {
2677 struct sn9c102_device* cam = usb_get_intfdata(intf);
2678
2679 if (!cam)
2680 return;
2681
2682 down_write(&sn9c102_disconnect);
2683
2684 down(&cam->dev_sem);
2685
2686 DBG(2, "Disconnecting %s...", cam->v4ldev->name)
2687
2688 wake_up_interruptible_all(&cam->open);
2689
2690 if (cam->users) {
2691 DBG(2, "Device /dev/video%d is open! Deregistration and "
2692 "memory deallocation are deferred on close.",
2693 cam->v4ldev->minor)
2694 cam->state |= DEV_MISCONFIGURED;
2695 sn9c102_stop_transfer(cam);
2696 cam->state |= DEV_DISCONNECTED;
2697 wake_up_interruptible(&cam->wait_frame);
2698 wake_up_interruptible(&cam->wait_stream);
2699 } else {
2700 cam->state |= DEV_DISCONNECTED;
2701 sn9c102_release_resources(cam);
2702 }
2703
2704 up(&cam->dev_sem);
2705
2706 if (!cam->users)
2707 kfree(cam);
2708
2709 up_write(&sn9c102_disconnect);
2710 }
2711
2712
2713 static struct usb_driver sn9c102_usb_driver = {
2714 .owner = THIS_MODULE,
2715 .name = "sn9c102",
2716 .id_table = sn9c102_id_table,
2717 .probe = sn9c102_usb_probe,
2718 .disconnect = sn9c102_usb_disconnect,
2719 };
2720
2721 /*****************************************************************************/
2722
2723 static int __init sn9c102_module_init(void)
2724 {
2725 int err = 0;
2726
2727 KDBG(2, SN9C102_MODULE_NAME " v" SN9C102_MODULE_VERSION)
2728 KDBG(3, SN9C102_MODULE_AUTHOR)
2729
2730 if ((err = usb_register(&sn9c102_usb_driver)))
2731 KDBG(1, "usb_register() failed")
2732
2733 return err;
2734 }
2735
2736
2737 static void __exit sn9c102_module_exit(void)
2738 {
2739 usb_deregister(&sn9c102_usb_driver);
2740 }
2741
2742
2743 module_init(sn9c102_module_init);
2744 module_exit(sn9c102_module_exit);