1 /*
2  * Auvitek AU0828 USB Bridge (Analog video support)
3  *
4  * Copyright (C) 2009 Devin Heitmueller <dheitmueller@linuxtv.org>
5  * Copyright (C) 2005-2008 Auvitek International, Ltd.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * As published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  * 02110-1301, USA.
21  */
22 
23 /* Developer Notes:
24  *
25  * VBI support is not yet working
26  * The hardware scaler supported is unimplemented
27  * AC97 audio support is unimplemented (only i2s audio mode)
28  *
29  */
30 
31 #include <linux/module.h>
32 #include <linux/slab.h>
33 #include <linux/init.h>
34 #include <linux/device.h>
35 #include <linux/suspend.h>
36 #include <media/v4l2-common.h>
37 #include <media/v4l2-ioctl.h>
38 #include <media/v4l2-chip-ident.h>
39 #include <media/tuner.h>
40 #include "au0828.h"
41 #include "au0828-reg.h"
42 
43 static DEFINE_MUTEX(au0828_sysfs_lock);
44 
45 /* ------------------------------------------------------------------
46 	Videobuf operations
47    ------------------------------------------------------------------*/
48 
49 static unsigned int isoc_debug;
50 module_param(isoc_debug, int, 0644);
51 MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
52 
53 #define au0828_isocdbg(fmt, arg...) \
54 do {\
55 	if (isoc_debug) { \
56 		printk(KERN_INFO "au0828 %s :"fmt, \
57 		       __func__ , ##arg);	   \
58 	} \
59   } while (0)
60 
print_err_status(struct au0828_dev * dev,int packet,int status)61 static inline void print_err_status(struct au0828_dev *dev,
62 				    int packet, int status)
63 {
64 	char *errmsg = "Unknown";
65 
66 	switch (status) {
67 	case -ENOENT:
68 		errmsg = "unlinked synchronuously";
69 		break;
70 	case -ECONNRESET:
71 		errmsg = "unlinked asynchronuously";
72 		break;
73 	case -ENOSR:
74 		errmsg = "Buffer error (overrun)";
75 		break;
76 	case -EPIPE:
77 		errmsg = "Stalled (device not responding)";
78 		break;
79 	case -EOVERFLOW:
80 		errmsg = "Babble (bad cable?)";
81 		break;
82 	case -EPROTO:
83 		errmsg = "Bit-stuff error (bad cable?)";
84 		break;
85 	case -EILSEQ:
86 		errmsg = "CRC/Timeout (could be anything)";
87 		break;
88 	case -ETIME:
89 		errmsg = "Device does not respond";
90 		break;
91 	}
92 	if (packet < 0) {
93 		au0828_isocdbg("URB status %d [%s].\n",	status, errmsg);
94 	} else {
95 		au0828_isocdbg("URB packet %d, status %d [%s].\n",
96 			       packet, status, errmsg);
97 	}
98 }
99 
check_dev(struct au0828_dev * dev)100 static int check_dev(struct au0828_dev *dev)
101 {
102 	if (dev->dev_state & DEV_DISCONNECTED) {
103 		printk(KERN_INFO "v4l2 ioctl: device not present\n");
104 		return -ENODEV;
105 	}
106 
107 	if (dev->dev_state & DEV_MISCONFIGURED) {
108 		printk(KERN_INFO "v4l2 ioctl: device is misconfigured; "
109 		       "close and open it again\n");
110 		return -EIO;
111 	}
112 	return 0;
113 }
114 
115 /*
116  * IRQ callback, called by URB callback
117  */
au0828_irq_callback(struct urb * urb)118 static void au0828_irq_callback(struct urb *urb)
119 {
120 	struct au0828_dmaqueue  *dma_q = urb->context;
121 	struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
122 	unsigned long flags = 0;
123 	int rc, i;
124 
125 	switch (urb->status) {
126 	case 0:             /* success */
127 	case -ETIMEDOUT:    /* NAK */
128 		break;
129 	case -ECONNRESET:   /* kill */
130 	case -ENOENT:
131 	case -ESHUTDOWN:
132 		au0828_isocdbg("au0828_irq_callback called: status kill\n");
133 		return;
134 	default:            /* unknown error */
135 		au0828_isocdbg("urb completition error %d.\n", urb->status);
136 		break;
137 	}
138 
139 	/* Copy data from URB */
140 	spin_lock_irqsave(&dev->slock, flags);
141 	rc = dev->isoc_ctl.isoc_copy(dev, urb);
142 	spin_unlock_irqrestore(&dev->slock, flags);
143 
144 	/* Reset urb buffers */
145 	for (i = 0; i < urb->number_of_packets; i++) {
146 		urb->iso_frame_desc[i].status = 0;
147 		urb->iso_frame_desc[i].actual_length = 0;
148 	}
149 	urb->status = 0;
150 
151 	urb->status = usb_submit_urb(urb, GFP_ATOMIC);
152 	if (urb->status) {
153 		au0828_isocdbg("urb resubmit failed (error=%i)\n",
154 			       urb->status);
155 	}
156 }
157 
158 /*
159  * Stop and Deallocate URBs
160  */
au0828_uninit_isoc(struct au0828_dev * dev)161 void au0828_uninit_isoc(struct au0828_dev *dev)
162 {
163 	struct urb *urb;
164 	int i;
165 
166 	au0828_isocdbg("au0828: called au0828_uninit_isoc\n");
167 
168 	dev->isoc_ctl.nfields = -1;
169 	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
170 		urb = dev->isoc_ctl.urb[i];
171 		if (urb) {
172 			if (!irqs_disabled())
173 				usb_kill_urb(urb);
174 			else
175 				usb_unlink_urb(urb);
176 
177 			if (dev->isoc_ctl.transfer_buffer[i]) {
178 				usb_free_coherent(dev->usbdev,
179 					urb->transfer_buffer_length,
180 					dev->isoc_ctl.transfer_buffer[i],
181 					urb->transfer_dma);
182 			}
183 			usb_free_urb(urb);
184 			dev->isoc_ctl.urb[i] = NULL;
185 		}
186 		dev->isoc_ctl.transfer_buffer[i] = NULL;
187 	}
188 
189 	kfree(dev->isoc_ctl.urb);
190 	kfree(dev->isoc_ctl.transfer_buffer);
191 
192 	dev->isoc_ctl.urb = NULL;
193 	dev->isoc_ctl.transfer_buffer = NULL;
194 	dev->isoc_ctl.num_bufs = 0;
195 }
196 
197 /*
198  * Allocate URBs and start IRQ
199  */
au0828_init_isoc(struct au0828_dev * dev,int max_packets,int num_bufs,int max_pkt_size,int (* isoc_copy)(struct au0828_dev * dev,struct urb * urb))200 int au0828_init_isoc(struct au0828_dev *dev, int max_packets,
201 		     int num_bufs, int max_pkt_size,
202 		     int (*isoc_copy) (struct au0828_dev *dev, struct urb *urb))
203 {
204 	struct au0828_dmaqueue *dma_q = &dev->vidq;
205 	int i;
206 	int sb_size, pipe;
207 	struct urb *urb;
208 	int j, k;
209 	int rc;
210 
211 	au0828_isocdbg("au0828: called au0828_prepare_isoc\n");
212 
213 	/* De-allocates all pending stuff */
214 	au0828_uninit_isoc(dev);
215 
216 	dev->isoc_ctl.isoc_copy = isoc_copy;
217 	dev->isoc_ctl.num_bufs = num_bufs;
218 
219 	dev->isoc_ctl.urb = kzalloc(sizeof(void *)*num_bufs,  GFP_KERNEL);
220 	if (!dev->isoc_ctl.urb) {
221 		au0828_isocdbg("cannot alloc memory for usb buffers\n");
222 		return -ENOMEM;
223 	}
224 
225 	dev->isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
226 					      GFP_KERNEL);
227 	if (!dev->isoc_ctl.transfer_buffer) {
228 		au0828_isocdbg("cannot allocate memory for usb transfer\n");
229 		kfree(dev->isoc_ctl.urb);
230 		return -ENOMEM;
231 	}
232 
233 	dev->isoc_ctl.max_pkt_size = max_pkt_size;
234 	dev->isoc_ctl.buf = NULL;
235 
236 	sb_size = max_packets * dev->isoc_ctl.max_pkt_size;
237 
238 	/* allocate urbs and transfer buffers */
239 	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
240 		urb = usb_alloc_urb(max_packets, GFP_KERNEL);
241 		if (!urb) {
242 			au0828_isocdbg("cannot alloc isoc_ctl.urb %i\n", i);
243 			au0828_uninit_isoc(dev);
244 			return -ENOMEM;
245 		}
246 		dev->isoc_ctl.urb[i] = urb;
247 
248 		dev->isoc_ctl.transfer_buffer[i] = usb_alloc_coherent(dev->usbdev,
249 			sb_size, GFP_KERNEL, &urb->transfer_dma);
250 		if (!dev->isoc_ctl.transfer_buffer[i]) {
251 			printk("unable to allocate %i bytes for transfer"
252 					" buffer %i%s\n",
253 					sb_size, i,
254 					in_interrupt() ? " while in int" : "");
255 			au0828_uninit_isoc(dev);
256 			return -ENOMEM;
257 		}
258 		memset(dev->isoc_ctl.transfer_buffer[i], 0, sb_size);
259 
260 		pipe = usb_rcvisocpipe(dev->usbdev,
261 				       dev->isoc_in_endpointaddr),
262 
263 		usb_fill_int_urb(urb, dev->usbdev, pipe,
264 				 dev->isoc_ctl.transfer_buffer[i], sb_size,
265 				 au0828_irq_callback, dma_q, 1);
266 
267 		urb->number_of_packets = max_packets;
268 		urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
269 
270 		k = 0;
271 		for (j = 0; j < max_packets; j++) {
272 			urb->iso_frame_desc[j].offset = k;
273 			urb->iso_frame_desc[j].length =
274 						dev->isoc_ctl.max_pkt_size;
275 			k += dev->isoc_ctl.max_pkt_size;
276 		}
277 	}
278 
279 	init_waitqueue_head(&dma_q->wq);
280 
281 	/* submit urbs and enables IRQ */
282 	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
283 		rc = usb_submit_urb(dev->isoc_ctl.urb[i], GFP_ATOMIC);
284 		if (rc) {
285 			au0828_isocdbg("submit of urb %i failed (error=%i)\n",
286 				       i, rc);
287 			au0828_uninit_isoc(dev);
288 			return rc;
289 		}
290 	}
291 
292 	return 0;
293 }
294 
295 /*
296  * Announces that a buffer were filled and request the next
297  */
buffer_filled(struct au0828_dev * dev,struct au0828_dmaqueue * dma_q,struct au0828_buffer * buf)298 static inline void buffer_filled(struct au0828_dev *dev,
299 				  struct au0828_dmaqueue *dma_q,
300 				  struct au0828_buffer *buf)
301 {
302 	/* Advice that buffer was filled */
303 	au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
304 
305 	buf->vb.state = VIDEOBUF_DONE;
306 	buf->vb.field_count++;
307 	do_gettimeofday(&buf->vb.ts);
308 
309 	dev->isoc_ctl.buf = NULL;
310 
311 	list_del(&buf->vb.queue);
312 	wake_up(&buf->vb.done);
313 }
314 
vbi_buffer_filled(struct au0828_dev * dev,struct au0828_dmaqueue * dma_q,struct au0828_buffer * buf)315 static inline void vbi_buffer_filled(struct au0828_dev *dev,
316 				     struct au0828_dmaqueue *dma_q,
317 				     struct au0828_buffer *buf)
318 {
319 	/* Advice that buffer was filled */
320 	au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
321 
322 	buf->vb.state = VIDEOBUF_DONE;
323 	buf->vb.field_count++;
324 	do_gettimeofday(&buf->vb.ts);
325 
326 	dev->isoc_ctl.vbi_buf = NULL;
327 
328 	list_del(&buf->vb.queue);
329 	wake_up(&buf->vb.done);
330 }
331 
332 /*
333  * Identify the buffer header type and properly handles
334  */
au0828_copy_video(struct au0828_dev * dev,struct au0828_dmaqueue * dma_q,struct au0828_buffer * buf,unsigned char * p,unsigned char * outp,unsigned long len)335 static void au0828_copy_video(struct au0828_dev *dev,
336 			      struct au0828_dmaqueue  *dma_q,
337 			      struct au0828_buffer *buf,
338 			      unsigned char *p,
339 			      unsigned char *outp, unsigned long len)
340 {
341 	void *fieldstart, *startwrite, *startread;
342 	int  linesdone, currlinedone, offset, lencopy, remain;
343 	int bytesperline = dev->width << 1; /* Assumes 16-bit depth @@@@ */
344 
345 	if (len == 0)
346 		return;
347 
348 	if (dma_q->pos + len > buf->vb.size)
349 		len = buf->vb.size - dma_q->pos;
350 
351 	startread = p;
352 	remain = len;
353 
354 	/* Interlaces frame */
355 	if (buf->top_field)
356 		fieldstart = outp;
357 	else
358 		fieldstart = outp + bytesperline;
359 
360 	linesdone = dma_q->pos / bytesperline;
361 	currlinedone = dma_q->pos % bytesperline;
362 	offset = linesdone * bytesperline * 2 + currlinedone;
363 	startwrite = fieldstart + offset;
364 	lencopy = bytesperline - currlinedone;
365 	lencopy = lencopy > remain ? remain : lencopy;
366 
367 	if ((char *)startwrite + lencopy > (char *)outp + buf->vb.size) {
368 		au0828_isocdbg("Overflow of %zi bytes past buffer end (1)\n",
369 			       ((char *)startwrite + lencopy) -
370 			       ((char *)outp + buf->vb.size));
371 		remain = (char *)outp + buf->vb.size - (char *)startwrite;
372 		lencopy = remain;
373 	}
374 	if (lencopy <= 0)
375 		return;
376 	memcpy(startwrite, startread, lencopy);
377 
378 	remain -= lencopy;
379 
380 	while (remain > 0) {
381 		startwrite += lencopy + bytesperline;
382 		startread += lencopy;
383 		if (bytesperline > remain)
384 			lencopy = remain;
385 		else
386 			lencopy = bytesperline;
387 
388 		if ((char *)startwrite + lencopy > (char *)outp +
389 		    buf->vb.size) {
390 			au0828_isocdbg("Overflow %zi bytes past buf end (2)\n",
391 				       ((char *)startwrite + lencopy) -
392 				       ((char *)outp + buf->vb.size));
393 			lencopy = remain = (char *)outp + buf->vb.size -
394 					   (char *)startwrite;
395 		}
396 		if (lencopy <= 0)
397 			break;
398 
399 		memcpy(startwrite, startread, lencopy);
400 
401 		remain -= lencopy;
402 	}
403 
404 	if (offset > 1440) {
405 		/* We have enough data to check for greenscreen */
406 		if (outp[0] < 0x60 && outp[1440] < 0x60)
407 			dev->greenscreen_detected = 1;
408 	}
409 
410 	dma_q->pos += len;
411 }
412 
413 /*
414  * video-buf generic routine to get the next available buffer
415  */
get_next_buf(struct au0828_dmaqueue * dma_q,struct au0828_buffer ** buf)416 static inline void get_next_buf(struct au0828_dmaqueue *dma_q,
417 				struct au0828_buffer **buf)
418 {
419 	struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
420 
421 	if (list_empty(&dma_q->active)) {
422 		au0828_isocdbg("No active queue to serve\n");
423 		dev->isoc_ctl.buf = NULL;
424 		*buf = NULL;
425 		return;
426 	}
427 
428 	/* Get the next buffer */
429 	*buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
430 	dev->isoc_ctl.buf = *buf;
431 
432 	return;
433 }
434 
au0828_copy_vbi(struct au0828_dev * dev,struct au0828_dmaqueue * dma_q,struct au0828_buffer * buf,unsigned char * p,unsigned char * outp,unsigned long len)435 static void au0828_copy_vbi(struct au0828_dev *dev,
436 			      struct au0828_dmaqueue  *dma_q,
437 			      struct au0828_buffer *buf,
438 			      unsigned char *p,
439 			      unsigned char *outp, unsigned long len)
440 {
441 	unsigned char *startwrite, *startread;
442 	int bytesperline;
443 	int i, j = 0;
444 
445 	if (dev == NULL) {
446 		au0828_isocdbg("dev is null\n");
447 		return;
448 	}
449 
450 	if (dma_q == NULL) {
451 		au0828_isocdbg("dma_q is null\n");
452 		return;
453 	}
454 	if (buf == NULL)
455 		return;
456 	if (p == NULL) {
457 		au0828_isocdbg("p is null\n");
458 		return;
459 	}
460 	if (outp == NULL) {
461 		au0828_isocdbg("outp is null\n");
462 		return;
463 	}
464 
465 	bytesperline = dev->vbi_width;
466 
467 	if (dma_q->pos + len > buf->vb.size)
468 		len = buf->vb.size - dma_q->pos;
469 
470 	startread = p;
471 	startwrite = outp + (dma_q->pos / 2);
472 
473 	/* Make sure the bottom field populates the second half of the frame */
474 	if (buf->top_field == 0)
475 		startwrite += bytesperline * dev->vbi_height;
476 
477 	for (i = 0; i < len; i += 2)
478 		startwrite[j++] = startread[i+1];
479 
480 	dma_q->pos += len;
481 }
482 
483 
484 /*
485  * video-buf generic routine to get the next available VBI buffer
486  */
vbi_get_next_buf(struct au0828_dmaqueue * dma_q,struct au0828_buffer ** buf)487 static inline void vbi_get_next_buf(struct au0828_dmaqueue *dma_q,
488 				    struct au0828_buffer **buf)
489 {
490 	struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vbiq);
491 	char *outp;
492 
493 	if (list_empty(&dma_q->active)) {
494 		au0828_isocdbg("No active queue to serve\n");
495 		dev->isoc_ctl.vbi_buf = NULL;
496 		*buf = NULL;
497 		return;
498 	}
499 
500 	/* Get the next buffer */
501 	*buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
502 	/* Cleans up buffer - Useful for testing for frame/URB loss */
503 	outp = videobuf_to_vmalloc(&(*buf)->vb);
504 	memset(outp, 0x00, (*buf)->vb.size);
505 
506 	dev->isoc_ctl.vbi_buf = *buf;
507 
508 	return;
509 }
510 
511 /*
512  * Controls the isoc copy of each urb packet
513  */
au0828_isoc_copy(struct au0828_dev * dev,struct urb * urb)514 static inline int au0828_isoc_copy(struct au0828_dev *dev, struct urb *urb)
515 {
516 	struct au0828_buffer    *buf;
517 	struct au0828_buffer    *vbi_buf;
518 	struct au0828_dmaqueue  *dma_q = urb->context;
519 	struct au0828_dmaqueue  *vbi_dma_q = &dev->vbiq;
520 	unsigned char *outp = NULL;
521 	unsigned char *vbioutp = NULL;
522 	int i, len = 0, rc = 1;
523 	unsigned char *p;
524 	unsigned char fbyte;
525 	unsigned int vbi_field_size;
526 	unsigned int remain, lencopy;
527 
528 	if (!dev)
529 		return 0;
530 
531 	if ((dev->dev_state & DEV_DISCONNECTED) ||
532 	    (dev->dev_state & DEV_MISCONFIGURED))
533 		return 0;
534 
535 	if (urb->status < 0) {
536 		print_err_status(dev, -1, urb->status);
537 		if (urb->status == -ENOENT)
538 			return 0;
539 	}
540 
541 	buf = dev->isoc_ctl.buf;
542 	if (buf != NULL)
543 		outp = videobuf_to_vmalloc(&buf->vb);
544 
545 	vbi_buf = dev->isoc_ctl.vbi_buf;
546 	if (vbi_buf != NULL)
547 		vbioutp = videobuf_to_vmalloc(&vbi_buf->vb);
548 
549 	for (i = 0; i < urb->number_of_packets; i++) {
550 		int status = urb->iso_frame_desc[i].status;
551 
552 		if (status < 0) {
553 			print_err_status(dev, i, status);
554 			if (urb->iso_frame_desc[i].status != -EPROTO)
555 				continue;
556 		}
557 
558 		if (urb->iso_frame_desc[i].actual_length <= 0)
559 			continue;
560 
561 		if (urb->iso_frame_desc[i].actual_length >
562 						dev->max_pkt_size) {
563 			au0828_isocdbg("packet bigger than packet size");
564 			continue;
565 		}
566 
567 		p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
568 		fbyte = p[0];
569 		len = urb->iso_frame_desc[i].actual_length - 4;
570 		p += 4;
571 
572 		if (fbyte & 0x80) {
573 			len -= 4;
574 			p += 4;
575 			au0828_isocdbg("Video frame %s\n",
576 				       (fbyte & 0x40) ? "odd" : "even");
577 			if (fbyte & 0x40) {
578 				/* VBI */
579 				if (vbi_buf != NULL)
580 					vbi_buffer_filled(dev,
581 							  vbi_dma_q,
582 							  vbi_buf);
583 				vbi_get_next_buf(vbi_dma_q, &vbi_buf);
584 				if (vbi_buf == NULL)
585 					vbioutp = NULL;
586 				else
587 					vbioutp = videobuf_to_vmalloc(
588 						&vbi_buf->vb);
589 
590 				/* Video */
591 				if (buf != NULL)
592 					buffer_filled(dev, dma_q, buf);
593 				get_next_buf(dma_q, &buf);
594 				if (buf == NULL)
595 					outp = NULL;
596 				else
597 					outp = videobuf_to_vmalloc(&buf->vb);
598 
599 				/* As long as isoc traffic is arriving, keep
600 				   resetting the timer */
601 				if (dev->vid_timeout_running)
602 					mod_timer(&dev->vid_timeout,
603 						  jiffies + (HZ / 10));
604 				if (dev->vbi_timeout_running)
605 					mod_timer(&dev->vbi_timeout,
606 						  jiffies + (HZ / 10));
607 			}
608 
609 			if (buf != NULL) {
610 				if (fbyte & 0x40)
611 					buf->top_field = 1;
612 				else
613 					buf->top_field = 0;
614 			}
615 
616 			if (vbi_buf != NULL) {
617 				if (fbyte & 0x40)
618 					vbi_buf->top_field = 1;
619 				else
620 					vbi_buf->top_field = 0;
621 			}
622 
623 			dev->vbi_read = 0;
624 			vbi_dma_q->pos = 0;
625 			dma_q->pos = 0;
626 		}
627 
628 		vbi_field_size = dev->vbi_width * dev->vbi_height * 2;
629 		if (dev->vbi_read < vbi_field_size) {
630 			remain  = vbi_field_size - dev->vbi_read;
631 			if (len < remain)
632 				lencopy = len;
633 			else
634 				lencopy = remain;
635 
636 			if (vbi_buf != NULL)
637 				au0828_copy_vbi(dev, vbi_dma_q, vbi_buf, p,
638 						vbioutp, len);
639 
640 			len -= lencopy;
641 			p += lencopy;
642 			dev->vbi_read += lencopy;
643 		}
644 
645 		if (dev->vbi_read >= vbi_field_size && buf != NULL)
646 			au0828_copy_video(dev, dma_q, buf, p, outp, len);
647 	}
648 	return rc;
649 }
650 
651 static int
buffer_setup(struct videobuf_queue * vq,unsigned int * count,unsigned int * size)652 buffer_setup(struct videobuf_queue *vq, unsigned int *count,
653 	     unsigned int *size)
654 {
655 	struct au0828_fh *fh = vq->priv_data;
656 	*size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
657 
658 	if (0 == *count)
659 		*count = AU0828_DEF_BUF;
660 
661 	if (*count < AU0828_MIN_BUF)
662 		*count = AU0828_MIN_BUF;
663 	return 0;
664 }
665 
666 /* This is called *without* dev->slock held; please keep it that way */
free_buffer(struct videobuf_queue * vq,struct au0828_buffer * buf)667 static void free_buffer(struct videobuf_queue *vq, struct au0828_buffer *buf)
668 {
669 	struct au0828_fh     *fh  = vq->priv_data;
670 	struct au0828_dev    *dev = fh->dev;
671 	unsigned long flags = 0;
672 	if (in_interrupt())
673 		BUG();
674 
675 	/* We used to wait for the buffer to finish here, but this didn't work
676 	   because, as we were keeping the state as VIDEOBUF_QUEUED,
677 	   videobuf_queue_cancel marked it as finished for us.
678 	   (Also, it could wedge forever if the hardware was misconfigured.)
679 
680 	   This should be safe; by the time we get here, the buffer isn't
681 	   queued anymore. If we ever start marking the buffers as
682 	   VIDEOBUF_ACTIVE, it won't be, though.
683 	*/
684 	spin_lock_irqsave(&dev->slock, flags);
685 	if (dev->isoc_ctl.buf == buf)
686 		dev->isoc_ctl.buf = NULL;
687 	spin_unlock_irqrestore(&dev->slock, flags);
688 
689 	videobuf_vmalloc_free(&buf->vb);
690 	buf->vb.state = VIDEOBUF_NEEDS_INIT;
691 }
692 
693 static int
buffer_prepare(struct videobuf_queue * vq,struct videobuf_buffer * vb,enum v4l2_field field)694 buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
695 						enum v4l2_field field)
696 {
697 	struct au0828_fh     *fh  = vq->priv_data;
698 	struct au0828_buffer *buf = container_of(vb, struct au0828_buffer, vb);
699 	struct au0828_dev    *dev = fh->dev;
700 	int                  rc = 0, urb_init = 0;
701 
702 	buf->vb.size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
703 
704 	if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
705 		return -EINVAL;
706 
707 	buf->vb.width  = dev->width;
708 	buf->vb.height = dev->height;
709 	buf->vb.field  = field;
710 
711 	if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
712 		rc = videobuf_iolock(vq, &buf->vb, NULL);
713 		if (rc < 0) {
714 			printk(KERN_INFO "videobuf_iolock failed\n");
715 			goto fail;
716 		}
717 	}
718 
719 	if (!dev->isoc_ctl.num_bufs)
720 		urb_init = 1;
721 
722 	if (urb_init) {
723 		rc = au0828_init_isoc(dev, AU0828_ISO_PACKETS_PER_URB,
724 				      AU0828_MAX_ISO_BUFS, dev->max_pkt_size,
725 				      au0828_isoc_copy);
726 		if (rc < 0) {
727 			printk(KERN_INFO "au0828_init_isoc failed\n");
728 			goto fail;
729 		}
730 	}
731 
732 	buf->vb.state = VIDEOBUF_PREPARED;
733 	return 0;
734 
735 fail:
736 	free_buffer(vq, buf);
737 	return rc;
738 }
739 
740 static void
buffer_queue(struct videobuf_queue * vq,struct videobuf_buffer * vb)741 buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
742 {
743 	struct au0828_buffer    *buf     = container_of(vb,
744 							struct au0828_buffer,
745 							vb);
746 	struct au0828_fh        *fh      = vq->priv_data;
747 	struct au0828_dev       *dev     = fh->dev;
748 	struct au0828_dmaqueue  *vidq    = &dev->vidq;
749 
750 	buf->vb.state = VIDEOBUF_QUEUED;
751 	list_add_tail(&buf->vb.queue, &vidq->active);
752 }
753 
buffer_release(struct videobuf_queue * vq,struct videobuf_buffer * vb)754 static void buffer_release(struct videobuf_queue *vq,
755 				struct videobuf_buffer *vb)
756 {
757 	struct au0828_buffer   *buf  = container_of(vb,
758 						    struct au0828_buffer,
759 						    vb);
760 
761 	free_buffer(vq, buf);
762 }
763 
764 static struct videobuf_queue_ops au0828_video_qops = {
765 	.buf_setup      = buffer_setup,
766 	.buf_prepare    = buffer_prepare,
767 	.buf_queue      = buffer_queue,
768 	.buf_release    = buffer_release,
769 };
770 
771 /* ------------------------------------------------------------------
772    V4L2 interface
773    ------------------------------------------------------------------*/
774 
au0828_i2s_init(struct au0828_dev * dev)775 static int au0828_i2s_init(struct au0828_dev *dev)
776 {
777 	/* Enable i2s mode */
778 	au0828_writereg(dev, AU0828_AUDIOCTRL_50C, 0x01);
779 	return 0;
780 }
781 
782 /*
783  * Auvitek au0828 analog stream enable
784  * Please set interface0 to AS5 before enable the stream
785  */
au0828_analog_stream_enable(struct au0828_dev * d)786 int au0828_analog_stream_enable(struct au0828_dev *d)
787 {
788 	dprintk(1, "au0828_analog_stream_enable called\n");
789 	au0828_writereg(d, AU0828_SENSORCTRL_VBI_103, 0x00);
790 	au0828_writereg(d, 0x106, 0x00);
791 	/* set x position */
792 	au0828_writereg(d, 0x110, 0x00);
793 	au0828_writereg(d, 0x111, 0x00);
794 	au0828_writereg(d, 0x114, 0xa0);
795 	au0828_writereg(d, 0x115, 0x05);
796 	/* set y position */
797 	au0828_writereg(d, 0x112, 0x00);
798 	au0828_writereg(d, 0x113, 0x00);
799 	au0828_writereg(d, 0x116, 0xf2);
800 	au0828_writereg(d, 0x117, 0x00);
801 	au0828_writereg(d, AU0828_SENSORCTRL_100, 0xb3);
802 
803 	return 0;
804 }
805 
au0828_analog_stream_disable(struct au0828_dev * d)806 int au0828_analog_stream_disable(struct au0828_dev *d)
807 {
808 	dprintk(1, "au0828_analog_stream_disable called\n");
809 	au0828_writereg(d, AU0828_SENSORCTRL_100, 0x0);
810 	return 0;
811 }
812 
au0828_analog_stream_reset(struct au0828_dev * dev)813 void au0828_analog_stream_reset(struct au0828_dev *dev)
814 {
815 	dprintk(1, "au0828_analog_stream_reset called\n");
816 	au0828_writereg(dev, AU0828_SENSORCTRL_100, 0x0);
817 	mdelay(30);
818 	au0828_writereg(dev, AU0828_SENSORCTRL_100, 0xb3);
819 }
820 
821 /*
822  * Some operations needs to stop current streaming
823  */
au0828_stream_interrupt(struct au0828_dev * dev)824 static int au0828_stream_interrupt(struct au0828_dev *dev)
825 {
826 	int ret = 0;
827 
828 	dev->stream_state = STREAM_INTERRUPT;
829 	if (dev->dev_state == DEV_DISCONNECTED)
830 		return -ENODEV;
831 	else if (ret) {
832 		dev->dev_state = DEV_MISCONFIGURED;
833 		dprintk(1, "%s device is misconfigured!\n", __func__);
834 		return ret;
835 	}
836 	return 0;
837 }
838 
839 /*
840  * au0828_release_resources
841  * unregister v4l2 devices
842  */
au0828_analog_unregister(struct au0828_dev * dev)843 void au0828_analog_unregister(struct au0828_dev *dev)
844 {
845 	dprintk(1, "au0828_release_resources called\n");
846 	mutex_lock(&au0828_sysfs_lock);
847 
848 	if (dev->vdev)
849 		video_unregister_device(dev->vdev);
850 	if (dev->vbi_dev)
851 		video_unregister_device(dev->vbi_dev);
852 
853 	mutex_unlock(&au0828_sysfs_lock);
854 }
855 
856 
857 /* Usage lock check functions */
res_get(struct au0828_fh * fh,unsigned int bit)858 static int res_get(struct au0828_fh *fh, unsigned int bit)
859 {
860 	struct au0828_dev    *dev = fh->dev;
861 
862 	if (fh->resources & bit)
863 		/* have it already allocated */
864 		return 1;
865 
866 	/* is it free? */
867 	mutex_lock(&dev->lock);
868 	if (dev->resources & bit) {
869 		/* no, someone else uses it */
870 		mutex_unlock(&dev->lock);
871 		return 0;
872 	}
873 	/* it's free, grab it */
874 	fh->resources  |= bit;
875 	dev->resources |= bit;
876 	dprintk(1, "res: get %d\n", bit);
877 	mutex_unlock(&dev->lock);
878 	return 1;
879 }
880 
res_check(struct au0828_fh * fh,unsigned int bit)881 static int res_check(struct au0828_fh *fh, unsigned int bit)
882 {
883 	return fh->resources & bit;
884 }
885 
res_locked(struct au0828_dev * dev,unsigned int bit)886 static int res_locked(struct au0828_dev *dev, unsigned int bit)
887 {
888 	return dev->resources & bit;
889 }
890 
res_free(struct au0828_fh * fh,unsigned int bits)891 static void res_free(struct au0828_fh *fh, unsigned int bits)
892 {
893 	struct au0828_dev    *dev = fh->dev;
894 
895 	BUG_ON((fh->resources & bits) != bits);
896 
897 	mutex_lock(&dev->lock);
898 	fh->resources  &= ~bits;
899 	dev->resources &= ~bits;
900 	dprintk(1, "res: put %d\n", bits);
901 	mutex_unlock(&dev->lock);
902 }
903 
get_ressource(struct au0828_fh * fh)904 static int get_ressource(struct au0828_fh *fh)
905 {
906 	switch (fh->type) {
907 	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
908 		return AU0828_RESOURCE_VIDEO;
909 	case V4L2_BUF_TYPE_VBI_CAPTURE:
910 		return AU0828_RESOURCE_VBI;
911 	default:
912 		BUG();
913 		return 0;
914 	}
915 }
916 
917 /* This function ensures that video frames continue to be delivered even if
918    the ITU-656 input isn't receiving any data (thereby preventing applications
919    such as tvtime from hanging) */
au0828_vid_buffer_timeout(unsigned long data)920 void au0828_vid_buffer_timeout(unsigned long data)
921 {
922 	struct au0828_dev *dev = (struct au0828_dev *) data;
923 	struct au0828_dmaqueue *dma_q = &dev->vidq;
924 	struct au0828_buffer *buf;
925 	unsigned char *vid_data;
926 	unsigned long flags = 0;
927 
928 	spin_lock_irqsave(&dev->slock, flags);
929 
930 	buf = dev->isoc_ctl.buf;
931 	if (buf != NULL) {
932 		vid_data = videobuf_to_vmalloc(&buf->vb);
933 		memset(vid_data, 0x00, buf->vb.size); /* Blank green frame */
934 		buffer_filled(dev, dma_q, buf);
935 	}
936 	get_next_buf(dma_q, &buf);
937 
938 	if (dev->vid_timeout_running == 1)
939 		mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
940 
941 	spin_unlock_irqrestore(&dev->slock, flags);
942 }
943 
au0828_vbi_buffer_timeout(unsigned long data)944 void au0828_vbi_buffer_timeout(unsigned long data)
945 {
946 	struct au0828_dev *dev = (struct au0828_dev *) data;
947 	struct au0828_dmaqueue *dma_q = &dev->vbiq;
948 	struct au0828_buffer *buf;
949 	unsigned char *vbi_data;
950 	unsigned long flags = 0;
951 
952 	spin_lock_irqsave(&dev->slock, flags);
953 
954 	buf = dev->isoc_ctl.vbi_buf;
955 	if (buf != NULL) {
956 		vbi_data = videobuf_to_vmalloc(&buf->vb);
957 		memset(vbi_data, 0x00, buf->vb.size);
958 		vbi_buffer_filled(dev, dma_q, buf);
959 	}
960 	vbi_get_next_buf(dma_q, &buf);
961 
962 	if (dev->vbi_timeout_running == 1)
963 		mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
964 	spin_unlock_irqrestore(&dev->slock, flags);
965 }
966 
967 
au0828_v4l2_open(struct file * filp)968 static int au0828_v4l2_open(struct file *filp)
969 {
970 	int ret = 0;
971 	struct video_device *vdev = video_devdata(filp);
972 	struct au0828_dev *dev = video_drvdata(filp);
973 	struct au0828_fh *fh;
974 	int type;
975 
976 	switch (vdev->vfl_type) {
977 	case VFL_TYPE_GRABBER:
978 		type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
979 		break;
980 	case VFL_TYPE_VBI:
981 		type = V4L2_BUF_TYPE_VBI_CAPTURE;
982 		break;
983 	default:
984 		return -EINVAL;
985 	}
986 
987 	fh = kzalloc(sizeof(struct au0828_fh), GFP_KERNEL);
988 	if (NULL == fh) {
989 		dprintk(1, "Failed allocate au0828_fh struct!\n");
990 		return -ENOMEM;
991 	}
992 
993 	fh->type = type;
994 	fh->dev = dev;
995 	filp->private_data = fh;
996 
997 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
998 		/* set au0828 interface0 to AS5 here again */
999 		ret = usb_set_interface(dev->usbdev, 0, 5);
1000 		if (ret < 0) {
1001 			printk(KERN_INFO "Au0828 can't set alternate to 5!\n");
1002 			return -EBUSY;
1003 		}
1004 		dev->width = NTSC_STD_W;
1005 		dev->height = NTSC_STD_H;
1006 		dev->frame_size = dev->width * dev->height * 2;
1007 		dev->field_size = dev->width * dev->height;
1008 		dev->bytesperline = dev->width * 2;
1009 
1010 		au0828_analog_stream_enable(dev);
1011 		au0828_analog_stream_reset(dev);
1012 
1013 		/* If we were doing ac97 instead of i2s, it would go here...*/
1014 		au0828_i2s_init(dev);
1015 
1016 		dev->stream_state = STREAM_OFF;
1017 		dev->dev_state |= DEV_INITIALIZED;
1018 	}
1019 
1020 	dev->users++;
1021 
1022 	videobuf_queue_vmalloc_init(&fh->vb_vidq, &au0828_video_qops,
1023 				    NULL, &dev->slock,
1024 				    V4L2_BUF_TYPE_VIDEO_CAPTURE,
1025 				    V4L2_FIELD_INTERLACED,
1026 				    sizeof(struct au0828_buffer), fh, NULL);
1027 
1028 	/* VBI Setup */
1029 	dev->vbi_width = 720;
1030 	dev->vbi_height = 1;
1031 	videobuf_queue_vmalloc_init(&fh->vb_vbiq, &au0828_vbi_qops,
1032 				    NULL, &dev->slock,
1033 				    V4L2_BUF_TYPE_VBI_CAPTURE,
1034 				    V4L2_FIELD_SEQ_TB,
1035 				    sizeof(struct au0828_buffer), fh, NULL);
1036 
1037 	return ret;
1038 }
1039 
au0828_v4l2_close(struct file * filp)1040 static int au0828_v4l2_close(struct file *filp)
1041 {
1042 	int ret;
1043 	struct au0828_fh *fh = filp->private_data;
1044 	struct au0828_dev *dev = fh->dev;
1045 
1046 	if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
1047 		/* Cancel timeout thread in case they didn't call streamoff */
1048 		dev->vid_timeout_running = 0;
1049 		del_timer_sync(&dev->vid_timeout);
1050 
1051 		videobuf_stop(&fh->vb_vidq);
1052 		res_free(fh, AU0828_RESOURCE_VIDEO);
1053 	}
1054 
1055 	if (res_check(fh, AU0828_RESOURCE_VBI)) {
1056 		/* Cancel timeout thread in case they didn't call streamoff */
1057 		dev->vbi_timeout_running = 0;
1058 		del_timer_sync(&dev->vbi_timeout);
1059 
1060 		videobuf_stop(&fh->vb_vbiq);
1061 		res_free(fh, AU0828_RESOURCE_VBI);
1062 	}
1063 
1064 	if (dev->users == 1) {
1065 		if (dev->dev_state & DEV_DISCONNECTED) {
1066 			au0828_analog_unregister(dev);
1067 			kfree(dev);
1068 			return 0;
1069 		}
1070 
1071 		au0828_analog_stream_disable(dev);
1072 
1073 		au0828_uninit_isoc(dev);
1074 
1075 		/* Save some power by putting tuner to sleep */
1076 		v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 0);
1077 
1078 		/* When close the device, set the usb intf0 into alt0 to free
1079 		   USB bandwidth */
1080 		ret = usb_set_interface(dev->usbdev, 0, 0);
1081 		if (ret < 0)
1082 			printk(KERN_INFO "Au0828 can't set alternate to 0!\n");
1083 	}
1084 
1085 	videobuf_mmap_free(&fh->vb_vidq);
1086 	videobuf_mmap_free(&fh->vb_vbiq);
1087 	kfree(fh);
1088 	dev->users--;
1089 	wake_up_interruptible_nr(&dev->open, 1);
1090 	return 0;
1091 }
1092 
au0828_v4l2_read(struct file * filp,char __user * buf,size_t count,loff_t * pos)1093 static ssize_t au0828_v4l2_read(struct file *filp, char __user *buf,
1094 				size_t count, loff_t *pos)
1095 {
1096 	struct au0828_fh *fh = filp->private_data;
1097 	struct au0828_dev *dev = fh->dev;
1098 	int rc;
1099 
1100 	rc = check_dev(dev);
1101 	if (rc < 0)
1102 		return rc;
1103 
1104 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1105 		if (res_locked(dev, AU0828_RESOURCE_VIDEO))
1106 			return -EBUSY;
1107 
1108 		return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
1109 					filp->f_flags & O_NONBLOCK);
1110 	}
1111 
1112 	if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1113 		if (!res_get(fh, AU0828_RESOURCE_VBI))
1114 			return -EBUSY;
1115 
1116 		if (dev->vbi_timeout_running == 0) {
1117 			/* Handle case where caller tries to read without
1118 			   calling streamon first */
1119 			dev->vbi_timeout_running = 1;
1120 			mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
1121 		}
1122 
1123 		return videobuf_read_stream(&fh->vb_vbiq, buf, count, pos, 0,
1124 					    filp->f_flags & O_NONBLOCK);
1125 	}
1126 
1127 	return 0;
1128 }
1129 
au0828_v4l2_poll(struct file * filp,poll_table * wait)1130 static unsigned int au0828_v4l2_poll(struct file *filp, poll_table *wait)
1131 {
1132 	struct au0828_fh *fh = filp->private_data;
1133 	struct au0828_dev *dev = fh->dev;
1134 	int rc;
1135 
1136 	rc = check_dev(dev);
1137 	if (rc < 0)
1138 		return rc;
1139 
1140 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1141 		if (!res_get(fh, AU0828_RESOURCE_VIDEO))
1142 			return POLLERR;
1143 		return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
1144 	} else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1145 		if (!res_get(fh, AU0828_RESOURCE_VBI))
1146 			return POLLERR;
1147 		return videobuf_poll_stream(filp, &fh->vb_vbiq, wait);
1148 	} else {
1149 		return POLLERR;
1150 	}
1151 }
1152 
au0828_v4l2_mmap(struct file * filp,struct vm_area_struct * vma)1153 static int au0828_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
1154 {
1155 	struct au0828_fh *fh    = filp->private_data;
1156 	struct au0828_dev *dev   = fh->dev;
1157 	int		 rc;
1158 
1159 	rc = check_dev(dev);
1160 	if (rc < 0)
1161 		return rc;
1162 
1163 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1164 		rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1165 	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1166 		rc = videobuf_mmap_mapper(&fh->vb_vbiq, vma);
1167 
1168 	return rc;
1169 }
1170 
au0828_set_format(struct au0828_dev * dev,unsigned int cmd,struct v4l2_format * format)1171 static int au0828_set_format(struct au0828_dev *dev, unsigned int cmd,
1172 			     struct v4l2_format *format)
1173 {
1174 	int ret;
1175 	int width = format->fmt.pix.width;
1176 	int height = format->fmt.pix.height;
1177 
1178 	if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1179 		return -EINVAL;
1180 
1181 	/* If they are demanding a format other than the one we support,
1182 	   bail out (tvtime asks for UYVY and then retries with YUYV) */
1183 	if (format->fmt.pix.pixelformat != V4L2_PIX_FMT_UYVY)
1184 		return -EINVAL;
1185 
1186 	/* format->fmt.pix.width only support 720 and height 480 */
1187 	if (width != 720)
1188 		width = 720;
1189 	if (height != 480)
1190 		height = 480;
1191 
1192 	format->fmt.pix.width = width;
1193 	format->fmt.pix.height = height;
1194 	format->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1195 	format->fmt.pix.bytesperline = width * 2;
1196 	format->fmt.pix.sizeimage = width * height * 2;
1197 	format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1198 	format->fmt.pix.field = V4L2_FIELD_INTERLACED;
1199 
1200 	if (cmd == VIDIOC_TRY_FMT)
1201 		return 0;
1202 
1203 	/* maybe set new image format, driver current only support 720*480 */
1204 	dev->width = width;
1205 	dev->height = height;
1206 	dev->frame_size = width * height * 2;
1207 	dev->field_size = width * height;
1208 	dev->bytesperline = width * 2;
1209 
1210 	if (dev->stream_state == STREAM_ON) {
1211 		dprintk(1, "VIDIOC_SET_FMT: interrupting stream!\n");
1212 		ret = au0828_stream_interrupt(dev);
1213 		if (ret != 0) {
1214 			dprintk(1, "error interrupting video stream!\n");
1215 			return ret;
1216 		}
1217 	}
1218 
1219 	/* set au0828 interface0 to AS5 here again */
1220 	ret = usb_set_interface(dev->usbdev, 0, 5);
1221 	if (ret < 0) {
1222 		printk(KERN_INFO "Au0828 can't set alt setting to 5!\n");
1223 		return -EBUSY;
1224 	}
1225 
1226 	au0828_analog_stream_enable(dev);
1227 
1228 	return 0;
1229 }
1230 
1231 
vidioc_queryctrl(struct file * file,void * priv,struct v4l2_queryctrl * qc)1232 static int vidioc_queryctrl(struct file *file, void *priv,
1233 			    struct v4l2_queryctrl *qc)
1234 {
1235 	struct au0828_fh *fh = priv;
1236 	struct au0828_dev *dev = fh->dev;
1237 	v4l2_device_call_all(&dev->v4l2_dev, 0, core, queryctrl, qc);
1238 	if (qc->type)
1239 		return 0;
1240 	else
1241 		return -EINVAL;
1242 }
1243 
vidioc_querycap(struct file * file,void * priv,struct v4l2_capability * cap)1244 static int vidioc_querycap(struct file *file, void  *priv,
1245 			   struct v4l2_capability *cap)
1246 {
1247 	struct au0828_fh *fh  = priv;
1248 	struct au0828_dev *dev = fh->dev;
1249 
1250 	strlcpy(cap->driver, "au0828", sizeof(cap->driver));
1251 	strlcpy(cap->card, dev->board.name, sizeof(cap->card));
1252 	strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
1253 
1254 	/*set the device capabilities */
1255 	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1256 		V4L2_CAP_VBI_CAPTURE |
1257 		V4L2_CAP_AUDIO |
1258 		V4L2_CAP_READWRITE |
1259 		V4L2_CAP_STREAMING |
1260 		V4L2_CAP_TUNER;
1261 	return 0;
1262 }
1263 
vidioc_enum_fmt_vid_cap(struct file * file,void * priv,struct v4l2_fmtdesc * f)1264 static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
1265 					struct v4l2_fmtdesc *f)
1266 {
1267 	if (f->index)
1268 		return -EINVAL;
1269 
1270 	f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1271 	strcpy(f->description, "Packed YUV2");
1272 
1273 	f->flags = 0;
1274 	f->pixelformat = V4L2_PIX_FMT_UYVY;
1275 
1276 	return 0;
1277 }
1278 
vidioc_g_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)1279 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1280 					struct v4l2_format *f)
1281 {
1282 	struct au0828_fh *fh  = priv;
1283 	struct au0828_dev *dev = fh->dev;
1284 
1285 	f->fmt.pix.width = dev->width;
1286 	f->fmt.pix.height = dev->height;
1287 	f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1288 	f->fmt.pix.bytesperline = dev->bytesperline;
1289 	f->fmt.pix.sizeimage = dev->frame_size;
1290 	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* NTSC/PAL */
1291 	f->fmt.pix.field = V4L2_FIELD_INTERLACED;
1292 	return 0;
1293 }
1294 
vidioc_try_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)1295 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1296 				  struct v4l2_format *f)
1297 {
1298 	struct au0828_fh *fh  = priv;
1299 	struct au0828_dev *dev = fh->dev;
1300 
1301 	return au0828_set_format(dev, VIDIOC_TRY_FMT, f);
1302 }
1303 
vidioc_s_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)1304 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1305 				struct v4l2_format *f)
1306 {
1307 	struct au0828_fh *fh  = priv;
1308 	struct au0828_dev *dev = fh->dev;
1309 	int rc;
1310 
1311 	rc = check_dev(dev);
1312 	if (rc < 0)
1313 		return rc;
1314 
1315 	mutex_lock(&dev->lock);
1316 
1317 	if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1318 		printk(KERN_INFO "%s queue busy\n", __func__);
1319 		rc = -EBUSY;
1320 		goto out;
1321 	}
1322 
1323 	rc = au0828_set_format(dev, VIDIOC_S_FMT, f);
1324 out:
1325 	mutex_unlock(&dev->lock);
1326 	return rc;
1327 }
1328 
vidioc_s_std(struct file * file,void * priv,v4l2_std_id * norm)1329 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm)
1330 {
1331 	struct au0828_fh *fh = priv;
1332 	struct au0828_dev *dev = fh->dev;
1333 
1334 	/* FIXME: when we support something other than NTSC, we are going to
1335 	   have to make the au0828 bridge adjust the size of its capture
1336 	   buffer, which is currently hardcoded at 720x480 */
1337 
1338 	v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, *norm);
1339 	return 0;
1340 }
1341 
vidioc_enum_input(struct file * file,void * priv,struct v4l2_input * input)1342 static int vidioc_enum_input(struct file *file, void *priv,
1343 				struct v4l2_input *input)
1344 {
1345 	struct au0828_fh *fh = priv;
1346 	struct au0828_dev *dev = fh->dev;
1347 	unsigned int tmp;
1348 
1349 	static const char *inames[] = {
1350 		[AU0828_VMUX_UNDEFINED] = "Undefined",
1351 		[AU0828_VMUX_COMPOSITE] = "Composite",
1352 		[AU0828_VMUX_SVIDEO] = "S-Video",
1353 		[AU0828_VMUX_CABLE] = "Cable TV",
1354 		[AU0828_VMUX_TELEVISION] = "Television",
1355 		[AU0828_VMUX_DVB] = "DVB",
1356 		[AU0828_VMUX_DEBUG] = "tv debug"
1357 	};
1358 
1359 	tmp = input->index;
1360 
1361 	if (tmp >= AU0828_MAX_INPUT)
1362 		return -EINVAL;
1363 	if (AUVI_INPUT(tmp).type == 0)
1364 		return -EINVAL;
1365 
1366 	input->index = tmp;
1367 	strcpy(input->name, inames[AUVI_INPUT(tmp).type]);
1368 	if ((AUVI_INPUT(tmp).type == AU0828_VMUX_TELEVISION) ||
1369 	    (AUVI_INPUT(tmp).type == AU0828_VMUX_CABLE))
1370 		input->type |= V4L2_INPUT_TYPE_TUNER;
1371 	else
1372 		input->type |= V4L2_INPUT_TYPE_CAMERA;
1373 
1374 	input->std = dev->vdev->tvnorms;
1375 
1376 	return 0;
1377 }
1378 
vidioc_g_input(struct file * file,void * priv,unsigned int * i)1379 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1380 {
1381 	struct au0828_fh *fh = priv;
1382 	struct au0828_dev *dev = fh->dev;
1383 	*i = dev->ctrl_input;
1384 	return 0;
1385 }
1386 
vidioc_s_input(struct file * file,void * priv,unsigned int index)1387 static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
1388 {
1389 	struct au0828_fh *fh = priv;
1390 	struct au0828_dev *dev = fh->dev;
1391 	int i;
1392 
1393 	dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
1394 		index);
1395 	if (index >= AU0828_MAX_INPUT)
1396 		return -EINVAL;
1397 	if (AUVI_INPUT(index).type == 0)
1398 		return -EINVAL;
1399 	dev->ctrl_input = index;
1400 
1401 	switch (AUVI_INPUT(index).type) {
1402 	case AU0828_VMUX_SVIDEO:
1403 		dev->input_type = AU0828_VMUX_SVIDEO;
1404 		break;
1405 	case AU0828_VMUX_COMPOSITE:
1406 		dev->input_type = AU0828_VMUX_COMPOSITE;
1407 		break;
1408 	case AU0828_VMUX_TELEVISION:
1409 		dev->input_type = AU0828_VMUX_TELEVISION;
1410 		break;
1411 	default:
1412 		dprintk(1, "VIDIOC_S_INPUT unknown input type set [%d]\n",
1413 			AUVI_INPUT(index).type);
1414 		break;
1415 	}
1416 
1417 	v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
1418 			AUVI_INPUT(index).vmux, 0, 0);
1419 
1420 	for (i = 0; i < AU0828_MAX_INPUT; i++) {
1421 		int enable = 0;
1422 		if (AUVI_INPUT(i).audio_setup == NULL)
1423 			continue;
1424 
1425 		if (i == index)
1426 			enable = 1;
1427 		else
1428 			enable = 0;
1429 		if (enable) {
1430 			(AUVI_INPUT(i).audio_setup)(dev, enable);
1431 		} else {
1432 			/* Make sure we leave it turned on if some
1433 			   other input is routed to this callback */
1434 			if ((AUVI_INPUT(i).audio_setup) !=
1435 			    ((AUVI_INPUT(index).audio_setup))) {
1436 				(AUVI_INPUT(i).audio_setup)(dev, enable);
1437 			}
1438 		}
1439 	}
1440 
1441 	v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
1442 			AUVI_INPUT(index).amux, 0, 0);
1443 	return 0;
1444 }
1445 
vidioc_g_audio(struct file * file,void * priv,struct v4l2_audio * a)1446 static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1447 {
1448 	struct au0828_fh *fh = priv;
1449 	struct au0828_dev *dev = fh->dev;
1450 	unsigned int index = a->index;
1451 
1452 	if (a->index > 1)
1453 		return -EINVAL;
1454 
1455 	index = dev->ctrl_ainput;
1456 	if (index == 0)
1457 		strcpy(a->name, "Television");
1458 	else
1459 		strcpy(a->name, "Line in");
1460 
1461 	a->capability = V4L2_AUDCAP_STEREO;
1462 	a->index = index;
1463 	return 0;
1464 }
1465 
vidioc_s_audio(struct file * file,void * priv,struct v4l2_audio * a)1466 static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
1467 {
1468 	struct au0828_fh *fh = priv;
1469 	struct au0828_dev *dev = fh->dev;
1470 	if (a->index != dev->ctrl_ainput)
1471 		return -EINVAL;
1472 	return 0;
1473 }
1474 
vidioc_g_ctrl(struct file * file,void * priv,struct v4l2_control * ctrl)1475 static int vidioc_g_ctrl(struct file *file, void *priv,
1476 			 struct v4l2_control *ctrl)
1477 {
1478 	struct au0828_fh *fh = priv;
1479 	struct au0828_dev *dev = fh->dev;
1480 
1481 	v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_ctrl, ctrl);
1482 	return 0;
1483 
1484 }
1485 
vidioc_s_ctrl(struct file * file,void * priv,struct v4l2_control * ctrl)1486 static int vidioc_s_ctrl(struct file *file, void *priv,
1487 				struct v4l2_control *ctrl)
1488 {
1489 	struct au0828_fh *fh = priv;
1490 	struct au0828_dev *dev = fh->dev;
1491 	v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_ctrl, ctrl);
1492 	return 0;
1493 }
1494 
vidioc_g_tuner(struct file * file,void * priv,struct v4l2_tuner * t)1495 static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1496 {
1497 	struct au0828_fh *fh = priv;
1498 	struct au0828_dev *dev = fh->dev;
1499 
1500 	if (t->index != 0)
1501 		return -EINVAL;
1502 
1503 	strcpy(t->name, "Auvitek tuner");
1504 	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1505 	return 0;
1506 }
1507 
vidioc_s_tuner(struct file * file,void * priv,struct v4l2_tuner * t)1508 static int vidioc_s_tuner(struct file *file, void *priv,
1509 				struct v4l2_tuner *t)
1510 {
1511 	struct au0828_fh *fh = priv;
1512 	struct au0828_dev *dev = fh->dev;
1513 
1514 	if (t->index != 0)
1515 		return -EINVAL;
1516 
1517 	t->type = V4L2_TUNER_ANALOG_TV;
1518 	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1519 	dprintk(1, "VIDIOC_S_TUNER: signal = %x, afc = %x\n", t->signal,
1520 		t->afc);
1521 	return 0;
1522 
1523 }
1524 
vidioc_g_frequency(struct file * file,void * priv,struct v4l2_frequency * freq)1525 static int vidioc_g_frequency(struct file *file, void *priv,
1526 				struct v4l2_frequency *freq)
1527 {
1528 	struct au0828_fh *fh = priv;
1529 	struct au0828_dev *dev = fh->dev;
1530 
1531 	freq->type = V4L2_TUNER_ANALOG_TV;
1532 	freq->frequency = dev->ctrl_freq;
1533 	return 0;
1534 }
1535 
vidioc_s_frequency(struct file * file,void * priv,struct v4l2_frequency * freq)1536 static int vidioc_s_frequency(struct file *file, void *priv,
1537 				struct v4l2_frequency *freq)
1538 {
1539 	struct au0828_fh *fh = priv;
1540 	struct au0828_dev *dev = fh->dev;
1541 
1542 	if (freq->tuner != 0)
1543 		return -EINVAL;
1544 	if (freq->type != V4L2_TUNER_ANALOG_TV)
1545 		return -EINVAL;
1546 
1547 	dev->ctrl_freq = freq->frequency;
1548 
1549 	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, freq);
1550 
1551 	au0828_analog_stream_reset(dev);
1552 
1553 	return 0;
1554 }
1555 
1556 
1557 /* RAW VBI ioctls */
1558 
vidioc_g_fmt_vbi_cap(struct file * file,void * priv,struct v4l2_format * format)1559 static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1560 				struct v4l2_format *format)
1561 {
1562 	struct au0828_fh      *fh  = priv;
1563 	struct au0828_dev     *dev = fh->dev;
1564 
1565 	format->fmt.vbi.samples_per_line = dev->vbi_width;
1566 	format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1567 	format->fmt.vbi.offset = 0;
1568 	format->fmt.vbi.flags = 0;
1569 	format->fmt.vbi.sampling_rate = 6750000 * 4 / 2;
1570 
1571 	format->fmt.vbi.count[0] = dev->vbi_height;
1572 	format->fmt.vbi.count[1] = dev->vbi_height;
1573 	format->fmt.vbi.start[0] = 21;
1574 	format->fmt.vbi.start[1] = 284;
1575 
1576 	return 0;
1577 }
1578 
vidioc_g_chip_ident(struct file * file,void * priv,struct v4l2_dbg_chip_ident * chip)1579 static int vidioc_g_chip_ident(struct file *file, void *priv,
1580 	       struct v4l2_dbg_chip_ident *chip)
1581 {
1582 	struct au0828_fh *fh = priv;
1583 	struct au0828_dev *dev = fh->dev;
1584 	chip->ident = V4L2_IDENT_NONE;
1585 	chip->revision = 0;
1586 
1587 	if (v4l2_chip_match_host(&chip->match)) {
1588 		chip->ident = V4L2_IDENT_AU0828;
1589 		return 0;
1590 	}
1591 
1592 	v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_chip_ident, chip);
1593 	if (chip->ident == V4L2_IDENT_NONE)
1594 		return -EINVAL;
1595 
1596 	return 0;
1597 }
1598 
vidioc_cropcap(struct file * file,void * priv,struct v4l2_cropcap * cc)1599 static int vidioc_cropcap(struct file *file, void *priv,
1600 			  struct v4l2_cropcap *cc)
1601 {
1602 	struct au0828_fh *fh = priv;
1603 	struct au0828_dev *dev = fh->dev;
1604 
1605 	if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1606 		return -EINVAL;
1607 
1608 	cc->bounds.left = 0;
1609 	cc->bounds.top = 0;
1610 	cc->bounds.width = dev->width;
1611 	cc->bounds.height = dev->height;
1612 
1613 	cc->defrect = cc->bounds;
1614 
1615 	cc->pixelaspect.numerator = 54;
1616 	cc->pixelaspect.denominator = 59;
1617 
1618 	return 0;
1619 }
1620 
vidioc_streamon(struct file * file,void * priv,enum v4l2_buf_type type)1621 static int vidioc_streamon(struct file *file, void *priv,
1622 			   enum v4l2_buf_type type)
1623 {
1624 	struct au0828_fh      *fh  = priv;
1625 	struct au0828_dev     *dev = fh->dev;
1626 	int                   rc = -EINVAL;
1627 
1628 	rc = check_dev(dev);
1629 	if (rc < 0)
1630 		return rc;
1631 
1632 	if (unlikely(type != fh->type))
1633 		return -EINVAL;
1634 
1635 	dprintk(1, "vidioc_streamon fh=%p t=%d fh->res=%d dev->res=%d\n",
1636 		fh, type, fh->resources, dev->resources);
1637 
1638 	if (unlikely(!res_get(fh, get_ressource(fh))))
1639 		return -EBUSY;
1640 
1641 	if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1642 		au0828_analog_stream_enable(dev);
1643 		v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
1644 	}
1645 
1646 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1647 		rc = videobuf_streamon(&fh->vb_vidq);
1648 		dev->vid_timeout_running = 1;
1649 		mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
1650 	} else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1651 		rc = videobuf_streamon(&fh->vb_vbiq);
1652 		dev->vbi_timeout_running = 1;
1653 		mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
1654 	}
1655 
1656 	return rc;
1657 }
1658 
vidioc_streamoff(struct file * file,void * priv,enum v4l2_buf_type type)1659 static int vidioc_streamoff(struct file *file, void *priv,
1660 			    enum v4l2_buf_type type)
1661 {
1662 	struct au0828_fh      *fh  = priv;
1663 	struct au0828_dev     *dev = fh->dev;
1664 	int                   rc;
1665 	int                   i;
1666 
1667 	rc = check_dev(dev);
1668 	if (rc < 0)
1669 		return rc;
1670 
1671 	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1672 	    fh->type != V4L2_BUF_TYPE_VBI_CAPTURE)
1673 		return -EINVAL;
1674 	if (type != fh->type)
1675 		return -EINVAL;
1676 
1677 	dprintk(1, "vidioc_streamoff fh=%p t=%d fh->res=%d dev->res=%d\n",
1678 		fh, type, fh->resources, dev->resources);
1679 
1680 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1681 		dev->vid_timeout_running = 0;
1682 		del_timer_sync(&dev->vid_timeout);
1683 
1684 		v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
1685 		rc = au0828_stream_interrupt(dev);
1686 		if (rc != 0)
1687 			return rc;
1688 
1689 		for (i = 0; i < AU0828_MAX_INPUT; i++) {
1690 			if (AUVI_INPUT(i).audio_setup == NULL)
1691 				continue;
1692 			(AUVI_INPUT(i).audio_setup)(dev, 0);
1693 		}
1694 
1695 		videobuf_streamoff(&fh->vb_vidq);
1696 		res_free(fh, AU0828_RESOURCE_VIDEO);
1697 	} else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1698 		dev->vbi_timeout_running = 0;
1699 		del_timer_sync(&dev->vbi_timeout);
1700 
1701 		videobuf_streamoff(&fh->vb_vbiq);
1702 		res_free(fh, AU0828_RESOURCE_VBI);
1703 	}
1704 
1705 	return 0;
1706 }
1707 
1708 #ifdef CONFIG_VIDEO_ADV_DEBUG
vidioc_g_register(struct file * file,void * priv,struct v4l2_dbg_register * reg)1709 static int vidioc_g_register(struct file *file, void *priv,
1710 			     struct v4l2_dbg_register *reg)
1711 {
1712 	struct au0828_fh *fh = priv;
1713 	struct au0828_dev *dev = fh->dev;
1714 
1715 	switch (reg->match.type) {
1716 	case V4L2_CHIP_MATCH_I2C_DRIVER:
1717 		v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
1718 		return 0;
1719 	default:
1720 		return -EINVAL;
1721 	}
1722 }
1723 
vidioc_s_register(struct file * file,void * priv,struct v4l2_dbg_register * reg)1724 static int vidioc_s_register(struct file *file, void *priv,
1725 			     struct v4l2_dbg_register *reg)
1726 {
1727 	struct au0828_fh *fh = priv;
1728 	struct au0828_dev *dev = fh->dev;
1729 
1730 	switch (reg->match.type) {
1731 	case V4L2_CHIP_MATCH_I2C_DRIVER:
1732 		v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
1733 		return 0;
1734 	default:
1735 		return -EINVAL;
1736 	}
1737 	return 0;
1738 }
1739 #endif
1740 
vidioc_reqbufs(struct file * file,void * priv,struct v4l2_requestbuffers * rb)1741 static int vidioc_reqbufs(struct file *file, void *priv,
1742 			  struct v4l2_requestbuffers *rb)
1743 {
1744 	struct au0828_fh *fh = priv;
1745 	struct au0828_dev *dev = fh->dev;
1746 	int rc;
1747 
1748 	rc = check_dev(dev);
1749 	if (rc < 0)
1750 		return rc;
1751 
1752 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1753 		rc = videobuf_reqbufs(&fh->vb_vidq, rb);
1754 	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1755 		rc = videobuf_reqbufs(&fh->vb_vbiq, rb);
1756 
1757 	return rc;
1758 }
1759 
vidioc_querybuf(struct file * file,void * priv,struct v4l2_buffer * b)1760 static int vidioc_querybuf(struct file *file, void *priv,
1761 			   struct v4l2_buffer *b)
1762 {
1763 	struct au0828_fh *fh = priv;
1764 	struct au0828_dev *dev = fh->dev;
1765 	int rc;
1766 
1767 	rc = check_dev(dev);
1768 	if (rc < 0)
1769 		return rc;
1770 
1771 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1772 		rc = videobuf_querybuf(&fh->vb_vidq, b);
1773 	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1774 		rc = videobuf_querybuf(&fh->vb_vbiq, b);
1775 
1776 	return rc;
1777 }
1778 
vidioc_qbuf(struct file * file,void * priv,struct v4l2_buffer * b)1779 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1780 {
1781 	struct au0828_fh *fh = priv;
1782 	struct au0828_dev *dev = fh->dev;
1783 	int rc;
1784 
1785 	rc = check_dev(dev);
1786 	if (rc < 0)
1787 		return rc;
1788 
1789 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1790 		rc = videobuf_qbuf(&fh->vb_vidq, b);
1791 	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1792 		rc = videobuf_qbuf(&fh->vb_vbiq, b);
1793 
1794 	return rc;
1795 }
1796 
vidioc_dqbuf(struct file * file,void * priv,struct v4l2_buffer * b)1797 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1798 {
1799 	struct au0828_fh *fh = priv;
1800 	struct au0828_dev *dev = fh->dev;
1801 	int rc;
1802 
1803 	rc = check_dev(dev);
1804 	if (rc < 0)
1805 		return rc;
1806 
1807 	/* Workaround for a bug in the au0828 hardware design that sometimes
1808 	   results in the colorspace being inverted */
1809 	if (dev->greenscreen_detected == 1) {
1810 		dprintk(1, "Detected green frame.  Resetting stream...\n");
1811 		au0828_analog_stream_reset(dev);
1812 		dev->greenscreen_detected = 0;
1813 	}
1814 
1815 	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1816 		rc = videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1817 	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1818 		rc = videobuf_dqbuf(&fh->vb_vbiq, b, file->f_flags & O_NONBLOCK);
1819 
1820 	return rc;
1821 }
1822 
1823 static struct v4l2_file_operations au0828_v4l_fops = {
1824 	.owner      = THIS_MODULE,
1825 	.open       = au0828_v4l2_open,
1826 	.release    = au0828_v4l2_close,
1827 	.read       = au0828_v4l2_read,
1828 	.poll       = au0828_v4l2_poll,
1829 	.mmap       = au0828_v4l2_mmap,
1830 	.ioctl      = video_ioctl2,
1831 };
1832 
1833 static const struct v4l2_ioctl_ops video_ioctl_ops = {
1834 	.vidioc_querycap            = vidioc_querycap,
1835 	.vidioc_enum_fmt_vid_cap    = vidioc_enum_fmt_vid_cap,
1836 	.vidioc_g_fmt_vid_cap       = vidioc_g_fmt_vid_cap,
1837 	.vidioc_try_fmt_vid_cap     = vidioc_try_fmt_vid_cap,
1838 	.vidioc_s_fmt_vid_cap       = vidioc_s_fmt_vid_cap,
1839 	.vidioc_g_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
1840 	.vidioc_s_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
1841 	.vidioc_g_audio             = vidioc_g_audio,
1842 	.vidioc_s_audio             = vidioc_s_audio,
1843 	.vidioc_cropcap             = vidioc_cropcap,
1844 	.vidioc_reqbufs             = vidioc_reqbufs,
1845 	.vidioc_querybuf            = vidioc_querybuf,
1846 	.vidioc_qbuf                = vidioc_qbuf,
1847 	.vidioc_dqbuf               = vidioc_dqbuf,
1848 	.vidioc_s_std               = vidioc_s_std,
1849 	.vidioc_enum_input          = vidioc_enum_input,
1850 	.vidioc_g_input             = vidioc_g_input,
1851 	.vidioc_s_input             = vidioc_s_input,
1852 	.vidioc_queryctrl           = vidioc_queryctrl,
1853 	.vidioc_g_ctrl              = vidioc_g_ctrl,
1854 	.vidioc_s_ctrl              = vidioc_s_ctrl,
1855 	.vidioc_streamon            = vidioc_streamon,
1856 	.vidioc_streamoff           = vidioc_streamoff,
1857 	.vidioc_g_tuner             = vidioc_g_tuner,
1858 	.vidioc_s_tuner             = vidioc_s_tuner,
1859 	.vidioc_g_frequency         = vidioc_g_frequency,
1860 	.vidioc_s_frequency         = vidioc_s_frequency,
1861 #ifdef CONFIG_VIDEO_ADV_DEBUG
1862 	.vidioc_g_register          = vidioc_g_register,
1863 	.vidioc_s_register          = vidioc_s_register,
1864 #endif
1865 	.vidioc_g_chip_ident        = vidioc_g_chip_ident,
1866 };
1867 
1868 static const struct video_device au0828_video_template = {
1869 	.fops                       = &au0828_v4l_fops,
1870 	.release                    = video_device_release,
1871 	.ioctl_ops 		    = &video_ioctl_ops,
1872 	.tvnorms                    = V4L2_STD_NTSC_M,
1873 	.current_norm               = V4L2_STD_NTSC_M,
1874 };
1875 
1876 /**************************************************************************/
1877 
au0828_analog_register(struct au0828_dev * dev,struct usb_interface * interface)1878 int au0828_analog_register(struct au0828_dev *dev,
1879 			   struct usb_interface *interface)
1880 {
1881 	int retval = -ENOMEM;
1882 	struct usb_host_interface *iface_desc;
1883 	struct usb_endpoint_descriptor *endpoint;
1884 	int i;
1885 
1886 	dprintk(1, "au0828_analog_register called!\n");
1887 
1888 	/* set au0828 usb interface0 to as5 */
1889 	retval = usb_set_interface(dev->usbdev,
1890 			interface->cur_altsetting->desc.bInterfaceNumber, 5);
1891 	if (retval != 0) {
1892 		printk(KERN_INFO "Failure setting usb interface0 to as5\n");
1893 		return retval;
1894 	}
1895 
1896 	/* Figure out which endpoint has the isoc interface */
1897 	iface_desc = interface->cur_altsetting;
1898 	for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
1899 		endpoint = &iface_desc->endpoint[i].desc;
1900 		if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1901 		     == USB_DIR_IN) &&
1902 		    ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1903 		     == USB_ENDPOINT_XFER_ISOC)) {
1904 
1905 			/* we find our isoc in endpoint */
1906 			u16 tmp = le16_to_cpu(endpoint->wMaxPacketSize);
1907 			dev->max_pkt_size = (tmp & 0x07ff) *
1908 				(((tmp & 0x1800) >> 11) + 1);
1909 			dev->isoc_in_endpointaddr = endpoint->bEndpointAddress;
1910 		}
1911 	}
1912 	if (!(dev->isoc_in_endpointaddr)) {
1913 		printk(KERN_INFO "Could not locate isoc endpoint\n");
1914 		kfree(dev);
1915 		return -ENODEV;
1916 	}
1917 
1918 	init_waitqueue_head(&dev->open);
1919 	spin_lock_init(&dev->slock);
1920 	mutex_init(&dev->lock);
1921 
1922 	/* init video dma queues */
1923 	INIT_LIST_HEAD(&dev->vidq.active);
1924 	INIT_LIST_HEAD(&dev->vidq.queued);
1925 	INIT_LIST_HEAD(&dev->vbiq.active);
1926 	INIT_LIST_HEAD(&dev->vbiq.queued);
1927 
1928 	dev->vid_timeout.function = au0828_vid_buffer_timeout;
1929 	dev->vid_timeout.data = (unsigned long) dev;
1930 	init_timer(&dev->vid_timeout);
1931 
1932 	dev->vbi_timeout.function = au0828_vbi_buffer_timeout;
1933 	dev->vbi_timeout.data = (unsigned long) dev;
1934 	init_timer(&dev->vbi_timeout);
1935 
1936 	dev->width = NTSC_STD_W;
1937 	dev->height = NTSC_STD_H;
1938 	dev->field_size = dev->width * dev->height;
1939 	dev->frame_size = dev->field_size << 1;
1940 	dev->bytesperline = dev->width << 1;
1941 	dev->ctrl_ainput = 0;
1942 
1943 	/* allocate and fill v4l2 video struct */
1944 	dev->vdev = video_device_alloc();
1945 	if (NULL == dev->vdev) {
1946 		dprintk(1, "Can't allocate video_device.\n");
1947 		return -ENOMEM;
1948 	}
1949 
1950 	/* allocate the VBI struct */
1951 	dev->vbi_dev = video_device_alloc();
1952 	if (NULL == dev->vbi_dev) {
1953 		dprintk(1, "Can't allocate vbi_device.\n");
1954 		kfree(dev->vdev);
1955 		return -ENOMEM;
1956 	}
1957 
1958 	/* Fill the video capture device struct */
1959 	*dev->vdev = au0828_video_template;
1960 	dev->vdev->parent = &dev->usbdev->dev;
1961 	strcpy(dev->vdev->name, "au0828a video");
1962 
1963 	/* Setup the VBI device */
1964 	*dev->vbi_dev = au0828_video_template;
1965 	dev->vbi_dev->parent = &dev->usbdev->dev;
1966 	strcpy(dev->vbi_dev->name, "au0828a vbi");
1967 
1968 	/* Register the v4l2 device */
1969 	video_set_drvdata(dev->vdev, dev);
1970 	retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1);
1971 	if (retval != 0) {
1972 		dprintk(1, "unable to register video device (error = %d).\n",
1973 			retval);
1974 		video_device_release(dev->vdev);
1975 		return -ENODEV;
1976 	}
1977 
1978 	/* Register the vbi device */
1979 	video_set_drvdata(dev->vbi_dev, dev);
1980 	retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1);
1981 	if (retval != 0) {
1982 		dprintk(1, "unable to register vbi device (error = %d).\n",
1983 			retval);
1984 		video_device_release(dev->vbi_dev);
1985 		video_device_release(dev->vdev);
1986 		return -ENODEV;
1987 	}
1988 
1989 	dprintk(1, "%s completed!\n", __func__);
1990 
1991 	return 0;
1992 }
1993 
1994