Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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>
 36 #include <media/v4l2-common.h>
 37 #include <media/v4l2-ioctl.h>
 38 #include <media/v4l2-chip-ident.h>
 39 #include <media/tuner.h>
 40 #include "au0828.h"
 41 #include "au0828-reg.h"
 42 
 43 static LIST_HEAD(au0828_devlist);
 44 static DEFINE_MUTEX(au0828_sysfs_lock);
 45 
 46 #define AU0828_VERSION_CODE KERNEL_VERSION(0, 0, 1)
 47 
 48 /* ------------------------------------------------------------------
 49         Videobuf operations
 50    ------------------------------------------------------------------*/
 51 
 52 static unsigned int isoc_debug;
 53 module_param(isoc_debug, int, 0644);
 54 MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
 55 
 56 #define au0828_isocdbg(fmt, arg...) \
 57 do {\
 58         if (isoc_debug) { \
 59                 printk(KERN_INFO "au0828 %s :"fmt, \
 60                        __func__ , ##arg);          \
 61         } \
 62   } while (0)
 63 
 64 static 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 
103 static int check_dev(struct au0828_dev *dev)
104 {
105         if (dev->dev_state & DEV_DISCONNECTED) {
106                 printk(KERN_INFO "v4l2 ioctl: device not present\n");
107                 return -ENODEV;
108         }
109 
110         if (dev->dev_state & DEV_MISCONFIGURED) {
111                 printk(KERN_INFO "v4l2 ioctl: device is misconfigured; "
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  */
121 static 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  */
163 void 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  */
202 int 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;
270                 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
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  */
300 static 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  */
320 static 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) {
372                         au0828_isocdbg("Overflow %zi bytes past buf end (2)\n",
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 */
388                 if (outp[0] < 0x60 && outp[1440] < 0x60)
389                         dev->greenscreen_detected = 1;
390         }
391 
392         dma_q->pos += len;
393 }
394 
395 /*
396  * video-buf generic routine to get the next available buffer
397  */
398 static 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  */
420 static 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 
455                 if (urb->iso_frame_desc[i].actual_length <= 0)
456                         continue;
457 
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);
478                                 if (buf == NULL)
479                                         outp = NULL;
480                                 else
481                                         outp = videobuf_to_vmalloc(&buf->vb);
482                         }
483 
484                         if (buf != NULL) {
485                                 if (fbyte & 0x40)
486                                         buf->top_field = 1;
487                                 else
488                                         buf->top_field = 0;
489                         }
490 
491                         dma_q->pos = 0;
492                 }
493                 if (buf != NULL)
494                         au0828_copy_video(dev, dma_q, buf, p, outp, len);
495         }
496         return rc;
497 }
498 
499 static int
500 buffer_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 */
515 static 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 
541 static int
542 buffer_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) {
562                         printk(KERN_INFO "videobuf_iolock failed\n");
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) {
575                         printk(KERN_INFO "au0828_init_isoc failed\n");
576                         goto fail;
577                 }
578         }
579 
580         buf->vb.state = VIDEOBUF_PREPARED;
581         return 0;
582 
583 fail:
584         free_buffer(vq, buf);
585         return rc;
586 }
587 
588 static void
589 buffer_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 
602 static 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 
612 static 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 
623 static 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  */
634 int 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 
654 int 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 
661 void 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  */
672 static int au0828_stream_interrupt(struct au0828_dev *dev)
673 {
674         int ret = 0;
675 
676         dev->stream_state = STREAM_INTERRUPT;
677         if (dev->dev_state == DEV_DISCONNECTED)
678                 return -ENODEV;
679         else if (ret) {
680                 dev->dev_state = DEV_MISCONFIGURED;
681                 dprintk(1, "%s device is misconfigured!\n", __func__);
682                 return ret;
683         }
684         return 0;
685 }
686 
687 /*
688  * au0828_release_resources
689  * unregister v4l2 devices
690  */
691 void au0828_analog_unregister(struct au0828_dev *dev)
692 {
693         dprintk(1, "au0828_release_resources called\n");
694         mutex_lock(&au0828_sysfs_lock);
695 
696         if (dev->vdev) {
697                 list_del(&dev->au0828list);
698                 video_unregister_device(dev->vdev);
699         }
700         if (dev->vbi_dev)
701                 video_unregister_device(dev->vbi_dev);
702 
703         mutex_unlock(&au0828_sysfs_lock);
704 }
705 
706 
707 /* Usage lock check functions */
708 static 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 
725 static int res_check(struct au0828_fh *fh)
726 {
727         return fh->stream_on;
728 }
729 
730 static 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 
738 static 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);
749                 if (h->vdev->minor == minor) {
750                         dev = h;
751                         type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
752                 }
753 #ifdef VBI_IS_WORKING
754                 if (h->vbi_dev->minor == minor) {
755                         dev = h;
756                         type = V4L2_BUF_TYPE_VBI_CAPTURE;
757                 }
758 #endif
759         }
760 
761         if (NULL == dev)
762                 return -ENODEV;
763 
764         fh = kzalloc(sizeof(struct au0828_fh), GFP_KERNEL);
765         if (NULL == fh) {
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 
774         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
775                 /* set au0828 interface0 to AS5 here again */
776                 ret = usb_set_interface(dev->usbdev, 0, 5);
777                 if (ret < 0) {
778                         printk(KERN_INFO "Au0828 can't set alternate to 5!\n");
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 
807 static 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 
817         if (dev->users == 1) {
818                 videobuf_stop(&fh->vb_vidq);
819                 videobuf_mmap_free(&fh->vb_vidq);
820 
821                 if (dev->dev_state & DEV_DISCONNECTED) {
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                 /* Save some power by putting tuner to sleep */
833                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_standby);
834 
835                 /* When close the device, set the usb intf0 into alt0 to free
836                    USB bandwidth */
837                 ret = usb_set_interface(dev->usbdev, 0, 0);
838                 if (ret < 0)
839                         printk(KERN_INFO "Au0828 can't set alternate to 0!\n");
840         }
841 
842         kfree(fh);
843         dev->users--;
844         wake_up_interruptible_nr(&dev->open, 1);
845         mutex_unlock(&dev->lock);
846         return 0;
847 }
848 
849 static ssize_t au0828_v4l2_read(struct file *filp, char __user *buf,
850                                 size_t count, loff_t *pos)
851 {
852         struct au0828_fh *fh = filp->private_data;
853         struct au0828_dev *dev = fh->dev;
854         int rc;
855 
856         rc = check_dev(dev);
857         if (rc < 0)
858                 return rc;
859 
860         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
861                 mutex_lock(&dev->lock);
862                 rc = res_get(fh);
863                 mutex_unlock(&dev->lock);
864 
865                 if (unlikely(rc < 0))
866                         return rc;
867 
868                 return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
869                                         filp->f_flags & O_NONBLOCK);
870         }
871         return 0;
872 }
873 
874 static unsigned int au0828_v4l2_poll(struct file *filp, poll_table *wait)
875 {
876         struct au0828_fh *fh = filp->private_data;
877         struct au0828_dev *dev = fh->dev;
878         int rc;
879 
880         rc = check_dev(dev);
881         if (rc < 0)
882                 return rc;
883 
884         mutex_lock(&dev->lock);
885         rc = res_get(fh);
886         mutex_unlock(&dev->lock);
887 
888         if (unlikely(rc < 0))
889                 return POLLERR;
890 
891         if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
892                 return POLLERR;
893 
894         return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
895 }
896 
897 static int au0828_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
898 {
899         struct au0828_fh *fh    = filp->private_data;
900         struct au0828_dev *dev   = fh->dev;
901         int              rc;
902 
903         rc = check_dev(dev);
904         if (rc < 0)
905                 return rc;
906 
907         mutex_lock(&dev->lock);
908         rc = res_get(fh);
909         mutex_unlock(&dev->lock);
910 
911         if (unlikely(rc < 0))
912                 return rc;
913 
914         rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
915 
916         return rc;
917 }
918 
919 static int au0828_set_format(struct au0828_dev *dev, unsigned int cmd,
920                              struct v4l2_format *format)
921 {
922         int ret;
923         int width = format->fmt.pix.width;
924         int height = format->fmt.pix.height;
925         unsigned int maxwidth, maxheight;
926 
927         maxwidth = 720;
928         maxheight = 480;
929 
930 #ifdef VBI_IS_WORKING
931         if (format->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
932                 dprintk(1, "VBI format set: to be supported!\n");
933                 return 0;
934         }
935         if (format->type == V4L2_BUF_TYPE_VBI_CAPTURE)
936                 return 0;
937 #endif
938         if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
939                 return -EINVAL;
940 
941         /* If they are demanding a format other than the one we support,
942            bail out (tvtime asks for UYVY and then retries with YUYV) */
943         if (format->fmt.pix.pixelformat != V4L2_PIX_FMT_UYVY)
944                 return -EINVAL;
945 
946         /* format->fmt.pix.width only support 720 and height 480 */
947         if (width != 720)
948                 width = 720;
949         if (height != 480)
950                 height = 480;
951 
952         format->fmt.pix.width = width;
953         format->fmt.pix.height = height;
954         format->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
955         format->fmt.pix.bytesperline = width * 2;
956         format->fmt.pix.sizeimage = width * height * 2;
957         format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
958         format->fmt.pix.field = V4L2_FIELD_INTERLACED;
959 
960         if (cmd == VIDIOC_TRY_FMT)
961                 return 0;
962 
963         /* maybe set new image format, driver current only support 720*480 */
964         dev->width = width;
965         dev->height = height;
966         dev->frame_size = width * height * 2;
967         dev->field_size = width * height;
968         dev->bytesperline = width * 2;
969 
970         if (dev->stream_state == STREAM_ON) {
971                 dprintk(1, "VIDIOC_SET_FMT: interrupting stream!\n");
972                 ret = au0828_stream_interrupt(dev);
973                 if (ret != 0) {
974                         dprintk(1, "error interrupting video stream!\n");
975                         return ret;
976                 }
977         }
978 
979         /* set au0828 interface0 to AS5 here again */
980         ret = usb_set_interface(dev->usbdev, 0, 5);
981         if (ret < 0) {
982                 printk(KERN_INFO "Au0828 can't set alt setting to 5!\n");
983                 return -EBUSY;
984         }
985 
986         au0828_analog_stream_enable(dev);
987 
988         return 0;
989 }
990 
991 
992 static int vidioc_queryctrl(struct file *file, void *priv,
993                             struct v4l2_queryctrl *qc)
994 {
995         struct au0828_fh *fh = priv;
996         struct au0828_dev *dev = fh->dev;
997         v4l2_device_call_all(&dev->v4l2_dev, 0, core, queryctrl, qc);
998         if (qc->type)
999                 return 0;
1000         else
1001                 return -EINVAL;
1002 }
1003 
1004 static int vidioc_querycap(struct file *file, void  *priv,
1005                            struct v4l2_capability *cap)
1006 {
1007         struct au0828_fh *fh  = priv;
1008         struct au0828_dev *dev = fh->dev;
1009 
1010         strlcpy(cap->driver, "au0828", sizeof(cap->driver));
1011         strlcpy(cap->card, dev->board.name, sizeof(cap->card));
1012         strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
1013 
1014         cap->version = AU0828_VERSION_CODE;
1015 
1016         /*set the device capabilities */
1017         cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1018 #ifdef VBI_IS_WORKING
1019                 V4L2_CAP_VBI_CAPTURE |
1020 #endif
1021                 V4L2_CAP_AUDIO |
1022                 V4L2_CAP_READWRITE |
1023                 V4L2_CAP_STREAMING |
1024                 V4L2_CAP_TUNER;
1025         return 0;
1026 }
1027 
1028 static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
1029                                         struct v4l2_fmtdesc *f)
1030 {
1031         if (f->index)
1032                 return -EINVAL;
1033 
1034         f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1035         strcpy(f->description, "Packed YUV2");
1036 
1037         f->flags = 0;
1038         f->pixelformat = V4L2_PIX_FMT_UYVY;
1039 
1040         return 0;
1041 }
1042 
1043 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1044                                         struct v4l2_format *f)
1045 {
1046         struct au0828_fh *fh  = priv;
1047         struct au0828_dev *dev = fh->dev;
1048 
1049         f->fmt.pix.width = dev->width;
1050         f->fmt.pix.height = dev->height;
1051         f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1052         f->fmt.pix.bytesperline = dev->bytesperline;
1053         f->fmt.pix.sizeimage = dev->frame_size;
1054         f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* NTSC/PAL */
1055         f->fmt.pix.field = V4L2_FIELD_INTERLACED;
1056         return 0;
1057 }
1058 
1059 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1060                                   struct v4l2_format *f)
1061 {
1062         struct au0828_fh *fh  = priv;
1063         struct au0828_dev *dev = fh->dev;
1064 
1065         return au0828_set_format(dev, VIDIOC_TRY_FMT, f);
1066 }
1067 
1068 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1069                                 struct v4l2_format *f)
1070 {
1071         struct au0828_fh *fh  = priv;
1072         struct au0828_dev *dev = fh->dev;
1073         int rc;
1074 
1075         if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1076                 printk(KERN_INFO "%s queue busy\n", __func__);
1077                 rc = -EBUSY;
1078                 goto out;
1079         }
1080 
1081         if (dev->stream_on && !fh->stream_on) {
1082                 printk(KERN_INFO "%s device in use by another fh\n", __func__);
1083                 rc = -EBUSY;
1084                 goto out;
1085         }
1086 
1087         return au0828_set_format(dev, VIDIOC_S_FMT, f);
1088 out:
1089         return rc;
1090 }
1091 
1092 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm)
1093 {
1094         struct au0828_fh *fh = priv;
1095         struct au0828_dev *dev = fh->dev;
1096 
1097         /* FIXME: when we support something other than NTSC, we are going to
1098            have to make the au0828 bridge adjust the size of its capture
1099            buffer, which is currently hardcoded at 720x480 */
1100 
1101         v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, *norm);
1102         return 0;
1103 }
1104 
1105 static int vidioc_enum_input(struct file *file, void *priv,
1106                                 struct v4l2_input *input)
1107 {
1108         struct au0828_fh *fh = priv;
1109         struct au0828_dev *dev = fh->dev;
1110         unsigned int tmp;
1111 
1112         static const char *inames[] = {
1113                 [AU0828_VMUX_UNDEFINED] = "Undefined",
1114                 [AU0828_VMUX_COMPOSITE] = "Composite",
1115                 [AU0828_VMUX_SVIDEO] = "S-Video",
1116                 [AU0828_VMUX_CABLE] = "Cable TV",
1117                 [AU0828_VMUX_TELEVISION] = "Television",
1118                 [AU0828_VMUX_DVB] = "DVB",
1119                 [AU0828_VMUX_DEBUG] = "tv debug"
1120         };
1121 
1122         tmp = input->index;
1123 
1124         if (tmp > AU0828_MAX_INPUT)
1125                 return -EINVAL;
1126         if (AUVI_INPUT(tmp).type == 0)
1127                 return -EINVAL;
1128 
1129         input->index = tmp;
1130         strcpy(input->name, inames[AUVI_INPUT(tmp).type]);
1131         if ((AUVI_INPUT(tmp).type == AU0828_VMUX_TELEVISION) ||
1132             (AUVI_INPUT(tmp).type == AU0828_VMUX_CABLE))
1133                 input->type |= V4L2_INPUT_TYPE_TUNER;
1134         else
1135                 input->type |= V4L2_INPUT_TYPE_CAMERA;
1136 
1137         input->std = dev->vdev->tvnorms;
1138 
1139         return 0;
1140 }
1141 
1142 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1143 {
1144         struct au0828_fh *fh = priv;
1145         struct au0828_dev *dev = fh->dev;
1146         *i = dev->ctrl_input;
1147         return 0;
1148 }
1149 
1150 static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
1151 {
1152         struct au0828_fh *fh = priv;
1153         struct au0828_dev *dev = fh->dev;
1154         int i;
1155 
1156         dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
1157                 index);
1158         if (index >= AU0828_MAX_INPUT)
1159                 return -EINVAL;
1160         if (AUVI_INPUT(index).type == 0)
1161                 return -EINVAL;
1162         dev->ctrl_input = index;
1163 
1164         switch (AUVI_INPUT(index).type) {
1165         case AU0828_VMUX_SVIDEO:
1166                 dev->input_type = AU0828_VMUX_SVIDEO;
1167                 break;
1168         case AU0828_VMUX_COMPOSITE:
1169                 dev->input_type = AU0828_VMUX_COMPOSITE;
1170                 break;
1171         case AU0828_VMUX_TELEVISION:
1172                 dev->input_type = AU0828_VMUX_TELEVISION;
1173                 break;
1174         default:
1175                 dprintk(1, "VIDIOC_S_INPUT unknown input type set [%d]\n",
1176                         AUVI_INPUT(index).type);
1177                 break;
1178         }
1179 
1180         v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
1181                         AUVI_INPUT(index).vmux, 0, 0);
1182 
1183         for (i = 0; i < AU0828_MAX_INPUT; i++) {
1184                 int enable = 0;
1185                 if (AUVI_INPUT(i).audio_setup == NULL)
1186                         continue;
1187 
1188                 if (i == index)
1189                         enable = 1;
1190                 else
1191                         enable = 0;
1192                 if (enable) {
1193                         (AUVI_INPUT(i).audio_setup)(dev, enable);
1194                 } else {
1195                         /* Make sure we leave it turned on if some
1196                            other input is routed to this callback */
1197                         if ((AUVI_INPUT(i).audio_setup) !=
1198                             ((AUVI_INPUT(index).audio_setup))) {
1199                                 (AUVI_INPUT(i).audio_setup)(dev, enable);
1200                         }
1201                 }
1202         }
1203 
1204         v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
1205                         AUVI_INPUT(index).amux, 0, 0);
1206         return 0;
1207 }
1208 
1209 static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1210 {
1211         struct au0828_fh *fh = priv;
1212         struct au0828_dev *dev = fh->dev;
1213         unsigned int index = a->index;
1214 
1215         if (a->index > 1)
1216                 return -EINVAL;
1217 
1218         index = dev->ctrl_ainput;
1219         if (index == 0)
1220                 strcpy(a->name, "Television");
1221         else
1222                 strcpy(a->name, "Line in");
1223 
1224         a->capability = V4L2_AUDCAP_STEREO;
1225         a->index = index;
1226         return 0;
1227 }
1228 
1229 static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
1230 {
1231         struct au0828_fh *fh = priv;
1232         struct au0828_dev *dev = fh->dev;
1233         if (a->index != dev->ctrl_ainput)
1234                 return -EINVAL;
1235         return 0;
1236 }
1237 
1238 static int vidioc_g_ctrl(struct file *file, void *priv,
1239                          struct v4l2_control *ctrl)
1240 {
1241         struct au0828_fh *fh = priv;
1242         struct au0828_dev *dev = fh->dev;
1243 
1244         v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_ctrl, ctrl);
1245         return 0;
1246 
1247 }
1248 
1249 static int vidioc_s_ctrl(struct file *file, void *priv,
1250                                 struct v4l2_control *ctrl)
1251 {
1252         struct au0828_fh *fh = priv;
1253         struct au0828_dev *dev = fh->dev;
1254         v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_ctrl, ctrl);
1255         return 0;
1256 }
1257 
1258 static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1259 {
1260         struct au0828_fh *fh = priv;
1261         struct au0828_dev *dev = fh->dev;
1262 
1263         if (t->index != 0)
1264                 return -EINVAL;
1265 
1266         strcpy(t->name, "Auvitek tuner");
1267         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1268         return 0;
1269 }
1270 
1271 static int vidioc_s_tuner(struct file *file, void *priv,
1272                                 struct v4l2_tuner *t)
1273 {
1274         struct au0828_fh *fh = priv;
1275         struct au0828_dev *dev = fh->dev;
1276 
1277         if (t->index != 0)
1278                 return -EINVAL;
1279 
1280         t->type = V4L2_TUNER_ANALOG_TV;
1281         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1282         dprintk(1, "VIDIOC_S_TUNER: signal = %x, afc = %x\n", t->signal,
1283                 t->afc);
1284         return 0;
1285 
1286 }
1287 
1288 static int vidioc_g_frequency(struct file *file, void *priv,
1289                                 struct v4l2_frequency *freq)
1290 {
1291         struct au0828_fh *fh = priv;
1292         struct au0828_dev *dev = fh->dev;
1293 
1294         freq->type = V4L2_TUNER_ANALOG_TV;
1295         freq->frequency = dev->ctrl_freq;
1296         return 0;
1297 }
1298 
1299 static int vidioc_s_frequency(struct file *file, void *priv,
1300                                 struct v4l2_frequency *freq)
1301 {
1302         struct au0828_fh *fh = priv;
1303         struct au0828_dev *dev = fh->dev;
1304 
1305         if (freq->tuner != 0)
1306                 return -EINVAL;
1307         if (freq->type != V4L2_TUNER_ANALOG_TV)
1308                 return -EINVAL;
1309 
1310         dev->ctrl_freq = freq->frequency;
1311 
1312         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, freq);
1313 
1314         au0828_analog_stream_reset(dev);
1315 
1316         return 0;
1317 }
1318 
1319 static int vidioc_g_chip_ident(struct file *file, void *priv,
1320                struct v4l2_dbg_chip_ident *chip)
1321 {
1322         struct au0828_fh *fh = priv;
1323         struct au0828_dev *dev = fh->dev;
1324         chip->ident = V4L2_IDENT_NONE;
1325         chip->revision = 0;
1326 
1327         if (v4l2_chip_match_host(&chip->match)) {
1328                 chip->ident = V4L2_IDENT_AU0828;
1329                 return 0;
1330         }
1331 
1332         v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_chip_ident, chip);
1333         if (chip->ident == V4L2_IDENT_NONE)
1334                 return -EINVAL;
1335 
1336         return 0;
1337 }
1338 
1339 static int vidioc_cropcap(struct file *file, void *priv,
1340                           struct v4l2_cropcap *cc)
1341 {
1342         struct au0828_fh *fh = priv;
1343         struct au0828_dev *dev = fh->dev;
1344 
1345         if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1346                 return -EINVAL;
1347 
1348         cc->bounds.left = 0;
1349         cc->bounds.top = 0;
1350         cc->bounds.width = dev->width;
1351         cc->bounds.height = dev->height;
1352 
1353         cc->defrect = cc->bounds;
1354 
1355         cc->pixelaspect.numerator = 54;
1356         cc->pixelaspect.denominator = 59;
1357 
1358         return 0;
1359 }
1360 
1361 static int vidioc_streamon(struct file *file, void *priv,
1362                            enum v4l2_buf_type type)
1363 {
1364         struct au0828_fh *fh = priv;
1365         struct au0828_dev *dev = fh->dev;
1366         int rc;
1367 
1368         rc = check_dev(dev);
1369         if (rc < 0)
1370                 return rc;
1371 
1372         if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1373                 au0828_analog_stream_enable(dev);
1374                 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
1375         }
1376 
1377         mutex_lock(&dev->lock);
1378         rc = res_get(fh);
1379 
1380         if (likely(rc >= 0))
1381                 rc = videobuf_streamon(&fh->vb_vidq);
1382         mutex_unlock(&dev->lock);
1383 
1384         return rc;
1385 }
1386 
1387 static int vidioc_streamoff(struct file *file, void *priv,
1388                             enum v4l2_buf_type type)
1389 {
1390         struct au0828_fh *fh = priv;
1391         struct au0828_dev *dev = fh->dev;
1392         int i;
1393         int ret;
1394         int rc;
1395 
1396         rc = check_dev(dev);
1397         if (rc < 0)
1398                 return rc;
1399 
1400         if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1401                 return -EINVAL;
1402         if (type != fh->type)
1403                 return -EINVAL;
1404 
1405         if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1406                 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
1407                 ret = au0828_stream_interrupt(dev);
1408                 if (ret != 0)
1409                         return ret;
1410         }
1411 
1412         for (i = 0; i < AU0828_MAX_INPUT; i++) {
1413                 if (AUVI_INPUT(i).audio_setup == NULL)
1414                         continue;
1415                 (AUVI_INPUT(i).audio_setup)(dev, 0);
1416         }
1417 
1418         mutex_lock(&dev->lock);
1419         videobuf_streamoff(&fh->vb_vidq);
1420         res_free(fh);
1421         mutex_unlock(&dev->lock);
1422 
1423         return 0;
1424 }
1425 
1426 #ifdef CONFIG_VIDEO_ADV_DEBUG
1427 static int vidioc_g_register(struct file *file, void *priv,
1428                              struct v4l2_dbg_register *reg)
1429 {
1430         struct au0828_fh *fh = priv;
1431         struct au0828_dev *dev = fh->dev;
1432 
1433         switch (reg->match.type) {
1434         case V4L2_CHIP_MATCH_I2C_DRIVER:
1435                 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
1436                 return 0;
1437         default:
1438                 return -EINVAL;
1439         }
1440 }
1441 
1442 static int vidioc_s_register(struct file *file, void *priv,
1443                              struct v4l2_dbg_register *reg)
1444 {
1445         struct au0828_fh *fh = priv;
1446         struct au0828_dev *dev = fh->dev;
1447 
1448         switch (reg->match.type) {
1449         case V4L2_CHIP_MATCH_I2C_DRIVER:
1450                 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
1451                 return 0;
1452         default:
1453                 return -EINVAL;
1454         }
1455         return 0;
1456 }
1457 #endif
1458 
1459 static int vidioc_reqbufs(struct file *file, void *priv,
1460                           struct v4l2_requestbuffers *rb)
1461 {
1462         struct au0828_fh *fh = priv;
1463         struct au0828_dev *dev = fh->dev;
1464         int rc;
1465 
1466         rc = check_dev(dev);
1467         if (rc < 0)
1468                 return rc;
1469 
1470         return videobuf_reqbufs(&fh->vb_vidq, rb);
1471 }
1472 
1473 static int vidioc_querybuf(struct file *file, void *priv,
1474                            struct v4l2_buffer *b)
1475 {
1476         struct au0828_fh *fh = priv;
1477         struct au0828_dev *dev = fh->dev;
1478         int rc;
1479 
1480         rc = check_dev(dev);
1481         if (rc < 0)
1482                 return rc;
1483 
1484         return videobuf_querybuf(&fh->vb_vidq, b);
1485 }
1486 
1487 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1488 {
1489         struct au0828_fh *fh = priv;
1490         struct au0828_dev *dev = fh->dev;
1491         int rc;
1492 
1493         rc = check_dev(dev);
1494         if (rc < 0)
1495                 return rc;
1496 
1497         return videobuf_qbuf(&fh->vb_vidq, b);
1498 }
1499 
1500 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1501 {
1502         struct au0828_fh *fh = priv;
1503         struct au0828_dev *dev = fh->dev;
1504         int rc;
1505 
1506         rc = check_dev(dev);
1507         if (rc < 0)
1508                 return rc;
1509 
1510         /* Workaround for a bug in the au0828 hardware design that sometimes
1511            results in the colorspace being inverted */
1512         if (dev->greenscreen_detected == 1) {
1513                 dprintk(1, "Detected green frame.  Resetting stream...\n");
1514                 au0828_analog_stream_reset(dev);
1515                 dev->greenscreen_detected = 0;
1516         }
1517 
1518         return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1519 }
1520 
1521 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1522 static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
1523 {
1524         struct au0828_fh *fh = priv;
1525 
1526         return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
1527 }
1528 #endif
1529 
1530 static struct v4l2_file_operations au0828_v4l_fops = {
1531         .owner      = THIS_MODULE,
1532         .open       = au0828_v4l2_open,
1533         .release    = au0828_v4l2_close,
1534         .read       = au0828_v4l2_read,
1535         .poll       = au0828_v4l2_poll,
1536         .mmap       = au0828_v4l2_mmap,
1537         .ioctl      = video_ioctl2,
1538 };
1539 
1540 static const struct v4l2_ioctl_ops video_ioctl_ops = {
1541         .vidioc_querycap            = vidioc_querycap,
1542         .vidioc_enum_fmt_vid_cap    = vidioc_enum_fmt_vid_cap,
1543         .vidioc_g_fmt_vid_cap       = vidioc_g_fmt_vid_cap,
1544         .vidioc_try_fmt_vid_cap     = vidioc_try_fmt_vid_cap,
1545         .vidioc_s_fmt_vid_cap       = vidioc_s_fmt_vid_cap,
1546 #ifdef VBI_IS_WORKING
1547         .vidioc_g_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
1548         .vidioc_try_fmt_vbi_cap     = vidioc_s_fmt_vbi_cap,
1549         .vidioc_s_fmt_vbi_cap       = vidioc_s_fmt_vbi_cap,
1550 #endif
1551         .vidioc_g_audio             = vidioc_g_audio,
1552         .vidioc_s_audio             = vidioc_s_audio,
1553         .vidioc_cropcap             = vidioc_cropcap,
1554 #ifdef VBI_IS_WORKING
1555         .vidioc_g_fmt_sliced_vbi_cap   = vidioc_g_fmt_sliced_vbi_cap,
1556         .vidioc_try_fmt_sliced_vbi_cap = vidioc_try_set_sliced_vbi_cap,
1557         .vidioc_s_fmt_sliced_vbi_cap   = vidioc_try_set_sliced_vbi_cap,
1558 #endif
1559         .vidioc_reqbufs             = vidioc_reqbufs,
1560         .vidioc_querybuf            = vidioc_querybuf,
1561         .vidioc_qbuf                = vidioc_qbuf,
1562         .vidioc_dqbuf               = vidioc_dqbuf,
1563         .vidioc_s_std               = vidioc_s_std,
1564         .vidioc_enum_input          = vidioc_enum_input,
1565         .vidioc_g_input             = vidioc_g_input,
1566         .vidioc_s_input             = vidioc_s_input,
1567         .vidioc_queryctrl           = vidioc_queryctrl,
1568         .vidioc_g_ctrl              = vidioc_g_ctrl,
1569         .vidioc_s_ctrl              = vidioc_s_ctrl,
1570         .vidioc_streamon            = vidioc_streamon,
1571         .vidioc_streamoff           = vidioc_streamoff,
1572         .vidioc_g_tuner             = vidioc_g_tuner,
1573         .vidioc_s_tuner             = vidioc_s_tuner,
1574         .vidioc_g_frequency         = vidioc_g_frequency,
1575         .vidioc_s_frequency         = vidioc_s_frequency,
1576 #ifdef CONFIG_VIDEO_ADV_DEBUG
1577         .vidioc_g_register          = vidioc_g_register,
1578         .vidioc_s_register          = vidioc_s_register,
1579 #endif
1580         .vidioc_g_chip_ident        = vidioc_g_chip_ident,
1581 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1582         .vidiocgmbuf                = vidiocgmbuf,
1583 #endif
1584 };
1585 
1586 static const struct video_device au0828_video_template = {
1587         .fops                       = &au0828_v4l_fops,
1588         .release                    = video_device_release,
1589         .ioctl_ops                  = &video_ioctl_ops,
1590         .minor                      = -1,
1591         .tvnorms                    = V4L2_STD_NTSC_M,
1592         .current_norm               = V4L2_STD_NTSC_M,
1593 };
1594 
1595 /**************************************************************************/
1596 
1597 int au0828_analog_register(struct au0828_dev *dev,
1598                            struct usb_interface *interface)
1599 {
1600         int retval = -ENOMEM;
1601         struct usb_host_interface *iface_desc;
1602         struct usb_endpoint_descriptor *endpoint;
1603         int i;
1604 
1605         dprintk(1, "au0828_analog_register called!\n");
1606 
1607         /* set au0828 usb interface0 to as5 */
1608         retval = usb_set_interface(dev->usbdev,
1609                         interface->cur_altsetting->desc.bInterfaceNumber, 5);
1610         if (retval != 0) {
1611                 printk(KERN_INFO "Failure setting usb interface0 to as5\n");
1612                 return retval;
1613         }
1614 
1615         /* Figure out which endpoint has the isoc interface */
1616         iface_desc = interface->cur_altsetting;
1617         for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
1618                 endpoint = &iface_desc->endpoint[i].desc;
1619                 if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1620                      == USB_DIR_IN) &&
1621                     ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1622                      == USB_ENDPOINT_XFER_ISOC)) {
1623 
1624                         /* we find our isoc in endpoint */
1625                         u16 tmp = le16_to_cpu(endpoint->wMaxPacketSize);
1626                         dev->max_pkt_size = (tmp & 0x07ff) *
1627                                 (((tmp & 0x1800) >> 11) + 1);
1628                         dev->isoc_in_endpointaddr = endpoint->bEndpointAddress;
1629                 }
1630         }
1631         if (!(dev->isoc_in_endpointaddr)) {
1632                 printk(KERN_INFO "Could not locate isoc endpoint\n");
1633                 kfree(dev);
1634                 return -ENODEV;
1635         }
1636 
1637         init_waitqueue_head(&dev->open);
1638         spin_lock_init(&dev->slock);
1639         mutex_init(&dev->lock);
1640 
1641         INIT_LIST_HEAD(&dev->vidq.active);
1642         INIT_LIST_HEAD(&dev->vidq.queued);
1643 
1644         dev->width = NTSC_STD_W;
1645         dev->height = NTSC_STD_H;
1646         dev->field_size = dev->width * dev->height;
1647         dev->frame_size = dev->field_size << 1;
1648         dev->bytesperline = dev->width << 1;
1649         dev->ctrl_ainput = 0;
1650 
1651         /* allocate and fill v4l2 video struct */
1652         dev->vdev = video_device_alloc();
1653         if (NULL == dev->vdev) {
1654                 dprintk(1, "Can't allocate video_device.\n");
1655                 return -ENOMEM;
1656         }
1657 
1658 #ifdef VBI_IS_WORKING
1659         dev->vbi_dev = video_device_alloc();
1660         if (NULL == dev->vbi_dev) {
1661                 dprintk(1, "Can't allocate vbi_device.\n");
1662                 kfree(dev->vdev);
1663                 return -ENOMEM;
1664         }
1665 #endif
1666 
1667         /* Fill the video capture device struct */
1668         *dev->vdev = au0828_video_template;
1669         dev->vdev->parent = &dev->usbdev->dev;
1670         strcpy(dev->vdev->name, "au0828a video");
1671 
1672 #ifdef VBI_IS_WORKING
1673         /* Setup the VBI device */
1674         *dev->vbi_dev = au0828_video_template;
1675         dev->vbi_dev->parent = &dev->usbdev->dev;
1676         strcpy(dev->vbi_dev->name, "au0828a vbi");
1677 #endif
1678 
1679         list_add_tail(&dev->au0828list, &au0828_devlist);
1680 
1681         /* Register the v4l2 device */
1682         retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1);
1683         if (retval != 0) {
1684                 dprintk(1, "unable to register video device (error = %d).\n",
1685                         retval);
1686                 list_del(&dev->au0828list);
1687                 video_device_release(dev->vdev);
1688                 return -ENODEV;
1689         }
1690 
1691 #ifdef VBI_IS_WORKING
1692         /* Register the vbi device */
1693         retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1);
1694         if (retval != 0) {
1695                 dprintk(1, "unable to register vbi device (error = %d).\n",
1696                         retval);
1697                 list_del(&dev->au0828list);
1698                 video_device_release(dev->vbi_dev);
1699                 video_device_release(dev->vdev);
1700                 return -ENODEV;
1701         }
1702 #endif
1703 
1704         dprintk(1, "%s completed!\n", __func__);
1705 
1706         return 0;
1707 }
1708 
1709 
  This page was automatically generated by the LXR engine.