V4L/DVB (8750): V4L: check inval in video_register_device_index()
[safe/jmp/linux-2.6] / drivers / media / video / ivtv / ivtv-driver.h
index e80f9f6..2ceb522 100644 (file)
@@ -38,7 +38,6 @@
 
 #include <linux/version.h>
 #include <linux/module.h>
-#include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/sched.h>
@@ -52,6 +51,7 @@
 #include <linux/unistd.h>
 #include <linux/byteorder/swab.h>
 #include <linux/pagemap.h>
+#include <linux/scatterlist.h>
 #include <linux/workqueue.h>
 #include <linux/mutex.h>
 #include <asm/uaccess.h>
 #include <linux/dvb/video.h>
 #include <linux/dvb/audio.h>
 #include <media/v4l2-common.h>
+#include <media/v4l2-ioctl.h>
 #include <media/tuner.h>
 #include <media/cx2341x.h>
 
-#include <media/ivtv.h>
-
+#include <linux/ivtv.h>
 
+/* Memory layout */
 #define IVTV_ENCODER_OFFSET    0x00000000
-#define IVTV_ENCODER_SIZE      0x00800000      /* Last half isn't needed 0x01000000 */
-
+#define IVTV_ENCODER_SIZE      0x00800000      /* Total size is 0x01000000, but only first half is used */
 #define IVTV_DECODER_OFFSET    0x01000000
-#define IVTV_DECODER_SIZE      0x00800000      /* Last half isn't needed 0x01000000 */
-
+#define IVTV_DECODER_SIZE      0x00800000      /* Total size is 0x01000000, but only first half is used */
 #define IVTV_REG_OFFSET        0x02000000
 #define IVTV_REG_SIZE          0x00010000
 
-/* Buffers on hardware offsets */
-#define IVTV_YUV_BUFFER_OFFSET    0x001a8600   /* First YUV Buffer */
-#define IVTV_YUV_BUFFER_OFFSET_1  0x00240400   /* Second YUV Buffer */
-#define IVTV_YUV_BUFFER_OFFSET_2  0x002d8200   /* Third YUV Buffer */
-#define IVTV_YUV_BUFFER_OFFSET_3  0x00370000   /* Fourth YUV Buffer */
-#define IVTV_YUV_BUFFER_UV_OFFSET 0x65400      /* Offset to UV Buffer */
-
-/* Offset to filter table in firmware */
-#define IVTV_YUV_HORIZONTAL_FILTER_OFFSET 0x025d8
-#define IVTV_YUV_VERTICAL_FILTER_OFFSET 0x03358
-
-extern const u32 yuv_offset[4];
-
 /* Maximum ivtv driver instances. Some people have a huge number of
    capture cards, so set this to a high value. */
 #define IVTV_MAX_CARDS 32
 
-/* Supported cards */
-#define IVTV_CARD_PVR_250            0 /* WinTV PVR 250 */
-#define IVTV_CARD_PVR_350            1 /* encoder, decoder, tv-out */
-#define IVTV_CARD_PVR_150            2 /* WinTV PVR 150 and PVR 500 (really just two
-                                          PVR150s on one PCI board) */
-#define IVTV_CARD_M179               3 /* AVerMedia M179 (encoder only) */
-#define IVTV_CARD_MPG600             4 /* Kuroutoshikou ITVC16-STVLP/YUAN MPG600, encoder only */
-#define IVTV_CARD_MPG160             5 /* Kuroutoshikou ITVC15-STVLP/YUAN MPG160
-                                          cx23415 based, but does not have tv-out */
-#define IVTV_CARD_PG600              6 /* YUAN PG600/DIAMONDMM PVR-550 based on the CX Falcon 2 */
-#define IVTV_CARD_AVC2410            7 /* Adaptec AVC-2410 */
-#define IVTV_CARD_AVC2010            8 /* Adaptec AVD-2010 (No Tuner) */
-#define IVTV_CARD_TG5000TV           9 /* NAGASE TRANSGEAR 5000TV, encoder only */
-#define IVTV_CARD_VA2000MAX_SNT6     10 /* VA2000MAX-STN6 */
-#define IVTV_CARD_CX23416GYC        11 /* Kuroutoshikou CX23416GYC-STVLP (Yuan MPG600GR OEM) */
-#define IVTV_CARD_GV_MVPRX          12 /* I/O Data GV-MVP/RX, RX2, RX2W */
-#define IVTV_CARD_GV_MVPRX2E        13 /* I/O Data GV-MVP/RX2E */
-#define IVTV_CARD_GOTVIEW_PCI_DVD    14        /* GotView PCI DVD */
-#define IVTV_CARD_GOTVIEW_PCI_DVD2   15        /* GotView PCI DVD2 */
-#define IVTV_CARD_YUAN_MPC622        16        /* Yuan MPC622 miniPCI */
-#define IVTV_CARD_DCTMTVP1          17 /* DIGITAL COWBOY DCT-MTVP1 */
-#define IVTV_CARD_PG600V2           18 /* Yuan PG600V2/GotView PCI DVD Lite */
-#define IVTV_CARD_CLUB3D            19 /* Club3D ZAP-TV1x01 */
-#define IVTV_CARD_AVERTV_MCE116             20 /* AVerTV MCE 116 Plus */
-#define IVTV_CARD_LAST                      20
-
-/* Variants of existing cards but with the same PCI IDs. The driver
-   detects these based on other device information.
-   These cards must always come last.
-   New cards must be inserted above, and the indices of the cards below
-   must be adjusted accordingly. */
-
-/* PVR-350 V1 (uses saa7114) */
-#define IVTV_CARD_PVR_350_V1        (IVTV_CARD_LAST+1)
-/* 2 variants of Kuroutoshikou CX23416GYC-STVLP (Yuan MPG600GR OEM) */
-#define IVTV_CARD_CX23416GYC_NOGR    (IVTV_CARD_LAST+2)
-#define IVTV_CARD_CX23416GYC_NOGRYCS (IVTV_CARD_LAST+3)
-
 #define IVTV_ENC_STREAM_TYPE_MPG  0
 #define IVTV_ENC_STREAM_TYPE_YUV  1
 #define IVTV_ENC_STREAM_TYPE_VBI  2
