au0828-video.c revision b530a447bb588fdf43fdf4eb909e4ee1921d47ac
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_queryctrl(struct file *file, void *priv,
1230			    struct v4l2_queryctrl *qc)
1231{
1232	struct au0828_fh *fh = priv;
1233	struct au0828_dev *dev = fh->dev;
1234	v4l2_device_call_all(&dev->v4l2_dev, 0, core, queryctrl, qc);
1235	if (qc->type)
1236		return 0;
1237	else
1238		return -EINVAL;
1239}
1240
1241static int vidioc_querycap(struct file *file, void  *priv,
1242			   struct v4l2_capability *cap)
1243{
1244	struct au0828_fh *fh  = priv;
1245	struct au0828_dev *dev = fh->dev;
1246
1247	strlcpy(cap->driver, "au0828", sizeof(cap->driver));
1248	strlcpy(cap->card, dev->board.name, sizeof(cap->card));
1249	strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
1250
1251	/*set the device capabilities */
1252	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1253		V4L2_CAP_VBI_CAPTURE |
1254		V4L2_CAP_AUDIO |
1255		V4L2_CAP_READWRITE |
1256		V4L2_CAP_STREAMING |
1257		V4L2_CAP_TUNER;
1258	return 0;
1259}
1260
1261static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
1262					struct v4l2_fmtdesc *f)
1263{
1264	if (f->index)
1265		return -EINVAL;
1266
1267	f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1268	strcpy(f->description, "Packed YUV2");
1269
1270	f->flags = 0;
1271	f->pixelformat = V4L2_PIX_FMT_UYVY;
1272
1273	return 0;
1274}
1275
1276static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1277					struct v4l2_format *f)
1278{
1279	struct au0828_fh *fh  = priv;
1280	struct au0828_dev *dev = fh->dev;
1281
1282	f->fmt.pix.width = dev->width;
1283	f->fmt.pix.height = dev->height;
1284	f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1285	f->fmt.pix.bytesperline = dev->bytesperline;
1286	f->fmt.pix.sizeimage = dev->frame_size;
1287	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* NTSC/PAL */
1288	f->fmt.pix.field = V4L2_FIELD_INTERLACED;
1289	return 0;
1290}
1291
1292static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1293				  struct v4l2_format *f)
1294{
1295	struct au0828_fh *fh  = priv;
1296	struct au0828_dev *dev = fh->dev;
1297
1298	return au0828_set_format(dev, VIDIOC_TRY_FMT, f);
1299}
1300
1301static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1302				struct v4l2_format *f)
1303{
1304	struct au0828_fh *fh  = priv;
1305	struct au0828_dev *dev = fh->dev;
1306	int rc;
1307
1308	rc = check_dev(dev);
1309	if (rc < 0)
1310		return rc;
1311
1312	if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1313		printk(KERN_INFO "%s queue busy\n", __func__);
1314		rc = -EBUSY;
1315		goto out;
1316	}
1317
1318	rc = au0828_set_format(dev, VIDIOC_S_FMT, f);
1319out:
1320	return rc;
1321}
1322
1323static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm)
1324{
1325	struct au0828_fh *fh = priv;
1326	struct au0828_dev *dev = fh->dev;
1327
1328	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1329		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 1);
1330
1331	/* FIXME: when we support something other than NTSC, we are going to
1332	   have to make the au0828 bridge adjust the size of its capture
1333	   buffer, which is currently hardcoded at 720x480 */
1334
1335	v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, *norm);
1336	dev->std_set_in_tuner_core = 1;
1337
1338	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1339		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 0);
1340
1341	return 0;
1342}
1343
1344static int vidioc_enum_input(struct file *file, void *priv,
1345				struct v4l2_input *input)
1346{
1347	struct au0828_fh *fh = priv;
1348	struct au0828_dev *dev = fh->dev;
1349	unsigned int tmp;
1350
1351	static const char *inames[] = {
1352		[AU0828_VMUX_UNDEFINED] = "Undefined",
1353		[AU0828_VMUX_COMPOSITE] = "Composite",
1354		[AU0828_VMUX_SVIDEO] = "S-Video",
1355		[AU0828_VMUX_CABLE] = "Cable TV",
1356		[AU0828_VMUX_TELEVISION] = "Television",
1357		[AU0828_VMUX_DVB] = "DVB",
1358		[AU0828_VMUX_DEBUG] = "tv debug"
1359	};
1360
1361	tmp = input->index;
1362
1363	if (tmp >= AU0828_MAX_INPUT)
1364		return -EINVAL;
1365	if (AUVI_INPUT(tmp).type == 0)
1366		return -EINVAL;
1367
1368	input->index = tmp;
1369	strcpy(input->name, inames[AUVI_INPUT(tmp).type]);
1370	if ((AUVI_INPUT(tmp).type == AU0828_VMUX_TELEVISION) ||
1371	    (AUVI_INPUT(tmp).type == AU0828_VMUX_CABLE))
1372		input->type |= V4L2_INPUT_TYPE_TUNER;
1373	else
1374		input->type |= V4L2_INPUT_TYPE_CAMERA;
1375
1376	input->std = dev->vdev->tvnorms;
1377
1378	return 0;
1379}
1380
1381static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1382{
1383	struct au0828_fh *fh = priv;
1384	struct au0828_dev *dev = fh->dev;
1385	*i = dev->ctrl_input;
1386	return 0;
1387}
1388
1389static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
1390{
1391	struct au0828_fh *fh = priv;
1392	struct au0828_dev *dev = fh->dev;
1393	int i;
1394
1395	dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
1396		index);
1397	if (index >= AU0828_MAX_INPUT)
1398		return -EINVAL;
1399	if (AUVI_INPUT(index).type == 0)
1400		return -EINVAL;
1401	dev->ctrl_input = index;
1402
1403	switch (AUVI_INPUT(index).type) {
1404	case AU0828_VMUX_SVIDEO:
1405		dev->input_type = AU0828_VMUX_SVIDEO;
1406		break;
1407	case AU0828_VMUX_COMPOSITE:
1408		dev->input_type = AU0828_VMUX_COMPOSITE;
1409		break;
1410	case AU0828_VMUX_TELEVISION:
1411		dev->input_type = AU0828_VMUX_TELEVISION;
1412		break;
1413	default:
1414		dprintk(1, "VIDIOC_S_INPUT unknown input type set [%d]\n",
1415			AUVI_INPUT(index).type);
1416		break;
1417	}
1418
1419	v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
1420			AUVI_INPUT(index).vmux, 0, 0);
1421
1422	for (i = 0; i < AU0828_MAX_INPUT; i++) {
1423		int enable = 0;
1424		if (AUVI_INPUT(i).audio_setup == NULL)
1425			continue;
1426
1427		if (i == index)
1428			enable = 1;
1429		else
1430			enable = 0;
1431		if (enable) {
1432			(AUVI_INPUT(i).audio_setup)(dev, enable);
1433		} else {
1434			/* Make sure we leave it turned on if some
1435			   other input is routed to this callback */
1436			if ((AUVI_INPUT(i).audio_setup) !=
1437			    ((AUVI_INPUT(index).audio_setup))) {
1438				(AUVI_INPUT(i).audio_setup)(dev, enable);
1439			}
1440		}
1441	}
1442
1443	v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
1444			AUVI_INPUT(index).amux, 0, 0);
1445	return 0;
1446}
1447
1448static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1449{
1450	struct au0828_fh *fh = priv;
1451	struct au0828_dev *dev = fh->dev;
1452	unsigned int index = a->index;
1453
1454	if (a->index > 1)
1455		return -EINVAL;
1456
1457	index = dev->ctrl_ainput;
1458	if (index == 0)
1459		strcpy(a->name, "Television");
1460	else
1461		strcpy(a->name, "Line in");
1462
1463	a->capability = V4L2_AUDCAP_STEREO;
1464	a->index = index;
1465	return 0;
1466}
1467
1468static int vidioc_s_audio(struct file *file, void *priv, const struct v4l2_audio *a)
1469{
1470	struct au0828_fh *fh = priv;
1471	struct au0828_dev *dev = fh->dev;
1472	if (a->index != dev->ctrl_ainput)
1473		return -EINVAL;
1474	return 0;
1475}
1476
1477static int vidioc_g_ctrl(struct file *file, void *priv,
1478			 struct v4l2_control *ctrl)
1479{
1480	struct au0828_fh *fh = priv;
1481	struct au0828_dev *dev = fh->dev;
1482
1483	v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_ctrl, ctrl);
1484	return 0;
1485
1486}
1487
1488static int vidioc_s_ctrl(struct file *file, void *priv,
1489				struct v4l2_control *ctrl)
1490{
1491	struct au0828_fh *fh = priv;
1492	struct au0828_dev *dev = fh->dev;
1493	v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_ctrl, ctrl);
1494	return 0;
1495}
1496
1497static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1498{
1499	struct au0828_fh *fh = priv;
1500	struct au0828_dev *dev = fh->dev;
1501
1502	if (t->index != 0)
1503		return -EINVAL;
1504
1505	strcpy(t->name, "Auvitek tuner");
1506	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1507	return 0;
1508}
1509
1510static int vidioc_s_tuner(struct file *file, void *priv,
1511				struct v4l2_tuner *t)
1512{
1513	struct au0828_fh *fh = priv;
1514	struct au0828_dev *dev = fh->dev;
1515
1516	if (t->index != 0)
1517		return -EINVAL;
1518
1519	t->type = V4L2_TUNER_ANALOG_TV;
1520
1521	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1522		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 1);
1523
1524	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1525
1526	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1527		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 0);
1528
1529	dprintk(1, "VIDIOC_S_TUNER: signal = %x, afc = %x\n", t->signal,
1530		t->afc);
1531
1532	return 0;
1533
1534}
1535
1536static int vidioc_g_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	freq->type = V4L2_TUNER_ANALOG_TV;
1543	freq->frequency = dev->ctrl_freq;
1544	return 0;
1545}
1546
1547static int vidioc_s_frequency(struct file *file, void *priv,
1548				const struct v4l2_frequency *freq)
1549{
1550	struct au0828_fh *fh = priv;
1551	struct au0828_dev *dev = fh->dev;
1552
1553	if (freq->tuner != 0)
1554		return -EINVAL;
1555	if (freq->type != V4L2_TUNER_ANALOG_TV)
1556		return -EINVAL;
1557
1558	dev->ctrl_freq = freq->frequency;
1559
1560	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1561		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 1);
1562
1563	if (dev->std_set_in_tuner_core == 0) {
1564	  /* If we've never sent the standard in tuner core, do so now.  We
1565	     don't do this at device probe because we don't want to incur
1566	     the cost of a firmware load */
1567	  v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std,
1568			       dev->vdev->tvnorms);
1569	  dev->std_set_in_tuner_core = 1;
1570	}
1571
1572	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, freq);
1573
1574	if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
1575		dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, 0);
1576
1577	au0828_analog_stream_reset(dev);
1578
1579	return 0;
1580}
1581
1582
1583/* RAW VBI ioctls */
1584
1585static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1586				struct v4l2_format *format)
1587{
1588	struct au0828_fh      *fh  = priv;
1589	struct au0828_dev     *dev = fh->dev;
1590
1591	format->fmt.vbi.samples_per_line = dev->vbi_width;
1592	format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1593	format->fmt.vbi.offset = 0;
1594	format->fmt.vbi.flags = 0;
1595	format->fmt.vbi.sampling_rate = 6750000 * 4 / 2;
1596
1597	format->fmt.vbi.count[0] = dev->vbi_height;
1598	format->fmt.vbi.count[1] = dev->vbi_height;
1599	format->fmt.vbi.start[0] = 21;
1600	format->fmt.vbi.start[1] = 284;
1601
1602	return 0;
1603}
1604
1605static int vidioc_g_chip_ident(struct file *file, void *priv,
1606	       struct v4l2_dbg_chip_ident *chip)
1607{
1608	struct au0828_fh *fh = priv;
1609	struct au0828_dev *dev = fh->dev;
1610	chip->ident = V4L2_IDENT_NONE;
1611	chip->revision = 0;
1612
1613	if (v4l2_chip_match_host(&chip->match)) {
1614		chip->ident = V4L2_IDENT_AU0828;
1615		return 0;
1616	}
1617
1618	v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_chip_ident, chip);
1619	if (chip->ident == V4L2_IDENT_NONE)
1620		return -EINVAL;
1621
1622	return 0;
1623}
1624
1625static int vidioc_cropcap(struct file *file, void *priv,
1626			  struct v4l2_cropcap *cc)
1627{
1628	struct au0828_fh *fh = priv;
1629	struct au0828_dev *dev = fh->dev;
1630
1631	if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1632		return -EINVAL;
1633
1634	cc->bounds.left = 0;
1635	cc->bounds.top = 0;
1636	cc->bounds.width = dev->width;
1637	cc->bounds.height = dev->height;
1638
1639	cc->defrect = cc->bounds;
1640
1641	cc->pixelaspect.numerator = 54;
1642	cc->pixelaspect.denominator = 59;
1643
1644	return 0;
1645}
1646
1647static int vidioc_streamon(struct file *file, void *priv,
1648			   enum v4l2_buf_type type)
1649{
1650	struct au0828_fh      *fh  = priv;
1651	struct au0828_dev     *dev = fh->dev;
1652	int                   rc = -EINVAL;
1653
1654	rc = check_dev(dev);
1655	if (rc < 0)
1656		return rc;
1657
1658	if (unlikely(type != fh->type))
1659		return -EINVAL;
1660
1661	dprintk(1, "vidioc_streamon fh=%p t=%d fh->res=%d dev->res=%d\n",
1662		fh, type, fh->resources, dev->resources);
1663
1664	if (unlikely(!res_get(fh, get_ressource(fh))))
1665		return -EBUSY;
1666
1667	if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1668		au0828_analog_stream_enable(dev);
1669		v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
1670	}
1671
1672	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1673		rc = videobuf_streamon(&fh->vb_vidq);
1674		dev->vid_timeout_running = 1;
1675		mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
1676	} else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1677		rc = videobuf_streamon(&fh->vb_vbiq);
1678		dev->vbi_timeout_running = 1;
1679		mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
1680	}
1681
1682	return rc;
1683}
1684
1685static int vidioc_streamoff(struct file *file, void *priv,
1686			    enum v4l2_buf_type type)
1687{
1688	struct au0828_fh      *fh  = priv;
1689	struct au0828_dev     *dev = fh->dev;
1690	int                   rc;
1691	int                   i;
1692
1693	rc = check_dev(dev);
1694	if (rc < 0)
1695		return rc;
1696
1697	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1698	    fh->type != V4L2_BUF_TYPE_VBI_CAPTURE)
1699		return -EINVAL;
1700	if (type != fh->type)
1701		return -EINVAL;
1702
1703	dprintk(1, "vidioc_streamoff fh=%p t=%d fh->res=%d dev->res=%d\n",
1704		fh, type, fh->resources, dev->resources);
1705
1706	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1707		dev->vid_timeout_running = 0;
1708		del_timer_sync(&dev->vid_timeout);
1709
1710		v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
1711		rc = au0828_stream_interrupt(dev);
1712		if (rc != 0)
1713			return rc;
1714
1715		for (i = 0; i < AU0828_MAX_INPUT; i++) {
1716			if (AUVI_INPUT(i).audio_setup == NULL)
1717				continue;
1718			(AUVI_INPUT(i).audio_setup)(dev, 0);
1719		}
1720
1721		if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
1722			videobuf_streamoff(&fh->vb_vidq);
1723			res_free(fh, AU0828_RESOURCE_VIDEO);
1724		}
1725	} else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1726		dev->vbi_timeout_running = 0;
1727		del_timer_sync(&dev->vbi_timeout);
1728
1729		if (res_check(fh, AU0828_RESOURCE_VBI)) {
1730			videobuf_streamoff(&fh->vb_vbiq);
1731			res_free(fh, AU0828_RESOURCE_VBI);
1732		}
1733	}
1734
1735	return 0;
1736}
1737
1738#ifdef CONFIG_VIDEO_ADV_DEBUG
1739static int vidioc_g_register(struct file *file, void *priv,
1740			     struct v4l2_dbg_register *reg)
1741{
1742	struct au0828_fh *fh = priv;
1743	struct au0828_dev *dev = fh->dev;
1744
1745	switch (reg->match.type) {
1746	case V4L2_CHIP_MATCH_I2C_DRIVER:
1747		v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
1748		return 0;
1749	default:
1750		if (!v4l2_chip_match_host(&reg->match))
1751			return -EINVAL;
1752	}
1753
1754	reg->val = au0828_read(dev, reg->reg);
1755	return 0;
1756}
1757
1758static int vidioc_s_register(struct file *file, void *priv,
1759			     struct v4l2_dbg_register *reg)
1760{
1761	struct au0828_fh *fh = priv;
1762	struct au0828_dev *dev = fh->dev;
1763
1764	switch (reg->match.type) {
1765	case V4L2_CHIP_MATCH_I2C_DRIVER:
1766		v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
1767		return 0;
1768	default:
1769		if (!v4l2_chip_match_host(&reg->match))
1770			return -EINVAL;
1771	}
1772	return au0828_writereg(dev, reg->reg, reg->val);
1773}
1774#endif
1775
1776static int vidioc_reqbufs(struct file *file, void *priv,
1777			  struct v4l2_requestbuffers *rb)
1778{
1779	struct au0828_fh *fh = priv;
1780	struct au0828_dev *dev = fh->dev;
1781	int rc;
1782
1783	rc = check_dev(dev);
1784	if (rc < 0)
1785		return rc;
1786
1787	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1788		rc = videobuf_reqbufs(&fh->vb_vidq, rb);
1789	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1790		rc = videobuf_reqbufs(&fh->vb_vbiq, rb);
1791
1792	return rc;
1793}
1794
1795static int vidioc_querybuf(struct file *file, void *priv,
1796			   struct v4l2_buffer *b)
1797{
1798	struct au0828_fh *fh = priv;
1799	struct au0828_dev *dev = fh->dev;
1800	int rc;
1801
1802	rc = check_dev(dev);
1803	if (rc < 0)
1804		return rc;
1805
1806	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1807		rc = videobuf_querybuf(&fh->vb_vidq, b);
1808	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1809		rc = videobuf_querybuf(&fh->vb_vbiq, b);
1810
1811	return rc;
1812}
1813
1814static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1815{
1816	struct au0828_fh *fh = priv;
1817	struct au0828_dev *dev = fh->dev;
1818	int rc;
1819
1820	rc = check_dev(dev);
1821	if (rc < 0)
1822		return rc;
1823
1824	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1825		rc = videobuf_qbuf(&fh->vb_vidq, b);
1826	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1827		rc = videobuf_qbuf(&fh->vb_vbiq, b);
1828
1829	return rc;
1830}
1831
1832static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1833{
1834	struct au0828_fh *fh = priv;
1835	struct au0828_dev *dev = fh->dev;
1836	int rc;
1837
1838	rc = check_dev(dev);
1839	if (rc < 0)
1840		return rc;
1841
1842	/* Workaround for a bug in the au0828 hardware design that sometimes
1843	   results in the colorspace being inverted */
1844	if (dev->greenscreen_detected == 1) {
1845		dprintk(1, "Detected green frame.  Resetting stream...\n");
1846		au0828_analog_stream_reset(dev);
1847		dev->greenscreen_detected = 0;
1848	}
1849
1850	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1851		rc = videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1852	else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1853		rc = videobuf_dqbuf(&fh->vb_vbiq, b, file->f_flags & O_NONBLOCK);
1854
1855	return rc;
1856}
1857
1858static struct v4l2_file_operations au0828_v4l_fops = {
1859	.owner      = THIS_MODULE,
1860	.open       = au0828_v4l2_open,
1861	.release    = au0828_v4l2_close,
1862	.read       = au0828_v4l2_read,
1863	.poll       = au0828_v4l2_poll,
1864	.mmap       = au0828_v4l2_mmap,
1865	.unlocked_ioctl = video_ioctl2,
1866};
1867
1868static const struct v4l2_ioctl_ops video_ioctl_ops = {
1869	.vidioc_querycap            = vidioc_querycap,
1870	.vidioc_enum_fmt_vid_cap    = vidioc_enum_fmt_vid_cap,
1871	.vidioc_g_fmt_vid_cap       = vidioc_g_fmt_vid_cap,
1872	.vidioc_try_fmt_vid_cap     = vidioc_try_fmt_vid_cap,
1873	.vidioc_s_fmt_vid_cap       = vidioc_s_fmt_vid_cap,
1874	.vidioc_g_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
1875	.vidioc_s_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
1876	.vidioc_g_audio             = vidioc_g_audio,
1877	.vidioc_s_audio             = vidioc_s_audio,
1878	.vidioc_cropcap             = vidioc_cropcap,
1879	.vidioc_reqbufs             = vidioc_reqbufs,
1880	.vidioc_querybuf            = vidioc_querybuf,
1881	.vidioc_qbuf                = vidioc_qbuf,
1882	.vidioc_dqbuf               = vidioc_dqbuf,
1883	.vidioc_s_std               = vidioc_s_std,
1884	.vidioc_enum_input          = vidioc_enum_input,
1885	.vidioc_g_input             = vidioc_g_input,
1886	.vidioc_s_input             = vidioc_s_input,
1887	.vidioc_queryctrl           = vidioc_queryctrl,
1888	.vidioc_g_ctrl              = vidioc_g_ctrl,
1889	.vidioc_s_ctrl              = vidioc_s_ctrl,
1890	.vidioc_streamon            = vidioc_streamon,
1891	.vidioc_streamoff           = vidioc_streamoff,
1892	.vidioc_g_tuner             = vidioc_g_tuner,
1893	.vidioc_s_tuner             = vidioc_s_tuner,
1894	.vidioc_g_frequency         = vidioc_g_frequency,
1895	.vidioc_s_frequency         = vidioc_s_frequency,
1896#ifdef CONFIG_VIDEO_ADV_DEBUG
1897	.vidioc_g_register          = vidioc_g_register,
1898	.vidioc_s_register          = vidioc_s_register,
1899#endif
1900	.vidioc_g_chip_ident        = vidioc_g_chip_ident,
1901};
1902
1903static const struct video_device au0828_video_template = {
1904	.fops                       = &au0828_v4l_fops,
1905	.release                    = video_device_release,
1906	.ioctl_ops 		    = &video_ioctl_ops,
1907	.tvnorms                    = V4L2_STD_NTSC_M,
1908	.current_norm               = V4L2_STD_NTSC_M,
1909};
1910
1911/**************************************************************************/
1912
1913int au0828_analog_register(struct au0828_dev *dev,
1914			   struct usb_interface *interface)
1915{
1916	int retval = -ENOMEM;
1917	struct usb_host_interface *iface_desc;
1918	struct usb_endpoint_descriptor *endpoint;
1919	int i, ret;
1920
1921	dprintk(1, "au0828_analog_register called!\n");
1922
1923	/* set au0828 usb interface0 to as5 */
1924	retval = usb_set_interface(dev->usbdev,
1925			interface->cur_altsetting->desc.bInterfaceNumber, 5);
1926	if (retval != 0) {
1927		printk(KERN_INFO "Failure setting usb interface0 to as5\n");
1928		return retval;
1929	}
1930
1931	/* Figure out which endpoint has the isoc interface */
1932	iface_desc = interface->cur_altsetting;
1933	for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
1934		endpoint = &iface_desc->endpoint[i].desc;
1935		if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1936		     == USB_DIR_IN) &&
1937		    ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1938		     == USB_ENDPOINT_XFER_ISOC)) {
1939
1940			/* we find our isoc in endpoint */
1941			u16 tmp = le16_to_cpu(endpoint->wMaxPacketSize);
1942			dev->max_pkt_size = (tmp & 0x07ff) *
1943				(((tmp & 0x1800) >> 11) + 1);
1944			dev->isoc_in_endpointaddr = endpoint->bEndpointAddress;
1945		}
1946	}
1947	if (!(dev->isoc_in_endpointaddr)) {
1948		printk(KERN_INFO "Could not locate isoc endpoint\n");
1949		kfree(dev);
1950		return -ENODEV;
1951	}
1952
1953	init_waitqueue_head(&dev->open);
1954	spin_lock_init(&dev->slock);
1955
1956	/* init video dma queues */
1957	INIT_LIST_HEAD(&dev->vidq.active);
1958	INIT_LIST_HEAD(&dev->vidq.queued);
1959	INIT_LIST_HEAD(&dev->vbiq.active);
1960	INIT_LIST_HEAD(&dev->vbiq.queued);
1961
1962	dev->vid_timeout.function = au0828_vid_buffer_timeout;
1963	dev->vid_timeout.data = (unsigned long) dev;
1964	init_timer(&dev->vid_timeout);
1965
1966	dev->vbi_timeout.function = au0828_vbi_buffer_timeout;
1967	dev->vbi_timeout.data = (unsigned long) dev;
1968	init_timer(&dev->vbi_timeout);
1969
1970	dev->width = NTSC_STD_W;
1971	dev->height = NTSC_STD_H;
1972	dev->field_size = dev->width * dev->height;
1973	dev->frame_size = dev->field_size << 1;
1974	dev->bytesperline = dev->width << 1;
1975	dev->ctrl_ainput = 0;
1976
1977	/* allocate and fill v4l2 video struct */
1978	dev->vdev = video_device_alloc();
1979	if (NULL == dev->vdev) {
1980		dprintk(1, "Can't allocate video_device.\n");
1981		return -ENOMEM;
1982	}
1983
1984	/* allocate the VBI struct */
1985	dev->vbi_dev = video_device_alloc();
1986	if (NULL == dev->vbi_dev) {
1987		dprintk(1, "Can't allocate vbi_device.\n");
1988		ret = -ENOMEM;
1989		goto err_vdev;
1990	}
1991
1992	/* Fill the video capture device struct */
1993	*dev->vdev = au0828_video_template;
1994	dev->vdev->parent = &dev->usbdev->dev;
1995	dev->vdev->lock = &dev->lock;
1996	strcpy(dev->vdev->name, "au0828a video");
1997
1998	/* Setup the VBI device */
1999	*dev->vbi_dev = au0828_video_template;
2000	dev->vbi_dev->parent = &dev->usbdev->dev;
2001	dev->vbi_dev->lock = &dev->lock;
2002	strcpy(dev->vbi_dev->name, "au0828a vbi");
2003
2004	/* Register the v4l2 device */
2005	video_set_drvdata(dev->vdev, dev);
2006	retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1);
2007	if (retval != 0) {
2008		dprintk(1, "unable to register video device (error = %d).\n",
2009			retval);
2010		ret = -ENODEV;
2011		goto err_vbi_dev;
2012	}
2013
2014	/* Register the vbi device */
2015	video_set_drvdata(dev->vbi_dev, dev);
2016	retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1);
2017	if (retval != 0) {
2018		dprintk(1, "unable to register vbi device (error = %d).\n",
2019			retval);
2020		ret = -ENODEV;
2021		goto err_vbi_dev;
2022	}
2023
2024	dprintk(1, "%s completed!\n", __func__);
2025
2026	return 0;
2027
2028err_vbi_dev:
2029	video_device_release(dev->vbi_dev);
2030err_vdev:
2031	video_device_release(dev->vdev);
2032	return ret;
2033}
2034
2035