au0828-video.c revision e8c26f45b1f7e57ecf297903158823ecaa32c513
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
43static DEFINE_MUTEX(au0828_sysfs_lock);
44
45/* ------------------------------------------------------------------
46	Videobuf operations
47   ------------------------------------------------------------------*/
48
49static unsigned int isoc_debug;
50module_param(isoc_debug, int, 0644);
51MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
52
53#define au0828_isocdbg(fmt, arg...) \
54do {\
55	if (isoc_debug) { \
56		printk(KERN_INFO "au0828 %s :"fmt, \
57		       __func__ , ##arg);	   \
58	} \
59  } while (0)
60
61static 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
100static 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 */
118static 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 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	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 */
161static 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 */
200static 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 */
298static 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	v4l2_get_timestamp(&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
315static 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	v4l2_get_timestamp(&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 */
335static 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 */
416static 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
435static 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 */
487static 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 */
514static 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
651static int
652buffer_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 */
667static 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
693static int
694buffer_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
735fail:
736	free_buffer(vq, buf);
737	return rc;
738}
739
740static void
741buffer_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
754static 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
764static 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
775static 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 */
786static 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
806int 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
813static 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 */
824static 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 */
843void 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 */
858static 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	if (dev->resources & bit) {
868		/* no, someone else uses it */
869		return 0;
870	}
871	/* it's free, grab it */
872	fh->resources  |= bit;
873	dev->resources |= bit;
874	dprintk(1, "res: get %d\n", bit);
875
876	return 1;
877}
878
879static int res_check(struct au0828_fh *fh, unsigned int bit)
880{
881	return fh->resources & bit;
882}
883
884static int res_locked(struct au0828_dev *dev, unsigned int bit)
885{
886	return dev->resources & bit;
887}
888
889static void res_free(struct au0828_fh *fh, unsigned int bits)
890{
891	struct au0828_dev    *dev = fh->dev;
892
893	BUG_ON((fh->resources & bits) != bits);
894
895	fh->resources  &= ~bits;
896	dev->resources &= ~bits;
897	dprintk(1, "res: put %d\n", bits);
898}
899
900static int get_ressource(struct au0828_fh *fh)
901{
902	switch (fh->type) {
903	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
904		return AU0828_RESOURCE_VIDEO;
905	case V4L2_BUF_TYPE_VBI_CAPTURE:
906		return AU0828_RESOURCE_VBI;
907	default:
908		BUG();
909		return 0;
910	}
911}
912
913/* This function ensures that video frames continue to be delivered even if
914   the ITU-656 input isn't receiving any data (thereby preventing applications
915   such as tvtime from hanging) */
916static void au0828_vid_buffer_timeout(unsigned long data)
917{
918	struct au0828_dev *dev = (struct au0828_dev *) data;
919	struct au0828_dmaqueue *dma_q = &dev->vidq;
920	struct au0828_buffer *buf;
921	unsigned char *vid_data;
922	unsigned long flags = 0;
923
924	spin_lock_irqsave(&dev->slock, flags);
925
926	buf = dev->isoc_ctl.buf;
927	if (buf != NULL) {
928		vid_data = videobuf_to_vmalloc(&buf->vb);
929		memset(vid_data, 0x00, buf->vb.size); /* Blank green frame */
930		buffer_filled(dev, dma_q, buf);
931	}
932	get_next_buf(dma_q, &buf);
933
934	if (dev->vid_timeout_running == 1)
935		mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
936
937	spin_unlock_irqrestore(&dev->slock, flags);
938}
939
940static void au0828_vbi_buffer_timeout(unsigned long data)
941{
942	struct au0828_dev *dev = (struct au0828_dev *) data;
943	struct au0828_dmaqueue *dma_q = &dev->vbiq;
944	struct au0828_buffer *buf;
945	unsigned char *vbi_data;
946	unsigned long flags = 0;
947
948	spin_lock_irqsave(&dev->slock, flags);
949
950	buf = dev->isoc_ctl.vbi_buf;
951	if (buf != NULL) {
952		vbi_data = videobuf_to_vmalloc(&buf->vb);
953		memset(vbi_data, 0x00, buf->vb.size);
954		vbi_buffer_filled(dev, dma_q, buf);
955	}
956	vbi_get_next_buf(dma_q, &buf);
957
958	if (dev->vbi_timeout_running == 1)
959		mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
960	spin_unlock_irqrestore(&dev->slock, flags);
961}
962
963
964static int au0828_v4l2_open(struct file *filp)
965{
966	int ret = 0;
967	struct video_device *vdev = video_devdata(filp);
968	struct au0828_dev *dev = video_drvdata(filp);
969	struct au0828_fh *fh;
970	int type;
971
972	switch (vdev->vfl_type) {
973	case VFL_TYPE_GRABBER:
974		type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
975		break;
976	case VFL_TYPE_VBI:
977		type = V4L2_BUF_TYPE_VBI_CAPTURE;
978		break;
979	default:
980		return -EINVAL;
981	}
982
983	fh = kzalloc(sizeof(struct au0828_fh), GFP_KERNEL);
984	if (NULL == fh) {
985		dprintk(1, "Failed allocate au0828_fh struct!\n");
986		return -ENOMEM;
987	}
988
989	fh->type = type;
990	fh->dev = dev;
991	filp->private_data = fh;
992
993	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
994		/* set au0828 interface0 to AS5 here again */
995		ret = usb_set_interface(dev->usbdev, 0, 5);
996		if (ret < 0) {
997			printk(KERN_INFO "Au0828 can't set alternate to 5!\n");
998			return -EBUSY;
999		}
1000		dev->width = NTSC_STD_W;
1001		dev->height = NTSC_STD_H;
1002		dev->frame_size = dev->width * dev->height * 2;
1003		dev->field_size = dev->width * dev->height;
1004		dev->bytesperline = dev->width * 2;
1005
1006		au0828_analog_stream_enable(dev);
1007		au0828_analog_stream_reset(dev);
1008
1009		/* If we were doing ac97 instead of i2s, it would go here...*/
1010		au0828_i2s_init(dev);
1011
1012		dev->stream_state = STREAM_OFF;
1013		dev->dev_state |= DEV_INITIALIZED;
1014	}
1015
1016	dev->users++;
1017
1018	videobuf_queue_vmalloc_init(&fh->vb_vidq, &au0828_video_qops,
1019				    NULL, &dev->slock,
1020				    V4L2_BUF_TYPE_VIDEO_CAPTURE,
1021				    V4L2_FIELD_INTERLACED,
1022				    sizeof(struct au0828_buffer), fh,
1023				    &dev->lock);
1024
1025	/* VBI Setup */
1026	dev->vbi_width = 720;
1027	dev->vbi_height = 1;
1028	videobuf_queue_vmalloc_init(&fh->vb_vbiq, &au0828_vbi_qops,
1029				    NULL, &dev->slock,
1030				    V4L2_BUF_TYPE_VBI_CAPTURE,
1031				    V4L2_FIELD_SEQ_TB,
1032				    sizeof(struct au0828_buffer), fh,
1033				    &dev->lock);
1034	return ret;
1035}
1036
1037static int au0828_v4l2_close(struct file *filp)
1038{
1039	int ret;
1040	struct au0828_fh *fh = filp->private_data;
1041	struct au0828_dev *dev = fh->dev;
1042
1043	if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
1044		/* Cancel timeout thread in case they didn't call streamoff */
1045		dev->vid_timeout_running = 0;
1046		del_timer_sync(&dev->vid_timeout);
1047
1048		videobuf_stop(&fh->vb_vidq);
1049		res_free(fh, AU0828_RESOURCE_VIDEO);
1050	}
1051
1052	if (res_check(fh, AU0828_RESOURCE_VBI)) {
1053		/* Cancel timeout thread in case they didn't call streamoff */
1054		dev->vbi_timeout_running = 0;
1055		del_timer_sync(&dev->vbi_timeout);
1056
1057		videobuf_stop(&fh->vb_vbiq);
1058		res_free(fh, AU0828_RESOURCE_VBI);
1059	}
1060
1061	if (dev->users == 1) {
1062		if (dev->dev_state & DEV_DISCONNECTED) {
1063			au0828_analog_unregister(dev);
1064			kfree(dev);
1065			return 0;
1066		}
1067
1068		au0828_analog_stream_disable(dev);
1069
1070		au0828_uninit_isoc(dev);
1071
1072		/* Save some power by putting tuner to sleep */
1073		v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 0);
1074
1075		/* When close the device, set the usb intf0 into alt0 to free
1076		   USB bandwidth */
1077		ret = usb_set_interface(dev->usbdev, 0, 0);
1078		if (ret < 0)
1079			printk(KERN_INFO "Au0828 can't set alternate to 0!\n");
1080	}
1081
1082	videobuf_mmap_free(&fh->vb_vidq);
1083	videobuf_mmap_free(&fh->vb_vbiq);
1084	kfree(fh);
1085	dev->users--;
1086	wake_up_interruptible_nr(&dev->open, 1);
1087	return 0;
1088}
1089
1090static ssize_t au0828_v4l2_read(struct file *filp, char __user *buf,
1091				size_t count, loff_t *pos)
1092{
1093	struct au0828_fh *fh = filp->private_data;
1094	struct au0828_dev *dev = fh->dev;
1095	int rc;
1096
1097	rc = check_dev(dev);
1098	if (rc < 0)
1099		return rc;
1100
1101	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1102		if (res_locked(dev, AU0828_RESOURCE_VIDEO))
1103			return -EBUSY;
1104
1105		return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
1106					filp->f_flags & O_NONBLOCK);
1107	}
1108
1109	if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1110		if (!res_get(fh, AU0828_RESOURCE_VBI))
1111			return -EBUSY;
1112
1113		if (dev->vbi_timeout_running == 0) {
1114			/* Handle case where caller tries to read without
1115			   calling streamon first */
1116			dev->vbi_timeout_running = 1;
1117			mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
1118		}
1119
1120		return videobuf_read_stream(&fh->vb_vbiq, buf, count, pos, 0,
1121					    filp->f_flags & O_NONBLOCK);
1122	}
1123
1124	return 0;
1125}
1126
1127static unsigned int au0828_v4l2_poll(struct file *filp, poll_table *wait)
1128{
1129	struct au0828_fh *fh = filp->private_data;
1130	struct au0828_dev *dev = fh->dev;
1131	int rc;
1132
1133	rc = check_dev(dev);
1134	if (rc < 0)
1135		return rc;
1136
1137	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1138		if (!res_get(fh, AU0828_RESOURCE_VIDEO))
1139			return POLLERR;
1140		return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
1141	} else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1142		if (!res_get(fh, AU0828_RESOURCE_VBI))
1143			return POLLERR;
1144		return videobuf_poll_stream(filp, &fh->vb_vbiq, wait);
1145	} else {
1146		return POLLERR;
1147	}
1148}
1149
1150static int au0828_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
1151{
1152	struct au0828_fh *fh    = filp->private_data;
1153	struct au0828_dev *dev   = fh->dev;
1154	int		 rc;
1155
1156	rc = check_dev(dev);
1157	if (rc < 0)
1158		return rc;
1159
1160	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1161		rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1162	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1163		rc = videobuf_mmap_mapper(&fh->vb_vbiq, vma);
1164
1165	return rc;
1166}
1167
1168static int au0828_set_format(struct au0828_dev *dev, unsigned int cmd,
1169			     struct v4l2_format *format)
1170{
1171	int ret;
1172	int width = format->fmt.pix.width;
1173	int height = format->fmt.pix.height;
1174
1175	if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1176		return -EINVAL;
1177
1178	/* If they are demanding a format other than the one we support,
1179	   bail out (tvtime asks for UYVY and then retries with YUYV) */
1180	if (format->fmt.pix.pixelformat != V4L2_PIX_FMT_UYVY)
1181		return -EINVAL;
1182
1183	/* format->fmt.pix.width only support 720 and height 480 */
1184	if (width != 720)
1185		width = 720;
1186	if (height != 480)
1187		height = 480;
1188
1189	format->fmt.pix.width = width;
1190	format->fmt.pix.height = height;
1191	format->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1192	format->fmt.pix.bytesperline = width * 2;
1193	format->fmt.pix.sizeimage = width * height * 2;
1194	format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1195	format->fmt.pix.field = V4L2_FIELD_INTERLACED;
1196
1197	if (cmd == VIDIOC_TRY_FMT)
1198		return 0;
1199
1200	/* maybe set new image format, driver current only support 720*480 */
1201	dev->width = width;
1202	dev->height = height;
1203	dev->frame_size = width * height * 2;
1204	dev->field_size = width * height;
1205	dev->bytesperline = width * 2;
1206
1207	if (dev->stream_state == STREAM_ON) {
1208		dprintk(1, "VIDIOC_SET_FMT: interrupting stream!\n");
1209		ret = au0828_stream_interrupt(dev);
1210		if (ret != 0) {
1211			dprintk(1, "error interrupting video stream!\n");
1212			return ret;
1213		}
1214	}
1215
1216	/* set au0828 interface0 to AS5 here again */
1217	ret = usb_set_interface(dev->usbdev, 0, 5);
1218	if (ret < 0) {
1219		printk(KERN_INFO "Au0828 can't set alt setting to 5!\n");
1220		return -EBUSY;
1221	}
1222
1223	au0828_analog_stream_enable(dev);
1224
1225	return 0;
1226}
1227
1228
1229static int vidioc_querycap(struct file *file, void  *priv,
1230			   struct v4l2_capability *cap)
1231{
1232	struct video_device *vdev = video_devdata(file);
1233	struct au0828_fh *fh = priv;
1234	struct au0828_dev *dev = fh->dev;
1235
1236	strlcpy(cap->driver, "au0828", sizeof(cap->driver));
1237	strlcpy(cap->card, dev->board.name, sizeof(cap->card));
1238	usb_make_path(dev->usbdev, cap->bus_info, sizeof(cap->bus_info));
1239
1240	/* set the device capabilities */
1241	cap->device_caps = V4L2_CAP_AUDIO |
1242		V4L2_CAP_READWRITE |
1243		V4L2_CAP_STREAMING |
1244		V4L2_CAP_TUNER;
1245	if (vdev->vfl_type == VFL_TYPE_GRABBER)
1246		cap->device_caps |= V4L2_CAP_VIDEO_CAPTURE;
1247	else
1248		cap->device_caps |= V4L2_CAP_VBI_CAPTURE;
1249	cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS |
1250		V4L2_CAP_VBI_CAPTURE | V4L2_CAP_VIDEO_CAPTURE;
1251	return 0;
1252}
1253
1254static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
1255					struct v4l2_fmtdesc *f)
1256{
1257	if (f->index)
1258		return -EINVAL;
1259
1260	f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1261	strcpy(f->description, "Packed YUV2");
1262
1263	f->flags = 0;
1264	f->pixelformat = V4L2_PIX_FMT_UYVY;
1265
1266	return 0;
1267}
1268
1269static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1270					struct v4l2_format *f)
1271{
1272	struct au0828_fh *fh  = priv;
1273	struct au0828_dev *dev = fh->dev;
1274
1275	f->fmt.pix.width = dev->width;
1276	f->fmt.pix.height = dev->height;
1277	f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1278	f->fmt.pix.bytesperline = dev->bytesperline;
1279	f->fmt.pix.sizeimage = dev->frame_size;
1280	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* NTSC/PAL */
1281	f->fmt.pix.field = V4L2_FIELD_INTERLACED;
1282	return 0;
1283}
1284
1285static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1286				  struct v4l2_format *f)
1287{
1288	struct au0828_fh *fh  = priv;
1289	struct au0828_dev *dev = fh->dev;
1290
1291	return au0828_set_format(dev, VIDIOC_TRY_FMT, f);
1292}
1293
1294static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1295				struct v4l2_format *f)
1296{
1297	struct au0828_fh *fh  = priv;
1298	struct au0828_dev *dev = fh->dev;
1299	int rc;
1300
1301	rc = check_dev(dev);
1302	if (rc < 0)
1303		return rc;
1304
1305	if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1306		printk(KERN_INFO "%s queue busy\n", __func__);
1307		rc = -EBUSY;
1308		goto out;
1309	}
1310
1311	rc = au0828_set_format(dev, VIDIOC_S_FMT, f);
1312out:
1313	return rc;
1314}
1315
1316static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm)
1317{
1318	struct au0828_fh *fh = priv;
1319	struct au0828_dev *dev = fh->dev;
1320
1321	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1322		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 1);
1323
1324	/* FIXME: when we support something other than NTSC, we are going to
1325	   have to make the au0828 bridge adjust the size of its capture
1326	   buffer, which is currently hardcoded at 720x480 */
1327
1328	v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, norm);
1329	dev->std_set_in_tuner_core = 1;
1330
1331	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1332		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 0);
1333
1334	return 0;
1335}
1336
1337static int vidioc_enum_input(struct file *file, void *priv,
1338				struct v4l2_input *input)
1339{
1340	struct au0828_fh *fh = priv;
1341	struct au0828_dev *dev = fh->dev;
1342	unsigned int tmp;
1343
1344	static const char *inames[] = {
1345		[AU0828_VMUX_UNDEFINED] = "Undefined",
1346		[AU0828_VMUX_COMPOSITE] = "Composite",
1347		[AU0828_VMUX_SVIDEO] = "S-Video",
1348		[AU0828_VMUX_CABLE] = "Cable TV",
1349		[AU0828_VMUX_TELEVISION] = "Television",
1350		[AU0828_VMUX_DVB] = "DVB",
1351		[AU0828_VMUX_DEBUG] = "tv debug"
1352	};
1353
1354	tmp = input->index;
1355
1356	if (tmp >= AU0828_MAX_INPUT)
1357		return -EINVAL;
1358	if (AUVI_INPUT(tmp).type == 0)
1359		return -EINVAL;
1360
1361	input->index = tmp;
1362	strcpy(input->name, inames[AUVI_INPUT(tmp).type]);
1363	if ((AUVI_INPUT(tmp).type == AU0828_VMUX_TELEVISION) ||
1364	    (AUVI_INPUT(tmp).type == AU0828_VMUX_CABLE)) {
1365		input->type |= V4L2_INPUT_TYPE_TUNER;
1366		input->audioset = 1;
1367	} else {
1368		input->type |= V4L2_INPUT_TYPE_CAMERA;
1369		input->audioset = 2;
1370	}
1371
1372	input->std = dev->vdev->tvnorms;
1373
1374	return 0;
1375}
1376
1377static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1378{
1379	struct au0828_fh *fh = priv;
1380	struct au0828_dev *dev = fh->dev;
1381	*i = dev->ctrl_input;
1382	return 0;
1383}
1384
1385static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
1386{
1387	struct au0828_fh *fh = priv;
1388	struct au0828_dev *dev = fh->dev;
1389	int i;
1390
1391	dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
1392		index);
1393	if (index >= AU0828_MAX_INPUT)
1394		return -EINVAL;
1395	if (AUVI_INPUT(index).type == 0)
1396		return -EINVAL;
1397	dev->ctrl_input = index;
1398
1399	switch (AUVI_INPUT(index).type) {
1400	case AU0828_VMUX_SVIDEO:
1401		dev->input_type = AU0828_VMUX_SVIDEO;
1402		dev->ctrl_ainput = 1;
1403		break;
1404	case AU0828_VMUX_COMPOSITE:
1405		dev->input_type = AU0828_VMUX_COMPOSITE;
1406		dev->ctrl_ainput = 1;
1407		break;
1408	case AU0828_VMUX_TELEVISION:
1409		dev->input_type = AU0828_VMUX_TELEVISION;
1410		dev->ctrl_ainput = 0;
1411		break;
1412	default:
1413		dprintk(1, "VIDIOC_S_INPUT unknown input type set [%d]\n",
1414			AUVI_INPUT(index).type);
1415		break;
1416	}
1417
1418	v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
1419			AUVI_INPUT(index).vmux, 0, 0);
1420
1421	for (i = 0; i < AU0828_MAX_INPUT; i++) {
1422		int enable = 0;
1423		if (AUVI_INPUT(i).audio_setup == NULL)
1424			continue;
1425
1426		if (i == index)
1427			enable = 1;
1428		else
1429			enable = 0;
1430		if (enable) {
1431			(AUVI_INPUT(i).audio_setup)(dev, enable);
1432		} else {
1433			/* Make sure we leave it turned on if some
1434			   other input is routed to this callback */
1435			if ((AUVI_INPUT(i).audio_setup) !=
1436			    ((AUVI_INPUT(index).audio_setup))) {
1437				(AUVI_INPUT(i).audio_setup)(dev, enable);
1438			}
1439		}
1440	}
1441
1442	v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
1443			AUVI_INPUT(index).amux, 0, 0);
1444	return 0;
1445}
1446
1447static int vidioc_enumaudio(struct file *file, void *priv, struct v4l2_audio *a)
1448{
1449	if (a->index > 1)
1450		return -EINVAL;
1451
1452	if (a->index == 0)
1453		strcpy(a->name, "Television");
1454	else
1455		strcpy(a->name, "Line in");
1456
1457	a->capability = V4L2_AUDCAP_STEREO;
1458	return 0;
1459}
1460
1461static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1462{
1463	struct au0828_fh *fh = priv;
1464	struct au0828_dev *dev = fh->dev;
1465
1466	a->index = dev->ctrl_ainput;
1467	if (a->index == 0)
1468		strcpy(a->name, "Television");
1469	else
1470		strcpy(a->name, "Line in");
1471
1472	a->capability = V4L2_AUDCAP_STEREO;
1473	return 0;
1474}
1475
1476static int vidioc_s_audio(struct file *file, void *priv, const struct v4l2_audio *a)
1477{
1478	struct au0828_fh *fh = priv;
1479	struct au0828_dev *dev = fh->dev;
1480
1481	if (a->index != dev->ctrl_ainput)
1482		return -EINVAL;
1483	return 0;
1484}
1485
1486static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1487{
1488	struct au0828_fh *fh = priv;
1489	struct au0828_dev *dev = fh->dev;
1490
1491	if (t->index != 0)
1492		return -EINVAL;
1493
1494	strcpy(t->name, "Auvitek tuner");
1495	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1496	return 0;
1497}
1498
1499static int vidioc_s_tuner(struct file *file, void *priv,
1500				const struct v4l2_tuner *t)
1501{
1502	struct au0828_fh *fh = priv;
1503	struct au0828_dev *dev = fh->dev;
1504
1505	if (t->index != 0)
1506		return -EINVAL;
1507
1508	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1509		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 1);
1510
1511	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1512
1513	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1514		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 0);
1515
1516	dprintk(1, "VIDIOC_S_TUNER: signal = %x, afc = %x\n", t->signal,
1517		t->afc);
1518
1519	return 0;
1520
1521}
1522
1523static int vidioc_g_frequency(struct file *file, void *priv,
1524				struct v4l2_frequency *freq)
1525{
1526	struct au0828_fh *fh = priv;
1527	struct au0828_dev *dev = fh->dev;
1528
1529	if (freq->tuner != 0)
1530		return -EINVAL;
1531	freq->frequency = dev->ctrl_freq;
1532	return 0;
1533}
1534
1535static int vidioc_s_frequency(struct file *file, void *priv,
1536				const struct v4l2_frequency *freq)
1537{
1538	struct au0828_fh *fh = priv;
1539	struct au0828_dev *dev = fh->dev;
1540	struct v4l2_frequency new_freq = *freq;
1541
1542	if (freq->tuner != 0)
1543		return -EINVAL;
1544
1545	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1546		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 1);
1547
1548	if (dev->std_set_in_tuner_core == 0) {
1549		/* If we've never sent the standard in tuner core, do so now.
1550		   We don't do this at device probe because we don't want to
1551		   incur the cost of a firmware load */
1552		v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std,
1553				     dev->vdev->tvnorms);
1554		dev->std_set_in_tuner_core = 1;
1555	}
1556
1557	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, freq);
1558	/* Get the actual set (and possibly clamped) frequency */
1559	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_frequency, &new_freq);
1560	dev->ctrl_freq = new_freq.frequency;
1561
1562	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1563		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 0);
1564
1565	au0828_analog_stream_reset(dev);
1566
1567	return 0;
1568}
1569
1570
1571/* RAW VBI ioctls */
1572
1573static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1574				struct v4l2_format *format)
1575{
1576	struct au0828_fh      *fh  = priv;
1577	struct au0828_dev     *dev = fh->dev;
1578
1579	format->fmt.vbi.samples_per_line = dev->vbi_width;
1580	format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1581	format->fmt.vbi.offset = 0;
1582	format->fmt.vbi.flags = 0;
1583	format->fmt.vbi.sampling_rate = 6750000 * 4 / 2;
1584
1585	format->fmt.vbi.count[0] = dev->vbi_height;
1586	format->fmt.vbi.count[1] = dev->vbi_height;
1587	format->fmt.vbi.start[0] = 21;
1588	format->fmt.vbi.start[1] = 284;
1589
1590	return 0;
1591}
1592
1593static int vidioc_g_chip_ident(struct file *file, void *priv,
1594	       struct v4l2_dbg_chip_ident *chip)
1595{
1596	struct au0828_fh *fh = priv;
1597	struct au0828_dev *dev = fh->dev;
1598	chip->ident = V4L2_IDENT_NONE;
1599	chip->revision = 0;
1600
1601	if (v4l2_chip_match_host(&chip->match)) {
1602		chip->ident = V4L2_IDENT_AU0828;
1603		return 0;
1604	}
1605
1606	v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_chip_ident, chip);
1607	if (chip->ident == V4L2_IDENT_NONE)
1608		return -EINVAL;
1609
1610	return 0;
1611}
1612
1613static int vidioc_cropcap(struct file *file, void *priv,
1614			  struct v4l2_cropcap *cc)
1615{
1616	struct au0828_fh *fh = priv;
1617	struct au0828_dev *dev = fh->dev;
1618
1619	if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1620		return -EINVAL;
1621
1622	cc->bounds.left = 0;
1623	cc->bounds.top = 0;
1624	cc->bounds.width = dev->width;
1625	cc->bounds.height = dev->height;
1626
1627	cc->defrect = cc->bounds;
1628
1629	cc->pixelaspect.numerator = 54;
1630	cc->pixelaspect.denominator = 59;
1631
1632	return 0;
1633}
1634
1635static int vidioc_streamon(struct file *file, void *priv,
1636			   enum v4l2_buf_type type)
1637{
1638	struct au0828_fh      *fh  = priv;
1639	struct au0828_dev     *dev = fh->dev;
1640	int                   rc = -EINVAL;
1641
1642	rc = check_dev(dev);
1643	if (rc < 0)
1644		return rc;
1645
1646	if (unlikely(type != fh->type))
1647		return -EINVAL;
1648
1649	dprintk(1, "vidioc_streamon fh=%p t=%d fh->res=%d dev->res=%d\n",
1650		fh, type, fh->resources, dev->resources);
1651
1652	if (unlikely(!res_get(fh, get_ressource(fh))))
1653		return -EBUSY;
1654
1655	if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1656		au0828_analog_stream_enable(dev);
1657		v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
1658	}
1659
1660	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1661		rc = videobuf_streamon(&fh->vb_vidq);
1662		dev->vid_timeout_running = 1;
1663		mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
1664	} else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1665		rc = videobuf_streamon(&fh->vb_vbiq);
1666		dev->vbi_timeout_running = 1;
1667		mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
1668	}
1669
1670	return rc;
1671}
1672
1673static int vidioc_streamoff(struct file *file, void *priv,
1674			    enum v4l2_buf_type type)
1675{
1676	struct au0828_fh      *fh  = priv;
1677	struct au0828_dev     *dev = fh->dev;
1678	int                   rc;
1679	int                   i;
1680
1681	rc = check_dev(dev);
1682	if (rc < 0)
1683		return rc;
1684
1685	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1686	    fh->type != V4L2_BUF_TYPE_VBI_CAPTURE)
1687		return -EINVAL;
1688	if (type != fh->type)
1689		return -EINVAL;
1690
1691	dprintk(1, "vidioc_streamoff fh=%p t=%d fh->res=%d dev->res=%d\n",
1692		fh, type, fh->resources, dev->resources);
1693
1694	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1695		dev->vid_timeout_running = 0;
1696		del_timer_sync(&dev->vid_timeout);
1697
1698		v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
1699		rc = au0828_stream_interrupt(dev);
1700		if (rc != 0)
1701			return rc;
1702
1703		for (i = 0; i < AU0828_MAX_INPUT; i++) {
1704			if (AUVI_INPUT(i).audio_setup == NULL)
1705				continue;
1706			(AUVI_INPUT(i).audio_setup)(dev, 0);
1707		}
1708
1709		if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
1710			videobuf_streamoff(&fh->vb_vidq);
1711			res_free(fh, AU0828_RESOURCE_VIDEO);
1712		}
1713	} else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1714		dev->vbi_timeout_running = 0;
1715		del_timer_sync(&dev->vbi_timeout);
1716
1717		if (res_check(fh, AU0828_RESOURCE_VBI)) {
1718			videobuf_streamoff(&fh->vb_vbiq);
1719			res_free(fh, AU0828_RESOURCE_VBI);
1720		}
1721	}
1722
1723	return 0;
1724}
1725
1726#ifdef CONFIG_VIDEO_ADV_DEBUG
1727static int vidioc_g_register(struct file *file, void *priv,
1728			     struct v4l2_dbg_register *reg)
1729{
1730	struct au0828_fh *fh = priv;
1731	struct au0828_dev *dev = fh->dev;
1732
1733	switch (reg->match.type) {
1734	case V4L2_CHIP_MATCH_I2C_DRIVER:
1735		v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
1736		return 0;
1737	default:
1738		if (!v4l2_chip_match_host(&reg->match))
1739			return -EINVAL;
1740	}
1741
1742	reg->val = au0828_read(dev, reg->reg);
1743	return 0;
1744}
1745
1746static int vidioc_s_register(struct file *file, void *priv,
1747			     const struct v4l2_dbg_register *reg)
1748{
1749	struct au0828_fh *fh = priv;
1750	struct au0828_dev *dev = fh->dev;
1751
1752	switch (reg->match.type) {
1753	case V4L2_CHIP_MATCH_I2C_DRIVER:
1754		v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
1755		return 0;
1756	default:
1757		if (!v4l2_chip_match_host(&reg->match))
1758			return -EINVAL;
1759	}
1760	return au0828_writereg(dev, reg->reg, reg->val);
1761}
1762#endif
1763
1764static int vidioc_reqbufs(struct file *file, void *priv,
1765			  struct v4l2_requestbuffers *rb)
1766{
1767	struct au0828_fh *fh = priv;
1768	struct au0828_dev *dev = fh->dev;
1769	int rc;
1770
1771	rc = check_dev(dev);
1772	if (rc < 0)
1773		return rc;
1774
1775	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1776		rc = videobuf_reqbufs(&fh->vb_vidq, rb);
1777	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1778		rc = videobuf_reqbufs(&fh->vb_vbiq, rb);
1779
1780	return rc;
1781}
1782
1783static int vidioc_querybuf(struct file *file, void *priv,
1784			   struct v4l2_buffer *b)
1785{
1786	struct au0828_fh *fh = priv;
1787	struct au0828_dev *dev = fh->dev;
1788	int rc;
1789
1790	rc = check_dev(dev);
1791	if (rc < 0)
1792		return rc;
1793
1794	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1795		rc = videobuf_querybuf(&fh->vb_vidq, b);
1796	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1797		rc = videobuf_querybuf(&fh->vb_vbiq, b);
1798
1799	return rc;
1800}
1801
1802static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1803{
1804	struct au0828_fh *fh = priv;
1805	struct au0828_dev *dev = fh->dev;
1806	int rc;
1807
1808	rc = check_dev(dev);
1809	if (rc < 0)
1810		return rc;
1811
1812	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1813		rc = videobuf_qbuf(&fh->vb_vidq, b);
1814	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1815		rc = videobuf_qbuf(&fh->vb_vbiq, b);
1816
1817	return rc;
1818}
1819
1820static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1821{
1822	struct au0828_fh *fh = priv;
1823	struct au0828_dev *dev = fh->dev;
1824	int rc;
1825
1826	rc = check_dev(dev);
1827	if (rc < 0)
1828		return rc;
1829
1830	/* Workaround for a bug in the au0828 hardware design that sometimes
1831	   results in the colorspace being inverted */
1832	if (dev->greenscreen_detected == 1) {
1833		dprintk(1, "Detected green frame.  Resetting stream...\n");
1834		au0828_analog_stream_reset(dev);
1835		dev->greenscreen_detected = 0;
1836	}
1837
1838	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1839		rc = videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1840	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1841		rc = videobuf_dqbuf(&fh->vb_vbiq, b, file->f_flags & O_NONBLOCK);
1842
1843	return rc;
1844}
1845
1846static struct v4l2_file_operations au0828_v4l_fops = {
1847	.owner      = THIS_MODULE,
1848	.open       = au0828_v4l2_open,
1849	.release    = au0828_v4l2_close,
1850	.read       = au0828_v4l2_read,
1851	.poll       = au0828_v4l2_poll,
1852	.mmap       = au0828_v4l2_mmap,
1853	.unlocked_ioctl = video_ioctl2,
1854};
1855
1856static const struct v4l2_ioctl_ops video_ioctl_ops = {
1857	.vidioc_querycap            = vidioc_querycap,
1858	.vidioc_enum_fmt_vid_cap    = vidioc_enum_fmt_vid_cap,
1859	.vidioc_g_fmt_vid_cap       = vidioc_g_fmt_vid_cap,
1860	.vidioc_try_fmt_vid_cap     = vidioc_try_fmt_vid_cap,
1861	.vidioc_s_fmt_vid_cap       = vidioc_s_fmt_vid_cap,
1862	.vidioc_g_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
1863	.vidioc_s_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
1864	.vidioc_enumaudio           = vidioc_enumaudio,
1865	.vidioc_g_audio             = vidioc_g_audio,
1866	.vidioc_s_audio             = vidioc_s_audio,
1867	.vidioc_cropcap             = vidioc_cropcap,
1868	.vidioc_reqbufs             = vidioc_reqbufs,
1869	.vidioc_querybuf            = vidioc_querybuf,
1870	.vidioc_qbuf                = vidioc_qbuf,
1871	.vidioc_dqbuf               = vidioc_dqbuf,
1872	.vidioc_s_std               = vidioc_s_std,
1873	.vidioc_enum_input          = vidioc_enum_input,
1874	.vidioc_g_input             = vidioc_g_input,
1875	.vidioc_s_input             = vidioc_s_input,
1876	.vidioc_streamon            = vidioc_streamon,
1877	.vidioc_streamoff           = vidioc_streamoff,
1878	.vidioc_g_tuner             = vidioc_g_tuner,
1879	.vidioc_s_tuner             = vidioc_s_tuner,
1880	.vidioc_g_frequency         = vidioc_g_frequency,
1881	.vidioc_s_frequency         = vidioc_s_frequency,
1882#ifdef CONFIG_VIDEO_ADV_DEBUG
1883	.vidioc_g_register          = vidioc_g_register,
1884	.vidioc_s_register          = vidioc_s_register,
1885#endif
1886	.vidioc_g_chip_ident        = vidioc_g_chip_ident,
1887};
1888
1889static const struct video_device au0828_video_template = {
1890	.fops                       = &au0828_v4l_fops,
1891	.release                    = video_device_release,
1892	.ioctl_ops 		    = &video_ioctl_ops,
1893	.tvnorms                    = V4L2_STD_NTSC_M,
1894	.current_norm               = V4L2_STD_NTSC_M,
1895};
1896
1897/**************************************************************************/
1898
1899int au0828_analog_register(struct au0828_dev *dev,
1900			   struct usb_interface *interface)
1901{
1902	int retval = -ENOMEM;
1903	struct usb_host_interface *iface_desc;
1904	struct usb_endpoint_descriptor *endpoint;
1905	int i, ret;
1906
1907	dprintk(1, "au0828_analog_register called!\n");
1908
1909	/* set au0828 usb interface0 to as5 */
1910	retval = usb_set_interface(dev->usbdev,
1911			interface->cur_altsetting->desc.bInterfaceNumber, 5);
1912	if (retval != 0) {
1913		printk(KERN_INFO "Failure setting usb interface0 to as5\n");
1914		return retval;
1915	}
1916
1917	/* Figure out which endpoint has the isoc interface */
1918	iface_desc = interface->cur_altsetting;
1919	for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
1920		endpoint = &iface_desc->endpoint[i].desc;
1921		if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1922		     == USB_DIR_IN) &&
1923		    ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1924		     == USB_ENDPOINT_XFER_ISOC)) {
1925
1926			/* we find our isoc in endpoint */
1927			u16 tmp = le16_to_cpu(endpoint->wMaxPacketSize);
1928			dev->max_pkt_size = (tmp & 0x07ff) *
1929				(((tmp & 0x1800) >> 11) + 1);
1930			dev->isoc_in_endpointaddr = endpoint->bEndpointAddress;
1931		}
1932	}
1933	if (!(dev->isoc_in_endpointaddr)) {
1934		printk(KERN_INFO "Could not locate isoc endpoint\n");
1935		kfree(dev);
1936		return -ENODEV;
1937	}
1938
1939	init_waitqueue_head(&dev->open);
1940	spin_lock_init(&dev->slock);
1941
1942	/* init video dma queues */
1943	INIT_LIST_HEAD(&dev->vidq.active);
1944	INIT_LIST_HEAD(&dev->vidq.queued);
1945	INIT_LIST_HEAD(&dev->vbiq.active);
1946	INIT_LIST_HEAD(&dev->vbiq.queued);
1947
1948	dev->vid_timeout.function = au0828_vid_buffer_timeout;
1949	dev->vid_timeout.data = (unsigned long) dev;
1950	init_timer(&dev->vid_timeout);
1951
1952	dev->vbi_timeout.function = au0828_vbi_buffer_timeout;
1953	dev->vbi_timeout.data = (unsigned long) dev;
1954	init_timer(&dev->vbi_timeout);
1955
1956	dev->width = NTSC_STD_W;
1957	dev->height = NTSC_STD_H;
1958	dev->field_size = dev->width * dev->height;
1959	dev->frame_size = dev->field_size << 1;
1960	dev->bytesperline = dev->width << 1;
1961	dev->ctrl_ainput = 0;
1962	dev->ctrl_freq = 960;
1963
1964	/* allocate and fill v4l2 video struct */
1965	dev->vdev = video_device_alloc();
1966	if (NULL == dev->vdev) {
1967		dprintk(1, "Can't allocate video_device.\n");
1968		return -ENOMEM;
1969	}
1970
1971	/* allocate the VBI struct */
1972	dev->vbi_dev = video_device_alloc();
1973	if (NULL == dev->vbi_dev) {
1974		dprintk(1, "Can't allocate vbi_device.\n");
1975		ret = -ENOMEM;
1976		goto err_vdev;
1977	}
1978
1979	/* Fill the video capture device struct */
1980	*dev->vdev = au0828_video_template;
1981	dev->vdev->v4l2_dev = &dev->v4l2_dev;
1982	dev->vdev->lock = &dev->lock;
1983	strcpy(dev->vdev->name, "au0828a video");
1984
1985	/* Setup the VBI device */
1986	*dev->vbi_dev = au0828_video_template;
1987	dev->vbi_dev->v4l2_dev = &dev->v4l2_dev;
1988	dev->vbi_dev->lock = &dev->lock;
1989	strcpy(dev->vbi_dev->name, "au0828a vbi");
1990
1991	/* Register the v4l2 device */
1992	video_set_drvdata(dev->vdev, dev);
1993	retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1);
1994	if (retval != 0) {
1995		dprintk(1, "unable to register video device (error = %d).\n",
1996			retval);
1997		ret = -ENODEV;
1998		goto err_vbi_dev;
1999	}
2000
2001	/* Register the vbi device */
2002	video_set_drvdata(dev->vbi_dev, dev);
2003	retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1);
2004	if (retval != 0) {
2005		dprintk(1, "unable to register vbi device (error = %d).\n",
2006			retval);
2007		ret = -ENODEV;
2008		goto err_vbi_dev;
2009	}
2010
2011	dprintk(1, "%s completed!\n", __func__);
2012
2013	return 0;
2014
2015err_vbi_dev:
2016	video_device_release(dev->vbi_dev);
2017err_vdev:
2018	video_device_release(dev->vdev);
2019	return ret;
2020}
2021
2022