@@ -141,70 +89,8 @@ extern const u32 yuv_offset[4];
 #define IVTV_DEC_STREAM_TYPE_YUV  8
 #define IVTV_MAX_STREAMS         9
 
-#define IVTV_V4L2_DEC_MPG_OFFSET  16   /* offset from 0 to register decoder mpg v4l2 minors on */
-#define IVTV_V4L2_ENC_PCM_OFFSET  24   /* offset from 0 to register pcm v4l2 minors on */
-#define IVTV_V4L2_ENC_YUV_OFFSET  32   /* offset from 0 to register yuv v4l2 minors on */
-#define IVTV_V4L2_DEC_YUV_OFFSET  48   /* offset from 0 to register decoder yuv v4l2 minors on */
-#define IVTV_V4L2_DEC_VBI_OFFSET   8   /* offset from 0 to register decoder vbi input v4l2 minors on */
-#define IVTV_V4L2_DEC_VOUT_OFFSET 16   /* offset from 0 to register vbi output v4l2 minors on */
-
-#define IVTV_ENC_MEM_START 0x00000000
-#define IVTV_DEC_MEM_START 0x01000000
-
-/* system vendor and device IDs */
-#define PCI_VENDOR_ID_ICOMP  0x4444
-#define PCI_DEVICE_ID_IVTV15 0x0803
-#define PCI_DEVICE_ID_IVTV16 0x0016
-
-/* subsystem vendor ID */
-#define IVTV_PCI_ID_HAUPPAUGE          0x0070
-#define IVTV_PCI_ID_HAUPPAUGE_ALT1     0x0270
-#define IVTV_PCI_ID_HAUPPAUGE_ALT2     0x4070
-#define IVTV_PCI_ID_ADAPTEC            0x9005
-#define IVTV_PCI_ID_AVERMEDIA          0x1461
-#define IVTV_PCI_ID_YUAN1              0x12ab
-#define IVTV_PCI_ID_YUAN2              0xff01
-#define IVTV_PCI_ID_YUAN3              0xffab
-#define IVTV_PCI_ID_YUAN4              0xfbab
-#define IVTV_PCI_ID_DIAMONDMM          0xff92
-#define IVTV_PCI_ID_IODATA             0x10fc
-#define IVTV_PCI_ID_MELCO              0x1154
-#define IVTV_PCI_ID_GOTVIEW1           0xffac
-#define IVTV_PCI_ID_GOTVIEW2           0xffad
-
-/* Decoder Buffer hardware size on Chip */
-#define IVTV_DEC_MAX_BUF        0x00100000     /* max bytes in decoder buffer */
-#define IVTV_DEC_MIN_BUF        0x00010000     /* min bytes in dec buffer */
-
-/* ======================================================================== */
-/* ========================== START USER SETTABLE DMA VARIABLES =========== */
-/* ======================================================================== */
-
 #define IVTV_DMA_SG_OSD_ENT    (2883584/PAGE_SIZE)     /* sg entities */
 
-/* DMA Buffers, Default size in MB allocated */
-#define IVTV_DEFAULT_ENC_MPG_BUFFERS 4
-#define IVTV_DEFAULT_ENC_YUV_BUFFERS 2
-#define IVTV_DEFAULT_ENC_VBI_BUFFERS 1
-#define IVTV_DEFAULT_ENC_PCM_BUFFERS 1
-#define IVTV_DEFAULT_DEC_MPG_BUFFERS 1
-#define IVTV_DEFAULT_DEC_YUV_BUFFERS 1
-#define IVTV_DEFAULT_DEC_VBI_BUFFERS 1
-
-/* ======================================================================== */
-/* ========================== END USER SETTABLE DMA VARIABLES ============= */
-/* ======================================================================== */
-
-/* Decoder Status Register */
-#define IVTV_DMA_ERR_LIST      0x00000010
-#define IVTV_DMA_ERR_WRITE     0x00000008
-#define IVTV_DMA_ERR_READ      0x00000004
-#define IVTV_DMA_SUCCESS_WRITE         0x00000002
-#define IVTV_DMA_SUCCESS_READ  0x00000001
-#define IVTV_DMA_READ_ERR      (IVTV_DMA_ERR_LIST | IVTV_DMA_ERR_READ)
-#define IVTV_DMA_WRITE_ERR     (IVTV_DMA_ERR_LIST | IVTV_DMA_ERR_WRITE)
-#define IVTV_DMA_ERR           (IVTV_DMA_ERR_LIST | IVTV_DMA_ERR_WRITE | IVTV_DMA_ERR_READ)
-
 /* DMA Registers */
 #define IVTV_REG_DMAXFER       (0x0000)
 #define IVTV_REG_DMASTATUS     (0x0004)
@@ -227,44 +113,24 @@ extern const u32 yuv_offset[4];
 #define IVTV_REG_VPU                   (0x9058)
 #define IVTV_REG_APU                   (0xA064)
 
-#define IVTV_IRQ_ENC_START_CAP         (0x1 << 31)
-#define IVTV_IRQ_ENC_EOS               (0x1 << 30)
-#define IVTV_IRQ_ENC_VBI_CAP           (0x1 << 29)
-#define IVTV_IRQ_ENC_VIM_RST           (0x1 << 28)
-#define IVTV_IRQ_ENC_DMA_COMPLETE      (0x1 << 27)
-#define IVTV_IRQ_ENC_PIO_COMPLETE      (0x1 << 25)
-#define IVTV_IRQ_DEC_AUD_MODE_CHG      (0x1 << 24)
-#define IVTV_IRQ_DEC_DATA_REQ          (0x1 << 22)
-#define IVTV_IRQ_DEC_DMA_COMPLETE      (0x1 << 20)
-#define IVTV_IRQ_DEC_VBI_RE_INSERT     (0x1 << 19)
-#define IVTV_IRQ_DMA_ERR               (0x1 << 18)
-#define IVTV_IRQ_DMA_WRITE             (0x1 << 17)
-#define IVTV_IRQ_DMA_READ              (0x1 << 16)
-#define IVTV_IRQ_DEC_VSYNC             (0x1 << 10)
-
-/* IRQ Masks */
-#define IVTV_IRQ_MASK_INIT (IVTV_IRQ_DMA_ERR|IVTV_IRQ_ENC_DMA_COMPLETE|\
-               IVTV_IRQ_DMA_READ|IVTV_IRQ_ENC_PIO_COMPLETE)
-
-#define IVTV_IRQ_MASK_CAPTURE (IVTV_IRQ_ENC_START_CAP | IVTV_IRQ_ENC_EOS)
-#define IVTV_IRQ_MASK_DECODE  (IVTV_IRQ_DEC_DATA_REQ|IVTV_IRQ_DEC_AUD_MODE_CHG)
-
 /* i2c stuff */
 #define I2C_CLIENTS_MAX 16
 
 /* debugging */
