V4L/DVB (8750): V4L: check inval in video_register_device_index()
[safe/jmp/linux-2.6] / drivers / media / video / ivtv / ivtv-driver.h
index 332d164..2ceb522 100644 (file)
@@ -51,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
@@ -250,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 */
@@ -259,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;
@@ -349,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;
@@ -391,6 +399,9 @@ struct yuv_frame_info
        u32 tru_h;
        u32 offset_y;
        s32 lace_mode;
+       u32 sync_field;
+       u32 delay;
+       u32 interlaced;
 };
 
 #define IVTV_YUV_MODE_INTERLACED       0x00
@@ -402,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;
@@ -451,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;
 
@@ -460,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;
@@ -474,23 +490,40 @@ 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 {
-       /* VBI general fixed card data */
+       /* 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 */
@@ -498,28 +531,42 @@ struct vbi_info {
        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 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;
-       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];
+       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.
@@ -536,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 */
@@ -555,13 +599,13 @@ struct ivtv {
        struct pci_dev *dev;            /* PCI device */
        const struct ivtv_card *card;   /* card information */
        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 */
-       int tunerid;                    /* userspace tuner ID for experimental Xceive tuner support */
        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 *);
@@ -593,7 +637,6 @@ struct ivtv {
        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 */
@@ -672,10 +715,9 @@ struct ivtv {
        int osd_chroma_key_state;       /* 1 = chroma-keying is on */
        u8  osd_global_alpha;           /* current global alpha */
        u32 osd_chroma_key;             /* current chroma 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 */
-       struct osd_info *osd_info;      /* ivtv-fb private OSD info */
+       struct osd_info *osd_info;      /* ivtvfb private OSD info */
 };
 
 /* Globals */