linux/drivers/media/usb/em28xx/em28xx.h
<<
>>
Prefs
   1/*
   2   em28xx.h - driver for Empia EM2800/EM2820/2840 USB video capture devices
   3
   4   Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com>
   5                      Ludovico Cavedon <cavedon@sssup.it>
   6                      Mauro Carvalho Chehab <mchehab@infradead.org>
   7
   8   Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de>
   9
  10   This program is free software; you can redistribute it and/or modify
  11   it under the terms of the GNU General Public License as published by
  12   the Free Software Foundation; either version 2 of the License, or
  13   (at your option) any later version.
  14
  15   This program is distributed in the hope that it will be useful,
  16   but WITHOUT ANY WARRANTY; without even the implied warranty of
  17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18   GNU General Public License for more details.
  19
  20   You should have received a copy of the GNU General Public License
  21   along with this program; if not, write to the Free Software
  22   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23 */
  24
  25#ifndef _EM28XX_H
  26#define _EM28XX_H
  27
  28#include <linux/workqueue.h>
  29#include <linux/i2c.h>
  30#include <linux/mutex.h>
  31#include <linux/videodev2.h>
  32
  33#include <media/videobuf-vmalloc.h>
  34#include <media/v4l2-device.h>
  35#include <media/ir-kbd-i2c.h>
  36#include <media/rc-core.h>
  37#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE)
  38#include <media/videobuf-dvb.h>
  39#endif
  40#include "tuner-xc2028.h"
  41#include "xc5000.h"
  42#include "em28xx-reg.h"
  43
  44/* Boards supported by driver */
  45#define EM2800_BOARD_UNKNOWN                    0
  46#define EM2820_BOARD_UNKNOWN                    1
  47#define EM2820_BOARD_TERRATEC_CINERGY_250       2
  48#define EM2820_BOARD_PINNACLE_USB_2             3
  49#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2      4
  50#define EM2820_BOARD_MSI_VOX_USB_2              5
  51#define EM2800_BOARD_TERRATEC_CINERGY_200       6
  52#define EM2800_BOARD_LEADTEK_WINFAST_USBII      7
  53#define EM2800_BOARD_KWORLD_USB2800             8
  54#define EM2820_BOARD_PINNACLE_DVC_90            9
  55#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900    10
  56#define EM2880_BOARD_TERRATEC_HYBRID_XS         11
  57#define EM2820_BOARD_KWORLD_PVRTV2800RF         12
  58#define EM2880_BOARD_TERRATEC_PRODIGY_XS        13
  59#define EM2820_BOARD_PROLINK_PLAYTV_USB2        14
  60#define EM2800_BOARD_VGEAR_POCKETTV             15
  61#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950    16
  62#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO       17
  63#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18
  64#define EM2860_BOARD_SAA711X_REFERENCE_DESIGN   19
  65#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600   20
  66#define EM2800_BOARD_GRABBEEX_USB2800           21
  67#define EM2750_BOARD_UNKNOWN                      22
  68#define EM2750_BOARD_DLCW_130                     23
  69#define EM2820_BOARD_DLINK_USB_TV                 24
  70#define EM2820_BOARD_GADMEI_UTV310                25
  71#define EM2820_BOARD_HERCULES_SMART_TV_USB2       26
  72#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME      27
  73#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28
  74#define EM2860_BOARD_TVP5150_REFERENCE_DESIGN     29
  75#define EM2820_BOARD_VIDEOLOGY_20K14XUSB          30
  76#define EM2821_BOARD_USBGEAR_VD204                31
  77#define EM2821_BOARD_SUPERCOMP_USB_2              32
  78#define EM2860_BOARD_ELGATO_VIDEO_CAPTURE         33
  79#define EM2860_BOARD_TERRATEC_HYBRID_XS           34
  80#define EM2860_BOARD_TYPHOON_DVD_MAKER            35
  81#define EM2860_BOARD_NETGMBH_CAM                  36
  82#define EM2860_BOARD_GADMEI_UTV330                37
  83#define EM2861_BOARD_YAKUMO_MOVIE_MIXER           38
  84#define EM2861_BOARD_KWORLD_PVRTV_300U            39
  85#define EM2861_BOARD_PLEXTOR_PX_TV100U            40
  86#define EM2870_BOARD_KWORLD_350U                  41
  87#define EM2870_BOARD_KWORLD_355U                  42
  88#define EM2870_BOARD_TERRATEC_XS                  43
  89#define EM2870_BOARD_TERRATEC_XS_MT2060           44
  90#define EM2870_BOARD_PINNACLE_PCTV_DVB            45
  91#define EM2870_BOARD_COMPRO_VIDEOMATE             46
  92#define EM2880_BOARD_KWORLD_DVB_305U              47
  93#define EM2880_BOARD_KWORLD_DVB_310U              48
  94#define EM2880_BOARD_MSI_DIGIVOX_AD               49
  95#define EM2880_BOARD_MSI_DIGIVOX_AD_II            50
  96#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR        51
  97#define EM2881_BOARD_DNT_DA2_HYBRID               52
  98#define EM2881_BOARD_PINNACLE_HYBRID_PRO          53
  99#define EM2882_BOARD_KWORLD_VS_DVBT               54
 100#define EM2882_BOARD_TERRATEC_HYBRID_XS           55
 101#define EM2882_BOARD_PINNACLE_HYBRID_PRO_330E     56
 102#define EM2883_BOARD_KWORLD_HYBRID_330U                  57
 103#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU      58
 104#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850      60
 105#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2     61
 106#define EM2820_BOARD_GADMEI_TVR200                62
 107#define EM2860_BOARD_KAIOMY_TVNPC_U2              63
 108#define EM2860_BOARD_EASYCAP                      64
 109#define EM2820_BOARD_IODATA_GVMVP_SZ              65
 110#define EM2880_BOARD_EMPIRE_DUAL_TV               66
 111#define EM2860_BOARD_TERRATEC_GRABBY              67
 112#define EM2860_BOARD_TERRATEC_AV350               68
 113#define EM2882_BOARD_KWORLD_ATSC_315U             69
 114#define EM2882_BOARD_EVGA_INDTUBE                 70
 115#define EM2820_BOARD_SILVERCREST_WEBCAM           71
 116#define EM2861_BOARD_GADMEI_UTV330PLUS           72
 117#define EM2870_BOARD_REDDO_DVB_C_USB_BOX          73
 118#define EM2800_BOARD_VC211A                       74
 119#define EM2882_BOARD_DIKOM_DK300                  75
 120#define EM2870_BOARD_KWORLD_A340                  76
 121#define EM2874_BOARD_LEADERSHIP_ISDBT             77
 122#define EM28174_BOARD_PCTV_290E                   78
 123#define EM2884_BOARD_TERRATEC_H5                  79
 124#define EM28174_BOARD_PCTV_460E                   80
 125#define EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C     81
 126#define EM2884_BOARD_CINERGY_HTC_STICK            82
 127#define EM2860_BOARD_HT_VIDBOX_NW03               83
 128#define EM2874_BOARD_MAXMEDIA_UB425_TC            84
 129#define EM2884_BOARD_PCTV_510E                    85
 130#define EM2884_BOARD_PCTV_520E                    86
 131
 132/* Limits minimum and default number of buffers */
 133#define EM28XX_MIN_BUF 4
 134#define EM28XX_DEF_BUF 8
 135
 136/*Limits the max URB message size */
 137#define URB_MAX_CTRL_SIZE 80
 138
 139/* Params for validated field */
 140#define EM28XX_BOARD_NOT_VALIDATED 1
 141#define EM28XX_BOARD_VALIDATED     0
 142
 143/* Params for em28xx_cmd() audio */
 144#define EM28XX_START_AUDIO      1
 145#define EM28XX_STOP_AUDIO       0
 146
 147/* maximum number of em28xx boards */
 148#define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */
 149
 150/* maximum number of frames that can be queued */
 151#define EM28XX_NUM_FRAMES 5
 152/* number of frames that get used for v4l2_read() */
 153#define EM28XX_NUM_READ_FRAMES 2
 154
 155/* number of buffers for isoc transfers */
 156#define EM28XX_NUM_BUFS 5
 157#define EM28XX_DVB_NUM_BUFS 5
 158
 159/* number of packets for each buffer
 160   windows requests only 64 packets .. so we better do the same
 161   this is what I found out for all alternate numbers there!
 162 */
 163#define EM28XX_NUM_PACKETS 64
 164#define EM28XX_DVB_MAX_PACKETS 64
 165
 166#define EM28XX_INTERLACED_DEFAULT 1
 167
 168/*
 169#define (use usbview if you want to get the other alternate number infos)
 170#define
 171#define alternate number 2
 172#define                         Endpoint Address: 82
 173                        Direction: in
 174                        Attribute: 1
 175                        Type: Isoc
 176                        Max Packet Size: 1448
 177                        Interval: 125us
 178
 179  alternate number 7
 180
 181                        Endpoint Address: 82
 182                        Direction: in
 183                        Attribute: 1
 184                        Type: Isoc
 185                        Max Packet Size: 3072
 186                        Interval: 125us
 187*/
 188
 189/* time to wait when stopping the isoc transfer */
 190#define EM28XX_URB_TIMEOUT \
 191                        msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
 192
 193/* time in msecs to wait for i2c writes to finish */
 194#define EM2800_I2C_WRITE_TIMEOUT 20
 195
 196enum em28xx_mode {
 197        EM28XX_SUSPEND,
 198        EM28XX_ANALOG_MODE,
 199        EM28XX_DIGITAL_MODE,
 200};
 201
 202
 203struct em28xx;
 204
 205struct em28xx_usb_isoc_bufs {
 206                /* max packet size of isoc transaction */
 207        int                             max_pkt_size;
 208
 209                /* number of packets in each buffer */
 210        int                             num_packets;
 211
 212                /* number of allocated urbs */
 213        int                             num_bufs;
 214
 215                /* urb for isoc transfers */
 216        struct urb                      **urb;
 217
 218                /* transfer buffers for isoc transfer */
 219        char                            **transfer_buffer;
 220};
 221
 222struct em28xx_usb_isoc_ctl {
 223                /* isoc transfer buffers for analog mode */
 224        struct em28xx_usb_isoc_bufs     analog_bufs;
 225
 226                /* isoc transfer buffers for digital mode */
 227        struct em28xx_usb_isoc_bufs     digital_bufs;
 228
 229                /* Stores already requested buffers */
 230        struct em28xx_buffer            *vid_buf;
 231        struct em28xx_buffer            *vbi_buf;
 232
 233                /* isoc urb callback */
 234        int (*isoc_copy) (struct em28xx *dev, struct urb *urb);
 235
 236};
 237
 238/* Struct to enumberate video formats */
 239struct em28xx_fmt {
 240        char  *name;
 241        u32   fourcc;          /* v4l2 format id */
 242        int   depth;
 243        int   reg;
 244};
 245
 246/* buffer for one video frame */
 247struct em28xx_buffer {
 248        /* common v4l buffer stuff -- must be first */
 249        struct videobuf_buffer vb;
 250
 251        struct list_head frame;
 252        int top_field;
 253};
 254
 255struct em28xx_dmaqueue {
 256        struct list_head       active;
 257
 258        wait_queue_head_t          wq;
 259
 260        /* Counters to control buffer fill */
 261        int                        pos;
 262};
 263
 264/* inputs */
 265
 266#define MAX_EM28XX_INPUT 4
 267enum enum28xx_itype {
 268        EM28XX_VMUX_COMPOSITE1 = 1,
 269        EM28XX_VMUX_COMPOSITE2,
 270        EM28XX_VMUX_COMPOSITE3,
 271        EM28XX_VMUX_COMPOSITE4,
 272        EM28XX_VMUX_SVIDEO,
 273        EM28XX_VMUX_TELEVISION,
 274        EM28XX_VMUX_CABLE,
 275        EM28XX_VMUX_DVB,
 276        EM28XX_VMUX_DEBUG,
 277        EM28XX_RADIO,
 278};
 279
 280enum em28xx_ac97_mode {
 281        EM28XX_NO_AC97 = 0,
 282        EM28XX_AC97_EM202,
 283        EM28XX_AC97_SIGMATEL,
 284        EM28XX_AC97_OTHER,
 285};
 286
 287struct em28xx_audio_mode {
 288        enum em28xx_ac97_mode ac97;
 289
 290        u16 ac97_feat;
 291        u32 ac97_vendor_id;
 292
 293        unsigned int has_audio:1;
 294
 295        unsigned int i2s_3rates:1;
 296        unsigned int i2s_5rates:1;
 297};
 298
 299/* em28xx has two audio inputs: tuner and line in.
 300   However, on most devices, an auxiliary AC97 codec device is used.
 301   The AC97 device may have several different inputs and outputs,
 302   depending on their model. So, it is possible to use AC97 mixer to
 303   address more than two different entries.
 304 */
 305enum em28xx_amux {
 306        /* This is the only entry for em28xx tuner input */
 307        EM28XX_AMUX_VIDEO,      /* em28xx tuner, AC97 mixer Video */
 308
 309        EM28XX_AMUX_LINE_IN,    /* AC97 mixer Line In */
 310
 311        /* Some less-common mixer setups */
 312        EM28XX_AMUX_VIDEO2,     /* em28xx Line in, AC97 mixer Video */
 313        EM28XX_AMUX_PHONE,
 314        EM28XX_AMUX_MIC,
 315        EM28XX_AMUX_CD,
 316        EM28XX_AMUX_AUX,
 317        EM28XX_AMUX_PCM_OUT,
 318};
 319
 320enum em28xx_aout {
 321        /* AC97 outputs */
 322        EM28XX_AOUT_MASTER = 1 << 0,
 323        EM28XX_AOUT_LINE   = 1 << 1,
 324        EM28XX_AOUT_MONO   = 1 << 2,
 325        EM28XX_AOUT_LFE    = 1 << 3,
 326        EM28XX_AOUT_SURR   = 1 << 4,
 327
 328        /* PCM IN Mixer - used by AC97_RECORD_SELECT register */
 329        EM28XX_AOUT_PCM_IN = 1 << 7,
 330
 331        /* Bits 10-8 are used to indicate the PCM IN record select */
 332        EM28XX_AOUT_PCM_MIC_PCM = 0 << 8,
 333        EM28XX_AOUT_PCM_CD      = 1 << 8,
 334        EM28XX_AOUT_PCM_VIDEO   = 2 << 8,
 335        EM28XX_AOUT_PCM_AUX     = 3 << 8,
 336        EM28XX_AOUT_PCM_LINE    = 4 << 8,
 337        EM28XX_AOUT_PCM_STEREO  = 5 << 8,
 338        EM28XX_AOUT_PCM_MONO    = 6 << 8,
 339        EM28XX_AOUT_PCM_PHONE   = 7 << 8,
 340};
 341
 342static inline int ac97_return_record_select(int a_out)
 343{
 344        return (a_out & 0x700) >> 8;
 345}
 346
 347struct em28xx_reg_seq {
 348        int reg;
 349        unsigned char val, mask;
 350        int sleep;
 351};
 352
 353struct em28xx_input {
 354        enum enum28xx_itype type;
 355        unsigned int vmux;
 356        enum em28xx_amux amux;
 357        enum em28xx_aout aout;
 358        struct em28xx_reg_seq *gpio;
 359};
 360
 361#define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
 362
 363enum em28xx_decoder {
 364        EM28XX_NODECODER = 0,
 365        EM28XX_TVP5150,
 366        EM28XX_SAA711X,
 367};
 368
 369enum em28xx_sensor {
 370        EM28XX_NOSENSOR = 0,
 371        EM28XX_MT9V011,
 372        EM28XX_MT9M001,
 373        EM28XX_MT9M111,
 374};
 375
 376enum em28xx_adecoder {
 377        EM28XX_NOADECODER = 0,
 378        EM28XX_TVAUDIO,
 379};
 380
 381struct em28xx_board {
 382        char *name;
 383        int vchannels;
 384        int tuner_type;
 385        int tuner_addr;
 386
 387        /* i2c flags */
 388        unsigned int tda9887_conf;
 389
 390        /* GPIO sequences */
 391        struct em28xx_reg_seq *dvb_gpio;
 392        struct em28xx_reg_seq *suspend_gpio;
 393        struct em28xx_reg_seq *tuner_gpio;
 394        struct em28xx_reg_seq *mute_gpio;
 395
 396        unsigned int is_em2800:1;
 397        unsigned int has_msp34xx:1;
 398        unsigned int mts_firmware:1;
 399        unsigned int max_range_640_480:1;
 400        unsigned int has_dvb:1;
 401        unsigned int has_snapshot_button:1;
 402        unsigned int is_webcam:1;
 403        unsigned int valid:1;
 404        unsigned int has_ir_i2c:1;
 405
 406        unsigned char xclk, i2c_speed;
 407        unsigned char radio_addr;
 408        unsigned short tvaudio_addr;
 409
 410        enum em28xx_decoder decoder;
 411        enum em28xx_adecoder adecoder;
 412
 413        struct em28xx_input       input[MAX_EM28XX_INPUT];
 414        struct em28xx_input       radio;
 415        char                      *ir_codes;
 416};
 417
 418struct em28xx_eeprom {
 419        u32 id;                 /* 0x9567eb1a */
 420        u16 vendor_ID;
 421        u16 product_ID;
 422
 423        u16 chip_conf;
 424
 425        u16 board_conf;
 426
 427        u16 string1, string2, string3;
 428
 429        u8 string_idx_table;
 430};
 431
 432/* device states */
 433enum em28xx_dev_state {
 434        DEV_INITIALIZED = 0x01,
 435        DEV_DISCONNECTED = 0x02,
 436        DEV_MISCONFIGURED = 0x04,
 437};
 438
 439#define EM28XX_AUDIO_BUFS 5
 440#define EM28XX_NUM_AUDIO_PACKETS 64
 441#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */
 442#define EM28XX_CAPTURE_STREAM_EN 1
 443
 444/* em28xx extensions */
 445#define EM28XX_AUDIO   0x10
 446#define EM28XX_DVB     0x20
 447#define EM28XX_RC      0x30
 448
 449/* em28xx resource types (used for res_get/res_lock etc */
 450#define EM28XX_RESOURCE_VIDEO 0x01
 451#define EM28XX_RESOURCE_VBI   0x02
 452
 453struct em28xx_audio {
 454        char name[50];
 455        char *transfer_buffer[EM28XX_AUDIO_BUFS];
 456        struct urb *urb[EM28XX_AUDIO_BUFS];
 457        struct usb_device *udev;
 458        unsigned int capture_transfer_done;
 459        struct snd_pcm_substream   *capture_pcm_substream;
 460
 461        unsigned int hwptr_done_capture;
 462        struct snd_card            *sndcard;
 463
 464        int users;
 465        spinlock_t slock;
 466};
 467
 468struct em28xx;
 469
 470struct em28xx_fh {
 471        struct em28xx *dev;
 472        int           radio;
 473        unsigned int  resources;
 474
 475        struct videobuf_queue        vb_vidq;
 476        struct videobuf_queue        vb_vbiq;
 477
 478        enum v4l2_buf_type           type;
 479};
 480
 481/* main device struct */
 482struct em28xx {
 483        /* generic device properties */
 484        char name[30];          /* name (including minor) of the device */
 485        int model;              /* index in the device_data struct */
 486        int devno;              /* marks the number of this device */
 487        enum em28xx_chip_id chip_id;
 488
 489        int audio_ifnum;
 490
 491        struct v4l2_device v4l2_dev;
 492        struct em28xx_board board;
 493
 494        /* Webcam specific fields */
 495        enum em28xx_sensor em28xx_sensor;
 496        int sensor_xres, sensor_yres;
 497        int sensor_xtal;
 498
 499        /* Allows progressive (e. g. non-interlaced) mode */
 500        int progressive;
 501
 502        /* Vinmode/Vinctl used at the driver */
 503        int vinmode, vinctl;
 504
 505        unsigned int has_audio_class:1;
 506        unsigned int has_alsa_audio:1;
 507        unsigned int is_audio_only:1;
 508
 509        /* Controls audio streaming */
 510        struct work_struct wq_trigger;              /* Trigger to start/stop audio for alsa module */
 511         atomic_t       stream_started;      /* stream should be running if true */
 512
 513        struct em28xx_fmt *format;
 514
 515        struct em28xx_IR *ir;
 516
 517        /* Some older em28xx chips needs a waiting time after writing */
 518        unsigned int wait_after_write;
 519
 520        struct list_head        devlist;
 521
 522        u32 i2s_speed;          /* I2S speed for audio digital stream */
 523
 524        struct em28xx_audio_mode audio_mode;
 525
 526        int tuner_type;         /* type of the tuner */
 527        int tuner_addr;         /* tuner address */
 528        int tda9887_conf;
 529        /* i2c i/o */
 530        struct i2c_adapter i2c_adap;
 531        struct i2c_client i2c_client;
 532        /* video for linux */
 533        int users;              /* user count for exclusive use */
 534        struct video_device *vdev;      /* video for linux device struct */
 535        v4l2_std_id norm;       /* selected tv norm */
 536        int ctl_freq;           /* selected frequency */
 537        unsigned int ctl_input; /* selected input */
 538        unsigned int ctl_ainput;/* selected audio input */
 539        unsigned int ctl_aoutput;/* selected audio output */
 540        int mute;
 541        int volume;
 542        /* frame properties */
 543        int width;              /* current frame width */
 544        int height;             /* current frame height */
 545        unsigned hscale;        /* horizontal scale factor (see datasheet) */
 546        unsigned vscale;        /* vertical scale factor (see datasheet) */
 547        int interlaced;         /* 1=interlace fileds, 0=just top fileds */
 548        unsigned int video_bytesread;   /* Number of bytes read */
 549
 550        unsigned long hash;     /* eeprom hash - for boards with generic ID */
 551        unsigned long i2c_hash; /* i2c devicelist hash -
 552                                   for boards with generic ID */
 553
 554        struct em28xx_audio adev;
 555
 556        /* states */
 557        enum em28xx_dev_state state;
 558
 559        /* vbi related state tracking */
 560        int capture_type;
 561        int vbi_read;
 562        unsigned char cur_field;
 563        unsigned int vbi_width;
 564        unsigned int vbi_height; /* lines per field */
 565
 566        struct work_struct         request_module_wk;
 567
 568        /* locks */
 569        struct mutex lock;
 570        struct mutex ctrl_urb_lock;     /* protects urb_buf */
 571        /* spinlock_t queue_lock; */
 572        struct list_head inqueue, outqueue;
 573        struct video_device *vbi_dev;
 574        struct video_device *radio_dev;
 575
 576        /* resources in use */
 577        unsigned int resources;
 578
 579        unsigned char eedata[256];
 580
 581        /* Isoc control struct */
 582        struct em28xx_dmaqueue vidq;
 583        struct em28xx_dmaqueue vbiq;
 584        struct em28xx_usb_isoc_ctl isoc_ctl;
 585        spinlock_t slock;
 586
 587        /* usb transfer */
 588        struct usb_device *udev;        /* the usb device */
 589        int alt;                /* alternate */
 590        int max_pkt_size;       /* max packet size of isoc transaction */
 591        int num_alt;            /* Number of alternative settings */
 592        unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
 593        int dvb_alt;                            /* alternate for DVB */
 594        unsigned int dvb_max_pkt_size;          /* wMaxPacketSize for DVB */
 595        char urb_buf[URB_MAX_CTRL_SIZE];        /* urb control msg buffer */
 596
 597        /* helper funcs that call usb_control_msg */
 598        int (*em28xx_write_regs) (struct em28xx *dev, u16 reg,
 599                                        char *buf, int len);
 600        int (*em28xx_read_reg) (struct em28xx *dev, u16 reg);
 601        int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg,
 602                                        char *buf, int len);
 603        int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg,
 604                                      char *buf, int len);
 605        int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg);
 606
 607        enum em28xx_mode mode;
 608
 609        /* register numbers for GPO/GPIO registers */
 610        u16 reg_gpo_num, reg_gpio_num;
 611
 612        /* Caches GPO and GPIO registers */
 613        unsigned char   reg_gpo, reg_gpio;
 614
 615        /* Snapshot button */
 616        char snapshot_button_path[30];  /* path of the input dev */
 617        struct input_dev *sbutton_input_dev;
 618        struct delayed_work sbutton_query_work;
 619
 620        struct em28xx_dvb *dvb;
 621
 622        /* I2C keyboard data */
 623        struct IR_i2c_init_data init_data;
 624};
 625
 626struct em28xx_ops {
 627        struct list_head next;
 628        char *name;
 629        int id;
 630        int (*init)(struct em28xx *);
 631        int (*fini)(struct em28xx *);
 632};
 633
 634/* Provided by em28xx-i2c.c */
 635void em28xx_do_i2c_scan(struct em28xx *dev);
 636int  em28xx_i2c_register(struct em28xx *dev);
 637int  em28xx_i2c_unregister(struct em28xx *dev);
 638
 639/* Provided by em28xx-core.c */
 640
 641u32 em28xx_request_buffers(struct em28xx *dev, u32 count);
 642void em28xx_queue_unusedframes(struct em28xx *dev);
 643void em28xx_release_buffers(struct em28xx *dev);
 644
 645int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
 646                            char *buf, int len);
 647int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
 648int em28xx_read_reg(struct em28xx *dev, u16 reg);
 649int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
 650                          int len);
 651int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
 652int em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val);
 653int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
 654                                 u8 bitmask);
 655
 656int em28xx_read_ac97(struct em28xx *dev, u8 reg);
 657int em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val);
 658
 659int em28xx_audio_analog_set(struct em28xx *dev);
 660int em28xx_audio_setup(struct em28xx *dev);
 661
 662int em28xx_colorlevels_set_default(struct em28xx *dev);
 663int em28xx_capture_start(struct em28xx *dev, int start);
 664int em28xx_vbi_supported(struct em28xx *dev);
 665int em28xx_set_outfmt(struct em28xx *dev);
 666int em28xx_resolution_set(struct em28xx *dev);
 667int em28xx_set_alternate(struct em28xx *dev);
 668int em28xx_alloc_isoc(struct em28xx *dev, enum em28xx_mode mode,
 669                      int max_packets, int num_bufs, int max_pkt_size);
 670int em28xx_init_isoc(struct em28xx *dev, enum em28xx_mode mode,
 671                     int max_packets, int num_bufs, int max_pkt_size,
 672                     int (*isoc_copy) (struct em28xx *dev, struct urb *urb));
 673void em28xx_uninit_isoc(struct em28xx *dev, enum em28xx_mode mode);
 674void em28xx_stop_urbs(struct em28xx *dev);
 675int em28xx_isoc_dvb_max_packetsize(struct em28xx *dev);
 676int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
 677int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
 678void em28xx_wake_i2c(struct em28xx *dev);
 679int em28xx_register_extension(struct em28xx_ops *dev);
 680void em28xx_unregister_extension(struct em28xx_ops *dev);
 681void em28xx_init_extension(struct em28xx *dev);
 682void em28xx_close_extension(struct em28xx *dev);
 683
 684/* Provided by em28xx-video.c */
 685int em28xx_register_analog_devices(struct em28xx *dev);
 686void em28xx_release_analog_resources(struct em28xx *dev);
 687
 688/* Provided by em28xx-cards.c */
 689extern int em2800_variant_detect(struct usb_device *udev, int model);
 690extern struct em28xx_board em28xx_boards[];
 691extern struct usb_device_id em28xx_id_table[];
 692extern const unsigned int em28xx_bcount;
 693int em28xx_tuner_callback(void *ptr, int component, int command, int arg);
 694void em28xx_release_resources(struct em28xx *dev);
 695
 696/* Provided by em28xx-vbi.c */
 697extern struct videobuf_queue_ops em28xx_vbi_qops;
 698
 699/* printk macros */
 700
 701#define em28xx_err(fmt, arg...) do {\
 702        printk(KERN_ERR fmt , ##arg); } while (0)
 703
 704#define em28xx_errdev(fmt, arg...) do {\
 705        printk(KERN_ERR "%s: "fmt,\
 706                        dev->name , ##arg); } while (0)
 707
 708#define em28xx_info(fmt, arg...) do {\
 709        printk(KERN_INFO "%s: "fmt,\
 710                        dev->name , ##arg); } while (0)
 711#define em28xx_warn(fmt, arg...) do {\
 712        printk(KERN_WARNING "%s: "fmt,\
 713                        dev->name , ##arg); } while (0)
 714
 715static inline int em28xx_compression_disable(struct em28xx *dev)
 716{
 717        /* side effect of disabling scaler and mixer */
 718        return em28xx_write_reg(dev, EM28XX_R26_COMPR, 0x00);
 719}
 720
 721static inline int em28xx_contrast_get(struct em28xx *dev)
 722{
 723        return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f;
 724}
 725
 726static inline int em28xx_brightness_get(struct em28xx *dev)
 727{
 728        return em28xx_read_reg(dev, EM28XX_R21_YOFFSET);
 729}
 730
 731static inline int em28xx_saturation_get(struct em28xx *dev)
 732{
 733        return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f;
 734}
 735
 736static inline int em28xx_u_balance_get(struct em28xx *dev)
 737{
 738        return em28xx_read_reg(dev, EM28XX_R23_UOFFSET);
 739}
 740
 741static inline int em28xx_v_balance_get(struct em28xx *dev)
 742{
 743        return em28xx_read_reg(dev, EM28XX_R24_VOFFSET);
 744}
 745
 746static inline int em28xx_gamma_get(struct em28xx *dev)
 747{
 748        return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f;
 749}
 750
 751static inline int em28xx_contrast_set(struct em28xx *dev, s32 val)
 752{
 753        u8 tmp = (u8) val;
 754        return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1);
 755}
 756
 757static inline int em28xx_brightness_set(struct em28xx *dev, s32 val)
 758{
 759        u8 tmp = (u8) val;
 760        return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1);
 761}
 762
 763static inline int em28xx_saturation_set(struct em28xx *dev, s32 val)
 764{
 765        u8 tmp = (u8) val;
 766        return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1);
 767}
 768
 769static inline int em28xx_u_balance_set(struct em28xx *dev, s32 val)
 770{
 771        u8 tmp = (u8) val;
 772        return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1);
 773}
 774
 775static inline int em28xx_v_balance_set(struct em28xx *dev, s32 val)
 776{
 777        u8 tmp = (u8) val;
 778        return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1);
 779}
 780
 781static inline int em28xx_gamma_set(struct em28xx *dev, s32 val)
 782{
 783        u8 tmp = (u8) val;
 784        return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1);
 785}
 786
 787/*FIXME: maxw should be dependent of alt mode */
 788static inline unsigned int norm_maxw(struct em28xx *dev)
 789{
 790        if (dev->board.is_webcam)
 791                return dev->sensor_xres;
 792
 793        if (dev->board.max_range_640_480)
 794                return 640;
 795
 796        return 720;
 797}
 798
 799static inline unsigned int norm_maxh(struct em28xx *dev)
 800{
 801        if (dev->board.is_webcam)
 802                return dev->sensor_yres;
 803
 804        if (dev->board.max_range_640_480)
 805                return 480;
 806
 807        return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
 808}
 809#endif
 810