cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

go7007-usb.c (35268B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2005-2006 Micronas USA Inc.
      4 */
      5
      6#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      7
      8#include <linux/module.h>
      9#include <linux/kernel.h>
     10#include <linux/wait.h>
     11#include <linux/list.h>
     12#include <linux/slab.h>
     13#include <linux/time.h>
     14#include <linux/mm.h>
     15#include <linux/usb.h>
     16#include <linux/i2c.h>
     17#include <asm/byteorder.h>
     18#include <media/i2c/saa7115.h>
     19#include <media/tuner.h>
     20#include <media/i2c/uda1342.h>
     21
     22#include "go7007-priv.h"
     23
     24static unsigned int assume_endura;
     25module_param(assume_endura, int, 0644);
     26MODULE_PARM_DESC(assume_endura,
     27			"when probing fails, hardware is a Pelco Endura");
     28
     29/* #define GO7007_I2C_DEBUG */ /* for debugging the EZ-USB I2C adapter */
     30
     31#define	HPI_STATUS_ADDR	0xFFF4
     32#define	INT_PARAM_ADDR	0xFFF6
     33#define	INT_INDEX_ADDR	0xFFF8
     34
     35/*
     36 * Pipes on EZ-USB interface:
     37 *	0 snd - Control
     38 *	0 rcv - Control
     39 *	2 snd - Download firmware (control)
     40 *	4 rcv - Read Interrupt (interrupt)
     41 *	6 rcv - Read Video (bulk)
     42 *	8 rcv - Read Audio (bulk)
     43 */
     44
     45#define GO7007_USB_EZUSB		(1<<0)
     46#define GO7007_USB_EZUSB_I2C		(1<<1)
     47
     48struct go7007_usb_board {
     49	unsigned int flags;
     50	struct go7007_board_info main_info;
     51};
     52
     53struct go7007_usb {
     54	const struct go7007_usb_board *board;
     55	struct mutex i2c_lock;
     56	struct usb_device *usbdev;
     57	struct urb *video_urbs[8];
     58	struct urb *audio_urbs[8];
     59	struct urb *intr_urb;
     60};
     61
     62/*********************** Product specification data ***********************/
     63
     64static const struct go7007_usb_board board_matrix_ii = {
     65	.flags		= GO7007_USB_EZUSB,
     66	.main_info	= {
     67		.flags		 = GO7007_BOARD_HAS_AUDIO |
     68					GO7007_BOARD_USE_ONBOARD_I2C,
     69		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
     70					GO7007_AUDIO_WORD_16,
     71		.audio_rate	 = 48000,
     72		.audio_bclk_div	 = 8,
     73		.audio_main_div	 = 2,
     74		.hpi_buffer_cap  = 7,
     75		.sensor_flags	 = GO7007_SENSOR_656 |
     76					GO7007_SENSOR_VALID_ENABLE |
     77					GO7007_SENSOR_TV |
     78					GO7007_SENSOR_SAA7115 |
     79					GO7007_SENSOR_VBI |
     80					GO7007_SENSOR_SCALING,
     81		.num_i2c_devs	 = 1,
     82		.i2c_devs	 = {
     83			{
     84				.type	= "saa7115",
     85				.addr	= 0x20,
     86				.is_video = 1,
     87			},
     88		},
     89		.num_inputs	 = 2,
     90		.inputs		 = {
     91			{
     92				.video_input	= 0,
     93				.name		= "Composite",
     94			},
     95			{
     96				.video_input	= 9,
     97				.name		= "S-Video",
     98			},
     99		},
    100		.video_config	= SAA7115_IDQ_IS_DEFAULT,
    101	},
    102};
    103
    104static const struct go7007_usb_board board_matrix_reload = {
    105	.flags		= GO7007_USB_EZUSB,
    106	.main_info	= {
    107		.flags		 = GO7007_BOARD_HAS_AUDIO |
    108					GO7007_BOARD_USE_ONBOARD_I2C,
    109		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
    110					GO7007_AUDIO_I2S_MASTER |
    111					GO7007_AUDIO_WORD_16,
    112		.audio_rate	 = 48000,
    113		.audio_bclk_div	 = 8,
    114		.audio_main_div	 = 2,
    115		.hpi_buffer_cap  = 7,
    116		.sensor_flags	 = GO7007_SENSOR_656 |
    117					GO7007_SENSOR_TV,
    118		.num_i2c_devs	 = 1,
    119		.i2c_devs	 = {
    120			{
    121				.type	= "saa7113",
    122				.addr	= 0x25,
    123				.is_video = 1,
    124			},
    125		},
    126		.num_inputs	 = 2,
    127		.inputs		 = {
    128			{
    129				.video_input	= 0,
    130				.name		= "Composite",
    131			},
    132			{
    133				.video_input	= 9,
    134				.name		= "S-Video",
    135			},
    136		},
    137		.video_config	= SAA7115_IDQ_IS_DEFAULT,
    138	},
    139};
    140
    141static const struct go7007_usb_board board_star_trek = {
    142	.flags		= GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C,
    143	.main_info	= {
    144		.flags		 = GO7007_BOARD_HAS_AUDIO, /* |
    145					GO7007_BOARD_HAS_TUNER, */
    146		.sensor_flags	 = GO7007_SENSOR_656 |
    147					GO7007_SENSOR_VALID_ENABLE |
    148					GO7007_SENSOR_TV |
    149					GO7007_SENSOR_SAA7115 |
    150					GO7007_SENSOR_VBI |
    151					GO7007_SENSOR_SCALING,
    152		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
    153					GO7007_AUDIO_WORD_16,
    154		.audio_bclk_div	 = 8,
    155		.audio_main_div	 = 2,
    156		.hpi_buffer_cap  = 7,
    157		.num_i2c_devs	 = 1,
    158		.i2c_devs	 = {
    159			{
    160				.type	= "saa7115",
    161				.addr	= 0x20,
    162				.is_video = 1,
    163			},
    164		},
    165		.num_inputs	 = 2,
    166		.inputs		 = {
    167		/*	{
    168		 *		.video_input	= 3,
    169		 *		.audio_index	= AUDIO_TUNER,
    170		 *		.name		= "Tuner",
    171		 *	},
    172		 */
    173			{
    174				.video_input	= 1,
    175			/*	.audio_index	= AUDIO_EXTERN, */
    176				.name		= "Composite",
    177			},
    178			{
    179				.video_input	= 8,
    180			/*	.audio_index	= AUDIO_EXTERN, */
    181				.name		= "S-Video",
    182			},
    183		},
    184		.video_config	= SAA7115_IDQ_IS_DEFAULT,
    185	},
    186};
    187
    188static const struct go7007_usb_board board_px_tv402u = {
    189	.flags		= GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C,
    190	.main_info	= {
    191		.flags		 = GO7007_BOARD_HAS_AUDIO |
    192					GO7007_BOARD_HAS_TUNER,
    193		.sensor_flags	 = GO7007_SENSOR_656 |
    194					GO7007_SENSOR_VALID_ENABLE |
    195					GO7007_SENSOR_TV |
    196					GO7007_SENSOR_SAA7115 |
    197					GO7007_SENSOR_VBI |
    198					GO7007_SENSOR_SCALING,
    199		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
    200					GO7007_AUDIO_WORD_16,
    201		.audio_bclk_div	 = 8,
    202		.audio_main_div	 = 2,
    203		.hpi_buffer_cap  = 7,
    204		.num_i2c_devs	 = 5,
    205		.i2c_devs	 = {
    206			{
    207				.type	= "saa7115",
    208				.addr	= 0x20,
    209				.is_video = 1,
    210			},
    211			{
    212				.type	= "uda1342",
    213				.addr	= 0x1a,
    214				.is_audio = 1,
    215			},
    216			{
    217				.type	= "tuner",
    218				.addr	= 0x60,
    219			},
    220			{
    221				.type	= "tuner",
    222				.addr	= 0x43,
    223			},
    224			{
    225				.type	= "sony-btf-mpx",
    226				.addr	= 0x44,
    227			},
    228		},
    229		.num_inputs	 = 3,
    230		.inputs		 = {
    231			{
    232				.video_input	= 3,
    233				.audio_index	= 0,
    234				.name		= "Tuner",
    235			},
    236			{
    237				.video_input	= 1,
    238				.audio_index	= 1,
    239				.name		= "Composite",
    240			},
    241			{
    242				.video_input	= 8,
    243				.audio_index	= 1,
    244				.name		= "S-Video",
    245			},
    246		},
    247		.video_config	= SAA7115_IDQ_IS_DEFAULT,
    248		.num_aud_inputs	 = 2,
    249		.aud_inputs	 = {
    250			{
    251				.audio_input	= UDA1342_IN2,
    252				.name		= "Tuner",
    253			},
    254			{
    255				.audio_input	= UDA1342_IN1,
    256				.name		= "Line In",
    257			},
    258		},
    259	},
    260};
    261
    262static const struct go7007_usb_board board_xmen = {
    263	.flags		= 0,
    264	.main_info	= {
    265		.flags		  = GO7007_BOARD_USE_ONBOARD_I2C,
    266		.hpi_buffer_cap   = 0,
    267		.sensor_flags	  = GO7007_SENSOR_VREF_POLAR,
    268		.sensor_width	  = 320,
    269		.sensor_height	  = 240,
    270		.sensor_framerate = 30030,
    271		.audio_flags	  = GO7007_AUDIO_ONE_CHANNEL |
    272					GO7007_AUDIO_I2S_MODE_3 |
    273					GO7007_AUDIO_WORD_14 |
    274					GO7007_AUDIO_I2S_MASTER |
    275					GO7007_AUDIO_BCLK_POLAR |
    276					GO7007_AUDIO_OKI_MODE,
    277		.audio_rate	  = 8000,
    278		.audio_bclk_div	  = 48,
    279		.audio_main_div	  = 1,
    280		.num_i2c_devs	  = 1,
    281		.i2c_devs	  = {
    282			{
    283				.type	= "ov7640",
    284				.addr	= 0x21,
    285			},
    286		},
    287		.num_inputs	  = 1,
    288		.inputs		  = {
    289			{
    290				.name		= "Camera",
    291			},
    292		},
    293	},
    294};
    295
    296static const struct go7007_usb_board board_matrix_revolution = {
    297	.flags		= GO7007_USB_EZUSB,
    298	.main_info	= {
    299		.flags		 = GO7007_BOARD_HAS_AUDIO |
    300					GO7007_BOARD_USE_ONBOARD_I2C,
    301		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
    302					GO7007_AUDIO_I2S_MASTER |
    303					GO7007_AUDIO_WORD_16,
    304		.audio_rate	 = 48000,
    305		.audio_bclk_div	 = 8,
    306		.audio_main_div	 = 2,
    307		.hpi_buffer_cap  = 7,
    308		.sensor_flags	 = GO7007_SENSOR_656 |
    309					GO7007_SENSOR_TV |
    310					GO7007_SENSOR_VBI,
    311		.num_i2c_devs	 = 1,
    312		.i2c_devs	 = {
    313			{
    314				.type	= "tw9903",
    315				.is_video = 1,
    316				.addr	= 0x44,
    317			},
    318		},
    319		.num_inputs	 = 2,
    320		.inputs		 = {
    321			{
    322				.video_input	= 2,
    323				.name		= "Composite",
    324			},
    325			{
    326				.video_input	= 8,
    327				.name		= "S-Video",
    328			},
    329		},
    330	},
    331};
    332
    333#if 0
    334static const struct go7007_usb_board board_lifeview_lr192 = {
    335	.flags		= GO7007_USB_EZUSB,
    336	.main_info	= {
    337		.flags		 = GO7007_BOARD_HAS_AUDIO |
    338					GO7007_BOARD_USE_ONBOARD_I2C,
    339		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
    340					GO7007_AUDIO_WORD_16,
    341		.audio_rate	 = 48000,
    342		.audio_bclk_div	 = 8,
    343		.audio_main_div	 = 2,
    344		.hpi_buffer_cap  = 7,
    345		.sensor_flags	 = GO7007_SENSOR_656 |
    346					GO7007_SENSOR_VALID_ENABLE |
    347					GO7007_SENSOR_TV |
    348					GO7007_SENSOR_VBI |
    349					GO7007_SENSOR_SCALING,
    350		.num_i2c_devs	 = 0,
    351		.num_inputs	 = 1,
    352		.inputs		 = {
    353			{
    354				.video_input	= 0,
    355				.name		= "Composite",
    356			},
    357		},
    358	},
    359};
    360#endif
    361
    362static const struct go7007_usb_board board_endura = {
    363	.flags		= 0,
    364	.main_info	= {
    365		.flags		 = 0,
    366		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
    367					GO7007_AUDIO_I2S_MASTER |
    368					GO7007_AUDIO_WORD_16,
    369		.audio_rate	 = 8000,
    370		.audio_bclk_div	 = 48,
    371		.audio_main_div	 = 8,
    372		.hpi_buffer_cap  = 0,
    373		.sensor_flags	 = GO7007_SENSOR_656 |
    374					GO7007_SENSOR_TV,
    375		.sensor_h_offset = 8,
    376		.num_i2c_devs	 = 0,
    377		.num_inputs	 = 1,
    378		.inputs		 = {
    379			{
    380				.name		= "Camera",
    381			},
    382		},
    383	},
    384};
    385
    386static const struct go7007_usb_board board_adlink_mpg24 = {
    387	.flags		= 0,
    388	.main_info	= {
    389		.flags		 = GO7007_BOARD_USE_ONBOARD_I2C,
    390		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
    391					GO7007_AUDIO_I2S_MASTER |
    392					GO7007_AUDIO_WORD_16,
    393		.audio_rate	 = 48000,
    394		.audio_bclk_div	 = 8,
    395		.audio_main_div	 = 2,
    396		.hpi_buffer_cap  = 0,
    397		.sensor_flags	 = GO7007_SENSOR_656 |
    398					GO7007_SENSOR_TV |
    399					GO7007_SENSOR_VBI,
    400		.num_i2c_devs	 = 1,
    401		.i2c_devs	 = {
    402			{
    403				.type	= "tw2804",
    404				.addr	= 0x00, /* yes, really */
    405				.flags  = I2C_CLIENT_TEN,
    406				.is_video = 1,
    407			},
    408		},
    409		.num_inputs	 = 1,
    410		.inputs		 = {
    411			{
    412				.name		= "Composite",
    413			},
    414		},
    415	},
    416};
    417
    418static const struct go7007_usb_board board_sensoray_2250 = {
    419	.flags		= GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C,
    420	.main_info	= {
    421		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
    422					GO7007_AUDIO_I2S_MASTER |
    423					GO7007_AUDIO_WORD_16,
    424		.flags		 = GO7007_BOARD_HAS_AUDIO,
    425		.audio_rate	 = 48000,
    426		.audio_bclk_div	 = 8,
    427		.audio_main_div	 = 2,
    428		.hpi_buffer_cap  = 7,
    429		.sensor_flags	 = GO7007_SENSOR_656 |
    430					GO7007_SENSOR_TV,
    431		.num_i2c_devs	 = 1,
    432		.i2c_devs	 = {
    433			{
    434				.type	= "s2250",
    435				.addr	= 0x43,
    436				.is_video = 1,
    437				.is_audio = 1,
    438			},
    439		},
    440		.num_inputs	 = 2,
    441		.inputs		 = {
    442			{
    443				.video_input	= 0,
    444				.name		= "Composite",
    445			},
    446			{
    447				.video_input	= 1,
    448				.name		= "S-Video",
    449			},
    450		},
    451		.num_aud_inputs	 = 3,
    452		.aud_inputs	 = {
    453			{
    454				.audio_input	= 0,
    455				.name		= "Line In",
    456			},
    457			{
    458				.audio_input	= 1,
    459				.name		= "Mic",
    460			},
    461			{
    462				.audio_input	= 2,
    463				.name		= "Mic Boost",
    464			},
    465		},
    466	},
    467};
    468
    469static const struct go7007_usb_board board_ads_usbav_709 = {
    470	.flags		= GO7007_USB_EZUSB,
    471	.main_info	= {
    472		.flags		 = GO7007_BOARD_HAS_AUDIO |
    473					GO7007_BOARD_USE_ONBOARD_I2C,
    474		.audio_flags	 = GO7007_AUDIO_I2S_MODE_1 |
    475					GO7007_AUDIO_I2S_MASTER |
    476					GO7007_AUDIO_WORD_16,
    477		.audio_rate	 = 48000,
    478		.audio_bclk_div	 = 8,
    479		.audio_main_div	 = 2,
    480		.hpi_buffer_cap  = 7,
    481		.sensor_flags	 = GO7007_SENSOR_656 |
    482					GO7007_SENSOR_TV |
    483					GO7007_SENSOR_VBI,
    484		.num_i2c_devs	 = 1,
    485		.i2c_devs	 = {
    486			{
    487				.type	= "tw9906",
    488				.is_video = 1,
    489				.addr	= 0x44,
    490			},
    491		},
    492		.num_inputs	 = 2,
    493		.inputs		 = {
    494			{
    495				.video_input	= 0,
    496				.name		= "Composite",
    497			},
    498			{
    499				.video_input	= 10,
    500				.name		= "S-Video",
    501			},
    502		},
    503	},
    504};
    505
    506static const struct usb_device_id go7007_usb_id_table[] = {
    507	{
    508		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION |
    509					USB_DEVICE_ID_MATCH_INT_INFO,
    510		.idVendor	= 0x0eb1,  /* Vendor ID of WIS Technologies */
    511		.idProduct	= 0x7007,  /* Product ID of GO7007SB chip */
    512		.bcdDevice_lo	= 0x200,   /* Revision number of XMen */
    513		.bcdDevice_hi	= 0x200,
    514		.bInterfaceClass	= 255,
    515		.bInterfaceSubClass	= 0,
    516		.bInterfaceProtocol	= 255,
    517		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_XMEN,
    518	},
    519	{
    520		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
    521		.idVendor	= 0x0eb1,  /* Vendor ID of WIS Technologies */
    522		.idProduct	= 0x7007,  /* Product ID of GO7007SB chip */
    523		.bcdDevice_lo	= 0x202,   /* Revision number of Matrix II */
    524		.bcdDevice_hi	= 0x202,
    525		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_MATRIX_II,
    526	},
    527	{
    528		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
    529		.idVendor	= 0x0eb1,  /* Vendor ID of WIS Technologies */
    530		.idProduct	= 0x7007,  /* Product ID of GO7007SB chip */
    531		.bcdDevice_lo	= 0x204,   /* Revision number of Matrix */
    532		.bcdDevice_hi	= 0x204,   /*     Reloaded */
    533		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_MATRIX_RELOAD,
    534	},
    535	{
    536		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION |
    537					USB_DEVICE_ID_MATCH_INT_INFO,
    538		.idVendor	= 0x0eb1,  /* Vendor ID of WIS Technologies */
    539		.idProduct	= 0x7007,  /* Product ID of GO7007SB chip */
    540		.bcdDevice_lo	= 0x205,   /* Revision number of XMen-II */
    541		.bcdDevice_hi	= 0x205,
    542		.bInterfaceClass	= 255,
    543		.bInterfaceSubClass	= 0,
    544		.bInterfaceProtocol	= 255,
    545		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_XMEN_II,
    546	},
    547	{
    548		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
    549		.idVendor	= 0x0eb1,  /* Vendor ID of WIS Technologies */
    550		.idProduct	= 0x7007,  /* Product ID of GO7007SB chip */
    551		.bcdDevice_lo	= 0x208,   /* Revision number of Star Trek */
    552		.bcdDevice_hi	= 0x208,
    553		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_STAR_TREK,
    554	},
    555	{
    556		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION |
    557					USB_DEVICE_ID_MATCH_INT_INFO,
    558		.idVendor	= 0x0eb1,  /* Vendor ID of WIS Technologies */
    559		.idProduct	= 0x7007,  /* Product ID of GO7007SB chip */
    560		.bcdDevice_lo	= 0x209,   /* Revision number of XMen-III */
    561		.bcdDevice_hi	= 0x209,
    562		.bInterfaceClass	= 255,
    563		.bInterfaceSubClass	= 0,
    564		.bInterfaceProtocol	= 255,
    565		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_XMEN_III,
    566	},
    567	{
    568		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
    569		.idVendor	= 0x0eb1,  /* Vendor ID of WIS Technologies */
    570		.idProduct	= 0x7007,  /* Product ID of GO7007SB chip */
    571		.bcdDevice_lo	= 0x210,   /* Revision number of Matrix */
    572		.bcdDevice_hi	= 0x210,   /*     Revolution */
    573		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_MATRIX_REV,
    574	},
    575	{
    576		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
    577		.idVendor	= 0x093b,  /* Vendor ID of Plextor */
    578		.idProduct	= 0xa102,  /* Product ID of M402U */
    579		.bcdDevice_lo	= 0x1,	   /* revision number of Blueberry */
    580		.bcdDevice_hi	= 0x1,
    581		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_PX_M402U,
    582	},
    583	{
    584		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
    585		.idVendor	= 0x093b,  /* Vendor ID of Plextor */
    586		.idProduct	= 0xa104,  /* Product ID of TV402U */
    587		.bcdDevice_lo	= 0x1,
    588		.bcdDevice_hi	= 0x1,
    589		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_PX_TV402U,
    590	},
    591	{
    592		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
    593		.idVendor	= 0x10fd,  /* Vendor ID of Anubis Electronics */
    594		.idProduct	= 0xde00,  /* Product ID of Lifeview LR192 */
    595		.bcdDevice_lo	= 0x1,
    596		.bcdDevice_hi	= 0x1,
    597		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_LIFEVIEW_LR192,
    598	},
    599	{
    600		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
    601		.idVendor	= 0x1943,  /* Vendor ID Sensoray */
    602		.idProduct	= 0x2250,  /* Product ID of 2250/2251 */
    603		.bcdDevice_lo	= 0x1,
    604		.bcdDevice_hi	= 0x1,
    605		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_SENSORAY_2250,
    606	},
    607	{
    608		.match_flags	= USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
    609		.idVendor	= 0x06e1,  /* Vendor ID of ADS Technologies */
    610		.idProduct	= 0x0709,  /* Product ID of DVD Xpress DX2 */
    611		.bcdDevice_lo	= 0x204,
    612		.bcdDevice_hi	= 0x204,
    613		.driver_info	= (kernel_ulong_t)GO7007_BOARDID_ADS_USBAV_709,
    614	},
    615	{ }					/* Terminating entry */
    616};
    617
    618MODULE_DEVICE_TABLE(usb, go7007_usb_id_table);
    619
    620/********************* Driver for EZ-USB HPI interface *********************/
    621
    622static int go7007_usb_vendor_request(struct go7007 *go, int request,
    623		int value, int index, void *transfer_buffer, int length, int in)
    624{
    625	struct go7007_usb *usb = go->hpi_context;
    626	int timeout = 5000;
    627
    628	if (in) {
    629		return usb_control_msg(usb->usbdev,
    630				usb_rcvctrlpipe(usb->usbdev, 0), request,
    631				USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
    632				value, index, transfer_buffer, length, timeout);
    633	} else {
    634		return usb_control_msg(usb->usbdev,
    635				usb_sndctrlpipe(usb->usbdev, 0), request,
    636				USB_TYPE_VENDOR | USB_RECIP_DEVICE,
    637				value, index, transfer_buffer, length, timeout);
    638	}
    639}
    640
    641static int go7007_usb_interface_reset(struct go7007 *go)
    642{
    643	struct go7007_usb *usb = go->hpi_context;
    644	u16 intr_val, intr_data;
    645
    646	if (go->status == STATUS_SHUTDOWN)
    647		return -1;
    648	/* Reset encoder */
    649	if (go7007_write_interrupt(go, 0x0001, 0x0001) < 0)
    650		return -1;
    651	msleep(100);
    652
    653	if (usb->board->flags & GO7007_USB_EZUSB) {
    654		/* Reset buffer in EZ-USB */
    655		pr_debug("resetting EZ-USB buffers\n");
    656		if (go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0 ||
    657		    go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0)
    658			return -1;
    659
    660		/* Reset encoder again */
    661		if (go7007_write_interrupt(go, 0x0001, 0x0001) < 0)
    662			return -1;
    663		msleep(100);
    664	}
    665
    666	/* Wait for an interrupt to indicate successful hardware reset */
    667	if (go7007_read_interrupt(go, &intr_val, &intr_data) < 0 ||
    668			(intr_val & ~0x1) != 0x55aa) {
    669		dev_err(go->dev, "unable to reset the USB interface\n");
    670		return -1;
    671	}
    672	return 0;
    673}
    674
    675static int go7007_usb_ezusb_write_interrupt(struct go7007 *go,
    676						int addr, int data)
    677{
    678	struct go7007_usb *usb = go->hpi_context;
    679	int i, r;
    680	u16 status_reg = 0;
    681	int timeout = 500;
    682
    683	pr_debug("WriteInterrupt: %04x %04x\n", addr, data);
    684
    685	for (i = 0; i < 100; ++i) {
    686		r = usb_control_msg(usb->usbdev,
    687				usb_rcvctrlpipe(usb->usbdev, 0), 0x14,
    688				USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
    689				0, HPI_STATUS_ADDR, go->usb_buf,
    690				sizeof(status_reg), timeout);
    691		if (r < 0)
    692			break;
    693		status_reg = le16_to_cpu(*((__le16 *)go->usb_buf));
    694		if (!(status_reg & 0x0010))
    695			break;
    696		msleep(10);
    697	}
    698	if (r < 0)
    699		goto write_int_error;
    700	if (i == 100) {
    701		dev_err(go->dev, "device is hung, status reg = 0x%04x\n", status_reg);
    702		return -1;
    703	}
    704	r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 0), 0x12,
    705			USB_TYPE_VENDOR | USB_RECIP_DEVICE, data,
    706			INT_PARAM_ADDR, NULL, 0, timeout);
    707	if (r < 0)
    708		goto write_int_error;
    709	r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 0),
    710			0x12, USB_TYPE_VENDOR | USB_RECIP_DEVICE, addr,
    711			INT_INDEX_ADDR, NULL, 0, timeout);
    712	if (r < 0)
    713		goto write_int_error;
    714	return 0;
    715
    716write_int_error:
    717	dev_err(go->dev, "error in WriteInterrupt: %d\n", r);
    718	return r;
    719}
    720
    721static int go7007_usb_onboard_write_interrupt(struct go7007 *go,
    722						int addr, int data)
    723{
    724	struct go7007_usb *usb = go->hpi_context;
    725	int r;
    726	int timeout = 500;
    727
    728	pr_debug("WriteInterrupt: %04x %04x\n", addr, data);
    729
    730	go->usb_buf[0] = data & 0xff;
    731	go->usb_buf[1] = data >> 8;
    732	go->usb_buf[2] = addr & 0xff;
    733	go->usb_buf[3] = addr >> 8;
    734	go->usb_buf[4] = go->usb_buf[5] = go->usb_buf[6] = go->usb_buf[7] = 0;
    735	r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 2), 0x00,
    736			USB_TYPE_VENDOR | USB_RECIP_ENDPOINT, 0x55aa,
    737			0xf0f0, go->usb_buf, 8, timeout);
    738	if (r < 0) {
    739		dev_err(go->dev, "error in WriteInterrupt: %d\n", r);
    740		return r;
    741	}
    742	return 0;
    743}
    744
    745static void go7007_usb_readinterrupt_complete(struct urb *urb)
    746{
    747	struct go7007 *go = (struct go7007 *)urb->context;
    748	__le16 *regs = (__le16 *)urb->transfer_buffer;
    749	int status = urb->status;
    750
    751	if (status) {
    752		if (status != -ESHUTDOWN &&
    753				go->status != STATUS_SHUTDOWN) {
    754			dev_err(go->dev, "error in read interrupt: %d\n", urb->status);
    755		} else {
    756			wake_up(&go->interrupt_waitq);
    757			return;
    758		}
    759	} else if (urb->actual_length != urb->transfer_buffer_length) {
    760		dev_err(go->dev, "short read in interrupt pipe!\n");
    761	} else {
    762		go->interrupt_available = 1;
    763		go->interrupt_data = __le16_to_cpu(regs[0]);
    764		go->interrupt_value = __le16_to_cpu(regs[1]);
    765		pr_debug("ReadInterrupt: %04x %04x\n",
    766				go->interrupt_value, go->interrupt_data);
    767	}
    768
    769	wake_up(&go->interrupt_waitq);
    770}
    771
    772static int go7007_usb_read_interrupt(struct go7007 *go)
    773{
    774	struct go7007_usb *usb = go->hpi_context;
    775	int r;
    776
    777	r = usb_submit_urb(usb->intr_urb, GFP_KERNEL);
    778	if (r < 0) {
    779		dev_err(go->dev, "unable to submit interrupt urb: %d\n", r);
    780		return r;
    781	}
    782	return 0;
    783}
    784
    785static void go7007_usb_read_video_pipe_complete(struct urb *urb)
    786{
    787	struct go7007 *go = (struct go7007 *)urb->context;
    788	int r, status = urb->status;
    789
    790	if (!vb2_is_streaming(&go->vidq)) {
    791		wake_up_interruptible(&go->frame_waitq);
    792		return;
    793	}
    794	if (status) {
    795		dev_err(go->dev, "error in video pipe: %d\n", status);
    796		return;
    797	}
    798	if (urb->actual_length != urb->transfer_buffer_length) {
    799		dev_err(go->dev, "short read in video pipe!\n");
    800		return;
    801	}
    802	go7007_parse_video_stream(go, urb->transfer_buffer, urb->actual_length);
    803	r = usb_submit_urb(urb, GFP_ATOMIC);
    804	if (r < 0)
    805		dev_err(go->dev, "error in video pipe: %d\n", r);
    806}
    807
    808static void go7007_usb_read_audio_pipe_complete(struct urb *urb)
    809{
    810	struct go7007 *go = (struct go7007 *)urb->context;
    811	int r, status = urb->status;
    812
    813	if (!vb2_is_streaming(&go->vidq))
    814		return;
    815	if (status) {
    816		dev_err(go->dev, "error in audio pipe: %d\n",
    817			status);
    818		return;
    819	}
    820	if (urb->actual_length != urb->transfer_buffer_length) {
    821		dev_err(go->dev, "short read in audio pipe!\n");
    822		return;
    823	}
    824	if (go->audio_deliver != NULL)
    825		go->audio_deliver(go, urb->transfer_buffer, urb->actual_length);
    826	r = usb_submit_urb(urb, GFP_ATOMIC);
    827	if (r < 0)
    828		dev_err(go->dev, "error in audio pipe: %d\n", r);
    829}
    830
    831static int go7007_usb_stream_start(struct go7007 *go)
    832{
    833	struct go7007_usb *usb = go->hpi_context;
    834	int i, r;
    835
    836	for (i = 0; i < 8; ++i) {
    837		r = usb_submit_urb(usb->video_urbs[i], GFP_KERNEL);
    838		if (r < 0) {
    839			dev_err(go->dev, "error submitting video urb %d: %d\n", i, r);
    840			goto video_submit_failed;
    841		}
    842	}
    843	if (!go->audio_enabled)
    844		return 0;
    845
    846	for (i = 0; i < 8; ++i) {
    847		r = usb_submit_urb(usb->audio_urbs[i], GFP_KERNEL);
    848		if (r < 0) {
    849			dev_err(go->dev, "error submitting audio urb %d: %d\n", i, r);
    850			goto audio_submit_failed;
    851		}
    852	}
    853	return 0;
    854
    855audio_submit_failed:
    856	for (i = 0; i < 7; ++i)
    857		usb_kill_urb(usb->audio_urbs[i]);
    858video_submit_failed:
    859	for (i = 0; i < 8; ++i)
    860		usb_kill_urb(usb->video_urbs[i]);
    861	return -1;
    862}
    863
    864static int go7007_usb_stream_stop(struct go7007 *go)
    865{
    866	struct go7007_usb *usb = go->hpi_context;
    867	int i;
    868
    869	if (go->status == STATUS_SHUTDOWN)
    870		return 0;
    871	for (i = 0; i < 8; ++i)
    872		usb_kill_urb(usb->video_urbs[i]);
    873	if (go->audio_enabled)
    874		for (i = 0; i < 8; ++i)
    875			usb_kill_urb(usb->audio_urbs[i]);
    876	return 0;
    877}
    878
    879static int go7007_usb_send_firmware(struct go7007 *go, u8 *data, int len)
    880{
    881	struct go7007_usb *usb = go->hpi_context;
    882	int transferred, pipe;
    883	int timeout = 500;
    884
    885	pr_debug("DownloadBuffer sending %d bytes\n", len);
    886
    887	if (usb->board->flags & GO7007_USB_EZUSB)
    888		pipe = usb_sndbulkpipe(usb->usbdev, 2);
    889	else
    890		pipe = usb_sndbulkpipe(usb->usbdev, 3);
    891
    892	return usb_bulk_msg(usb->usbdev, pipe, data, len,
    893					&transferred, timeout);
    894}
    895
    896static void go7007_usb_release(struct go7007 *go)
    897{
    898	struct go7007_usb *usb = go->hpi_context;
    899	struct urb *vurb, *aurb;
    900	int i;
    901
    902	if (usb->intr_urb) {
    903		usb_kill_urb(usb->intr_urb);
    904		kfree(usb->intr_urb->transfer_buffer);
    905		usb_free_urb(usb->intr_urb);
    906	}
    907
    908	/* Free USB-related structs */
    909	for (i = 0; i < 8; ++i) {
    910		vurb = usb->video_urbs[i];
    911		if (vurb) {
    912			usb_kill_urb(vurb);
    913			kfree(vurb->transfer_buffer);
    914			usb_free_urb(vurb);
    915		}
    916		aurb = usb->audio_urbs[i];
    917		if (aurb) {
    918			usb_kill_urb(aurb);
    919			kfree(aurb->transfer_buffer);
    920			usb_free_urb(aurb);
    921		}
    922	}
    923
    924	kfree(go->hpi_context);
    925}
    926
    927static const struct go7007_hpi_ops go7007_usb_ezusb_hpi_ops = {
    928	.interface_reset	= go7007_usb_interface_reset,
    929	.write_interrupt	= go7007_usb_ezusb_write_interrupt,
    930	.read_interrupt		= go7007_usb_read_interrupt,
    931	.stream_start		= go7007_usb_stream_start,
    932	.stream_stop		= go7007_usb_stream_stop,
    933	.send_firmware		= go7007_usb_send_firmware,
    934	.release		= go7007_usb_release,
    935};
    936
    937static const struct go7007_hpi_ops go7007_usb_onboard_hpi_ops = {
    938	.interface_reset	= go7007_usb_interface_reset,
    939	.write_interrupt	= go7007_usb_onboard_write_interrupt,
    940	.read_interrupt		= go7007_usb_read_interrupt,
    941	.stream_start		= go7007_usb_stream_start,
    942	.stream_stop		= go7007_usb_stream_stop,
    943	.send_firmware		= go7007_usb_send_firmware,
    944	.release		= go7007_usb_release,
    945};
    946
    947/********************* Driver for EZ-USB I2C adapter *********************/
    948
    949static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter,
    950					struct i2c_msg msgs[], int num)
    951{
    952	struct go7007 *go = i2c_get_adapdata(adapter);
    953	struct go7007_usb *usb = go->hpi_context;
    954	u8 *buf = go->usb_buf;
    955	int buf_len, i;
    956	int ret = -EIO;
    957
    958	if (go->status == STATUS_SHUTDOWN)
    959		return -ENODEV;
    960
    961	mutex_lock(&usb->i2c_lock);
    962
    963	for (i = 0; i < num; ++i) {
    964		/* The hardware command is "write some bytes then read some
    965		 * bytes", so we try to coalesce a write followed by a read
    966		 * into a single USB transaction */
    967		if (i + 1 < num && msgs[i].addr == msgs[i + 1].addr &&
    968				!(msgs[i].flags & I2C_M_RD) &&
    969				(msgs[i + 1].flags & I2C_M_RD)) {
    970#ifdef GO7007_I2C_DEBUG
    971			pr_debug("i2c write/read %d/%d bytes on %02x\n",
    972				msgs[i].len, msgs[i + 1].len, msgs[i].addr);
    973#endif
    974			buf[0] = 0x01;
    975			buf[1] = msgs[i].len + 1;
    976			buf[2] = msgs[i].addr << 1;
    977			memcpy(&buf[3], msgs[i].buf, msgs[i].len);
    978			buf_len = msgs[i].len + 3;
    979			buf[buf_len++] = msgs[++i].len;
    980		} else if (msgs[i].flags & I2C_M_RD) {
    981#ifdef GO7007_I2C_DEBUG
    982			pr_debug("i2c read %d bytes on %02x\n",
    983					msgs[i].len, msgs[i].addr);
    984#endif
    985			buf[0] = 0x01;
    986			buf[1] = 1;
    987			buf[2] = msgs[i].addr << 1;
    988			buf[3] = msgs[i].len;
    989			buf_len = 4;
    990		} else {
    991#ifdef GO7007_I2C_DEBUG
    992			pr_debug("i2c write %d bytes on %02x\n",
    993					msgs[i].len, msgs[i].addr);
    994#endif
    995			buf[0] = 0x00;
    996			buf[1] = msgs[i].len + 1;
    997			buf[2] = msgs[i].addr << 1;
    998			memcpy(&buf[3], msgs[i].buf, msgs[i].len);
    999			buf_len = msgs[i].len + 3;
   1000			buf[buf_len++] = 0;
   1001		}
   1002		if (go7007_usb_vendor_request(go, 0x24, 0, 0,
   1003						buf, buf_len, 0) < 0)
   1004			goto i2c_done;
   1005		if (msgs[i].flags & I2C_M_RD) {
   1006			memset(buf, 0, msgs[i].len + 1);
   1007			if (go7007_usb_vendor_request(go, 0x25, 0, 0, buf,
   1008						msgs[i].len + 1, 1) < 0)
   1009				goto i2c_done;
   1010			memcpy(msgs[i].buf, buf + 1, msgs[i].len);
   1011		}
   1012	}
   1013	ret = num;
   1014
   1015i2c_done:
   1016	mutex_unlock(&usb->i2c_lock);
   1017	return ret;
   1018}
   1019
   1020static u32 go7007_usb_functionality(struct i2c_adapter *adapter)
   1021{
   1022	/* No errors are reported by the hardware, so we don't bother
   1023	 * supporting quick writes to avoid confusing probing */
   1024	return (I2C_FUNC_SMBUS_EMUL) & ~I2C_FUNC_SMBUS_QUICK;
   1025}
   1026
   1027static const struct i2c_algorithm go7007_usb_algo = {
   1028	.master_xfer	= go7007_usb_i2c_master_xfer,
   1029	.functionality	= go7007_usb_functionality,
   1030};
   1031
   1032static struct i2c_adapter go7007_usb_adap_templ = {
   1033	.owner			= THIS_MODULE,
   1034	.name			= "WIS GO7007SB EZ-USB",
   1035	.algo			= &go7007_usb_algo,
   1036};
   1037
   1038/********************* USB add/remove functions *********************/
   1039
   1040static int go7007_usb_probe(struct usb_interface *intf,
   1041		const struct usb_device_id *id)
   1042{
   1043	struct go7007 *go;
   1044	struct go7007_usb *usb;
   1045	const struct go7007_usb_board *board;
   1046	struct usb_device *usbdev = interface_to_usbdev(intf);
   1047	struct usb_host_endpoint *ep;
   1048	unsigned num_i2c_devs;
   1049	char *name;
   1050	int video_pipe, i, v_urb_len;
   1051
   1052	pr_debug("probing new GO7007 USB board\n");
   1053
   1054	switch (id->driver_info) {
   1055	case GO7007_BOARDID_MATRIX_II:
   1056		name = "WIS Matrix II or compatible";
   1057		board = &board_matrix_ii;
   1058		break;
   1059	case GO7007_BOARDID_MATRIX_RELOAD:
   1060		name = "WIS Matrix Reloaded or compatible";
   1061		board = &board_matrix_reload;
   1062		break;
   1063	case GO7007_BOARDID_MATRIX_REV:
   1064		name = "WIS Matrix Revolution or compatible";
   1065		board = &board_matrix_revolution;
   1066		break;
   1067	case GO7007_BOARDID_STAR_TREK:
   1068		name = "WIS Star Trek or compatible";
   1069		board = &board_star_trek;
   1070		break;
   1071	case GO7007_BOARDID_XMEN:
   1072		name = "WIS XMen or compatible";
   1073		board = &board_xmen;
   1074		break;
   1075	case GO7007_BOARDID_XMEN_II:
   1076		name = "WIS XMen II or compatible";
   1077		board = &board_xmen;
   1078		break;
   1079	case GO7007_BOARDID_XMEN_III:
   1080		name = "WIS XMen III or compatible";
   1081		board = &board_xmen;
   1082		break;
   1083	case GO7007_BOARDID_PX_M402U:
   1084		name = "Plextor PX-M402U";
   1085		board = &board_matrix_ii;
   1086		break;
   1087	case GO7007_BOARDID_PX_TV402U:
   1088		name = "Plextor PX-TV402U (unknown tuner)";
   1089		board = &board_px_tv402u;
   1090		break;
   1091	case GO7007_BOARDID_LIFEVIEW_LR192:
   1092		dev_err(&intf->dev, "The Lifeview TV Walker Ultra is not supported. Sorry!\n");
   1093		return -ENODEV;
   1094#if 0
   1095		name = "Lifeview TV Walker Ultra";
   1096		board = &board_lifeview_lr192;
   1097#endif
   1098		break;
   1099	case GO7007_BOARDID_SENSORAY_2250:
   1100		dev_info(&intf->dev, "Sensoray 2250 found\n");
   1101		name = "Sensoray 2250/2251";
   1102		board = &board_sensoray_2250;
   1103		break;
   1104	case GO7007_BOARDID_ADS_USBAV_709:
   1105		name = "ADS Tech DVD Xpress DX2";
   1106		board = &board_ads_usbav_709;
   1107		break;
   1108	default:
   1109		dev_err(&intf->dev, "unknown board ID %d!\n",
   1110				(unsigned int)id->driver_info);
   1111		return -ENODEV;
   1112	}
   1113
   1114	go = go7007_alloc(&board->main_info, &intf->dev);
   1115	if (go == NULL)
   1116		return -ENOMEM;
   1117
   1118	usb = kzalloc(sizeof(struct go7007_usb), GFP_KERNEL);
   1119	if (usb == NULL) {
   1120		kfree(go);
   1121		return -ENOMEM;
   1122	}
   1123
   1124	usb->board = board;
   1125	usb->usbdev = usbdev;
   1126	usb_make_path(usbdev, go->bus_info, sizeof(go->bus_info));
   1127	go->board_id = id->driver_info;
   1128	strscpy(go->name, name, sizeof(go->name));
   1129	if (board->flags & GO7007_USB_EZUSB)
   1130		go->hpi_ops = &go7007_usb_ezusb_hpi_ops;
   1131	else
   1132		go->hpi_ops = &go7007_usb_onboard_hpi_ops;
   1133	go->hpi_context = usb;
   1134
   1135	ep = usb->usbdev->ep_in[4];
   1136	if (!ep)
   1137		goto allocfail;
   1138
   1139	/* Allocate the URB and buffer for receiving incoming interrupts */
   1140	usb->intr_urb = usb_alloc_urb(0, GFP_KERNEL);
   1141	if (usb->intr_urb == NULL)
   1142		goto allocfail;
   1143	usb->intr_urb->transfer_buffer = kmalloc_array(2, sizeof(u16),
   1144						       GFP_KERNEL);
   1145	if (usb->intr_urb->transfer_buffer == NULL)
   1146		goto allocfail;
   1147
   1148	if (usb_endpoint_type(&ep->desc) == USB_ENDPOINT_XFER_BULK)
   1149		usb_fill_bulk_urb(usb->intr_urb, usb->usbdev,
   1150			usb_rcvbulkpipe(usb->usbdev, 4),
   1151			usb->intr_urb->transfer_buffer, 2*sizeof(u16),
   1152			go7007_usb_readinterrupt_complete, go);
   1153	else
   1154		usb_fill_int_urb(usb->intr_urb, usb->usbdev,
   1155			usb_rcvintpipe(usb->usbdev, 4),
   1156			usb->intr_urb->transfer_buffer, 2*sizeof(u16),
   1157			go7007_usb_readinterrupt_complete, go, 8);
   1158	usb_set_intfdata(intf, &go->v4l2_dev);
   1159
   1160	/* Boot the GO7007 */
   1161	if (go7007_boot_encoder(go, go->board_info->flags &
   1162					GO7007_BOARD_USE_ONBOARD_I2C) < 0)
   1163		goto allocfail;
   1164
   1165	/* Register the EZ-USB I2C adapter, if we're using it */
   1166	if (board->flags & GO7007_USB_EZUSB_I2C) {
   1167		memcpy(&go->i2c_adapter, &go7007_usb_adap_templ,
   1168				sizeof(go7007_usb_adap_templ));
   1169		mutex_init(&usb->i2c_lock);
   1170		go->i2c_adapter.dev.parent = go->dev;
   1171		i2c_set_adapdata(&go->i2c_adapter, go);
   1172		if (i2c_add_adapter(&go->i2c_adapter) < 0) {
   1173			dev_err(go->dev, "error: i2c_add_adapter failed\n");
   1174			goto allocfail;
   1175		}
   1176		go->i2c_adapter_online = 1;
   1177	}
   1178
   1179	/* Pelco and Adlink reused the XMen and XMen-III vendor and product
   1180	 * IDs for their own incompatible designs.  We can detect XMen boards
   1181	 * by probing the sensor, but there is no way to probe the sensors on
   1182	 * the Pelco and Adlink designs so we default to the Adlink.  If it
   1183	 * is actually a Pelco, the user must set the assume_endura module
   1184	 * parameter. */
   1185	if ((go->board_id == GO7007_BOARDID_XMEN ||
   1186				go->board_id == GO7007_BOARDID_XMEN_III) &&
   1187			go->i2c_adapter_online) {
   1188		union i2c_smbus_data data;
   1189
   1190		/* Check to see if register 0x0A is 0x76 */
   1191		i2c_smbus_xfer(&go->i2c_adapter, 0x21, I2C_CLIENT_SCCB,
   1192			I2C_SMBUS_READ, 0x0A, I2C_SMBUS_BYTE_DATA, &data);
   1193		if (data.byte != 0x76) {
   1194			if (assume_endura) {
   1195				go->board_id = GO7007_BOARDID_ENDURA;
   1196				usb->board = board = &board_endura;
   1197				go->board_info = &board->main_info;
   1198				strscpy(go->name, "Pelco Endura",
   1199					sizeof(go->name));
   1200			} else {
   1201				u16 channel;
   1202
   1203				/* read channel number from GPIO[1:0] */
   1204				go7007_read_addr(go, 0x3c81, &channel);
   1205				channel &= 0x3;
   1206				go->board_id = GO7007_BOARDID_ADLINK_MPG24;
   1207				usb->board = board = &board_adlink_mpg24;
   1208				go->board_info = &board->main_info;
   1209				go->channel_number = channel;
   1210				snprintf(go->name, sizeof(go->name),
   1211					"Adlink PCI-MPG24, channel #%d",
   1212					channel);
   1213			}
   1214			go7007_update_board(go);
   1215		}
   1216	}
   1217
   1218	num_i2c_devs = go->board_info->num_i2c_devs;
   1219
   1220	/* Probe the tuner model on the TV402U */
   1221	if (go->board_id == GO7007_BOARDID_PX_TV402U) {
   1222		/* Board strapping indicates tuner model */
   1223		if (go7007_usb_vendor_request(go, 0x41, 0, 0, go->usb_buf, 3,
   1224					1) < 0) {
   1225			dev_err(go->dev, "GPIO read failed!\n");
   1226			goto allocfail;
   1227		}
   1228		switch (go->usb_buf[0] >> 6) {
   1229		case 1:
   1230			go->tuner_type = TUNER_SONY_BTF_PG472Z;
   1231			go->std = V4L2_STD_PAL;
   1232			strscpy(go->name, "Plextor PX-TV402U-EU",
   1233				sizeof(go->name));
   1234			break;
   1235		case 2:
   1236			go->tuner_type = TUNER_SONY_BTF_PK467Z;
   1237			go->std = V4L2_STD_NTSC_M_JP;
   1238			num_i2c_devs -= 2;
   1239			strscpy(go->name, "Plextor PX-TV402U-JP",
   1240				sizeof(go->name));
   1241			break;
   1242		case 3:
   1243			go->tuner_type = TUNER_SONY_BTF_PB463Z;
   1244			num_i2c_devs -= 2;
   1245			strscpy(go->name, "Plextor PX-TV402U-NA",
   1246				sizeof(go->name));
   1247			break;
   1248		default:
   1249			pr_debug("unable to detect tuner type!\n");
   1250			break;
   1251		}
   1252		/* Configure tuner mode selection inputs connected
   1253		 * to the EZ-USB GPIO output pins */
   1254		if (go7007_usb_vendor_request(go, 0x40, 0x7f02, 0,
   1255					NULL, 0, 0) < 0) {
   1256			dev_err(go->dev, "GPIO write failed!\n");
   1257			goto allocfail;
   1258		}
   1259	}
   1260
   1261	/* Print a nasty message if the user attempts to use a USB2.0 device in
   1262	 * a USB1.1 port.  There will be silent corruption of the stream. */
   1263	if ((board->flags & GO7007_USB_EZUSB) &&
   1264			usbdev->speed != USB_SPEED_HIGH)
   1265		dev_err(go->dev, "*** WARNING ***  This device must be connected to a USB 2.0 port! Attempting to capture video through a USB 1.1 port will result in stream corruption, even at low bitrates!\n");
   1266
   1267	/* Allocate the URBs and buffers for receiving the video stream */
   1268	if (board->flags & GO7007_USB_EZUSB) {
   1269		if (!usb->usbdev->ep_in[6])
   1270			goto allocfail;
   1271		v_urb_len = 1024;
   1272		video_pipe = usb_rcvbulkpipe(usb->usbdev, 6);
   1273	} else {
   1274		if (!usb->usbdev->ep_in[1])
   1275			goto allocfail;
   1276		v_urb_len = 512;
   1277		video_pipe = usb_rcvbulkpipe(usb->usbdev, 1);
   1278	}
   1279	for (i = 0; i < 8; ++i) {
   1280		usb->video_urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
   1281		if (usb->video_urbs[i] == NULL)
   1282			goto allocfail;
   1283		usb->video_urbs[i]->transfer_buffer =
   1284						kmalloc(v_urb_len, GFP_KERNEL);
   1285		if (usb->video_urbs[i]->transfer_buffer == NULL)
   1286			goto allocfail;
   1287		usb_fill_bulk_urb(usb->video_urbs[i], usb->usbdev, video_pipe,
   1288				usb->video_urbs[i]->transfer_buffer, v_urb_len,
   1289				go7007_usb_read_video_pipe_complete, go);
   1290	}
   1291
   1292	/* Allocate the URBs and buffers for receiving the audio stream */
   1293	if ((board->flags & GO7007_USB_EZUSB) &&
   1294	    (board->main_info.flags & GO7007_BOARD_HAS_AUDIO)) {
   1295		if (!usb->usbdev->ep_in[8])
   1296			goto allocfail;
   1297		for (i = 0; i < 8; ++i) {
   1298			usb->audio_urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
   1299			if (usb->audio_urbs[i] == NULL)
   1300				goto allocfail;
   1301			usb->audio_urbs[i]->transfer_buffer = kmalloc(4096,
   1302								GFP_KERNEL);
   1303			if (usb->audio_urbs[i]->transfer_buffer == NULL)
   1304				goto allocfail;
   1305			usb_fill_bulk_urb(usb->audio_urbs[i], usb->usbdev,
   1306				usb_rcvbulkpipe(usb->usbdev, 8),
   1307				usb->audio_urbs[i]->transfer_buffer, 4096,
   1308				go7007_usb_read_audio_pipe_complete, go);
   1309		}
   1310	}
   1311
   1312	/* Do any final GO7007 initialization, then register the
   1313	 * V4L2 and ALSA interfaces */
   1314	if (go7007_register_encoder(go, num_i2c_devs) < 0)
   1315		goto allocfail;
   1316
   1317	go->status = STATUS_ONLINE;
   1318	return 0;
   1319
   1320allocfail:
   1321	go7007_usb_release(go);
   1322	kfree(go);
   1323	return -ENOMEM;
   1324}
   1325
   1326static void go7007_usb_disconnect(struct usb_interface *intf)
   1327{
   1328	struct go7007 *go = to_go7007(usb_get_intfdata(intf));
   1329
   1330	mutex_lock(&go->queue_lock);
   1331	mutex_lock(&go->serialize_lock);
   1332
   1333	if (go->audio_enabled)
   1334		go7007_snd_remove(go);
   1335
   1336	go->status = STATUS_SHUTDOWN;
   1337	v4l2_device_disconnect(&go->v4l2_dev);
   1338	video_unregister_device(&go->vdev);
   1339	mutex_unlock(&go->serialize_lock);
   1340	mutex_unlock(&go->queue_lock);
   1341
   1342	v4l2_device_put(&go->v4l2_dev);
   1343}
   1344
   1345static struct usb_driver go7007_usb_driver = {
   1346	.name		= "go7007",
   1347	.probe		= go7007_usb_probe,
   1348	.disconnect	= go7007_usb_disconnect,
   1349	.id_table	= go7007_usb_id_table,
   1350};
   1351
   1352module_usb_driver(go7007_usb_driver);
   1353MODULE_LICENSE("GPL v2");