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