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