+extern int ivtv_debug;
 
-#define IVTV_DBGFLG_WARN  (1 << 0)
-#define IVTV_DBGFLG_INFO  (1 << 1)
-#define IVTV_DBGFLG_API   (1 << 2)
-#define IVTV_DBGFLG_DMA   (1 << 3)
-#define IVTV_DBGFLG_IOCTL (1 << 4)
-#define IVTV_DBGFLG_I2C   (1 << 5)
-#define IVTV_DBGFLG_IRQ   (1 << 6)
-#define IVTV_DBGFLG_DEC   (1 << 7)
-#define IVTV_DBGFLG_YUV   (1 << 8)
+#define IVTV_DBGFLG_WARN    (1 << 0)
+#define IVTV_DBGFLG_INFO    (1 << 1)
+#define IVTV_DBGFLG_MB      (1 << 2)
+#define IVTV_DBGFLG_IOCTL   (1 << 3)
+#define IVTV_DBGFLG_FILE    (1 << 4)
+#define IVTV_DBGFLG_DMA     (1 << 5)
+#define IVTV_DBGFLG_IRQ     (1 << 6)
+#define IVTV_DBGFLG_DEC     (1 << 7)
+#define IVTV_DBGFLG_YUV     (1 << 8)
+#define IVTV_DBGFLG_I2C     (1 << 9)
 /* Flag to turn on high volume debugging */
-#define IVTV_DBGFLG_HIGHVOL (1 << 9)
+#define IVTV_DBGFLG_HIGHVOL (1 << 10)
 
 /* NOTE: extra space before comma in 'itv->num , ## args' is required for
    gcc-2.95, otherwise it won't compile. */
@@ -273,41 +139,38 @@ extern const u32 yuv_offset[4];
                if ((x) & ivtv_debug) \
                        printk(KERN_INFO "ivtv%d " type ": " fmt, itv->num , ## args); \
        } while (0)
-#define IVTV_DEBUG_WARN(fmt, args...)  IVTV_DEBUG(IVTV_DBGFLG_WARN, "warning", fmt , ## args)
-#define IVTV_DEBUG_INFO(fmt, args...)  IVTV_DEBUG(IVTV_DBGFLG_INFO, "info",fmt , ## args)
-#define IVTV_DEBUG_API(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_API, "api", fmt , ## args)
-#define IVTV_DEBUG_DMA(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_DMA, "dma", fmt , ## args)
+#define IVTV_DEBUG_WARN(fmt, args...)  IVTV_DEBUG(IVTV_DBGFLG_WARN,  "warn",  fmt , ## args)
+#define IVTV_DEBUG_INFO(fmt, args...)  IVTV_DEBUG(IVTV_DBGFLG_INFO,  "info",  fmt , ## args)
+#define IVTV_DEBUG_MB(fmt, args...)    IVTV_DEBUG(IVTV_DBGFLG_MB,    "mb",    fmt , ## args)
+#define IVTV_DEBUG_DMA(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_DMA,   "dma",   fmt , ## args)
 #define IVTV_DEBUG_IOCTL(fmt, args...) IVTV_DEBUG(IVTV_DBGFLG_IOCTL, "ioctl", fmt , ## args)
