V4L/DVB (13554a): v4l: Use the video_drvdata function in drivers
[safe/jmp/linux-2.6] / drivers / media / video / em28xx / em28xx.h
index 766ab59..80d9b4f 100644 (file)
 #define EM2882_BOARD_KWORLD_ATSC_315U            69
 #define EM2882_BOARD_EVGA_INDTUBE                70
 #define EM2820_BOARD_SILVERCREST_WEBCAM           71
+#define EM2861_BOARD_GADMEI_UTV330PLUS           72
+#define EM2870_BOARD_REDDO_DVB_C_USB_BOX          73
+#define EM2800_BOARD_VC211A                      74
 
 /* Limits minimum and default number of buffers */
 #define EM28XX_MIN_BUF 4
  */
 #define EM28XX_NUM_PACKETS 40
 
-/* default alternate; 0 means choose the best */
-#define EM28XX_PINOUT 0
-
 #define EM28XX_INTERLACED_DEFAULT 1
 
 /*
@@ -213,7 +213,8 @@ struct em28xx_usb_isoc_ctl {
        int                             tmp_buf_len;
 
                /* Stores already requested buffers */
-       struct em28xx_buffer            *buf;
+       struct em28xx_buffer            *vid_buf;
+       struct em28xx_buffer            *vbi_buf;
 
                /* Stores the number of received fields */
        int                             nfields;
@@ -366,6 +367,8 @@ enum em28xx_decoder {
 enum em28xx_sensor {
        EM28XX_NOSENSOR = 0,
        EM28XX_MT9V011,
+       EM28XX_MT9M001,
+       EM28XX_MT9M111,
 };
 
 enum em28xx_adecoder {
@@ -396,6 +399,7 @@ struct em28xx_board {
        unsigned int has_snapshot_button:1;
        unsigned int is_webcam:1;
        unsigned int valid:1;
+       unsigned int has_ir_i2c:1;
 
        unsigned char xclk, i2c_speed;
        unsigned char radio_addr;
@@ -406,7 +410,7 @@ struct em28xx_board {
 
        struct em28xx_input       input[MAX_EM28XX_INPUT];
        struct em28xx_input       radio;
-       IR_KEYTAB_TYPE            *ir_codes;
+       struct ir_scancode_table  *ir_codes;
 };
 
 struct em28xx_eeprom {
@@ -439,6 +443,10 @@ enum em28xx_dev_state {
 #define EM28XX_AUDIO   0x10
 #define EM28XX_DVB     0x20
 
+/* em28xx resource types (used for res_get/res_lock etc */
+#define EM28XX_RESOURCE_VIDEO 0x01
+#define EM28XX_RESOURCE_VBI   0x02
+
 struct em28xx_audio {
        char name[50];
        char *transfer_buffer[EM28XX_AUDIO_BUFS];
@@ -459,10 +467,11 @@ struct em28xx;
 
 struct em28xx_fh {
        struct em28xx *dev;
-       unsigned int  stream_on:1;      /* Locks streams */
        int           radio;
+       unsigned int  resources;
 
        struct videobuf_queue        vb_vidq;
+       struct videobuf_queue        vb_vbiq;
 
        enum v4l2_buf_type           type;
 };
@@ -483,10 +492,12 @@ struct em28xx {
        int sensor_xres, sensor_yres;
        int sensor_xtal;
 
+       /* Allows progressive (e. g. non-interlaced) mode */
+       int progressive;
+
        /* Vinmode/Vinctl used at the driver */
        int vinmode, vinctl;
 
-       unsigned int stream_on:1;       /* Locks streams */
        unsigned int has_audio_class:1;
        unsigned int has_alsa_audio:1;
 
@@ -537,6 +548,12 @@ struct em28xx {
        enum em28xx_dev_state state;
        enum em28xx_io_method io;
 
+       /* vbi related state tracking */
+       int capture_type;
+       int vbi_read;
+       unsigned char cur_field;
+
+
        struct work_struct         request_module_wk;
 
        /* locks */
@@ -548,10 +565,14 @@ struct em28xx {
        struct video_device *vbi_dev;
        struct video_device *radio_dev;
 
+       /* resources in use */
+       unsigned int resources;
+
        unsigned char eedata[256];
 
        /* Isoc control struct */
        struct em28xx_dmaqueue vidq;
+       struct em28xx_dmaqueue vbiq;
        struct em28xx_usb_isoc_ctl isoc_ctl;
        spinlock_t slock;
 
@@ -590,6 +611,9 @@ struct em28xx {
        struct delayed_work sbutton_query_work;
 
        struct em28xx_dvb *dvb;
+
+       /* I2C keyboard data */
+       struct IR_i2c_init_data init_data;
 };
 
 struct em28xx_ops {
@@ -619,6 +643,8 @@ int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
                          int len);
 int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
 int em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val);
+int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
+                                u8 bitmask);
 
 int em28xx_read_ac97(struct em28xx *dev, u8 reg);
 int em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val);
@@ -628,6 +654,7 @@ int em28xx_audio_setup(struct em28xx *dev);
 
 int em28xx_colorlevels_set_default(struct em28xx *dev);
 int em28xx_capture_start(struct em28xx *dev, int start);
+int em28xx_vbi_supported(struct em28xx *dev);
 int em28xx_set_outfmt(struct em28xx *dev);
 int em28xx_resolution_set(struct em28xx *dev);
 int em28xx_set_alternate(struct em28xx *dev);
@@ -641,9 +668,6 @@ int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
 void em28xx_wake_i2c(struct em28xx *dev);
 void em28xx_remove_from_devlist(struct em28xx *dev);
 void em28xx_add_into_devlist(struct em28xx *dev);
-struct em28xx *em28xx_get_device(int minor,
-                                enum v4l2_buf_type *fh_type,
-                                int *has_radio);
 int em28xx_register_extension(struct em28xx_ops *dev);
 void em28xx_unregister_extension(struct em28xx_ops *dev);
 void em28xx_init_extension(struct em28xx *dev);
@@ -675,6 +699,9 @@ void em28xx_deregister_snapshot_button(struct em28xx *dev);
 int em28xx_ir_init(struct em28xx *dev);
 int em28xx_ir_fini(struct em28xx *dev);
 
+/* Provided by em28xx-vbi.c */
+extern struct videobuf_queue_ops em28xx_vbi_qops;
+
 /* printk macros */
 
 #define em28xx_err(fmt, arg...) do {\
@@ -769,7 +796,7 @@ static inline unsigned int norm_maxw(struct em28xx *dev)
        if (dev->board.is_webcam)
                return dev->sensor_xres;
 
-       if (dev->board.max_range_640_480)
+       if (dev->board.max_range_640_480 || dev->board.is_em2800)
                return 640;
 
        return 720;