linux/drivers/media/video/em28xx/em28xx-video.c
<<
>>
Prefs
   1/*
   2   em28xx-video.c - driver for Empia EM2800/EM2820/2840 USB
   3                    video capture devices
   4
   5   Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
   6                      Markus Rechberger <mrechberger@gmail.com>
   7                      Mauro Carvalho Chehab <mchehab@infradead.org>
   8                      Sascha Sommer <saschasommer@freenet.de>
   9
  10        Some parts based on SN9C10x PC Camera Controllers GPL driver made
  11                by Luca Risolia <luca.risolia@studio.unibo.it>
  12
  13   This program is free software; you can redistribute it and/or modify
  14   it under the terms of the GNU General Public License as published by
  15   the Free Software Foundation; either version 2 of the License, or
  16   (at your option) any later version.
  17
  18   This program is distributed in the hope that it will be useful,
  19   but WITHOUT ANY WARRANTY; without even the implied warranty of
  20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21   GNU General Public License for more details.
  22
  23   You should have received a copy of the GNU General Public License
  24   along with this program; if not, write to the Free Software
  25   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26 */
  27
  28#include <linux/init.h>
  29#include <linux/list.h>
  30#include <linux/module.h>
  31#include <linux/kernel.h>
  32#include <linux/bitmap.h>
  33#include <linux/usb.h>
  34#include <linux/i2c.h>
  35#include <linux/version.h>
  36#include <linux/mm.h>
  37#include <linux/mutex.h>
  38
  39#include "em28xx.h"
  40#include <media/v4l2-common.h>
  41#include <media/v4l2-ioctl.h>
  42#include <media/v4l2-chip-ident.h>
  43#include <media/msp3400.h>
  44#include <media/tuner.h>
  45
  46#define DRIVER_AUTHOR "Ludovico Cavedon <cavedon@sssup.it>, " \
  47                      "Markus Rechberger <mrechberger@gmail.com>, " \
  48                      "Mauro Carvalho Chehab <mchehab@infradead.org>, " \
  49                      "Sascha Sommer <saschasommer@freenet.de>"
  50
  51#define DRIVER_DESC         "Empia em28xx based USB video device driver"
  52#define EM28XX_VERSION_CODE  KERNEL_VERSION(0, 1, 2)
  53
  54#define em28xx_videodbg(fmt, arg...) do {\
  55        if (video_debug) \
  56                printk(KERN_INFO "%s %s :"fmt, \
  57                         dev->name, __func__ , ##arg); } while (0)
  58
  59static unsigned int isoc_debug;
  60module_param(isoc_debug, int, 0644);
  61MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
  62
  63#define em28xx_isocdbg(fmt, arg...) \
  64do {\
  65        if (isoc_debug) { \
  66                printk(KERN_INFO "%s %s :"fmt, \
  67                         dev->name, __func__ , ##arg); \
  68        } \
  69  } while (0)
  70
  71MODULE_AUTHOR(DRIVER_AUTHOR);
  72MODULE_DESCRIPTION(DRIVER_DESC);
  73MODULE_LICENSE("GPL");
  74
  75static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
  76static unsigned int vbi_nr[]   = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
  77static unsigned int radio_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
  78
  79module_param_array(video_nr, int, NULL, 0444);
  80module_param_array(vbi_nr, int, NULL, 0444);
  81module_param_array(radio_nr, int, NULL, 0444);
  82MODULE_PARM_DESC(video_nr, "video device numbers");
  83MODULE_PARM_DESC(vbi_nr,   "vbi device numbers");
  84MODULE_PARM_DESC(radio_nr, "radio device numbers");
  85
  86static unsigned int video_debug;
  87module_param(video_debug, int, 0644);
  88MODULE_PARM_DESC(video_debug, "enable debug messages [video]");
  89
  90/* supported video standards */
  91static struct em28xx_fmt format[] = {
  92        {
  93                .name     = "16 bpp YUY2, 4:2:2, packed",
  94                .fourcc   = V4L2_PIX_FMT_YUYV,
  95                .depth    = 16,
  96                .reg      = EM28XX_OUTFMT_YUV422_Y0UY1V,
  97        }, {
  98                .name     = "16 bpp RGB 565, LE",
  99                .fourcc   = V4L2_PIX_FMT_RGB565,
 100                .depth    = 16,
 101                .reg      = EM28XX_OUTFMT_RGB_16_656,
 102        }, {
 103                .name     = "8 bpp Bayer BGBG..GRGR",
 104                .fourcc   = V4L2_PIX_FMT_SBGGR8,
 105                .depth    = 8,
 106                .reg      = EM28XX_OUTFMT_RGB_8_BGBG,
 107        }, {
 108                .name     = "8 bpp Bayer GRGR..BGBG",
 109                .fourcc   = V4L2_PIX_FMT_SGRBG8,
 110                .depth    = 8,
 111                .reg      = EM28XX_OUTFMT_RGB_8_GRGR,
 112        }, {
 113                .name     = "8 bpp Bayer GBGB..RGRG",
 114                .fourcc   = V4L2_PIX_FMT_SGBRG8,
 115                .depth    = 8,
 116                .reg      = EM28XX_OUTFMT_RGB_8_GBGB,
 117        }, {
 118                .name     = "12 bpp YUV411",
 119                .fourcc   = V4L2_PIX_FMT_YUV411P,
 120                .depth    = 12,
 121                .reg      = EM28XX_OUTFMT_YUV411,
 122        },
 123};
 124
 125/* supported controls */
 126/* Common to all boards */
 127static struct v4l2_queryctrl ac97_qctrl[] = {
 128        {
 129                .id = V4L2_CID_AUDIO_VOLUME,
 130                .type = V4L2_CTRL_TYPE_INTEGER,
 131                .name = "Volume",
 132                .minimum = 0x0,
 133                .maximum = 0x1f,
 134                .step = 0x1,
 135                .default_value = 0x1f,
 136                .flags = V4L2_CTRL_FLAG_SLIDER,
 137        }, {
 138                .id = V4L2_CID_AUDIO_MUTE,
 139                .type = V4L2_CTRL_TYPE_BOOLEAN,
 140                .name = "Mute",
 141                .minimum = 0,
 142                .maximum = 1,
 143                .step = 1,
 144                .default_value = 1,
 145                .flags = 0,
 146        }
 147};
 148
 149/* ------------------------------------------------------------------
 150        DMA and thread functions
 151   ------------------------------------------------------------------*/
 152
 153/*
 154 * Announces that a buffer were filled and request the next
 155 */
 156static inline void buffer_filled(struct em28xx *dev,
 157                                  struct em28xx_dmaqueue *dma_q,
 158                                  struct em28xx_buffer *buf)
 159{
 160        /* Advice that buffer was filled */
 161        em28xx_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
 162        buf->vb.state = VIDEOBUF_DONE;
 163        buf->vb.field_count++;
 164        do_gettimeofday(&buf->vb.ts);
 165
 166        dev->isoc_ctl.vid_buf = NULL;
 167
 168        list_del(&buf->vb.queue);
 169        wake_up(&buf->vb.done);
 170}
 171
 172static inline void vbi_buffer_filled(struct em28xx *dev,
 173                                     struct em28xx_dmaqueue *dma_q,
 174                                     struct em28xx_buffer *buf)
 175{
 176        /* Advice that buffer was filled */
 177        em28xx_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
 178
 179        buf->vb.state = VIDEOBUF_DONE;
 180        buf->vb.field_count++;
 181        do_gettimeofday(&buf->vb.ts);
 182
 183        dev->isoc_ctl.vbi_buf = NULL;
 184
 185        list_del(&buf->vb.queue);
 186        wake_up(&buf->vb.done);
 187}
 188
 189/*
 190 * Identify the buffer header type and properly handles
 191 */
 192static void em28xx_copy_video(struct em28xx *dev,
 193                              struct em28xx_dmaqueue  *dma_q,
 194                              struct em28xx_buffer *buf,
 195                              unsigned char *p,
 196                              unsigned char *outp, unsigned long len)
 197{
 198        void *fieldstart, *startwrite, *startread;
 199        int  linesdone, currlinedone, offset, lencopy, remain;
 200        int bytesperline = dev->width << 1;
 201
 202        if (dma_q->pos + len > buf->vb.size)
 203                len = buf->vb.size - dma_q->pos;
 204
 205        if (p[0] != 0x88 && p[0] != 0x22) {
 206                em28xx_isocdbg("frame is not complete\n");
 207                len += 4;
 208        } else
 209                p += 4;
 210
 211        startread = p;
 212        remain = len;
 213
 214        if (dev->progressive)
 215                fieldstart = outp;
 216        else {
 217                /* Interlaces two half frames */
 218                if (buf->top_field)
 219                        fieldstart = outp;
 220                else
 221                        fieldstart = outp + bytesperline;
 222        }
 223
 224        linesdone = dma_q->pos / bytesperline;
 225        currlinedone = dma_q->pos % bytesperline;
 226
 227        if (dev->progressive)
 228                offset = linesdone * bytesperline + currlinedone;
 229        else
 230                offset = linesdone * bytesperline * 2 + currlinedone;
 231
 232        startwrite = fieldstart + offset;
 233        lencopy = bytesperline - currlinedone;
 234        lencopy = lencopy > remain ? remain : lencopy;
 235
 236        if ((char *)startwrite + lencopy > (char *)outp + buf->vb.size) {
 237                em28xx_isocdbg("Overflow of %zi bytes past buffer end (1)\n",
 238                               ((char *)startwrite + lencopy) -
 239                               ((char *)outp + buf->vb.size));
 240                remain = (char *)outp + buf->vb.size - (char *)startwrite;
 241                lencopy = remain;
 242        }
 243        if (lencopy <= 0)
 244                return;
 245        memcpy(startwrite, startread, lencopy);
 246
 247        remain -= lencopy;
 248
 249        while (remain > 0) {
 250                startwrite += lencopy + bytesperline;
 251                startread += lencopy;
 252                if (bytesperline > remain)
 253                        lencopy = remain;
 254                else
 255                        lencopy = bytesperline;
 256
 257                if ((char *)startwrite + lencopy > (char *)outp +
 258                    buf->vb.size) {
 259                        em28xx_isocdbg("Overflow of %zi bytes past buffer end"
 260                                       "(2)\n",
 261                                       ((char *)startwrite + lencopy) -
 262                                       ((char *)outp + buf->vb.size));
 263                        lencopy = remain = (char *)outp + buf->vb.size -
 264                                           (char *)startwrite;
 265                }
 266                if (lencopy <= 0)
 267                        break;
 268
 269                memcpy(startwrite, startread, lencopy);
 270
 271                remain -= lencopy;
 272        }
 273
 274        dma_q->pos += len;
 275}
 276
 277static void em28xx_copy_vbi(struct em28xx *dev,
 278                              struct em28xx_dmaqueue  *dma_q,
 279                              struct em28xx_buffer *buf,
 280                              unsigned char *p,
 281                              unsigned char *outp, unsigned long len)
 282{
 283        void *startwrite, *startread;
 284        int  offset;
 285        int bytesperline = 720;
 286
 287        if (dev == NULL) {
 288                em28xx_isocdbg("dev is null\n");
 289                return;
 290        }
 291
 292        if (dma_q == NULL) {
 293                em28xx_isocdbg("dma_q is null\n");
 294                return;
 295        }
 296        if (buf == NULL) {
 297                return;
 298        }
 299        if (p == NULL) {
 300                em28xx_isocdbg("p is null\n");
 301                return;
 302        }
 303        if (outp == NULL) {
 304                em28xx_isocdbg("outp is null\n");
 305                return;
 306        }
 307
 308        if (dma_q->pos + len > buf->vb.size)
 309                len = buf->vb.size - dma_q->pos;
 310
 311        if ((p[0] == 0x33 && p[1] == 0x95) ||
 312            (p[0] == 0x88 && p[1] == 0x88)) {
 313                /* Header field, advance past it */
 314                p += 4;
 315        } else {
 316                len += 4;
 317        }
 318
 319        startread = p;
 320
 321        startwrite = outp + dma_q->pos;
 322        offset = dma_q->pos;
 323
 324        /* Make sure the bottom field populates the second half of the frame */
 325        if (buf->top_field == 0) {
 326                startwrite += bytesperline * 0x0c;
 327                offset += bytesperline * 0x0c;
 328        }
 329
 330        memcpy(startwrite, startread, len);
 331        dma_q->pos += len;
 332}
 333
 334static inline void print_err_status(struct em28xx *dev,
 335                                     int packet, int status)
 336{
 337        char *errmsg = "Unknown";
 338
 339        switch (status) {
 340        case -ENOENT:
 341                errmsg = "unlinked synchronuously";
 342                break;
 343        case -ECONNRESET:
 344                errmsg = "unlinked asynchronuously";
 345                break;
 346        case -ENOSR:
 347                errmsg = "Buffer error (overrun)";
 348                break;
 349        case -EPIPE:
 350                errmsg = "Stalled (device not responding)";
 351                break;
 352        case -EOVERFLOW:
 353                errmsg = "Babble (bad cable?)";
 354                break;
 355        case -EPROTO:
 356                errmsg = "Bit-stuff error (bad cable?)";
 357                break;
 358        case -EILSEQ:
 359                errmsg = "CRC/Timeout (could be anything)";
 360                break;
 361        case -ETIME:
 362                errmsg = "Device does not respond";
 363                break;
 364        }
 365        if (packet < 0) {
 366                em28xx_isocdbg("URB status %d [%s].\n", status, errmsg);
 367        } else {
 368                em28xx_isocdbg("URB packet %d, status %d [%s].\n",
 369                               packet, status, errmsg);
 370        }
 371}
 372
 373/*
 374 * video-buf generic routine to get the next available buffer
 375 */
 376static inline void get_next_buf(struct em28xx_dmaqueue *dma_q,
 377                                          struct em28xx_buffer **buf)
 378{
 379        struct em28xx *dev = container_of(dma_q, struct em28xx, vidq);
 380        char *outp;
 381
 382        if (list_empty(&dma_q->active)) {
 383                em28xx_isocdbg("No active queue to serve\n");
 384                dev->isoc_ctl.vid_buf = NULL;
 385                *buf = NULL;
 386                return;
 387        }
 388
 389        /* Get the next buffer */
 390        *buf = list_entry(dma_q->active.next, struct em28xx_buffer, vb.queue);
 391
 392        /* Cleans up buffer - Usefull for testing for frame/URB loss */
 393        outp = videobuf_to_vmalloc(&(*buf)->vb);
 394        memset(outp, 0, (*buf)->vb.size);
 395
 396        dev->isoc_ctl.vid_buf = *buf;
 397
 398        return;
 399}
 400
 401/*
 402 * video-buf generic routine to get the next available VBI buffer
 403 */
 404static inline void vbi_get_next_buf(struct em28xx_dmaqueue *dma_q,
 405                                    struct em28xx_buffer **buf)
 406{
 407        struct em28xx *dev = container_of(dma_q, struct em28xx, vbiq);
 408        char *outp;
 409
 410        if (list_empty(&dma_q->active)) {
 411                em28xx_isocdbg("No active queue to serve\n");
 412                dev->isoc_ctl.vbi_buf = NULL;
 413                *buf = NULL;
 414                return;
 415        }
 416
 417        /* Get the next buffer */
 418        *buf = list_entry(dma_q->active.next, struct em28xx_buffer, vb.queue);
 419        /* Cleans up buffer - Usefull for testing for frame/URB loss */
 420        outp = videobuf_to_vmalloc(&(*buf)->vb);
 421        memset(outp, 0x00, (*buf)->vb.size);
 422
 423        dev->isoc_ctl.vbi_buf = *buf;
 424
 425        return;
 426}
 427
 428/*
 429 * Controls the isoc copy of each urb packet
 430 */
 431static inline int em28xx_isoc_copy(struct em28xx *dev, struct urb *urb)
 432{
 433        struct em28xx_buffer    *buf;
 434        struct em28xx_dmaqueue  *dma_q = &dev->vidq;
 435        unsigned char *outp = NULL;
 436        int i, len = 0, rc = 1;
 437        unsigned char *p;
 438
 439        if (!dev)
 440                return 0;
 441
 442        if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
 443                return 0;
 444
 445        if (urb->status < 0) {
 446                print_err_status(dev, -1, urb->status);
 447                if (urb->status == -ENOENT)
 448                        return 0;
 449        }
 450
 451        buf = dev->isoc_ctl.vid_buf;
 452        if (buf != NULL)
 453                outp = videobuf_to_vmalloc(&buf->vb);
 454
 455        for (i = 0; i < urb->number_of_packets; i++) {
 456                int status = urb->iso_frame_desc[i].status;
 457
 458                if (status < 0) {
 459                        print_err_status(dev, i, status);
 460                        if (urb->iso_frame_desc[i].status != -EPROTO)
 461                                continue;
 462                }
 463
 464                len = urb->iso_frame_desc[i].actual_length - 4;
 465
 466                if (urb->iso_frame_desc[i].actual_length <= 0) {
 467                        /* em28xx_isocdbg("packet %d is empty",i); - spammy */
 468                        continue;
 469                }
 470                if (urb->iso_frame_desc[i].actual_length >
 471                                                dev->max_pkt_size) {
 472                        em28xx_isocdbg("packet bigger than packet size");
 473                        continue;
 474                }
 475
 476                p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
 477
 478                /* FIXME: incomplete buffer checks where removed to make
 479                   logic simpler. Impacts of those changes should be evaluated
 480                 */
 481                if (p[0] == 0x33 && p[1] == 0x95 && p[2] == 0x00) {
 482                        em28xx_isocdbg("VBI HEADER!!!\n");
 483                        /* FIXME: Should add vbi copy */
 484                        continue;
 485                }
 486                if (p[0] == 0x22 && p[1] == 0x5a) {
 487                        em28xx_isocdbg("Video frame %d, length=%i, %s\n", p[2],
 488                                       len, (p[2] & 1) ? "odd" : "even");
 489
 490                        if (dev->progressive || !(p[2] & 1)) {
 491                                if (buf != NULL)
 492                                        buffer_filled(dev, dma_q, buf);
 493                                get_next_buf(dma_q, &buf);
 494                                if (buf == NULL)
 495                                        outp = NULL;
 496                                else
 497                                        outp = videobuf_to_vmalloc(&buf->vb);
 498                        }
 499
 500                        if (buf != NULL) {
 501                                if (p[2] & 1)
 502                                        buf->top_field = 0;
 503                                else
 504                                        buf->top_field = 1;
 505                        }
 506
 507                        dma_q->pos = 0;
 508                }
 509                if (buf != NULL)
 510                        em28xx_copy_video(dev, dma_q, buf, p, outp, len);
 511        }
 512        return rc;
 513}
 514
 515/* Version of isoc handler that takes into account a mixture of video and
 516   VBI data */
 517static inline int em28xx_isoc_copy_vbi(struct em28xx *dev, struct urb *urb)
 518{
 519        struct em28xx_buffer    *buf, *vbi_buf;
 520        struct em28xx_dmaqueue  *dma_q = &dev->vidq;
 521        struct em28xx_dmaqueue  *vbi_dma_q = &dev->vbiq;
 522        unsigned char *outp = NULL;
 523        unsigned char *vbioutp = NULL;
 524        int i, len = 0, rc = 1;
 525        unsigned char *p;
 526        int vbi_size;
 527
 528        if (!dev)
 529                return 0;
 530
 531        if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
 532                return 0;
 533
 534        if (urb->status < 0) {
 535                print_err_status(dev, -1, urb->status);
 536                if (urb->status == -ENOENT)
 537                        return 0;
 538        }
 539
 540        buf = dev->isoc_ctl.vid_buf;
 541        if (buf != NULL)
 542                outp = videobuf_to_vmalloc(&buf->vb);
 543
 544        vbi_buf = dev->isoc_ctl.vbi_buf;
 545        if (vbi_buf != NULL)
 546                vbioutp = videobuf_to_vmalloc(&vbi_buf->vb);
 547
 548        for (i = 0; i < urb->number_of_packets; i++) {
 549                int status = urb->iso_frame_desc[i].status;
 550
 551                if (status < 0) {
 552                        print_err_status(dev, i, status);
 553                        if (urb->iso_frame_desc[i].status != -EPROTO)
 554                                continue;
 555                }
 556
 557                len = urb->iso_frame_desc[i].actual_length - 4;
 558
 559                if (urb->iso_frame_desc[i].actual_length <= 0) {
 560                        /* em28xx_isocdbg("packet %d is empty",i); - spammy */
 561                        continue;
 562                }
 563                if (urb->iso_frame_desc[i].actual_length >
 564                                                dev->max_pkt_size) {
 565                        em28xx_isocdbg("packet bigger than packet size");
 566                        continue;
 567                }
 568
 569                p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
 570
 571                /* capture type 0 = vbi start
 572                   capture type 1 = video start
 573                   capture type 2 = video in progress */
 574                if (p[0] == 0x33 && p[1] == 0x95) {
 575                        dev->capture_type = 0;
 576                        dev->vbi_read = 0;
 577                        em28xx_isocdbg("VBI START HEADER!!!\n");
 578                        dev->cur_field = p[2];
 579                }
 580
 581                /* FIXME: get rid of hard-coded value */
 582                vbi_size = 720 * 0x0c;
 583
 584                if (dev->capture_type == 0) {
 585                        if (dev->vbi_read >= vbi_size) {
 586                                /* We've already read all the VBI data, so
 587                                   treat the rest as video */
 588                                em28xx_isocdbg("dev->vbi_read > vbi_size\n");
 589                        } else if ((dev->vbi_read + len) < vbi_size) {
 590                                /* This entire frame is VBI data */
 591                                if (dev->vbi_read == 0 &&
 592                                    (!(dev->cur_field & 1))) {
 593                                        /* Brand new frame */
 594                                        if (vbi_buf != NULL)
 595                                                vbi_buffer_filled(dev,
 596                                                                  vbi_dma_q,
 597                                                                  vbi_buf);
 598                                        vbi_get_next_buf(vbi_dma_q, &vbi_buf);
 599                                        if (vbi_buf == NULL)
 600                                                vbioutp = NULL;
 601                                        else
 602                                                vbioutp = videobuf_to_vmalloc(
 603                                                        &vbi_buf->vb);
 604                                }
 605
 606                                if (dev->vbi_read == 0) {
 607                                        vbi_dma_q->pos = 0;
 608                                        if (vbi_buf != NULL) {
 609                                                if (dev->cur_field & 1)
 610                                                        vbi_buf->top_field = 0;
 611                                                else
 612                                                        vbi_buf->top_field = 1;
 613                                        }
 614                                }
 615
 616                                dev->vbi_read += len;
 617                                em28xx_copy_vbi(dev, vbi_dma_q, vbi_buf, p,
 618                                                vbioutp, len);
 619                        } else {
 620                                /* Some of this frame is VBI data and some is
 621                                   video data */
 622                                int vbi_data_len = vbi_size - dev->vbi_read;
 623                                dev->vbi_read += vbi_data_len;
 624                                em28xx_copy_vbi(dev, vbi_dma_q, vbi_buf, p,
 625                                                vbioutp, vbi_data_len);
 626                                dev->capture_type = 1;
 627                                p += vbi_data_len;
 628                                len -= vbi_data_len;
 629                        }
 630                }
 631
 632                if (dev->capture_type == 1) {
 633                        dev->capture_type = 2;
 634                        em28xx_isocdbg("Video frame %d, length=%i, %s\n", p[2],
 635                                       len, (p[2] & 1) ? "odd" : "even");
 636
 637                        if (dev->progressive || !(dev->cur_field & 1)) {
 638                                if (buf != NULL)
 639                                        buffer_filled(dev, dma_q, buf);
 640                                get_next_buf(dma_q, &buf);
 641                                if (buf == NULL)
 642                                        outp = NULL;
 643                                else
 644                                        outp = videobuf_to_vmalloc(&buf->vb);
 645                        }
 646                        if (buf != NULL) {
 647                                if (dev->cur_field & 1)
 648                                        buf->top_field = 0;
 649                                else
 650                                        buf->top_field = 1;
 651                        }
 652
 653                        dma_q->pos = 0;
 654                }
 655                if (buf != NULL && dev->capture_type == 2)
 656                        em28xx_copy_video(dev, dma_q, buf, p, outp, len);
 657        }
 658        return rc;
 659}
 660
 661
 662/* ------------------------------------------------------------------
 663        Videobuf operations
 664   ------------------------------------------------------------------*/
 665
 666static int
 667buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
 668{
 669        struct em28xx_fh *fh = vq->priv_data;
 670        struct em28xx        *dev = fh->dev;
 671        struct v4l2_frequency f;
 672
 673        *size = (fh->dev->width * fh->dev->height * dev->format->depth + 7)
 674                >> 3;
 675
 676        if (0 == *count)
 677                *count = EM28XX_DEF_BUF;
 678
 679        if (*count < EM28XX_MIN_BUF)
 680                *count = EM28XX_MIN_BUF;
 681
 682        /* Ask tuner to go to analog or radio mode */
 683        memset(&f, 0, sizeof(f));
 684        f.frequency = dev->ctl_freq;
 685        f.type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
 686
 687        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f);
 688
 689        return 0;
 690}
 691
 692/* This is called *without* dev->slock held; please keep it that way */
 693static void free_buffer(struct videobuf_queue *vq, struct em28xx_buffer *buf)
 694{
 695        struct em28xx_fh     *fh  = vq->priv_data;
 696        struct em28xx        *dev = fh->dev;
 697        unsigned long flags = 0;
 698        if (in_interrupt())
 699                BUG();
 700
 701        /* We used to wait for the buffer to finish here, but this didn't work
 702           because, as we were keeping the state as VIDEOBUF_QUEUED,
 703           videobuf_queue_cancel marked it as finished for us.
 704           (Also, it could wedge forever if the hardware was misconfigured.)
 705
 706           This should be safe; by the time we get here, the buffer isn't
 707           queued anymore. If we ever start marking the buffers as
 708           VIDEOBUF_ACTIVE, it won't be, though.
 709        */
 710        spin_lock_irqsave(&dev->slock, flags);
 711        if (dev->isoc_ctl.vid_buf == buf)
 712                dev->isoc_ctl.vid_buf = NULL;
 713        spin_unlock_irqrestore(&dev->slock, flags);
 714
 715        videobuf_vmalloc_free(&buf->vb);
 716        buf->vb.state = VIDEOBUF_NEEDS_INIT;
 717}
 718
 719static int
 720buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
 721                                                enum v4l2_field field)
 722{
 723        struct em28xx_fh     *fh  = vq->priv_data;
 724        struct em28xx_buffer *buf = container_of(vb, struct em28xx_buffer, vb);
 725        struct em28xx        *dev = fh->dev;
 726        int                  rc = 0, urb_init = 0;
 727
 728        buf->vb.size = (fh->dev->width * fh->dev->height * dev->format->depth
 729                        + 7) >> 3;
 730
 731        if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
 732                return -EINVAL;
 733
 734        buf->vb.width  = dev->width;
 735        buf->vb.height = dev->height;
 736        buf->vb.field  = field;
 737
 738        if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
 739                rc = videobuf_iolock(vq, &buf->vb, NULL);
 740                if (rc < 0)
 741                        goto fail;
 742        }
 743
 744        if (!dev->isoc_ctl.num_bufs)
 745                urb_init = 1;
 746
 747        if (urb_init) {
 748                if (em28xx_vbi_supported(dev) == 1)
 749                        rc = em28xx_init_isoc(dev, EM28XX_NUM_PACKETS,
 750                                              EM28XX_NUM_BUFS,
 751                                              dev->max_pkt_size,
 752                                              em28xx_isoc_copy_vbi);
 753                else
 754                        rc = em28xx_init_isoc(dev, EM28XX_NUM_PACKETS,
 755                                              EM28XX_NUM_BUFS,
 756                                              dev->max_pkt_size,
 757                                              em28xx_isoc_copy);
 758                if (rc < 0)
 759                        goto fail;
 760        }
 761
 762        buf->vb.state = VIDEOBUF_PREPARED;
 763        return 0;
 764
 765fail:
 766        free_buffer(vq, buf);
 767        return rc;
 768}
 769
 770static void
 771buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
 772{
 773        struct em28xx_buffer    *buf     = container_of(vb,
 774                                                        struct em28xx_buffer,
 775                                                        vb);
 776        struct em28xx_fh        *fh      = vq->priv_data;
 777        struct em28xx           *dev     = fh->dev;
 778        struct em28xx_dmaqueue  *vidq    = &dev->vidq;
 779
 780        buf->vb.state = VIDEOBUF_QUEUED;
 781        list_add_tail(&buf->vb.queue, &vidq->active);
 782
 783}
 784
 785static void buffer_release(struct videobuf_queue *vq,
 786                                struct videobuf_buffer *vb)
 787{
 788        struct em28xx_buffer   *buf  = container_of(vb,
 789                                                    struct em28xx_buffer,
 790                                                    vb);
 791        struct em28xx_fh       *fh   = vq->priv_data;
 792        struct em28xx          *dev  = (struct em28xx *)fh->dev;
 793
 794        em28xx_isocdbg("em28xx: called buffer_release\n");
 795
 796        free_buffer(vq, buf);
 797}
 798
 799static struct videobuf_queue_ops em28xx_video_qops = {
 800        .buf_setup      = buffer_setup,
 801        .buf_prepare    = buffer_prepare,
 802        .buf_queue      = buffer_queue,
 803        .buf_release    = buffer_release,
 804};
 805
 806/*********************  v4l2 interface  **************************************/
 807
 808static void video_mux(struct em28xx *dev, int index)
 809{
 810        dev->ctl_input = index;
 811        dev->ctl_ainput = INPUT(index)->amux;
 812        dev->ctl_aoutput = INPUT(index)->aout;
 813
 814        if (!dev->ctl_aoutput)
 815                dev->ctl_aoutput = EM28XX_AOUT_MASTER;
 816
 817        v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
 818                        INPUT(index)->vmux, 0, 0);
 819
 820        if (dev->board.has_msp34xx) {
 821                if (dev->i2s_speed) {
 822                        v4l2_device_call_all(&dev->v4l2_dev, 0, audio,
 823                                s_i2s_clock_freq, dev->i2s_speed);
 824                }
 825                /* Note: this is msp3400 specific */
 826                v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
 827                         dev->ctl_ainput, MSP_OUTPUT(MSP_SC_IN_DSP_SCART1), 0);
 828        }
 829
 830        if (dev->board.adecoder != EM28XX_NOADECODER) {
 831                v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
 832                        dev->ctl_ainput, dev->ctl_aoutput, 0);
 833        }
 834
 835        em28xx_audio_analog_set(dev);
 836}
 837
 838/* Usage lock check functions */
 839static int res_get(struct em28xx_fh *fh, unsigned int bit)
 840{
 841        struct em28xx    *dev = fh->dev;
 842
 843        if (fh->resources & bit)
 844                /* have it already allocated */
 845                return 1;
 846
 847        /* is it free? */
 848        mutex_lock(&dev->lock);
 849        if (dev->resources & bit) {
 850                /* no, someone else uses it */
 851                mutex_unlock(&dev->lock);
 852                return 0;
 853        }
 854        /* it's free, grab it */
 855        fh->resources  |= bit;
 856        dev->resources |= bit;
 857        em28xx_videodbg("res: get %d\n", bit);
 858        mutex_unlock(&dev->lock);
 859        return 1;
 860}
 861
 862static int res_check(struct em28xx_fh *fh, unsigned int bit)
 863{
 864        return fh->resources & bit;
 865}
 866
 867static int res_locked(struct em28xx *dev, unsigned int bit)
 868{
 869        return dev->resources & bit;
 870}
 871
 872static void res_free(struct em28xx_fh *fh, unsigned int bits)
 873{
 874        struct em28xx    *dev = fh->dev;
 875
 876        BUG_ON((fh->resources & bits) != bits);
 877
 878        mutex_lock(&dev->lock);
 879        fh->resources  &= ~bits;
 880        dev->resources &= ~bits;
 881        em28xx_videodbg("res: put %d\n", bits);
 882        mutex_unlock(&dev->lock);
 883}
 884
 885static int get_ressource(struct em28xx_fh *fh)
 886{
 887        switch (fh->type) {
 888        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
 889                return EM28XX_RESOURCE_VIDEO;
 890        case V4L2_BUF_TYPE_VBI_CAPTURE:
 891                return EM28XX_RESOURCE_VBI;
 892        default:
 893                BUG();
 894                return 0;
 895        }
 896}
 897
 898/*
 899 * ac97_queryctrl()
 900 * return the ac97 supported controls
 901 */
 902static int ac97_queryctrl(struct v4l2_queryctrl *qc)
 903{
 904        int i;
 905
 906        for (i = 0; i < ARRAY_SIZE(ac97_qctrl); i++) {
 907                if (qc->id && qc->id == ac97_qctrl[i].id) {
 908                        memcpy(qc, &(ac97_qctrl[i]), sizeof(*qc));
 909                        return 0;
 910                }
 911        }
 912
 913        /* Control is not ac97 related */
 914        return 1;
 915}
 916
 917/*
 918 * ac97_get_ctrl()
 919 * return the current values for ac97 mute and volume
 920 */
 921static int ac97_get_ctrl(struct em28xx *dev, struct v4l2_control *ctrl)
 922{
 923        switch (ctrl->id) {
 924        case V4L2_CID_AUDIO_MUTE:
 925                ctrl->value = dev->mute;
 926                return 0;
 927        case V4L2_CID_AUDIO_VOLUME:
 928                ctrl->value = dev->volume;
 929                return 0;
 930        default:
 931                /* Control is not ac97 related */
 932                return 1;
 933        }
 934}
 935
 936/*
 937 * ac97_set_ctrl()
 938 * set values for ac97 mute and volume
 939 */
 940static int ac97_set_ctrl(struct em28xx *dev, const struct v4l2_control *ctrl)
 941{
 942        int i;
 943
 944        for (i = 0; i < ARRAY_SIZE(ac97_qctrl); i++)
 945                if (ctrl->id == ac97_qctrl[i].id)
 946                        goto handle;
 947
 948        /* Announce that hasn't handle it */
 949        return 1;
 950
 951handle:
 952        if (ctrl->value < ac97_qctrl[i].minimum ||
 953            ctrl->value > ac97_qctrl[i].maximum)
 954                return -ERANGE;
 955
 956        switch (ctrl->id) {
 957        case V4L2_CID_AUDIO_MUTE:
 958                dev->mute = ctrl->value;
 959                break;
 960        case V4L2_CID_AUDIO_VOLUME:
 961                dev->volume = ctrl->value;
 962                break;
 963        }
 964
 965        return em28xx_audio_analog_set(dev);
 966}
 967
 968static int check_dev(struct em28xx *dev)
 969{
 970        if (dev->state & DEV_DISCONNECTED) {
 971                em28xx_errdev("v4l2 ioctl: device not present\n");
 972                return -ENODEV;
 973        }
 974
 975        if (dev->state & DEV_MISCONFIGURED) {
 976                em28xx_errdev("v4l2 ioctl: device is misconfigured; "
 977                              "close and open it again\n");
 978                return -EIO;
 979        }
 980        return 0;
 981}
 982
 983static void get_scale(struct em28xx *dev,
 984                        unsigned int width, unsigned int height,
 985                        unsigned int *hscale, unsigned int *vscale)
 986{
 987        unsigned int          maxw = norm_maxw(dev);
 988        unsigned int          maxh = norm_maxh(dev);
 989
 990        *hscale = (((unsigned long)maxw) << 12) / width - 4096L;
 991        if (*hscale >= 0x4000)
 992                *hscale = 0x3fff;
 993
 994        *vscale = (((unsigned long)maxh) << 12) / height - 4096L;
 995        if (*vscale >= 0x4000)
 996                *vscale = 0x3fff;
 997}
 998
 999/* ------------------------------------------------------------------
1000        IOCTL vidioc handling
1001   ------------------------------------------------------------------*/
1002
1003static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1004                                        struct v4l2_format *f)
1005{
1006        struct em28xx_fh      *fh  = priv;
1007        struct em28xx         *dev = fh->dev;
1008
1009        mutex_lock(&dev->lock);
1010
1011        f->fmt.pix.width = dev->width;
1012        f->fmt.pix.height = dev->height;
1013        f->fmt.pix.pixelformat = dev->format->fourcc;
1014        f->fmt.pix.bytesperline = (dev->width * dev->format->depth + 7) >> 3;
1015        f->fmt.pix.sizeimage = f->fmt.pix.bytesperline  * dev->height;
1016        f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1017
1018        /* FIXME: TOP? NONE? BOTTOM? ALTENATE? */
1019        if (dev->progressive)
1020                f->fmt.pix.field = V4L2_FIELD_NONE;
1021        else
1022                f->fmt.pix.field = dev->interlaced ?
1023                           V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
1024
1025        mutex_unlock(&dev->lock);
1026        return 0;
1027}
1028
1029static struct em28xx_fmt *format_by_fourcc(unsigned int fourcc)
1030{
1031        unsigned int i;
1032
1033        for (i = 0; i < ARRAY_SIZE(format); i++)
1034                if (format[i].fourcc == fourcc)
1035                        return &format[i];
1036
1037        return NULL;
1038}
1039
1040static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1041                        struct v4l2_format *f)
1042{
1043        struct em28xx_fh      *fh    = priv;
1044        struct em28xx         *dev   = fh->dev;
1045        unsigned int          width  = f->fmt.pix.width;
1046        unsigned int          height = f->fmt.pix.height;
1047        unsigned int          maxw   = norm_maxw(dev);
1048        unsigned int          maxh   = norm_maxh(dev);
1049        unsigned int          hscale, vscale;
1050        struct em28xx_fmt     *fmt;
1051
1052        fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1053        if (!fmt) {
1054                em28xx_videodbg("Fourcc format (%08x) invalid.\n",
1055                                f->fmt.pix.pixelformat);
1056                return -EINVAL;
1057        }
1058
1059        if (dev->board.is_em2800) {
1060                /* the em2800 can only scale down to 50% */
1061                height = height > (3 * maxh / 4) ? maxh : maxh / 2;
1062                width = width > (3 * maxw / 4) ? maxw : maxw / 2;
1063                /* According to empiatech support the MaxPacketSize is too small
1064                 * to support framesizes larger than 640x480 @ 30 fps or 640x576
1065                 * @ 25 fps.  As this would cut of a part of the image we prefer
1066                 * 360x576 or 360x480 for now */
1067                if (width == maxw && height == maxh)
1068                        width /= 2;
1069        } else {
1070                /* width must even because of the YUYV format
1071                   height must be even because of interlacing */
1072                v4l_bound_align_image(&width, 48, maxw, 1, &height, 32, maxh,
1073                                      1, 0);
1074        }
1075
1076        get_scale(dev, width, height, &hscale, &vscale);
1077
1078        width = (((unsigned long)maxw) << 12) / (hscale + 4096L);
1079        height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
1080
1081        f->fmt.pix.width = width;
1082        f->fmt.pix.height = height;
1083        f->fmt.pix.pixelformat = fmt->fourcc;
1084        f->fmt.pix.bytesperline = (dev->width * fmt->depth + 7) >> 3;
1085        f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height;
1086        f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1087        if (dev->progressive)
1088                f->fmt.pix.field = V4L2_FIELD_NONE;
1089        else
1090                f->fmt.pix.field = dev->interlaced ?
1091                           V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
1092
1093        return 0;
1094}
1095
1096static int em28xx_set_video_format(struct em28xx *dev, unsigned int fourcc,
1097                                   unsigned width, unsigned height)
1098{
1099        struct em28xx_fmt     *fmt;
1100
1101        fmt = format_by_fourcc(fourcc);
1102        if (!fmt)
1103                return -EINVAL;
1104
1105        dev->format = fmt;
1106        dev->width  = width;
1107        dev->height = height;
1108
1109        /* set new image size */
1110        get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
1111
1112        em28xx_set_alternate(dev);
1113        em28xx_resolution_set(dev);
1114
1115        return 0;
1116}
1117
1118static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1119                        struct v4l2_format *f)
1120{
1121        struct em28xx_fh      *fh  = priv;
1122        struct em28xx         *dev = fh->dev;
1123        int                   rc;
1124
1125        rc = check_dev(dev);
1126        if (rc < 0)
1127                return rc;
1128
1129        mutex_lock(&dev->lock);
1130
1131        vidioc_try_fmt_vid_cap(file, priv, f);
1132
1133        if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1134                em28xx_errdev("%s queue busy\n", __func__);
1135                rc = -EBUSY;
1136                goto out;
1137        }
1138
1139        rc = em28xx_set_video_format(dev, f->fmt.pix.pixelformat,
1140                                f->fmt.pix.width, f->fmt.pix.height);
1141
1142out:
1143        mutex_unlock(&dev->lock);
1144        return rc;
1145}
1146
1147static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *norm)
1148{
1149        struct em28xx_fh   *fh  = priv;
1150        struct em28xx      *dev = fh->dev;
1151        int                rc;
1152
1153        rc = check_dev(dev);
1154        if (rc < 0)
1155                return rc;
1156
1157        *norm = dev->norm;
1158
1159        return 0;
1160}
1161
1162static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
1163{
1164        struct em28xx_fh   *fh  = priv;
1165        struct em28xx      *dev = fh->dev;
1166        struct v4l2_format f;
1167        int                rc;
1168
1169        rc = check_dev(dev);
1170        if (rc < 0)
1171                return rc;
1172
1173        mutex_lock(&dev->lock);
1174        dev->norm = *norm;
1175
1176        /* Adjusts width/height, if needed */
1177        f.fmt.pix.width = dev->width;
1178        f.fmt.pix.height = dev->height;
1179        vidioc_try_fmt_vid_cap(file, priv, &f);
1180
1181        /* set new image size */
1182        dev->width = f.fmt.pix.width;
1183        dev->height = f.fmt.pix.height;
1184        get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
1185
1186        em28xx_resolution_set(dev);
1187        v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, dev->norm);
1188
1189        mutex_unlock(&dev->lock);
1190        return 0;
1191}
1192
1193static int vidioc_g_parm(struct file *file, void *priv,
1194                         struct v4l2_streamparm *p)
1195{
1196        struct em28xx_fh   *fh  = priv;
1197        struct em28xx      *dev = fh->dev;
1198        int rc = 0;
1199
1200        if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1201                return -EINVAL;
1202
1203        if (dev->board.is_webcam)
1204                rc = v4l2_device_call_until_err(&dev->v4l2_dev, 0,
1205                                                video, g_parm, p);
1206        else
1207                v4l2_video_std_frame_period(dev->norm,
1208                                                 &p->parm.capture.timeperframe);
1209
1210        return rc;
1211}
1212
1213static int vidioc_s_parm(struct file *file, void *priv,
1214                         struct v4l2_streamparm *p)
1215{
1216        struct em28xx_fh   *fh  = priv;
1217        struct em28xx      *dev = fh->dev;
1218
1219        if (!dev->board.is_webcam)
1220                return -EINVAL;
1221
1222        if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1223                return -EINVAL;
1224
1225        return v4l2_device_call_until_err(&dev->v4l2_dev, 0, video, s_parm, p);
1226}
1227
1228static const char *iname[] = {
1229        [EM28XX_VMUX_COMPOSITE1] = "Composite1",
1230        [EM28XX_VMUX_COMPOSITE2] = "Composite2",
1231        [EM28XX_VMUX_COMPOSITE3] = "Composite3",
1232        [EM28XX_VMUX_COMPOSITE4] = "Composite4",
1233        [EM28XX_VMUX_SVIDEO]     = "S-Video",
1234        [EM28XX_VMUX_TELEVISION] = "Television",
1235        [EM28XX_VMUX_CABLE]      = "Cable TV",
1236        [EM28XX_VMUX_DVB]        = "DVB",
1237        [EM28XX_VMUX_DEBUG]      = "for debug only",
1238};
1239
1240static int vidioc_enum_input(struct file *file, void *priv,
1241                                struct v4l2_input *i)
1242{
1243        struct em28xx_fh   *fh  = priv;
1244        struct em28xx      *dev = fh->dev;
1245        unsigned int       n;
1246
1247        n = i->index;
1248        if (n >= MAX_EM28XX_INPUT)
1249                return -EINVAL;
1250        if (0 == INPUT(n)->type)
1251                return -EINVAL;
1252
1253        i->index = n;
1254        i->type = V4L2_INPUT_TYPE_CAMERA;
1255
1256        strcpy(i->name, iname[INPUT(n)->type]);
1257
1258        if ((EM28XX_VMUX_TELEVISION == INPUT(n)->type) ||
1259                (EM28XX_VMUX_CABLE == INPUT(n)->type))
1260                i->type = V4L2_INPUT_TYPE_TUNER;
1261
1262        i->std = dev->vdev->tvnorms;
1263
1264        return 0;
1265}
1266
1267static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1268{
1269        struct em28xx_fh   *fh  = priv;
1270        struct em28xx      *dev = fh->dev;
1271
1272        *i = dev->ctl_input;
1273
1274        return 0;
1275}
1276
1277static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1278{
1279        struct em28xx_fh   *fh  = priv;
1280        struct em28xx      *dev = fh->dev;
1281        int                rc;
1282
1283        rc = check_dev(dev);
1284        if (rc < 0)
1285                return rc;
1286
1287        if (i >= MAX_EM28XX_INPUT)
1288                return -EINVAL;
1289        if (0 == INPUT(i)->type)
1290                return -EINVAL;
1291
1292        dev->ctl_input = i;
1293
1294        mutex_lock(&dev->lock);
1295        video_mux(dev, dev->ctl_input);
1296        mutex_unlock(&dev->lock);
1297        return 0;
1298}
1299
1300static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1301{
1302        struct em28xx_fh   *fh    = priv;
1303        struct em28xx      *dev   = fh->dev;
1304
1305        if (!dev->audio_mode.has_audio)
1306                return -EINVAL;
1307
1308        switch (a->index) {
1309        case EM28XX_AMUX_VIDEO:
1310                strcpy(a->name, "Television");
1311                break;
1312        case EM28XX_AMUX_LINE_IN:
1313                strcpy(a->name, "Line In");
1314                break;
1315        case EM28XX_AMUX_VIDEO2:
1316                strcpy(a->name, "Television alt");
1317                break;
1318        case EM28XX_AMUX_PHONE:
1319                strcpy(a->name, "Phone");
1320                break;
1321        case EM28XX_AMUX_MIC:
1322                strcpy(a->name, "Mic");
1323                break;
1324        case EM28XX_AMUX_CD:
1325                strcpy(a->name, "CD");
1326                break;
1327        case EM28XX_AMUX_AUX:
1328                strcpy(a->name, "Aux");
1329                break;
1330        case EM28XX_AMUX_PCM_OUT:
1331                strcpy(a->name, "PCM");
1332                break;
1333        default:
1334                return -EINVAL;
1335        }
1336
1337        a->index = dev->ctl_ainput;
1338        a->capability = V4L2_AUDCAP_STEREO;
1339
1340        return 0;
1341}
1342
1343static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
1344{
1345        struct em28xx_fh   *fh  = priv;
1346        struct em28xx      *dev = fh->dev;
1347
1348
1349        if (!dev->audio_mode.has_audio)
1350                return -EINVAL;
1351
1352        if (a->index >= MAX_EM28XX_INPUT)
1353                return -EINVAL;
1354        if (0 == INPUT(a->index)->type)
1355                return -EINVAL;
1356
1357        mutex_lock(&dev->lock);
1358
1359        dev->ctl_ainput = INPUT(a->index)->amux;
1360        dev->ctl_aoutput = INPUT(a->index)->aout;
1361
1362        if (!dev->ctl_aoutput)
1363                dev->ctl_aoutput = EM28XX_AOUT_MASTER;
1364
1365        mutex_unlock(&dev->lock);
1366        return 0;
1367}
1368
1369static int vidioc_queryctrl(struct file *file, void *priv,
1370                                struct v4l2_queryctrl *qc)
1371{
1372        struct em28xx_fh      *fh  = priv;
1373        struct em28xx         *dev = fh->dev;
1374        int                   id  = qc->id;
1375        int                   rc;
1376
1377        rc = check_dev(dev);
1378        if (rc < 0)
1379                return rc;
1380
1381        memset(qc, 0, sizeof(*qc));
1382
1383        qc->id = id;
1384
1385        /* enumberate AC97 controls */
1386        if (dev->audio_mode.ac97 != EM28XX_NO_AC97) {
1387                rc = ac97_queryctrl(qc);
1388                if (!rc)
1389                        return 0;
1390        }
1391
1392        /* enumberate V4L2 device controls */
1393        mutex_lock(&dev->lock);
1394        v4l2_device_call_all(&dev->v4l2_dev, 0, core, queryctrl, qc);
1395        mutex_unlock(&dev->lock);
1396
1397        if (qc->type)
1398                return 0;
1399        else
1400                return -EINVAL;
1401}
1402
1403static int vidioc_g_ctrl(struct file *file, void *priv,
1404                                struct v4l2_control *ctrl)
1405{
1406        struct em28xx_fh      *fh  = priv;
1407        struct em28xx         *dev = fh->dev;
1408        int                   rc;
1409
1410        rc = check_dev(dev);
1411        if (rc < 0)
1412                return rc;
1413        rc = 0;
1414
1415        mutex_lock(&dev->lock);
1416
1417        /* Set an AC97 control */
1418        if (dev->audio_mode.ac97 != EM28XX_NO_AC97)
1419                rc = ac97_get_ctrl(dev, ctrl);
1420        else
1421                rc = 1;
1422
1423        /* It were not an AC97 control. Sends it to the v4l2 dev interface */
1424        if (rc == 1) {
1425                v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_ctrl, ctrl);
1426                rc = 0;
1427        }
1428
1429        mutex_unlock(&dev->lock);
1430        return rc;
1431}
1432
1433static int vidioc_s_ctrl(struct file *file, void *priv,
1434                                struct v4l2_control *ctrl)
1435{
1436        struct em28xx_fh      *fh  = priv;
1437        struct em28xx         *dev = fh->dev;
1438        int                   rc;
1439
1440        rc = check_dev(dev);
1441        if (rc < 0)
1442                return rc;
1443
1444        mutex_lock(&dev->lock);
1445
1446        /* Set an AC97 control */
1447        if (dev->audio_mode.ac97 != EM28XX_NO_AC97)
1448                rc = ac97_set_ctrl(dev, ctrl);
1449        else
1450                rc = 1;
1451
1452        /* It isn't an AC97 control. Sends it to the v4l2 dev interface */
1453        if (rc == 1) {
1454                v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_ctrl, ctrl);
1455
1456                /*
1457                 * In the case of non-AC97 volume controls, we still need
1458                 * to do some setups at em28xx, in order to mute/unmute
1459                 * and to adjust audio volume. However, the value ranges
1460                 * should be checked by the corresponding V4L subdriver.
1461                 */
1462                switch (ctrl->id) {
1463                case V4L2_CID_AUDIO_MUTE:
1464                        dev->mute = ctrl->value;
1465                        rc = em28xx_audio_analog_set(dev);
1466                        break;
1467                case V4L2_CID_AUDIO_VOLUME:
1468                        dev->volume = ctrl->value;
1469                        rc = em28xx_audio_analog_set(dev);
1470                }
1471        }
1472
1473        mutex_unlock(&dev->lock);
1474        return rc;
1475}
1476
1477static int vidioc_g_tuner(struct file *file, void *priv,
1478                                struct v4l2_tuner *t)
1479{
1480        struct em28xx_fh      *fh  = priv;
1481        struct em28xx         *dev = fh->dev;
1482        int                   rc;
1483
1484        rc = check_dev(dev);
1485        if (rc < 0)
1486                return rc;
1487
1488        if (0 != t->index)
1489                return -EINVAL;
1490
1491        strcpy(t->name, "Tuner");
1492
1493        mutex_lock(&dev->lock);
1494        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1495        mutex_unlock(&dev->lock);
1496
1497        return 0;
1498}
1499
1500static int vidioc_s_tuner(struct file *file, void *priv,
1501                                struct v4l2_tuner *t)
1502{
1503        struct em28xx_fh      *fh  = priv;
1504        struct em28xx         *dev = fh->dev;
1505        int                   rc;
1506
1507        rc = check_dev(dev);
1508        if (rc < 0)
1509                return rc;
1510
1511        if (0 != t->index)
1512                return -EINVAL;
1513
1514        mutex_lock(&dev->lock);
1515        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1516        mutex_unlock(&dev->lock);
1517
1518        return 0;
1519}
1520
1521static int vidioc_g_frequency(struct file *file, void *priv,
1522                                struct v4l2_frequency *f)
1523{
1524        struct em28xx_fh      *fh  = priv;
1525        struct em28xx         *dev = fh->dev;
1526
1527        mutex_lock(&dev->lock);
1528        f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
1529        f->frequency = dev->ctl_freq;
1530        mutex_unlock(&dev->lock);
1531
1532        return 0;
1533}
1534
1535static int vidioc_s_frequency(struct file *file, void *priv,
1536                                struct v4l2_frequency *f)
1537{
1538        struct em28xx_fh      *fh  = priv;
1539        struct em28xx         *dev = fh->dev;
1540        int                   rc;
1541
1542        rc = check_dev(dev);
1543        if (rc < 0)
1544                return rc;
1545
1546        if (0 != f->tuner)
1547                return -EINVAL;
1548
1549        if (unlikely(0 == fh->radio && f->type != V4L2_TUNER_ANALOG_TV))
1550                return -EINVAL;
1551        if (unlikely(1 == fh->radio && f->type != V4L2_TUNER_RADIO))
1552                return -EINVAL;
1553
1554        mutex_lock(&dev->lock);
1555
1556        dev->ctl_freq = f->frequency;
1557        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, f);
1558
1559        mutex_unlock(&dev->lock);
1560
1561        return 0;
1562}
1563
1564#ifdef CONFIG_VIDEO_ADV_DEBUG
1565static int em28xx_reg_len(int reg)
1566{
1567        switch (reg) {
1568        case EM28XX_R40_AC97LSB:
1569        case EM28XX_R30_HSCALELOW:
1570        case EM28XX_R32_VSCALELOW:
1571                return 2;
1572        default:
1573                return 1;
1574        }
1575}
1576
1577static int vidioc_g_chip_ident(struct file *file, void *priv,
1578               struct v4l2_dbg_chip_ident *chip)
1579{
1580        struct em28xx_fh      *fh  = priv;
1581        struct em28xx         *dev = fh->dev;
1582
1583        chip->ident = V4L2_IDENT_NONE;
1584        chip->revision = 0;
1585
1586        v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_chip_ident, chip);
1587
1588        return 0;
1589}
1590
1591
1592static int vidioc_g_register(struct file *file, void *priv,
1593                             struct v4l2_dbg_register *reg)
1594{
1595        struct em28xx_fh      *fh  = priv;
1596        struct em28xx         *dev = fh->dev;
1597        int ret;
1598
1599        switch (reg->match.type) {
1600        case V4L2_CHIP_MATCH_AC97:
1601                mutex_lock(&dev->lock);
1602                ret = em28xx_read_ac97(dev, reg->reg);
1603                mutex_unlock(&dev->lock);
1604                if (ret < 0)
1605                        return ret;
1606
1607                reg->val = ret;
1608                reg->size = 1;
1609                return 0;
1610        case V4L2_CHIP_MATCH_I2C_DRIVER:
1611                v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
1612                return 0;
1613        case V4L2_CHIP_MATCH_I2C_ADDR:
1614                /* TODO: is this correct? */
1615                v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
1616                return 0;
1617        default:
1618                if (!v4l2_chip_match_host(&reg->match))
1619                        return -EINVAL;
1620        }
1621
1622        /* Match host */
1623        reg->size = em28xx_reg_len(reg->reg);
1624        if (reg->size == 1) {
1625                mutex_lock(&dev->lock);
1626                ret = em28xx_read_reg(dev, reg->reg);
1627                mutex_unlock(&dev->lock);
1628
1629                if (ret < 0)
1630                        return ret;
1631
1632                reg->val = ret;
1633        } else {
1634                __le16 val = 0;
1635                mutex_lock(&dev->lock);
1636                ret = em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS,
1637                                                   reg->reg, (char *)&val, 2);
1638                mutex_unlock(&dev->lock);
1639                if (ret < 0)
1640                        return ret;
1641
1642                reg->val = le16_to_cpu(val);
1643        }
1644
1645        return 0;
1646}
1647
1648static int vidioc_s_register(struct file *file, void *priv,
1649                             struct v4l2_dbg_register *reg)
1650{
1651        struct em28xx_fh      *fh  = priv;
1652        struct em28xx         *dev = fh->dev;
1653        __le16 buf;
1654        int    rc;
1655
1656        switch (reg->match.type) {
1657        case V4L2_CHIP_MATCH_AC97:
1658                mutex_lock(&dev->lock);
1659                rc = em28xx_write_ac97(dev, reg->reg, reg->val);
1660                mutex_unlock(&dev->lock);
1661
1662                return rc;
1663        case V4L2_CHIP_MATCH_I2C_DRIVER:
1664                v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
1665                return 0;
1666        case V4L2_CHIP_MATCH_I2C_ADDR:
1667                /* TODO: is this correct? */
1668                v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
1669                return 0;
1670        default:
1671                if (!v4l2_chip_match_host(&reg->match))
1672                        return -EINVAL;
1673        }
1674
1675        /* Match host */
1676        buf = cpu_to_le16(reg->val);
1677
1678        mutex_lock(&dev->lock);
1679        rc = em28xx_write_regs(dev, reg->reg, (char *)&buf,
1680                               em28xx_reg_len(reg->reg));
1681        mutex_unlock(&dev->lock);
1682
1683        return rc;
1684}
1685#endif
1686
1687
1688static int vidioc_cropcap(struct file *file, void *priv,
1689                                        struct v4l2_cropcap *cc)
1690{
1691        struct em28xx_fh      *fh  = priv;
1692        struct em28xx         *dev = fh->dev;
1693
1694        if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1695                return -EINVAL;
1696
1697        cc->bounds.left = 0;
1698        cc->bounds.top = 0;
1699        cc->bounds.width = dev->width;
1700        cc->bounds.height = dev->height;
1701        cc->defrect = cc->bounds;
1702        cc->pixelaspect.numerator = 54; /* 4:3 FIXME: remove magic numbers */
1703        cc->pixelaspect.denominator = 59;
1704
1705        return 0;
1706}
1707
1708static int vidioc_streamon(struct file *file, void *priv,
1709                                        enum v4l2_buf_type type)
1710{
1711        struct em28xx_fh      *fh  = priv;
1712        struct em28xx         *dev = fh->dev;
1713        int                   rc = -EINVAL;
1714
1715        rc = check_dev(dev);
1716        if (rc < 0)
1717                return rc;
1718
1719        if (unlikely(type != fh->type))
1720                return -EINVAL;
1721
1722        em28xx_videodbg("vidioc_streamon fh=%p t=%d fh->res=%d dev->res=%d\n",
1723                        fh, type, fh->resources, dev->resources);
1724
1725        if (unlikely(!res_get(fh, get_ressource(fh))))
1726                return -EBUSY;
1727
1728        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1729                rc = videobuf_streamon(&fh->vb_vidq);
1730        else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1731                rc = videobuf_streamon(&fh->vb_vbiq);
1732
1733        return rc;
1734}
1735
1736static int vidioc_streamoff(struct file *file, void *priv,
1737                                        enum v4l2_buf_type type)
1738{
1739        struct em28xx_fh      *fh  = priv;
1740        struct em28xx         *dev = fh->dev;
1741        int                   rc;
1742
1743        rc = check_dev(dev);
1744        if (rc < 0)
1745                return rc;
1746
1747        if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1748            fh->type != V4L2_BUF_TYPE_VBI_CAPTURE)
1749                return -EINVAL;
1750        if (type != fh->type)
1751                return -EINVAL;
1752
1753        em28xx_videodbg("vidioc_streamoff fh=%p t=%d fh->res=%d dev->res=%d\n",
1754                        fh, type, fh->resources, dev->resources);
1755
1756        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1757                videobuf_streamoff(&fh->vb_vidq);
1758                res_free(fh, EM28XX_RESOURCE_VIDEO);
1759        } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1760                videobuf_streamoff(&fh->vb_vbiq);
1761                res_free(fh, EM28XX_RESOURCE_VBI);
1762        }
1763
1764        return 0;
1765}
1766
1767static int vidioc_querycap(struct file *file, void  *priv,
1768                                        struct v4l2_capability *cap)
1769{
1770        struct em28xx_fh      *fh  = priv;
1771        struct em28xx         *dev = fh->dev;
1772
1773        strlcpy(cap->driver, "em28xx", sizeof(cap->driver));
1774        strlcpy(cap->card, em28xx_boards[dev->model].name, sizeof(cap->card));
1775        usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
1776
1777        cap->version = EM28XX_VERSION_CODE;
1778
1779        cap->capabilities =
1780                        V4L2_CAP_SLICED_VBI_CAPTURE |
1781                        V4L2_CAP_VIDEO_CAPTURE |
1782                        V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
1783
1784        if (dev->vbi_dev)
1785                cap->capabilities |= V4L2_CAP_VBI_CAPTURE;
1786
1787        if (dev->audio_mode.has_audio)
1788                cap->capabilities |= V4L2_CAP_AUDIO;
1789
1790        if (dev->tuner_type != TUNER_ABSENT)
1791                cap->capabilities |= V4L2_CAP_TUNER;
1792
1793        return 0;
1794}
1795
1796static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
1797                                        struct v4l2_fmtdesc *f)
1798{
1799        if (unlikely(f->index >= ARRAY_SIZE(format)))
1800                return -EINVAL;
1801
1802        strlcpy(f->description, format[f->index].name, sizeof(f->description));
1803        f->pixelformat = format[f->index].fourcc;
1804
1805        return 0;
1806}
1807
1808/* Sliced VBI ioctls */
1809static int vidioc_g_fmt_sliced_vbi_cap(struct file *file, void *priv,
1810                                        struct v4l2_format *f)
1811{
1812        struct em28xx_fh      *fh  = priv;
1813        struct em28xx         *dev = fh->dev;
1814        int                   rc;
1815
1816        rc = check_dev(dev);
1817        if (rc < 0)
1818                return rc;
1819
1820        mutex_lock(&dev->lock);
1821
1822        f->fmt.sliced.service_set = 0;
1823        v4l2_device_call_all(&dev->v4l2_dev, 0, video, g_fmt, f);
1824
1825        if (f->fmt.sliced.service_set == 0)
1826                rc = -EINVAL;
1827
1828        mutex_unlock(&dev->lock);
1829
1830        return rc;
1831}
1832
1833static int vidioc_try_set_sliced_vbi_cap(struct file *file, void *priv,
1834                        struct v4l2_format *f)
1835{
1836        struct em28xx_fh      *fh  = priv;
1837        struct em28xx         *dev = fh->dev;
1838        int                   rc;
1839
1840        rc = check_dev(dev);
1841        if (rc < 0)
1842                return rc;
1843
1844        mutex_lock(&dev->lock);
1845        v4l2_device_call_all(&dev->v4l2_dev, 0, video, g_fmt, f);
1846        mutex_unlock(&dev->lock);
1847
1848        if (f->fmt.sliced.service_set == 0)
1849                return -EINVAL;
1850
1851        return 0;
1852}
1853
1854/* RAW VBI ioctls */
1855
1856static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1857                                struct v4l2_format *format)
1858{
1859        format->fmt.vbi.samples_per_line = 720;
1860        format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1861        format->fmt.vbi.offset = 0;
1862        format->fmt.vbi.flags = 0;
1863
1864        /* Varies by video standard (NTSC, PAL, etc.) */
1865        /* FIXME: hard-coded for NTSC support */
1866        format->fmt.vbi.sampling_rate = 6750000 * 4 / 2; /* FIXME: ??? */
1867        format->fmt.vbi.count[0] = 12;
1868        format->fmt.vbi.count[1] = 12;
1869        format->fmt.vbi.start[0] = 10;
1870        format->fmt.vbi.start[1] = 273;
1871
1872        return 0;
1873}
1874
1875static int vidioc_s_fmt_vbi_cap(struct file *file, void *priv,
1876                                struct v4l2_format *format)
1877{
1878        format->fmt.vbi.samples_per_line = 720;
1879        format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1880        format->fmt.vbi.offset = 0;
1881        format->fmt.vbi.flags = 0;
1882
1883        /* Varies by video standard (NTSC, PAL, etc.) */
1884        /* FIXME: hard-coded for NTSC support */
1885        format->fmt.vbi.sampling_rate = 6750000 * 4 / 2; /* FIXME: ??? */
1886        format->fmt.vbi.count[0] = 12;
1887        format->fmt.vbi.count[1] = 12;
1888        format->fmt.vbi.start[0] = 10;
1889        format->fmt.vbi.start[1] = 273;
1890
1891        return 0;
1892}
1893
1894static int vidioc_reqbufs(struct file *file, void *priv,
1895                          struct v4l2_requestbuffers *rb)
1896{
1897        struct em28xx_fh      *fh  = priv;
1898        struct em28xx         *dev = fh->dev;
1899        int                   rc;
1900
1901        rc = check_dev(dev);
1902        if (rc < 0)
1903                return rc;
1904
1905        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1906                return videobuf_reqbufs(&fh->vb_vidq, rb);
1907        else
1908                return videobuf_reqbufs(&fh->vb_vbiq, rb);
1909}
1910
1911static int vidioc_querybuf(struct file *file, void *priv,
1912                           struct v4l2_buffer *b)
1913{
1914        struct em28xx_fh      *fh  = priv;
1915        struct em28xx         *dev = fh->dev;
1916        int                   rc;
1917
1918        rc = check_dev(dev);
1919        if (rc < 0)
1920                return rc;
1921
1922        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1923                return videobuf_querybuf(&fh->vb_vidq, b);
1924        else {
1925                /* FIXME: I'm not sure yet whether this is a bug in zvbi or
1926                   the videobuf framework, but we probably shouldn't be
1927                   returning a buffer larger than that which was asked for.
1928                   At a minimum, it causes a crash in zvbi since it does
1929                   a memcpy based on the source buffer length */
1930                int result = videobuf_querybuf(&fh->vb_vbiq, b);
1931                b->length = 17280;
1932                return result;
1933        }
1934}
1935
1936static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1937{
1938        struct em28xx_fh      *fh  = priv;
1939        struct em28xx         *dev = fh->dev;
1940        int                   rc;
1941
1942        rc = check_dev(dev);
1943        if (rc < 0)
1944                return rc;
1945
1946        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1947                return videobuf_qbuf(&fh->vb_vidq, b);
1948        else
1949                return videobuf_qbuf(&fh->vb_vbiq, b);
1950}
1951
1952static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1953{
1954        struct em28xx_fh      *fh  = priv;
1955        struct em28xx         *dev = fh->dev;
1956        int                   rc;
1957
1958        rc = check_dev(dev);
1959        if (rc < 0)
1960                return rc;
1961
1962        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1963                return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags &
1964                                      O_NONBLOCK);
1965        else
1966                return videobuf_dqbuf(&fh->vb_vbiq, b, file->f_flags &
1967                                      O_NONBLOCK);
1968}
1969
1970#ifdef CONFIG_VIDEO_V4L1_COMPAT
1971static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
1972{
1973        struct em28xx_fh  *fh = priv;
1974
1975        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1976                return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
1977        else
1978                return videobuf_cgmbuf(&fh->vb_vbiq, mbuf, 8);
1979}
1980#endif
1981
1982
1983/* ----------------------------------------------------------- */
1984/* RADIO ESPECIFIC IOCTLS                                      */
1985/* ----------------------------------------------------------- */
1986
1987static int radio_querycap(struct file *file, void  *priv,
1988                          struct v4l2_capability *cap)
1989{
1990        struct em28xx *dev = ((struct em28xx_fh *)priv)->dev;
1991
1992        strlcpy(cap->driver, "em28xx", sizeof(cap->driver));
1993        strlcpy(cap->card, em28xx_boards[dev->model].name, sizeof(cap->card));
1994        usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
1995
1996        cap->version = EM28XX_VERSION_CODE;
1997        cap->capabilities = V4L2_CAP_TUNER;
1998        return 0;
1999}
2000
2001static int radio_g_tuner(struct file *file, void *priv,
2002                         struct v4l2_tuner *t)
2003{
2004        struct em28xx *dev = ((struct em28xx_fh *)priv)->dev;
2005
2006        if (unlikely(t->index > 0))
2007                return -EINVAL;
2008
2009        strcpy(t->name, "Radio");
2010        t->type = V4L2_TUNER_RADIO;
2011
2012        mutex_lock(&dev->lock);
2013        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
2014        mutex_unlock(&dev->lock);
2015
2016        return 0;
2017}
2018
2019static int radio_enum_input(struct file *file, void *priv,
2020                            struct v4l2_input *i)
2021{
2022        if (i->index != 0)
2023                return -EINVAL;
2024        strcpy(i->name, "Radio");
2025        i->type = V4L2_INPUT_TYPE_TUNER;
2026
2027        return 0;
2028}
2029
2030static int radio_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
2031{
2032        if (unlikely(a->index))
2033                return -EINVAL;
2034
2035        strcpy(a->name, "Radio");
2036        return 0;
2037}
2038
2039static int radio_s_tuner(struct file *file, void *priv,
2040                         struct v4l2_tuner *t)
2041{
2042        struct em28xx *dev = ((struct em28xx_fh *)priv)->dev;
2043
2044        if (0 != t->index)
2045                return -EINVAL;
2046
2047        mutex_lock(&dev->lock);
2048        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
2049        mutex_unlock(&dev->lock);
2050
2051        return 0;
2052}
2053
2054static int radio_s_audio(struct file *file, void *fh,
2055                         struct v4l2_audio *a)
2056{
2057        return 0;
2058}
2059
2060static int radio_s_input(struct file *file, void *fh, unsigned int i)
2061{
2062        return 0;
2063}
2064
2065static int radio_queryctrl(struct file *file, void *priv,
2066                           struct v4l2_queryctrl *qc)
2067{
2068        int i;
2069
2070        if (qc->id <  V4L2_CID_BASE ||
2071                qc->id >= V4L2_CID_LASTP1)
2072                return -EINVAL;
2073
2074        for (i = 0; i < ARRAY_SIZE(ac97_qctrl); i++) {
2075                if (qc->id && qc->id == ac97_qctrl[i].id) {
2076                        memcpy(qc, &(ac97_qctrl[i]), sizeof(*qc));
2077                        return 0;
2078                }
2079        }
2080
2081        return -EINVAL;
2082}
2083
2084/*
2085 * em28xx_v4l2_open()
2086 * inits the device and starts isoc transfer
2087 */
2088static int em28xx_v4l2_open(struct file *filp)
2089{
2090        int minor = video_devdata(filp)->minor;
2091        int errCode = 0, radio;
2092        struct em28xx *dev;
2093        enum v4l2_buf_type fh_type;
2094        struct em28xx_fh *fh;
2095        enum v4l2_field field;
2096
2097        dev = em28xx_get_device(minor, &fh_type, &radio);
2098
2099        if (NULL == dev)
2100                return -ENODEV;
2101
2102        mutex_lock(&dev->lock);
2103
2104        em28xx_videodbg("open minor=%d type=%s users=%d\n",
2105                                minor, v4l2_type_names[fh_type], dev->users);
2106
2107
2108        fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL);
2109        if (!fh) {
2110                em28xx_errdev("em28xx-video.c: Out of memory?!\n");
2111                mutex_unlock(&dev->lock);
2112                return -ENOMEM;
2113        }
2114        fh->dev = dev;
2115        fh->radio = radio;
2116        fh->type = fh_type;
2117        filp->private_data = fh;
2118
2119        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
2120                em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
2121                em28xx_set_alternate(dev);
2122                em28xx_resolution_set(dev);
2123
2124                /* Needed, since GPIO might have disabled power of
2125                   some i2c device
2126                 */
2127                em28xx_wake_i2c(dev);
2128
2129        }
2130        if (fh->radio) {
2131                em28xx_videodbg("video_open: setting radio device\n");
2132                v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_radio);
2133        }
2134
2135        dev->users++;
2136
2137        if (dev->progressive)
2138                field = V4L2_FIELD_NONE;
2139        else
2140                field = V4L2_FIELD_INTERLACED;
2141
2142        videobuf_queue_vmalloc_init(&fh->vb_vidq, &em28xx_video_qops,
2143                                    NULL, &dev->slock,
2144                                    V4L2_BUF_TYPE_VIDEO_CAPTURE, field,
2145                                    sizeof(struct em28xx_buffer), fh);
2146
2147        videobuf_queue_vmalloc_init(&fh->vb_vbiq, &em28xx_vbi_qops,
2148                                    NULL, &dev->slock,
2149                                    V4L2_BUF_TYPE_VBI_CAPTURE,
2150                                    V4L2_FIELD_SEQ_TB,
2151                                    sizeof(struct em28xx_buffer), fh);
2152
2153        mutex_unlock(&dev->lock);
2154
2155        return errCode;
2156}
2157
2158/*
2159 * em28xx_realease_resources()
2160 * unregisters the v4l2,i2c and usb devices
2161 * called when the device gets disconected or at module unload
2162*/
2163void em28xx_release_analog_resources(struct em28xx *dev)
2164{
2165
2166        /*FIXME: I2C IR should be disconnected */
2167
2168        if (dev->radio_dev) {
2169                if (-1 != dev->radio_dev->minor)
2170                        video_unregister_device(dev->radio_dev);
2171                else
2172                        video_device_release(dev->radio_dev);
2173                dev->radio_dev = NULL;
2174        }
2175        if (dev->vbi_dev) {
2176                em28xx_info("V4L2 device /dev/vbi%d deregistered\n",
2177                            dev->vbi_dev->num);
2178                if (-1 != dev->vbi_dev->minor)
2179                        video_unregister_device(dev->vbi_dev);
2180                else
2181                        video_device_release(dev->vbi_dev);
2182                dev->vbi_dev = NULL;
2183        }
2184        if (dev->vdev) {
2185                em28xx_info("V4L2 device /dev/video%d deregistered\n",
2186                            dev->vdev->num);
2187                if (-1 != dev->vdev->minor)
2188                        video_unregister_device(dev->vdev);
2189                else
2190                        video_device_release(dev->vdev);
2191                dev->vdev = NULL;
2192        }
2193}
2194
2195/*
2196 * em28xx_v4l2_close()
2197 * stops streaming and deallocates all resources allocated by the v4l2
2198 * calls and ioctls
2199 */
2200static int em28xx_v4l2_close(struct file *filp)
2201{
2202        struct em28xx_fh *fh  = filp->private_data;
2203        struct em28xx    *dev = fh->dev;
2204        int              errCode;
2205
2206        em28xx_videodbg("users=%d\n", dev->users);
2207
2208        if (res_check(fh, EM28XX_RESOURCE_VIDEO)) {
2209                videobuf_stop(&fh->vb_vidq);
2210                res_free(fh, EM28XX_RESOURCE_VIDEO);
2211        }
2212
2213        if (res_check(fh, EM28XX_RESOURCE_VBI)) {
2214                videobuf_stop(&fh->vb_vbiq);
2215                res_free(fh, EM28XX_RESOURCE_VBI);
2216        }
2217
2218        if (dev->users == 1) {
2219                /* the device is already disconnect,
2220                   free the remaining resources */
2221                if (dev->state & DEV_DISCONNECTED) {
2222                        em28xx_release_resources(dev);
2223                        kfree(dev);
2224                        return 0;
2225                }
2226
2227                /* Save some power by putting tuner to sleep */
2228                v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_standby);
2229
2230                /* do this before setting alternate! */
2231                em28xx_uninit_isoc(dev);
2232                em28xx_set_mode(dev, EM28XX_SUSPEND);
2233
2234                /* set alternate 0 */
2235                dev->alt = 0;
2236                em28xx_videodbg("setting alternate 0\n");
2237                errCode = usb_set_interface(dev->udev, 0, 0);
2238                if (errCode < 0) {
2239                        em28xx_errdev("cannot change alternate number to "
2240                                        "0 (error=%i)\n", errCode);
2241                }
2242        }
2243
2244        videobuf_mmap_free(&fh->vb_vidq);
2245        videobuf_mmap_free(&fh->vb_vbiq);
2246        kfree(fh);
2247        dev->users--;
2248        wake_up_interruptible_nr(&dev->open, 1);
2249        return 0;
2250}
2251
2252/*
2253 * em28xx_v4l2_read()
2254 * will allocate buffers when called for the first time
2255 */
2256static ssize_t
2257em28xx_v4l2_read(struct file *filp, char __user *buf, size_t count,
2258                 loff_t *pos)
2259{
2260        struct em28xx_fh *fh = filp->private_data;
2261        struct em28xx *dev = fh->dev;
2262        int rc;
2263
2264        rc = check_dev(dev);
2265        if (rc < 0)
2266                return rc;
2267
2268        /* FIXME: read() is not prepared to allow changing the video
2269           resolution while streaming. Seems a bug at em28xx_set_fmt
2270         */
2271
2272        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
2273                if (res_locked(dev, EM28XX_RESOURCE_VIDEO))
2274                        return -EBUSY;
2275
2276                return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
2277                                        filp->f_flags & O_NONBLOCK);
2278        }
2279
2280
2281        if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
2282                if (!res_get(fh, EM28XX_RESOURCE_VBI))
2283                        return -EBUSY;
2284
2285                return videobuf_read_stream(&fh->vb_vbiq, buf, count, pos, 0,
2286                                        filp->f_flags & O_NONBLOCK);
2287        }
2288
2289        return 0;
2290}
2291
2292/*
2293 * em28xx_v4l2_poll()
2294 * will allocate buffers when called for the first time
2295 */
2296static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table *wait)
2297{
2298        struct em28xx_fh *fh = filp->private_data;
2299        struct em28xx *dev = fh->dev;
2300        int rc;
2301
2302        rc = check_dev(dev);
2303        if (rc < 0)
2304                return rc;
2305
2306        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
2307                if (!res_get(fh, EM28XX_RESOURCE_VIDEO))
2308                        return POLLERR;
2309                return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
2310        } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
2311                if (!res_get(fh, EM28XX_RESOURCE_VBI))
2312                        return POLLERR;
2313                return videobuf_poll_stream(filp, &fh->vb_vbiq, wait);
2314        } else {
2315                return POLLERR;
2316        }
2317}
2318
2319/*
2320 * em28xx_v4l2_mmap()
2321 */
2322static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
2323{
2324        struct em28xx_fh *fh    = filp->private_data;
2325        struct em28xx    *dev   = fh->dev;
2326        int              rc;
2327
2328        rc = check_dev(dev);
2329        if (rc < 0)
2330                return rc;
2331
2332        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
2333                rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
2334        else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
2335                rc = videobuf_mmap_mapper(&fh->vb_vbiq, vma);
2336
2337        em28xx_videodbg("vma start=0x%08lx, size=%ld, ret=%d\n",
2338                (unsigned long)vma->vm_start,
2339                (unsigned long)vma->vm_end-(unsigned long)vma->vm_start,
2340                rc);
2341
2342        return rc;
2343}
2344
2345static const struct v4l2_file_operations em28xx_v4l_fops = {
2346        .owner         = THIS_MODULE,
2347        .open          = em28xx_v4l2_open,
2348        .release       = em28xx_v4l2_close,
2349        .read          = em28xx_v4l2_read,
2350        .poll          = em28xx_v4l2_poll,
2351        .mmap          = em28xx_v4l2_mmap,
2352        .ioctl         = video_ioctl2,
2353};
2354
2355static const struct v4l2_ioctl_ops video_ioctl_ops = {
2356        .vidioc_querycap            = vidioc_querycap,
2357        .vidioc_enum_fmt_vid_cap    = vidioc_enum_fmt_vid_cap,
2358        .vidioc_g_fmt_vid_cap       = vidioc_g_fmt_vid_cap,
2359        .vidioc_try_fmt_vid_cap     = vidioc_try_fmt_vid_cap,
2360        .vidioc_s_fmt_vid_cap       = vidioc_s_fmt_vid_cap,
2361        .vidioc_g_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
2362        .vidioc_s_fmt_vbi_cap       = vidioc_s_fmt_vbi_cap,
2363        .vidioc_g_audio             = vidioc_g_audio,
2364        .vidioc_s_audio             = vidioc_s_audio,
2365        .vidioc_cropcap             = vidioc_cropcap,
2366
2367        .vidioc_g_fmt_sliced_vbi_cap   = vidioc_g_fmt_sliced_vbi_cap,
2368        .vidioc_try_fmt_sliced_vbi_cap = vidioc_try_set_sliced_vbi_cap,
2369        .vidioc_s_fmt_sliced_vbi_cap   = vidioc_try_set_sliced_vbi_cap,
2370
2371        .vidioc_reqbufs             = vidioc_reqbufs,
2372        .vidioc_querybuf            = vidioc_querybuf,
2373        .vidioc_qbuf                = vidioc_qbuf,
2374        .vidioc_dqbuf               = vidioc_dqbuf,
2375        .vidioc_g_std               = vidioc_g_std,
2376        .vidioc_s_std               = vidioc_s_std,
2377        .vidioc_g_parm              = vidioc_g_parm,
2378        .vidioc_s_parm              = vidioc_s_parm,
2379        .vidioc_enum_input          = vidioc_enum_input,
2380        .vidioc_g_input             = vidioc_g_input,
2381        .vidioc_s_input             = vidioc_s_input,
2382        .vidioc_queryctrl           = vidioc_queryctrl,
2383        .vidioc_g_ctrl              = vidioc_g_ctrl,
2384        .vidioc_s_ctrl              = vidioc_s_ctrl,
2385        .vidioc_streamon            = vidioc_streamon,
2386        .vidioc_streamoff           = vidioc_streamoff,
2387        .vidioc_g_tuner             = vidioc_g_tuner,
2388        .vidioc_s_tuner             = vidioc_s_tuner,
2389        .vidioc_g_frequency         = vidioc_g_frequency,
2390        .vidioc_s_frequency         = vidioc_s_frequency,
2391#ifdef CONFIG_VIDEO_ADV_DEBUG
2392        .vidioc_g_register          = vidioc_g_register,
2393        .vidioc_s_register          = vidioc_s_register,
2394        .vidioc_g_chip_ident        = vidioc_g_chip_ident,
2395#endif
2396#ifdef CONFIG_VIDEO_V4L1_COMPAT
2397        .vidiocgmbuf                = vidiocgmbuf,
2398#endif
2399};
2400
2401static const struct video_device em28xx_video_template = {
2402        .fops                       = &em28xx_v4l_fops,
2403        .release                    = video_device_release,
2404        .ioctl_ops                  = &video_ioctl_ops,
2405
2406        .minor                      = -1,
2407
2408        .tvnorms                    = V4L2_STD_ALL,
2409        .current_norm               = V4L2_STD_PAL,
2410};
2411
2412static const struct v4l2_file_operations radio_fops = {
2413        .owner         = THIS_MODULE,
2414        .open          = em28xx_v4l2_open,
2415        .release       = em28xx_v4l2_close,
2416        .ioctl         = video_ioctl2,
2417};
2418
2419static const struct v4l2_ioctl_ops radio_ioctl_ops = {
2420        .vidioc_querycap      = radio_querycap,
2421        .vidioc_g_tuner       = radio_g_tuner,
2422        .vidioc_enum_input    = radio_enum_input,
2423        .vidioc_g_audio       = radio_g_audio,
2424        .vidioc_s_tuner       = radio_s_tuner,
2425        .vidioc_s_audio       = radio_s_audio,
2426        .vidioc_s_input       = radio_s_input,
2427        .vidioc_queryctrl     = radio_queryctrl,
2428        .vidioc_g_ctrl        = vidioc_g_ctrl,
2429        .vidioc_s_ctrl        = vidioc_s_ctrl,
2430        .vidioc_g_frequency   = vidioc_g_frequency,
2431        .vidioc_s_frequency   = vidioc_s_frequency,
2432#ifdef CONFIG_VIDEO_ADV_DEBUG
2433        .vidioc_g_register    = vidioc_g_register,
2434        .vidioc_s_register    = vidioc_s_register,
2435#endif
2436};
2437
2438static struct video_device em28xx_radio_template = {
2439        .name                 = "em28xx-radio",
2440        .fops                 = &radio_fops,
2441        .ioctl_ops            = &radio_ioctl_ops,
2442        .minor                = -1,
2443};
2444
2445/******************************** usb interface ******************************/
2446
2447
2448
2449static struct video_device *em28xx_vdev_init(struct em28xx *dev,
2450                                        const struct video_device *template,
2451                                        const char *type_name)
2452{
2453        struct video_device *vfd;
2454
2455        vfd = video_device_alloc();
2456        if (NULL == vfd)
2457                return NULL;
2458
2459        *vfd            = *template;
2460        vfd->minor      = -1;
2461        vfd->v4l2_dev   = &dev->v4l2_dev;
2462        vfd->release    = video_device_release;
2463        vfd->debug      = video_debug;
2464
2465        snprintf(vfd->name, sizeof(vfd->name), "%s %s",
2466                 dev->name, type_name);
2467
2468        return vfd;
2469}
2470
2471int em28xx_register_analog_devices(struct em28xx *dev)
2472{
2473      u8 val;
2474        int ret;
2475
2476        printk(KERN_INFO "%s: v4l2 driver version %d.%d.%d\n",
2477                dev->name,
2478                (EM28XX_VERSION_CODE >> 16) & 0xff,
2479                (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
2480
2481        /* set default norm */
2482        dev->norm = em28xx_video_template.current_norm;
2483        dev->interlaced = EM28XX_INTERLACED_DEFAULT;
2484        dev->ctl_input = 0;
2485
2486        /* Analog specific initialization */
2487        dev->format = &format[0];
2488        em28xx_set_video_format(dev, format[0].fourcc,
2489                                norm_maxw(dev), norm_maxh(dev));
2490
2491        video_mux(dev, dev->ctl_input);
2492
2493        /* Audio defaults */
2494        dev->mute = 1;
2495        dev->volume = 0x1f;
2496
2497/*      em28xx_write_reg(dev, EM28XX_R0E_AUDIOSRC, 0xc0); audio register */
2498        val = (u8)em28xx_read_reg(dev, EM28XX_R0F_XCLK);
2499        em28xx_write_reg(dev, EM28XX_R0F_XCLK,
2500                         (EM28XX_XCLK_AUDIO_UNMUTE | val));
2501
2502        em28xx_set_outfmt(dev);
2503        em28xx_colorlevels_set_default(dev);
2504        em28xx_compression_disable(dev);
2505
2506        /* allocate and fill video video_device struct */
2507        dev->vdev = em28xx_vdev_init(dev, &em28xx_video_template, "video");
2508        if (!dev->vdev) {
2509                em28xx_errdev("cannot allocate video_device.\n");
2510                return -ENODEV;
2511        }
2512
2513        /* register v4l2 video video_device */
2514        ret = video_register_device(dev->vdev, VFL_TYPE_GRABBER,
2515                                       video_nr[dev->devno]);
2516        if (ret) {
2517                em28xx_errdev("unable to register video device (error=%i).\n",
2518                              ret);
2519                return ret;
2520        }
2521
2522        /* Allocate and fill vbi video_device struct */
2523        if (em28xx_vbi_supported(dev) == 1) {
2524                dev->vbi_dev = em28xx_vdev_init(dev, &em28xx_video_template,
2525                                                "vbi");
2526
2527                /* register v4l2 vbi video_device */
2528                ret = video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
2529                                            vbi_nr[dev->devno]);
2530                if (ret < 0) {
2531                        em28xx_errdev("unable to register vbi device\n");
2532                        return ret;
2533                }
2534        }
2535
2536        if (em28xx_boards[dev->model].radio.type == EM28XX_RADIO) {
2537                dev->radio_dev = em28xx_vdev_init(dev, &em28xx_radio_template,
2538                                                  "radio");
2539                if (!dev->radio_dev) {
2540                        em28xx_errdev("cannot allocate video_device.\n");
2541                        return -ENODEV;
2542                }
2543                ret = video_register_device(dev->radio_dev, VFL_TYPE_RADIO,
2544                                            radio_nr[dev->devno]);
2545                if (ret < 0) {
2546                        em28xx_errdev("can't register radio device\n");
2547                        return ret;
2548                }
2549                em28xx_info("Registered radio device as /dev/radio%d\n",
2550                            dev->radio_dev->num);
2551        }
2552
2553        em28xx_info("V4L2 video device registered as /dev/video%d\n",
2554                                dev->vdev->num);
2555
2556        if (dev->vbi_dev)
2557                em28xx_info("V4L2 VBI device registered as /dev/vbi%d\n",
2558                            dev->vbi_dev->num);
2559
2560        return 0;
2561}
2562
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.