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