1 /*
2  *	Video4Linux Colour QuickCam driver
3  *	Copyright 1997-2000 Philip Blundell <philb@gnu.org>
4  *
5  *    Module parameters:
6  *
7  *	parport=auto      -- probe all parports (default)
8  *	parport=0         -- parport0 becomes qcam1
9  *	parport=2,0,1     -- parports 2,0,1 are tried in that order
10  *
11  *	probe=0		  -- do no probing, assume camera is present
12  *	probe=1		  -- use IEEE-1284 autoprobe data only (default)
13  *	probe=2		  -- probe aggressively for cameras
14  *
15  *	force_rgb=1       -- force data format to RGB (default is BGR)
16  *
17  * The parport parameter controls which parports will be scanned.
18  * Scanning all parports causes some printers to print a garbage page.
19  *       -- March 14, 1999  Billy Donahue <billy@escape.com>
20  *
21  * Fixed data format to BGR, added force_rgb parameter. Added missing
22  * parport_unregister_driver() on module removal.
23  *       -- May 28, 2000  Claudio Matsuoka <claudio@conectiva.com>
24  */
25 
26 #include <linux/module.h>
27 #include <linux/delay.h>
28 #include <linux/errno.h>
29 #include <linux/fs.h>
30 #include <linux/init.h>
31 #include <linux/kernel.h>
32 #include <linux/slab.h>
33 #include <linux/mm.h>
34 #include <linux/parport.h>
35 #include <linux/sched.h>
36 #include <linux/mutex.h>
37 #include <linux/jiffies.h>
38 #include <linux/videodev2.h>
39 #include <asm/uaccess.h>
40 #include <media/v4l2-device.h>
41 #include <media/v4l2-common.h>
42 #include <media/v4l2-ioctl.h>
43 
44 struct qcam {
45 	struct v4l2_device v4l2_dev;
46 	struct video_device vdev;
47 	struct pardevice *pdev;
48 	struct parport *pport;
49 	int width, height;
50 	int ccd_width, ccd_height;
51 	int mode;
52 	int contrast, brightness, whitebal;
53 	int top, left;
54 	unsigned int bidirectional;
55 	struct mutex lock;
56 };
57 
58 /* cameras maximum */
59 #define MAX_CAMS 4
60 
61 /* The three possible QuickCam modes */
62 #define QC_MILLIONS	0x18
63 #define QC_BILLIONS	0x10
64 #define QC_THOUSANDS	0x08	/* with VIDEC compression (not supported) */
65 
66 /* The three possible decimations */
67 #define QC_DECIMATION_1		0
68 #define QC_DECIMATION_2		2
69 #define QC_DECIMATION_4		4
70 
71 #define BANNER "Colour QuickCam for Video4Linux v0.06"
72 
73 static int parport[MAX_CAMS] = { [1 ... MAX_CAMS-1] = -1 };
74 static int probe = 2;
75 static bool force_rgb;
76 static int video_nr = -1;
77 
78 /* FIXME: parport=auto would never have worked, surely? --RR */
79 MODULE_PARM_DESC(parport, "parport=<auto|n[,n]...> for port detection method\n"
80 			  "probe=<0|1|2> for camera detection method\n"
81 			  "force_rgb=<0|1> for RGB data format (default BGR)");
82 module_param_array(parport, int, NULL, 0);
83 module_param(probe, int, 0);
84 module_param(force_rgb, bool, 0);
85 module_param(video_nr, int, 0);
86 
87 static struct qcam *qcams[MAX_CAMS];
88 static unsigned int num_cams;
89 
qcam_set_ack(struct qcam * qcam,unsigned int i)90 static inline void qcam_set_ack(struct qcam *qcam, unsigned int i)
91 {
92 	/* note: the QC specs refer to the PCAck pin by voltage, not
93 	   software level.  PC ports have builtin inverters. */
94 	parport_frob_control(qcam->pport, 8, i ? 8 : 0);
95 }
96 
qcam_ready1(struct qcam * qcam)97 static inline unsigned int qcam_ready1(struct qcam *qcam)
98 {
99 	return (parport_read_status(qcam->pport) & 0x8) ? 1 : 0;
100 }
101 
qcam_ready2(struct qcam * qcam)102 static inline unsigned int qcam_ready2(struct qcam *qcam)
103 {
104 	return (parport_read_data(qcam->pport) & 0x1) ? 1 : 0;
105 }
106 
qcam_await_ready1(struct qcam * qcam,int value)107 static unsigned int qcam_await_ready1(struct qcam *qcam, int value)
108 {
109 	struct v4l2_device *v4l2_dev = &qcam->v4l2_dev;
110 	unsigned long oldjiffies = jiffies;
111 	unsigned int i;
112 
113 	for (oldjiffies = jiffies;
114 	     time_before(jiffies, oldjiffies + msecs_to_jiffies(40));)
115 		if (qcam_ready1(qcam) == value)
116 			return 0;
117 
118 	/* If the camera didn't respond within 1/25 second, poll slowly
119 	   for a while. */
120 	for (i = 0; i < 50; i++) {
121 		if (qcam_ready1(qcam) == value)
122 			return 0;
123 		msleep_interruptible(100);
124 	}
125 
126 	/* Probably somebody pulled the plug out.  Not much we can do. */
127 	v4l2_err(v4l2_dev, "ready1 timeout (%d) %x %x\n", value,
128 	       parport_read_status(qcam->pport),
129 	       parport_read_control(qcam->pport));
130 	return 1;
131 }
132 
qcam_await_ready2(struct qcam * qcam,int value)133 static unsigned int qcam_await_ready2(struct qcam *qcam, int value)
134 {
135 	struct v4l2_device *v4l2_dev = &qcam->v4l2_dev;
136 	unsigned long oldjiffies = jiffies;
137 	unsigned int i;
138 
139 	for (oldjiffies = jiffies;
140 	     time_before(jiffies, oldjiffies + msecs_to_jiffies(40));)
141 		if (qcam_ready2(qcam) == value)
142 			return 0;
143 
144 	/* If the camera didn't respond within 1/25 second, poll slowly
145 	   for a while. */
146 	for (i = 0; i < 50; i++) {
147 		if (qcam_ready2(qcam) == value)
148 			return 0;
149 		msleep_interruptible(100);
150 	}
151 
152 	/* Probably somebody pulled the plug out.  Not much we can do. */
153 	v4l2_err(v4l2_dev, "ready2 timeout (%d) %x %x %x\n", value,
154 	       parport_read_status(qcam->pport),
155 	       parport_read_control(qcam->pport),
156 	       parport_read_data(qcam->pport));
157 	return 1;
158 }
159 
qcam_read_data(struct qcam * qcam)160 static int qcam_read_data(struct qcam *qcam)
161 {
162 	unsigned int idata;
163 
164 	qcam_set_ack(qcam, 0);
165 	if (qcam_await_ready1(qcam, 1))
166 		return -1;
167 	idata = parport_read_status(qcam->pport) & 0xf0;
168 	qcam_set_ack(qcam, 1);
169 	if (qcam_await_ready1(qcam, 0))
170 		return -1;
171 	idata |= parport_read_status(qcam->pport) >> 4;
172 	return idata;
173 }
174 
qcam_write_data(struct qcam * qcam,unsigned int data)175 static int qcam_write_data(struct qcam *qcam, unsigned int data)
176 {
177 	struct v4l2_device *v4l2_dev = &qcam->v4l2_dev;
178 	unsigned int idata;
179 
180 	parport_write_data(qcam->pport, data);
181 	idata = qcam_read_data(qcam);
182 	if (data != idata) {
183 		v4l2_warn(v4l2_dev, "sent %x but received %x\n", data,
184 		       idata);
185 		return 1;
186 	}
187 	return 0;
188 }
189 
qcam_set(struct qcam * qcam,unsigned int cmd,unsigned int data)190 static inline int qcam_set(struct qcam *qcam, unsigned int cmd, unsigned int data)
191 {
192 	if (qcam_write_data(qcam, cmd))
193 		return -1;
194 	if (qcam_write_data(qcam, data))
195 		return -1;
196 	return 0;
197 }
198 
qcam_get(struct qcam * qcam,unsigned int cmd)199 static inline int qcam_get(struct qcam *qcam, unsigned int cmd)
200 {
201 	if (qcam_write_data(qcam, cmd))
202 		return -1;
203 	return qcam_read_data(qcam);
204 }
205 
qc_detect(struct qcam * qcam)206 static int qc_detect(struct qcam *qcam)
207 {
208 	unsigned int stat, ostat, i, count = 0;
209 
210 	/* The probe routine below is not very reliable.  The IEEE-1284
211 	   probe takes precedence. */
212 	/* XXX Currently parport provides no way to distinguish between
213 	   "the IEEE probe was not done" and "the probe was done, but
214 	   no device was found".  Fix this one day. */
215 	if (qcam->pport->probe_info[0].class == PARPORT_CLASS_MEDIA
216 	    && qcam->pport->probe_info[0].model
217 	    && !strcmp(qcam->pdev->port->probe_info[0].model,
218 		       "Color QuickCam 2.0")) {
219 		printk(KERN_DEBUG "QuickCam: Found by IEEE1284 probe.\n");
220 		return 1;
221 	}
222 
223 	if (probe < 2)
224 		return 0;
225 
226 	parport_write_control(qcam->pport, 0xc);
227 
228 	/* look for a heartbeat */
229 	ostat = stat = parport_read_status(qcam->pport);
230 	for (i = 0; i < 250; i++) {
231 		mdelay(1);
232 		stat = parport_read_status(qcam->pport);
233 		if (ostat != stat) {
234 			if (++count >= 3)
235 				return 1;
236 			ostat = stat;
237 		}
238 	}
239 
240 	/* Reset the camera and try again */
241 	parport_write_control(qcam->pport, 0xc);
242 	parport_write_control(qcam->pport, 0x8);
243 	mdelay(1);
244 	parport_write_control(qcam->pport, 0xc);
245 	mdelay(1);
246 	count = 0;
247 
248 	ostat = stat = parport_read_status(qcam->pport);
249 	for (i = 0; i < 250; i++) {
250 		mdelay(1);
251 		stat = parport_read_status(qcam->pport);
252 		if (ostat != stat) {
253 			if (++count >= 3)
254 				return 1;
255 			ostat = stat;
256 		}
257 	}
258 
259 	/* no (or flatline) camera, give up */
260 	return 0;
261 }
262 
qc_reset(struct qcam * qcam)263 static void qc_reset(struct qcam *qcam)
264 {
265 	parport_write_control(qcam->pport, 0xc);
266 	parport_write_control(qcam->pport, 0x8);
267 	mdelay(1);
268 	parport_write_control(qcam->pport, 0xc);
269 	mdelay(1);
270 }
271 
272 /* Reset the QuickCam and program for brightness, contrast,
273  * white-balance, and resolution. */
274 
qc_setup(struct qcam * qcam)275 static void qc_setup(struct qcam *qcam)
276 {
277 	qc_reset(qcam);
278 
279 	/* Set the brightness. */
280 	qcam_set(qcam, 11, qcam->brightness);
281 
282 	/* Set the height and width.  These refer to the actual
283 	   CCD area *before* applying the selected decimation.  */
284 	qcam_set(qcam, 17, qcam->ccd_height);
285 	qcam_set(qcam, 19, qcam->ccd_width / 2);
286 
287 	/* Set top and left.  */
288 	qcam_set(qcam, 0xd, qcam->top);
289 	qcam_set(qcam, 0xf, qcam->left);
290 
291 	/* Set contrast and white balance.  */
292 	qcam_set(qcam, 0x19, qcam->contrast);
293 	qcam_set(qcam, 0x1f, qcam->whitebal);
294 
295 	/* Set the speed.  */
296 	qcam_set(qcam, 45, 2);
297 }
298 
299 /* Read some bytes from the camera and put them in the buffer.
300    nbytes should be a multiple of 3, because bidirectional mode gives
301    us three bytes at a time.  */
302 
qcam_read_bytes(struct qcam * qcam,unsigned char * buf,unsigned int nbytes)303 static unsigned int qcam_read_bytes(struct qcam *qcam, unsigned char *buf, unsigned int nbytes)
304 {
305 	unsigned int bytes = 0;
306 
307 	qcam_set_ack(qcam, 0);
308 	if (qcam->bidirectional) {
309 		/* It's a bidirectional port */
310 		while (bytes < nbytes) {
311 			unsigned int lo1, hi1, lo2, hi2;
312 			unsigned char r, g, b;
313 
314 			if (qcam_await_ready2(qcam, 1))
315 				return bytes;
316 			lo1 = parport_read_data(qcam->pport) >> 1;
317 			hi1 = ((parport_read_status(qcam->pport) >> 3) & 0x1f) ^ 0x10;
318 			qcam_set_ack(qcam, 1);
319 			if (qcam_await_ready2(qcam, 0))
320 				return bytes;
321 			lo2 = parport_read_data(qcam->pport) >> 1;
322 			hi2 = ((parport_read_status(qcam->pport) >> 3) & 0x1f) ^ 0x10;
323 			qcam_set_ack(qcam, 0);
324 			r = lo1 | ((hi1 & 1) << 7);
325 			g = ((hi1 & 0x1e) << 3) | ((hi2 & 0x1e) >> 1);
326 			b = lo2 | ((hi2 & 1) << 7);
327 			if (force_rgb) {
328 				buf[bytes++] = r;
329 				buf[bytes++] = g;
330 				buf[bytes++] = b;
331 			} else {
332 				buf[bytes++] = b;
333 				buf[bytes++] = g;
334 				buf[bytes++] = r;
335 			}
336 		}
337 	} else {
338 		/* It's a unidirectional port */
339 		int i = 0, n = bytes;
340 		unsigned char rgb[3];
341 
342 		while (bytes < nbytes) {
343 			unsigned int hi, lo;
344 
345 			if (qcam_await_ready1(qcam, 1))
346 				return bytes;
347 			hi = (parport_read_status(qcam->pport) & 0xf0);
348 			qcam_set_ack(qcam, 1);
349 			if (qcam_await_ready1(qcam, 0))
350 				return bytes;
351 			lo = (parport_read_status(qcam->pport) & 0xf0);
352 			qcam_set_ack(qcam, 0);
353 			/* flip some bits */
354 			rgb[(i = bytes++ % 3)] = (hi | (lo >> 4)) ^ 0x88;
355 			if (i >= 2) {
356 get_fragment:
357 				if (force_rgb) {
358 					buf[n++] = rgb[0];
359 					buf[n++] = rgb[1];
360 					buf[n++] = rgb[2];
361 				} else {
362 					buf[n++] = rgb[2];
363 					buf[n++] = rgb[1];
364 					buf[n++] = rgb[0];
365 				}
366 			}
367 		}
368 		if (i) {
369 			i = 0;
370 			goto get_fragment;
371 		}
372 	}
373 	return bytes;
374 }
375 
376 #define BUFSZ	150
377 
qc_capture(struct qcam * qcam,char __user * buf,unsigned long len)378 static long qc_capture(struct qcam *qcam, char __user *buf, unsigned long len)
379 {
380 	struct v4l2_device *v4l2_dev = &qcam->v4l2_dev;
381 	unsigned lines, pixelsperline, bitsperxfer;
382 	unsigned int is_bi_dir = qcam->bidirectional;
383 	size_t wantlen, outptr = 0;
384 	char tmpbuf[BUFSZ];
385 
386 	if (!access_ok(VERIFY_WRITE, buf, len))
387 		return -EFAULT;
388 
389 	/* Wait for camera to become ready */
390 	for (;;) {
391 		int i = qcam_get(qcam, 41);
392 
393 		if (i == -1) {
394 			qc_setup(qcam);
395 			return -EIO;
396 		}
397 		if ((i & 0x80) == 0)
398 			break;
399 		schedule();
400 	}
401 
402 	if (qcam_set(qcam, 7, (qcam->mode | (is_bi_dir ? 1 : 0)) + 1))
403 		return -EIO;
404 
405 	lines = qcam->height;
406 	pixelsperline = qcam->width;
407 	bitsperxfer = (is_bi_dir) ? 24 : 8;
408 
409 	if (is_bi_dir) {
410 		/* Turn the port around */
411 		parport_data_reverse(qcam->pport);
412 		mdelay(3);
413 		qcam_set_ack(qcam, 0);
414 		if (qcam_await_ready1(qcam, 1)) {
415 			qc_setup(qcam);
416 			return -EIO;
417 		}
418 		qcam_set_ack(qcam, 1);
419 		if (qcam_await_ready1(qcam, 0)) {
420 			qc_setup(qcam);
421 			return -EIO;
422 		}
423 	}
424 
425 	wantlen = lines * pixelsperline * 24 / 8;
426 
427 	while (wantlen) {
428 		size_t t, s;
429 
430 		s = (wantlen > BUFSZ) ? BUFSZ : wantlen;
431 		t = qcam_read_bytes(qcam, tmpbuf, s);
432 		if (outptr < len) {
433 			size_t sz = len - outptr;
434 
435 			if (sz > t)
436 				sz = t;
437 			if (__copy_to_user(buf + outptr, tmpbuf, sz))
438 				break;
439 			outptr += sz;
440 		}
441 		wantlen -= t;
442 		if (t < s)
443 			break;
444 		cond_resched();
445 	}
446 
447 	len = outptr;
448 
449 	if (wantlen) {
450 		v4l2_err(v4l2_dev, "short read.\n");
451 		if (is_bi_dir)
452 			parport_data_forward(qcam->pport);
453 		qc_setup(qcam);
454 		return len;
455 	}
456 
457 	if (is_bi_dir) {
458 		int l;
459 
460 		do {
461 			l = qcam_read_bytes(qcam, tmpbuf, 3);
462 			cond_resched();
463 		} while (l && (tmpbuf[0] == 0x7e || tmpbuf[1] == 0x7e || tmpbuf[2] == 0x7e));
464 		if (force_rgb) {
465 			if (tmpbuf[0] != 0xe || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xf)
466 				v4l2_err(v4l2_dev, "bad EOF\n");
467 		} else {
468 			if (tmpbuf[0] != 0xf || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xe)
469 				v4l2_err(v4l2_dev, "bad EOF\n");
470 		}
471 		qcam_set_ack(qcam, 0);
472 		if (qcam_await_ready1(qcam, 1)) {
473 			v4l2_err(v4l2_dev, "no ack after EOF\n");
474 			parport_data_forward(qcam->pport);
475 			qc_setup(qcam);
476 			return len;
477 		}
478 		parport_data_forward(qcam->pport);
479 		mdelay(3);
480 		qcam_set_ack(qcam, 1);
481 		if (qcam_await_ready1(qcam, 0)) {
482 			v4l2_err(v4l2_dev, "no ack to port turnaround\n");
483 			qc_setup(qcam);
484 			return len;
485 		}
486 	} else {
487 		int l;
488 
489 		do {
490 			l = qcam_read_bytes(qcam, tmpbuf, 1);
491 			cond_resched();
492 		} while (l && tmpbuf[0] == 0x7e);
493 		l = qcam_read_bytes(qcam, tmpbuf + 1, 2);
494 		if (force_rgb) {
495 			if (tmpbuf[0] != 0xe || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xf)
496 				v4l2_err(v4l2_dev, "bad EOF\n");
497 		} else {
498 			if (tmpbuf[0] != 0xf || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xe)
499 				v4l2_err(v4l2_dev, "bad EOF\n");
500 		}
501 	}
502 
503 	qcam_write_data(qcam, 0);
504 	return len;
505 }
506 
507 /*
508  *	Video4linux interfacing
509  */
510 
qcam_querycap(struct file * file,void * priv,struct v4l2_capability * vcap)511 static int qcam_querycap(struct file *file, void  *priv,
512 					struct v4l2_capability *vcap)
513 {
514 	struct qcam *qcam = video_drvdata(file);
515 
516 	strlcpy(vcap->driver, qcam->v4l2_dev.name, sizeof(vcap->driver));
517 	strlcpy(vcap->card, "Color Quickcam", sizeof(vcap->card));
518 	strlcpy(vcap->bus_info, "parport", sizeof(vcap->bus_info));
519 	vcap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE;
520 	return 0;
521 }
522 
qcam_enum_input(struct file * file,void * fh,struct v4l2_input * vin)523 static int qcam_enum_input(struct file *file, void *fh, struct v4l2_input *vin)
524 {
525 	if (vin->index > 0)
526 		return -EINVAL;
527 	strlcpy(vin->name, "Camera", sizeof(vin->name));
528 	vin->type = V4L2_INPUT_TYPE_CAMERA;
529 	vin->audioset = 0;
530 	vin->tuner = 0;
531 	vin->std = 0;
532 	vin->status = 0;
533 	return 0;
534 }
535 
qcam_g_input(struct file * file,void * fh,unsigned int * inp)536 static int qcam_g_input(struct file *file, void *fh, unsigned int *inp)
537 {
538 	*inp = 0;
539 	return 0;
540 }
541 
qcam_s_input(struct file * file,void * fh,unsigned int inp)542 static int qcam_s_input(struct file *file, void *fh, unsigned int inp)
543 {
544 	return (inp > 0) ? -EINVAL : 0;
545 }
546 
qcam_queryctrl(struct file * file,void * priv,struct v4l2_queryctrl * qc)547 static int qcam_queryctrl(struct file *file, void *priv,
548 					struct v4l2_queryctrl *qc)
549 {
550 	switch (qc->id) {
551 	case V4L2_CID_BRIGHTNESS:
552 		return v4l2_ctrl_query_fill(qc, 0, 255, 1, 240);
553 	case V4L2_CID_CONTRAST:
554 		return v4l2_ctrl_query_fill(qc, 0, 255, 1, 192);
555 	case V4L2_CID_GAMMA:
556 		return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128);
557 	}
558 	return -EINVAL;
559 }
560 
qcam_g_ctrl(struct file * file,void * priv,struct v4l2_control * ctrl)561 static int qcam_g_ctrl(struct file *file, void *priv,
562 					struct v4l2_control *ctrl)
563 {
564 	struct qcam *qcam = video_drvdata(file);
565 	int ret = 0;
566 
567 	switch (ctrl->id) {
568 	case V4L2_CID_BRIGHTNESS:
569 		ctrl->value = qcam->brightness;
570 		break;
571 	case V4L2_CID_CONTRAST:
572 		ctrl->value = qcam->contrast;
573 		break;
574 	case V4L2_CID_GAMMA:
575 		ctrl->value = qcam->whitebal;
576 		break;
577 	default:
578 		ret = -EINVAL;
579 		break;
580 	}
581 	return ret;
582 }
583 
qcam_s_ctrl(struct file * file,void * priv,struct v4l2_control * ctrl)584 static int qcam_s_ctrl(struct file *file, void *priv,
585 					struct v4l2_control *ctrl)
586 {
587 	struct qcam *qcam = video_drvdata(file);
588 	int ret = 0;
589 
590 	mutex_lock(&qcam->lock);
591 	switch (ctrl->id) {
592 	case V4L2_CID_BRIGHTNESS:
593 		qcam->brightness = ctrl->value;
594 		break;
595 	case V4L2_CID_CONTRAST:
596 		qcam->contrast = ctrl->value;
597 		break;
598 	case V4L2_CID_GAMMA:
599 		qcam->whitebal = ctrl->value;
600 		break;
601 	default:
602 		ret = -EINVAL;
603 		break;
604 	}
605 	if (ret == 0) {
606 		parport_claim_or_block(qcam->pdev);
607 		qc_setup(qcam);
608 		parport_release(qcam->pdev);
609 	}
610 	mutex_unlock(&qcam->lock);
611 	return ret;
612 }
613 
qcam_g_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * fmt)614 static int qcam_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
615 {
616 	struct qcam *qcam = video_drvdata(file);
617 	struct v4l2_pix_format *pix = &fmt->fmt.pix;
618 
619 	pix->width = qcam->width;
620 	pix->height = qcam->height;
621 	pix->pixelformat = V4L2_PIX_FMT_RGB24;
622 	pix->field = V4L2_FIELD_NONE;
623 	pix->bytesperline = 3 * qcam->width;
624 	pix->sizeimage = 3 * qcam->width * qcam->height;
625 	/* Just a guess */
626 	pix->colorspace = V4L2_COLORSPACE_SRGB;
627 	return 0;
628 }
629 
qcam_try_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * fmt)630 static int qcam_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
631 {
632 	struct v4l2_pix_format *pix = &fmt->fmt.pix;
633 
634 	if (pix->height < 60 || pix->width < 80) {
635 		pix->height = 60;
636 		pix->width = 80;
637 	} else if (pix->height < 120 || pix->width < 160) {
638 		pix->height = 120;
639 		pix->width = 160;
640 	} else {
641 		pix->height = 240;
642 		pix->width = 320;
643 	}
644 	pix->pixelformat = V4L2_PIX_FMT_RGB24;
645 	pix->field = V4L2_FIELD_NONE;
646 	pix->bytesperline = 3 * pix->width;
647 	pix->sizeimage = 3 * pix->width * pix->height;
648 	/* Just a guess */
649 	pix->colorspace = V4L2_COLORSPACE_SRGB;
650 	return 0;
651 }
652 
qcam_s_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * fmt)653 static int qcam_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
654 {
655 	struct qcam *qcam = video_drvdata(file);
656 	struct v4l2_pix_format *pix = &fmt->fmt.pix;
657 	int ret = qcam_try_fmt_vid_cap(file, fh, fmt);
658 
659 	if (ret)
660 		return ret;
661 	switch (pix->height) {
662 	case 60:
663 		qcam->mode = QC_DECIMATION_4;
664 		break;
665 	case 120:
666 		qcam->mode = QC_DECIMATION_2;
667 		break;
668 	default:
669 		qcam->mode = QC_DECIMATION_1;
670 		break;
671 	}
672 
673 	mutex_lock(&qcam->lock);
674 	qcam->mode |= QC_MILLIONS;
675 	qcam->height = pix->height;
676 	qcam->width = pix->width;
677 	parport_claim_or_block(qcam->pdev);
678 	qc_setup(qcam);
679 	parport_release(qcam->pdev);
680 	mutex_unlock(&qcam->lock);
681 	return 0;
682 }
683 
qcam_enum_fmt_vid_cap(struct file * file,void * fh,struct v4l2_fmtdesc * fmt)684 static int qcam_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
685 {
686 	static struct v4l2_fmtdesc formats[] = {
687 		{ 0, 0, 0,
688 		  "RGB 8:8:8", V4L2_PIX_FMT_RGB24,
689 		  { 0, 0, 0, 0 }
690 		},
691 	};
692 	enum v4l2_buf_type type = fmt->type;
693 
694 	if (fmt->index > 0)
695 		return -EINVAL;
696 
697 	*fmt = formats[fmt->index];
698 	fmt->type = type;
699 	return 0;
700 }
701 
qcam_read(struct file * file,char __user * buf,size_t count,loff_t * ppos)702 static ssize_t qcam_read(struct file *file, char __user *buf,
703 			 size_t count, loff_t *ppos)
704 {
705 	struct qcam *qcam = video_drvdata(file);
706 	int len;
707 
708 	mutex_lock(&qcam->lock);
709 	parport_claim_or_block(qcam->pdev);
710 	/* Probably should have a semaphore against multiple users */
711 	len = qc_capture(qcam, buf, count);
712 	parport_release(qcam->pdev);
713 	mutex_unlock(&qcam->lock);
714 	return len;
715 }
716 
717 static const struct v4l2_file_operations qcam_fops = {
718 	.owner		= THIS_MODULE,
719 	.unlocked_ioctl	= video_ioctl2,
720 	.read		= qcam_read,
721 };
722 
723 static const struct v4l2_ioctl_ops qcam_ioctl_ops = {
724 	.vidioc_querycap    		    = qcam_querycap,
725 	.vidioc_g_input      		    = qcam_g_input,
726 	.vidioc_s_input      		    = qcam_s_input,
727 	.vidioc_enum_input   		    = qcam_enum_input,
728 	.vidioc_queryctrl 		    = qcam_queryctrl,
729 	.vidioc_g_ctrl  		    = qcam_g_ctrl,
730 	.vidioc_s_ctrl 			    = qcam_s_ctrl,
731 	.vidioc_enum_fmt_vid_cap 	    = qcam_enum_fmt_vid_cap,
732 	.vidioc_g_fmt_vid_cap 		    = qcam_g_fmt_vid_cap,
733 	.vidioc_s_fmt_vid_cap  		    = qcam_s_fmt_vid_cap,
734 	.vidioc_try_fmt_vid_cap  	    = qcam_try_fmt_vid_cap,
735 };
736 
737 /* Initialize the QuickCam driver control structure. */
738 
qcam_init(struct parport * port)739 static struct qcam *qcam_init(struct parport *port)
740 {
741 	struct qcam *qcam;
742 	struct v4l2_device *v4l2_dev;
743 
744 	qcam = kzalloc(sizeof(*qcam), GFP_KERNEL);
745 	if (qcam == NULL)
746 		return NULL;
747 
748 	v4l2_dev = &qcam->v4l2_dev;
749 	strlcpy(v4l2_dev->name, "c-qcam", sizeof(v4l2_dev->name));
750 
751 	if (v4l2_device_register(NULL, v4l2_dev) < 0) {
752 		v4l2_err(v4l2_dev, "Could not register v4l2_device\n");
753 		kfree(qcam);
754 		return NULL;
755 	}
756 
757 	qcam->pport = port;
758 	qcam->pdev = parport_register_device(port, "c-qcam", NULL, NULL,
759 					  NULL, 0, NULL);
760 
761 	qcam->bidirectional = (qcam->pport->modes & PARPORT_MODE_TRISTATE) ? 1 : 0;
762 
763 	if (qcam->pdev == NULL) {
764 		v4l2_err(v4l2_dev, "couldn't register for %s.\n", port->name);
765 		kfree(qcam);
766 		return NULL;
767 	}
768 
769 	strlcpy(qcam->vdev.name, "Colour QuickCam", sizeof(qcam->vdev.name));
770 	qcam->vdev.v4l2_dev = v4l2_dev;
771 	qcam->vdev.fops = &qcam_fops;
772 	qcam->vdev.ioctl_ops = &qcam_ioctl_ops;
773 	qcam->vdev.release = video_device_release_empty;
774 	video_set_drvdata(&qcam->vdev, qcam);
775 
776 	mutex_init(&qcam->lock);
777 	qcam->width = qcam->ccd_width = 320;
778 	qcam->height = qcam->ccd_height = 240;
779 	qcam->mode = QC_MILLIONS | QC_DECIMATION_1;
780 	qcam->contrast = 192;
781 	qcam->brightness = 240;
782 	qcam->whitebal = 128;
783 	qcam->top = 1;
784 	qcam->left = 14;
785 	return qcam;
786 }
787 
init_cqcam(struct parport * port)788 static int init_cqcam(struct parport *port)
789 {
790 	struct qcam *qcam;
791 	struct v4l2_device *v4l2_dev;
792 
793 	if (parport[0] != -1) {
794 		/* The user gave specific instructions */
795 		int i, found = 0;
796 
797 		for (i = 0; i < MAX_CAMS && parport[i] != -1; i++) {
798 			if (parport[0] == port->number)
799 				found = 1;
800 		}
801 		if (!found)
802 			return -ENODEV;
803 	}
804 
805 	if (num_cams == MAX_CAMS)
806 		return -ENOSPC;
807 
808 	qcam = qcam_init(port);
809 	if (qcam == NULL)
810 		return -ENODEV;
811 
812 	v4l2_dev = &qcam->v4l2_dev;
813 
814 	parport_claim_or_block(qcam->pdev);
815 
816 	qc_reset(qcam);
817 
818 	if (probe && qc_detect(qcam) == 0) {
819 		parport_release(qcam->pdev);
820 		parport_unregister_device(qcam->pdev);
821 		kfree(qcam);
822 		return -ENODEV;
823 	}
824 
825 	qc_setup(qcam);
826 
827 	parport_release(qcam->pdev);
828 
829 	if (video_register_device(&qcam->vdev, VFL_TYPE_GRABBER, video_nr) < 0) {
830 		v4l2_err(v4l2_dev, "Unable to register Colour QuickCam on %s\n",
831 		       qcam->pport->name);
832 		parport_unregister_device(qcam->pdev);
833 		kfree(qcam);
834 		return -ENODEV;
835 	}
836 
837 	v4l2_info(v4l2_dev, "%s: Colour QuickCam found on %s\n",
838 	       video_device_node_name(&qcam->vdev), qcam->pport->name);
839 
840 	qcams[num_cams++] = qcam;
841 
842 	return 0;
843 }
844 
close_cqcam(struct qcam * qcam)845 static void close_cqcam(struct qcam *qcam)
846 {
847 	video_unregister_device(&qcam->vdev);
848 	parport_unregister_device(qcam->pdev);
849 	kfree(qcam);
850 }
851 
cq_attach(struct parport * port)852 static void cq_attach(struct parport *port)
853 {
854 	init_cqcam(port);
855 }
856 
cq_detach(struct parport * port)857 static void cq_detach(struct parport *port)
858 {
859 	/* Write this some day. */
860 }
861 
862 static struct parport_driver cqcam_driver = {
863 	.name = "cqcam",
864 	.attach = cq_attach,
865 	.detach = cq_detach,
866 };
867 
cqcam_init(void)868 static int __init cqcam_init(void)
869 {
870 	printk(KERN_INFO BANNER "\n");
871 
872 	return parport_register_driver(&cqcam_driver);
873 }
874 
cqcam_cleanup(void)875 static void __exit cqcam_cleanup(void)
876 {
877 	unsigned int i;
878 
879 	for (i = 0; i < num_cams; i++)
880 		close_cqcam(qcams[i]);
881 
882 	parport_unregister_driver(&cqcam_driver);
883 }
884 
885 MODULE_AUTHOR("Philip Blundell <philb@gnu.org>");
886 MODULE_DESCRIPTION(BANNER);
887 MODULE_LICENSE("GPL");
888 MODULE_VERSION("0.0.4");
889 
890 module_init(cqcam_init);
891 module_exit(cqcam_cleanup);
892