-#define IVTV_DEBUG_I2C(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_I2C, "i2c", fmt , ## args)
-#define IVTV_DEBUG_IRQ(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_IRQ, "irq", fmt , ## args)
-#define IVTV_DEBUG_DEC(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_DEC, "dec", fmt , ## args)
-#define IVTV_DEBUG_YUV(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_YUV, "yuv", fmt , ## args)
+#define IVTV_DEBUG_FILE(fmt, args...)  IVTV_DEBUG(IVTV_DBGFLG_FILE,  "file",  fmt , ## args)
+#define IVTV_DEBUG_I2C(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_I2C,   "i2c",   fmt , ## args)
+#define IVTV_DEBUG_IRQ(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_IRQ,   "irq",   fmt , ## args)
+#define IVTV_DEBUG_DEC(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_DEC,   "dec",   fmt , ## args)
+#define IVTV_DEBUG_YUV(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_YUV,   "yuv",   fmt , ## args)
 
 #define IVTV_DEBUG_HIGH_VOL(x, type, fmt, args...) \
        do { \
                if (((x) & ivtv_debug) && (ivtv_debug & IVTV_DBGFLG_HIGHVOL)) \
                        printk(KERN_INFO "ivtv%d " type ": " fmt, itv->num , ## args); \
        } while (0)
-#define IVTV_DEBUG_HI_WARN(fmt, args...)  IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_WARN, "warning", fmt , ## args)
-#define IVTV_DEBUG_HI_INFO(fmt, args...)  IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_INFO, "info",fmt , ## args)
-#define IVTV_DEBUG_HI_API(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_API, "api", fmt , ## args)
-#define IVTV_DEBUG_HI_DMA(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_DMA, "dma", fmt , ## args)
+#define IVTV_DEBUG_HI_WARN(fmt, args...)  IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_WARN,  "warn",  fmt , ## args)
+#define IVTV_DEBUG_HI_INFO(fmt, args...)  IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_INFO,  "info",  fmt , ## args)
+#define IVTV_DEBUG_HI_MB(fmt, args...)    IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_MB,    "mb",    fmt , ## args)
+#define IVTV_DEBUG_HI_DMA(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_DMA,   "dma",   fmt , ## args)
 #define IVTV_DEBUG_HI_IOCTL(fmt, args...) IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_IOCTL, "ioctl", fmt , ## args)
-#define IVTV_DEBUG_HI_I2C(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_I2C, "i2c", fmt , ## args)
-#define IVTV_DEBUG_HI_IRQ(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_IRQ, "irq", fmt , ## args)
-#define IVTV_DEBUG_HI_DEC(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_DEC, "dec", fmt , ## args)
-#define IVTV_DEBUG_HI_YUV(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_YUV, "yuv", fmt , ## args)
+#define IVTV_DEBUG_HI_FILE(fmt, args...)  IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_FILE,  "file",  fmt , ## args)
+#define IVTV_DEBUG_HI_I2C(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_I2C,   "i2c",   fmt , ## args)
+#define IVTV_DEBUG_HI_IRQ(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_IRQ,   "irq",   fmt , ## args)
+#define IVTV_DEBUG_HI_DEC(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_DEC,   "dec",   fmt , ## args)
+#define IVTV_DEBUG_HI_YUV(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_YUV,   "yuv",   fmt , ## args)
 
 /* Standard kernel messages */
 #define IVTV_ERR(fmt, args...)      printk(KERN_ERR  "ivtv%d: " fmt, itv->num , ## args)
 #define IVTV_WARN(fmt, args...)     printk(KERN_WARNING "ivtv%d: " fmt, itv->num , ## args)
 #define IVTV_INFO(fmt, args...)     printk(KERN_INFO "ivtv%d: " fmt, itv->num , ## args)
 
-/* Values for IVTV_API_DEC_PLAYBACK_SPEED mpeg_frame_type_mask parameter: */
-#define MPEG_FRAME_TYPE_IFRAME 1
-#define MPEG_FRAME_TYPE_IFRAME_PFRAME 3
-#define MPEG_FRAME_TYPE_ALL 7
-
 /* output modes (cx23415 only) */
 #define OUT_NONE        0
 #define OUT_MPG         1
@@ -317,22 +180,14 @@ extern const u32 yuv_offset[4];
 
 #define IVTV_MAX_PGM_INDEX (400)
 
-extern int ivtv_debug;
-
-
 struct ivtv_options {
-       int megabytes[IVTV_MAX_STREAMS]; /* Size in megabytes of each stream */
-       int cardtype;           /* force card type on load */
-       int tuner;              /* set tuner on load */
-       int radio;              /* enable/disable radio */
-       int newi2c;             /* New I2C algorithm */
+       int kilobytes[IVTV_MAX_STREAMS];        /* size in kilobytes of each stream */
+       int cardtype;                           /* force card type on load */
+       int tuner;                              /* set tuner on load */
+       int radio;                              /* enable/disable radio */
+       int newi2c;                             /* new I2C algorithm */
 };
 
-#define IVTV_MBOX_DMA_START 6
-#define IVTV_MBOX_DMA_END 8
-#define IVTV_MBOX_DMA 9
-#define IVTV_MBOX_FIELD_DISPLAYED 8
-
 /* ivtv-specific mailbox template */
 struct ivtv_mailbox {
        u32 flags;
@@ -377,10 +232,10 @@ struct ivtv_mailbox_data {
 #define IVTV_F_I_DMA              0    /* DMA in progress */
 #define IVTV_F_I_UDMA             1    /* UDMA in progress */
 #define IVTV_F_I_UDMA_PENDING     2    /* UDMA pending */
-#define IVTV_F_I_SPEED_CHANGE     3    /* A speed change is in progress */
-#define IVTV_F_I_EOS              4    /* End of encoder stream reached */
-#define IVTV_F_I_RADIO_USER       5    /* The radio tuner is selected */
-#define IVTV_F_I_DIG_RST          6    /* Reset digitizer */
+#define IVTV_F_I_SPEED_CHANGE     3    /* a speed change is in progress */
+#define IVTV_F_I_EOS              4    /* end of encoder stream reached */
+#define IVTV_F_I_RADIO_USER       5    /* the radio tuner is selected */
+#define IVTV_F_I_DIG_RST          6    /* reset digitizer */
 #define IVTV_F_I_DEC_YUV          7    /* YUV instead of MPG is being decoded */
 #define IVTV_F_I_UPDATE_CC        9    /* CC should be updated */
 #define IVTV_F_I_UPDATE_WSS       10   /* WSS should be updated */
@@ -388,7 +243,7 @@ struct ivtv_mailbox_data {
 #define IVTV_F_I_DECODING_YUV     12   /* this stream is YUV frame decoding */
 #define IVTV_F_I_ENC_PAUSED       13   /* the encoder is paused */
 #define IVTV_F_I_VALID_DEC_TIMINGS 14  /* last_dec_timing is valid */
-#define IVTV_F_I_HAVE_WORK        15   /* Used in the interrupt handler: there is work to be done */
+#define IVTV_F_I_HAVE_WORK        15   /* used in the interrupt handler: there is work to be done */
 #define IVTV_F_I_WORK_HANDLER_VBI  16  /* there is work to be done for VBI */
 #define IVTV_F_I_WORK_HANDLER_YUV  17  /* there is work to be done for YUV */
 #define IVTV_F_I_WORK_HANDLER_PIO  18  /* there is work to be done for PIO */
@@ -396,6 +251,7 @@ struct ivtv_mailbox_data {
 #define IVTV_F_I_DEC_PAUSED       20   /* the decoder is paused */
 #define IVTV_F_I_INITED                   21   /* set after first open */
 #define IVTV_F_I_FAILED                   22   /* set if first open failed */
+#define IVTV_F_I_WORK_INITED       23  /* worker thread was initialized */
 
 /* Event notifications */
 #define IVTV_F_I_EV_DEC_STOPPED           28   /* decoder stopped event */
@@ -405,6 +261,12 @@ struct ivtv_mailbox_data {
 
 /* Scatter-Gather array element, used in DMA transfers */
 struct ivtv_sg_element {
+       __le32 src;
+       __le32 dst;
+       __le32 size;
+};
+
+struct ivtv_sg_host_element {
        u32 src;
        u32 dst;
        u32 size;
@@ -414,6 +276,8 @@ struct ivtv_user_dma {
        struct mutex lock;
        int page_count;
        struct page *map[IVTV_DMA_SG_OSD_ENT];
+       /* Needed when dealing with highmem userspace buffers */
+       struct page *bouncemap[IVTV_DMA_SG_OSD_ENT];
 
        /* Base Dev SG Array for cx23415/6 */
        struct ivtv_sg_element SGarray[IVTV_DMA_SG_OSD_ENT];
@@ -439,19 +303,18 @@ struct ivtv_buffer {
        unsigned short b_flags;
        unsigned short dma_xfer_cnt;
        char *buf;
-
        u32 bytesused;
        u32 readpos;
 };
 
 struct ivtv_queue {
-       struct list_head list;
-       u32 buffers;
-       u32 length;
-       u32 bytesused;
+       struct list_head list;          /* the list of buffers in this queue */
+       u32 buffers;                    /* number of buffers in this queue */
+       u32 length;                     /* total number of bytes of available buffer space */
+       u32 bytesused;                  /* total number of bytes used in this queue */
 };
 
-struct ivtv;   /* forward reference */
+struct ivtv;                           /* forward reference */
 
 struct ivtv_stream {
        /* These first four fields are always set, even if the stream
@@ -462,11 +325,9 @@ struct ivtv_stream {
        int type;                       /* stream type */
 
        u32 id;
-       spinlock_t qlock;       /* locks access to the queues */
-       unsigned long s_flags;  /* status flags, see above */
-       int dma;                /* can be PCI_DMA_TODEVICE,
-                                  PCI_DMA_FROMDEVICE or
-                                  PCI_DMA_NONE */
+       spinlock_t qlock;               /* locks access to the queues */
+       unsigned long s_flags;          /* status flags, see above */
+       int dma;                        /* can be PCI_DMA_TODEVICE, PCI_DMA_FROMDEVICE or PCI_DMA_NONE */
        u32 pending_offset;
        u32 pending_backup;
        u64 pending_pts;
@@ -496,8 +357,8 @@ struct ivtv_stream {
        u16 dma_xfer_cnt;
 
        /* Base Dev SG Array for cx23415/6 */
-       struct ivtv_sg_element *sg_pending;
-       struct ivtv_sg_element *sg_processing;
+       struct ivtv_sg_host_element *sg_pending;
+       struct ivtv_sg_host_element *sg_processing;
        struct ivtv_sg_element *sg_dma;
        dma_addr_t sg_handle;
        int sg_pending_size;
@@ -509,37 +370,38 @@ struct ivtv_stream {
 };
 
 struct ivtv_open_id {
-       u32 open_id;
-       int type;
-       enum v4l2_priority prio;
+       u32 open_id;                    /* unique ID for this file descriptor */
+       int type;                       /* stream type */
+       int yuv_frames;                 /* 1: started OUT_UDMA_YUV output mode */
+       enum v4l2_priority prio;        /* priority */
        struct ivtv *itv;
 };
 
-#define IVTV_YUV_UPDATE_HORIZONTAL  0x01
-#define IVTV_YUV_UPDATE_VERTICAL    0x02
-
 struct yuv_frame_info
 {
        u32 update;
-       int src_x;
-       int src_y;
-       unsigned int src_w;
-       unsigned int src_h;
-       int dst_x;
-       int dst_y;
-       unsigned int dst_w;
-       unsigned int dst_h;
-       int pan_x;
-       int pan_y;
+       s32 src_x;
+       s32 src_y;
+       u32 src_w;
+       u32 src_h;
+       s32 dst_x;
+       s32 dst_y;
+       u32 dst_w;
+       u32 dst_h;
+       s32 pan_x;
+       s32 pan_y;
        u32 vis_w;
        u32 vis_h;
        u32 interlaced_y;
        u32 interlaced_uv;
-       int tru_x;
+       s32 tru_x;
        u32 tru_w;
        u32 tru_h;
        u32 offset_y;
-       int lace_mode;
+       s32 lace_mode;
+       u32 sync_field;
+       u32 delay;
+       u32 interlaced;
 };
 
 #define IVTV_YUV_MODE_INTERLACED       0x00
@@ -551,6 +413,8 @@ struct yuv_frame_info
 #define IVTV_YUV_SYNC_ODD              0x04
 #define IVTV_YUV_SYNC_MASK             0x04
 
+#define IVTV_YUV_BUFFERS 8
+
 struct yuv_playback_info
 {
        u32 reg_2834;
@@ -600,6 +464,8 @@ struct yuv_playback_info
        int v_filter_2;
        int h_filter;
 
+       u8 track_osd; /* Should yuv output track the OSD size & position */
+
        u32 osd_x_offset;
        u32 osd_y_offset;
 
@@ -609,9 +475,10 @@ struct yuv_playback_info
        u32 osd_vis_w;
        u32 osd_vis_h;
 
-       int decode_height;
+       u32 osd_full_w;
+       u32 osd_full_h;
 
-       int frame_interlaced;
+       int decode_height;
 
        int lace_mode;
        int lace_threshold;
@@ -623,50 +490,83 @@ struct yuv_playback_info
        u32 yuv_forced_update;
        int update_frame;
 
-       int sync_field[4];  /* Field to sync on */
-       int field_delay[4]; /* Flag to extend duration of previous frame */
        u8 fields_lapsed;   /* Counter used when delaying a frame */
 
-       struct yuv_frame_info new_frame_info[4];
+       struct yuv_frame_info new_frame_info[IVTV_YUV_BUFFERS];
        struct yuv_frame_info old_frame_info;
        struct yuv_frame_info old_frame_info_args;
 
        void *blanking_ptr;
        dma_addr_t blanking_dmaptr;
+
+       int stream_size;
+
+       u8 draw_frame; /* PVR350 buffer to draw into */
+       u8 max_frames_buffered; /* Maximum number of frames to buffer */
+
+       struct v4l2_rect main_rect;
+       u32 v4l2_src_w;
+       u32 v4l2_src_h;
 };
 
 #define IVTV_VBI_FRAMES 32
 
 /* VBI data */
+struct vbi_cc {
+       u8 odd[2];      /* two-byte payload of odd field */
+       u8 even[2];     /* two-byte payload of even field */;
+};
+
+struct vbi_vps {
+       u8 data[5];     /* five-byte VPS payload */
+};
+
 struct vbi_info {
-       u32 dec_start;
-       u32 enc_start, enc_size;
-       int fpi;
-       u32 frame;
-       u8 cc_data_odd[256];
-       u8 cc_data_even[256];
-       int cc_pos;
-       u8 cc_no_update;
-       u8 vps[5];
-       u8 vps_found;
-       int wss;
-       u8 wss_found;
-       u8 wss_no_update;
-       u32 raw_decoder_line_size;
-       u8 raw_decoder_sav_odd_field;
-       u8 raw_decoder_sav_even_field;
-       u32 sliced_decoder_line_size;
-       u8 sliced_decoder_sav_odd_field;
-       u8 sliced_decoder_sav_even_field;
-       struct v4l2_format in;
-       /* convenience pointer to sliced struct in vbi_in union */
-       struct v4l2_sliced_vbi_format *sliced_in;
-       int insert_mpeg;
-
-       /* Buffer for the maximum of 2 * 18 * packet_size sliced VBI lines.
-          One for /dev/vbi0 and one for /dev/vbi8 */
-       struct v4l2_sliced_vbi_data sliced_data[36];
-       struct v4l2_sliced_vbi_data sliced_dec_data[36];
+       /* VBI general data, does not change during streaming */
+
+       u32 raw_decoder_line_size;              /* raw VBI line size from digitizer */
+       u8 raw_decoder_sav_odd_field;           /* raw VBI Start Active Video digitizer code of odd field */
+       u8 raw_decoder_sav_even_field;          /* raw VBI Start Active Video digitizer code of even field */
+       u32 sliced_decoder_line_size;           /* sliced VBI line size from digitizer */
+       u8 sliced_decoder_sav_odd_field;        /* sliced VBI Start Active Video digitizer code of odd field */
+       u8 sliced_decoder_sav_even_field;       /* sliced VBI Start Active Video digitizer code of even field */
+
+       u32 start[2];                           /* start of first VBI line in the odd/even fields */
+       u32 count;                              /* number of VBI lines per field */
+       u32 raw_size;                           /* size of raw VBI line from the digitizer */
+       u32 sliced_size;                        /* size of sliced VBI line from the digitizer */
+
+       u32 dec_start;                          /* start in decoder memory of VBI re-insertion buffers */
+       u32 enc_start;                          /* start in encoder memory of VBI capture buffers */
+       u32 enc_size;                           /* size of VBI capture area */
+       int fpi;                                /* number of VBI frames per interrupt */
+
+       struct v4l2_format in;                  /* current VBI capture format */
+       struct v4l2_sliced_vbi_format *sliced_in; /* convenience pointer to sliced struct in vbi.in union */
+       int insert_mpeg;                        /* if non-zero, then embed VBI data in MPEG stream */
+
+       /* Raw VBI compatibility hack */
+
+       u32 frame;                              /* frame counter hack needed for backwards compatibility
+                                                  of old VBI software */
+
+       /* Sliced VBI output data */
+
+       struct vbi_cc cc_payload[256];          /* sliced VBI CC payload array: it is an array to
+                                                  prevent dropping CC data if they couldn't be
+                                                  processed fast enough */
+       int cc_payload_idx;                     /* index in cc_payload */
+       u8 cc_missing_cnt;                      /* counts number of frames without CC for passthrough mode */
+       int wss_payload;                        /* sliced VBI WSS payload */
+       u8 wss_missing_cnt;                     /* counts number of frames without WSS for passthrough mode */
+       struct vbi_vps vps_payload;             /* sliced VBI VPS payload */
+
+       /* Sliced VBI capture data */
+
+       struct v4l2_sliced_vbi_data sliced_data[36];    /* sliced VBI storage for VBI encoder stream */
+       struct v4l2_sliced_vbi_data sliced_dec_data[36];/* sliced VBI storage for VBI decoder stream */
+
+       /* VBI Embedding data */
 
        /* Buffer for VBI data inserted into MPEG stream.
           The first byte is a dummy byte that's never used.
@@ -683,12 +583,9 @@ struct vbi_info {
           This pointer array will allocate 2049 bytes to store each VBI frame. */
        u8 *sliced_mpeg_data[IVTV_VBI_FRAMES];
        u32 sliced_mpeg_size[IVTV_VBI_FRAMES];
-       struct ivtv_buffer sliced_mpeg_buf;
-       u32 inserted_frame;
-
-       u32 start[2], count;
-       u32 raw_size;
-       u32 sliced_size;
+       struct ivtv_buffer sliced_mpeg_buf;     /* temporary buffer holding data from sliced_mpeg_data */
+       u32 inserted_frame;                     /* index in sliced_mpeg_size of next sliced data
+                                                  to be inserted in the MPEG stream */
 };
 
 /* forward declaration of struct defined in ivtv-cards.h */
@@ -696,133 +593,131 @@ struct ivtv_card;
 
 /* Struct to hold info about ivtv cards */
 struct ivtv {
-       int num;                /* board number, -1 during init! */
-       char name[8];           /* board name for printk and interrupts (e.g. 'ivtv0') */
-       struct pci_dev *dev;    /* PCI device */
+       /* General fixed card data */
+       int num;                        /* board number, -1 during init! */
+       char name[8];                   /* board name for printk and interrupts (e.g. 'ivtv0') */
+       struct pci_dev *dev;            /* PCI device */
        const struct ivtv_card *card;   /* card information */
-       const char *card_name;  /* full name of the card */
-       u8 has_cx23415;         /* 1 if it is a cx23415 based card, 0 for cx23416 */
-       u8 is_50hz;
-       u8 is_60hz;
-       u8 is_out_50hz;
-       u8 is_out_60hz;
-       u8 pvr150_workaround;   /* 1 if the cx25840 needs to workaround a PVR150 bug */
-       u8 nof_inputs;          /* number of video inputs */
-       u8 nof_audio_inputs;    /* number of audio inputs */
-       u32 v4l2_cap;           /* V4L2 capabilities of card */
-       u32 hw_flags;           /* Hardware description of the board */
-       int tunerid;            /* Userspace tuner ID for experimental Xceive tuner support */
-
-       /* controlling Video decoder function */
+       const char *card_name;          /* full name of the card */
+       const struct ivtv_card_tuner_i2c *card_i2c; /* i2c addresses to probe for tuner */
+       u8 has_cx23415;                 /* 1 if it is a cx23415 based card, 0 for cx23416 */
+       u8 pvr150_workaround;           /* 1 if the cx25840 needs to workaround a PVR150 bug */
+       u8 nof_inputs;                  /* number of video inputs */
+       u8 nof_audio_inputs;            /* number of audio inputs */
+       u32 v4l2_cap;                   /* V4L2 capabilities of card */
+       u32 hw_flags;                   /* hardware description of the board */
+       v4l2_std_id tuner_std;          /* the norm of the card's tuner (fixed) */
+                                       /* controlling video decoder function */
        int (*video_dec_func)(struct ivtv *, unsigned int, void *);
+       u32 base_addr;                  /* PCI resource base address */
+       volatile void __iomem *enc_mem; /* pointer to mapped encoder memory */
+       volatile void __iomem *dec_mem; /* pointer to mapped decoder memory */
+       volatile void __iomem *reg_mem; /* pointer to mapped registers */
+       struct ivtv_options options;    /* user options */
+
+
+       /* High-level state info */
+       unsigned long i_flags;          /* global ivtv flags */
+       u8 is_50hz;                     /* 1 if the current capture standard is 50 Hz */
+       u8 is_60hz                      /* 1 if the current capture standard is 60 Hz */;
+       u8 is_out_50hz                  /* 1 if the current TV output standard is 50 Hz */;
+       u8 is_out_60hz                  /* 1 if the current TV output standard is 60 Hz */;
+       int output_mode;                /* decoder output mode: NONE, MPG, YUV, UDMA YUV, passthrough */
+       u32 audio_input;                /* current audio input */
+       u32 active_input;               /* current video input */
+       u32 active_output;              /* current video output */
+       v4l2_std_id std;                /* current capture TV standard */
+       v4l2_std_id std_out;            /* current TV output standard */
+       u8 audio_stereo_mode;           /* decoder setting how to handle stereo MPEG audio */
+       u8 audio_bilingual_mode;        /* decoder setting how to handle bilingual MPEG audio */
+       struct cx2341x_mpeg_params params;              /* current encoder parameters */
+
+
+       /* Locking */
+       spinlock_t lock;                /* lock access to this struct */
+       struct mutex serialize_lock;    /* mutex used to serialize open/close/start/stop/ioctl operations */
+
+       /* Streams */
+       int stream_buf_size[IVTV_MAX_STREAMS];          /* stream buffer size */
+       struct ivtv_stream streams[IVTV_MAX_STREAMS];   /* stream data */
+       atomic_t capturing;             /* count number of active capture streams */
+       atomic_t decoding;              /* count number of active decoding streams */
+
+
+       /* Interrupts & DMA */
+       u32 irqmask;                    /* active interrupts */
+       u32 irq_rr_idx;                 /* round-robin stream index */
+       struct workqueue_struct *irq_work_queues;       /* workqueue for PIO/YUV/VBI actions */
+       struct work_struct irq_work_queue;              /* work entry */
+       spinlock_t dma_reg_lock;        /* lock access to DMA engine registers */
+       int cur_dma_stream;             /* index of current stream doing DMA (-1 if none) */
+       int cur_pio_stream;             /* index of current stream doing PIO (-1 if none) */
+       u32 dma_data_req_offset;        /* store offset in decoder memory of current DMA request */
+       u32 dma_data_req_size;          /* store size of current DMA request */
+       int dma_retries;                /* current DMA retry attempt */
+       struct ivtv_user_dma udma;      /* user based DMA for OSD */
+       struct timer_list dma_timer;    /* timer used to catch unfinished DMAs */
+       u32 last_vsync_field;           /* last seen vsync field */
+       wait_queue_head_t dma_waitq;    /* wake up when the current DMA is finished */
+       wait_queue_head_t eos_waitq;    /* wake up when EOS arrives */
+       wait_queue_head_t event_waitq;  /* wake up when the next decoder event arrives */
+       wait_queue_head_t vsync_waitq;  /* wake up when the next decoder vsync arrives */
+
+
+       /* Mailbox */
+       struct ivtv_mailbox_data enc_mbox;              /* encoder mailboxes */
+       struct ivtv_mailbox_data dec_mbox;              /* decoder mailboxes */
+       struct ivtv_api_cache api_cache[256];           /* cached API commands */
+
+
+       /* I2C */
+       struct i2c_adapter i2c_adap;
+       struct i2c_algo_bit_data i2c_algo;
+       struct i2c_client i2c_client;
+       struct i2c_client *i2c_clients[I2C_CLIENTS_MAX];/* pointers to all I2C clients */
+       int i2c_state;                  /* i2c bit state */
+       struct mutex i2c_bus_lock;      /* lock i2c bus */
+
+
+       /* Program Index information */
+       u32 pgm_info_offset;            /* start of pgm info in encoder memory */
+       u32 pgm_info_num;               /* number of elements in the pgm cyclic buffer in encoder memory */
+       u32 pgm_info_write_idx;         /* last index written by the card that was transferred to pgm_info[] */
+       u32 pgm_info_read_idx;          /* last index in pgm_info read by the application */
+       struct v4l2_enc_idx_entry pgm_info[IVTV_MAX_PGM_INDEX]; /* filled from the pgm cyclic buffer on the card */
+
+
+       /* Miscellaneous */
+       u32 open_id;                    /* incremented each time an open occurs, is >= 1 */
+       struct v4l2_prio_state prio;    /* priority state */
+       int search_pack_header;         /* 1 if ivtv_copy_buf_to_user() is scanning for a pack header (0xba) */
+       int speed;                      /* current playback speed setting */
+       u8 speed_mute_audio;            /* 1 if audio should be muted when fast forward */
+       u64 mpg_data_received;          /* number of bytes received from the MPEG stream */
+       u64 vbi_data_inserted;          /* number of VBI bytes inserted into the MPEG stream */
+       u32 last_dec_timing[3];         /* cache last retrieved pts/scr/frame values */
+       unsigned long dualwatch_jiffies;/* jiffies value of the previous dualwatch check */
+       u16 dualwatch_stereo_mode;      /* current detected dualwatch stereo mode */
+
+
+       /* VBI state info */
+       struct vbi_info vbi;            /* VBI-specific data */
+
+
+       /* YUV playback */
+       struct yuv_playback_info yuv_info;              /* YUV playback data */
 
-       struct ivtv_options options;    /* User options */
-       int stream_buf_size[IVTV_MAX_STREAMS]; /* Stream buffer size */
-       struct ivtv_stream streams[IVTV_MAX_STREAMS];   /* Stream data */
-       int speed;
-       u8 speed_mute_audio;
-       unsigned long i_flags;  /* global ivtv flags */
-       atomic_t capturing;     /* count number of active capture streams */
-       atomic_t decoding;      /* count number of active decoding streams */
-       u32 irq_rr_idx; /* Round-robin stream index */
-       int cur_dma_stream;     /* index of stream doing DMA */
-       int cur_pio_stream;     /* index of stream doing PIO */
-       u32 dma_data_req_offset;
-       u32 dma_data_req_size;
-       int dma_retries;
-       int output_mode;        /* NONE, MPG, YUV, UDMA YUV, passthrough */
-       spinlock_t lock;        /* lock access to this struct */
-       int search_pack_header;
-
-       spinlock_t dma_reg_lock; /* lock access to DMA engine registers */
-       struct mutex serialize_lock;  /* lock used to serialize starting streams */
-
-       /* User based DMA for OSD */
-       struct ivtv_user_dma udma;
-
-       int open_id;            /* incremented each time an open occurs, used as unique ID.
-                                  starts at 1, so 0 can be used as uninitialized value
-                                  in the stream->id. */
-
-       u32 base_addr;
-       u32 irqmask;
-
-       struct v4l2_prio_state prio;
-       struct workqueue_struct *irq_work_queues;
-       struct work_struct irq_work_queue;
-       struct timer_list dma_timer; /* Timer used to catch unfinished DMAs */
-
-       struct vbi_info vbi;
-
-       struct ivtv_mailbox_data enc_mbox;
-       struct ivtv_mailbox_data dec_mbox;
-       struct ivtv_api_cache api_cache[256];   /* Cached API Commands */
-
-       u8 card_rev;
-       volatile void __iomem *enc_mem, *dec_mem, *reg_mem;
-
-       u32 pgm_info_offset;
-       u32 pgm_info_num;
-       u32 pgm_info_write_idx;
-       u32 pgm_info_read_idx;
-       struct v4l2_enc_idx_entry pgm_info[IVTV_MAX_PGM_INDEX];
-
-       u64 mpg_data_received;
-       u64 vbi_data_inserted;
-
-       wait_queue_head_t cap_w;
-       /* when the next decoder event arrives this queue is woken up */
-       wait_queue_head_t event_waitq;
-       /* when the next decoder vsync arrives this queue is woken up */
-       wait_queue_head_t vsync_waitq;
-       /* when the current DMA is finished this queue is woken up */
-       wait_queue_head_t dma_waitq;
 
        /* OSD support */
        unsigned long osd_video_pbase;
-       int osd_global_alpha_state; /* 0=off : 1=on */
-       int osd_local_alpha_state;  /* 0=off : 1=on */
-       int osd_color_key_state;    /* 0=off : 1=on */
-       u8  osd_global_alpha;       /* Current global alpha */
-       u32 osd_color_key;          /* Current color key */
-       u32 osd_pixelformat;        /* Current pixel format */
-       struct v4l2_rect osd_rect;  /* Current OSD position and size */
-       struct v4l2_rect main_rect; /* Current Main window position and size */
-
-       u32 last_dec_timing[3];     /* Store last retrieved pts/scr/frame values */
-
-       /* i2c */
-       struct i2c_adapter i2c_adap;
-       struct i2c_algo_bit_data i2c_algo;
-       struct i2c_client i2c_client;
-       struct mutex i2c_bus_lock;
-       int i2c_state;
-       struct i2c_client *i2c_clients[I2C_CLIENTS_MAX];
-
-       /* v4l2 and User settings */
-
-       /* codec settings */
-       struct cx2341x_mpeg_params params;
-       u32 audio_input;
-       u32 active_input;
-       u32 active_output;
-       v4l2_std_id std;
-       v4l2_std_id std_out;
-       v4l2_std_id tuner_std;  /* The norm of the tuner (fixed) */
-       u8 audio_stereo_mode;
-       u8 audio_bilingual_mode;
-
-       /* dualwatch */
-       unsigned long dualwatch_jiffies;
-       u16 dualwatch_stereo_mode;
-
-       /* Digitizer type */
-       int digitizer;          /* 0x00EF = saa7114 0x00FO = saa7115 0x0106 = mic */
-
-       u32 lastVsyncFrame;
-
-       struct yuv_playback_info yuv_info;
-       struct osd_info *osd_info;
+       int osd_global_alpha_state;     /* 1 = global alpha is on */
+       int osd_local_alpha_state;      /* 1 = local alpha is on */
+       int osd_chroma_key_state;       /* 1 = chroma-keying is on */
+       u8  osd_global_alpha;           /* current global alpha */
+       u32 osd_chroma_key;             /* current chroma key */
+       struct v4l2_rect osd_rect;      /* current OSD position and size */
+       struct v4l2_rect main_rect;     /* current Main window position and size */
+       struct osd_info *osd_info;      /* ivtvfb private OSD info */
 };
 
 /* Globals */
@@ -883,4 +778,4 @@ int ivtv_init_on_first_open(struct ivtv *itv);
 #define write_dec_sync(val, addr) \
        do { write_dec(val, addr); read_dec(addr); } while (0)
 
-#endif /* IVTV_DRIVER_H */
+#endif