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/saa7115.h> 27#include <media/tuner.h> 28#include <media/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 341static const struct go7007_usb_board board_lifeview_lr192 = { 342 .flags = GO7007_USB_EZUSB, 343 .main_info = { 344 .flags = GO7007_BOARD_HAS_AUDIO | 345 GO7007_BOARD_USE_ONBOARD_I2C, 346 .audio_flags = GO7007_AUDIO_I2S_MODE_1 | 347 GO7007_AUDIO_WORD_16, 348 .audio_rate = 48000, 349 .audio_bclk_div = 8, 350 .audio_main_div = 2, 351 .hpi_buffer_cap = 7, 352 .sensor_flags = GO7007_SENSOR_656 | 353 GO7007_SENSOR_VALID_ENABLE | 354 GO7007_SENSOR_TV | 355 GO7007_SENSOR_VBI | 356 GO7007_SENSOR_SCALING, 357 .num_i2c_devs = 0, 358 .num_inputs = 1, 359 .inputs = { 360 { 361 .video_input = 0, 362 .name = "Composite", 363 }, 364 }, 365 }, 366}; 367 368static const struct go7007_usb_board board_endura = { 369 .flags = 0, 370 .main_info = { 371 .flags = 0, 372 .audio_flags = GO7007_AUDIO_I2S_MODE_1 | 373 GO7007_AUDIO_I2S_MASTER | 374 GO7007_AUDIO_WORD_16, 375 .audio_rate = 8000, 376 .audio_bclk_div = 48, 377 .audio_main_div = 8, 378 .hpi_buffer_cap = 0, 379 .sensor_flags = GO7007_SENSOR_656 | 380 GO7007_SENSOR_TV, 381 .sensor_h_offset = 8, 382 .num_i2c_devs = 0, 383 .num_inputs = 1, 384 .inputs = { 385 { 386 .name = "Camera", 387 }, 388 }, 389 }, 390}; 391 392static const struct go7007_usb_board board_adlink_mpg24 = { 393 .flags = 0, 394 .main_info = { 395 .flags = GO7007_BOARD_USE_ONBOARD_I2C, 396 .audio_flags = GO7007_AUDIO_I2S_MODE_1 | 397 GO7007_AUDIO_I2S_MASTER | 398 GO7007_AUDIO_WORD_16, 399 .audio_rate = 48000, 400 .audio_bclk_div = 8, 401 .audio_main_div = 2, 402 .hpi_buffer_cap = 0, 403 .sensor_flags = GO7007_SENSOR_656 | 404 GO7007_SENSOR_TV | 405 GO7007_SENSOR_VBI, 406 .num_i2c_devs = 1, 407 .i2c_devs = { 408 { 409 .type = "tw2804", 410 .addr = 0x00, /* yes, really */ 411 .flags = I2C_CLIENT_TEN, 412 .is_video = 1, 413 }, 414 }, 415 .num_inputs = 1, 416 .inputs = { 417 { 418 .name = "Composite", 419 }, 420 }, 421 }, 422}; 423 424static const struct go7007_usb_board board_sensoray_2250 = { 425 .flags = GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C, 426 .main_info = { 427 .audio_flags = GO7007_AUDIO_I2S_MODE_1 | 428 GO7007_AUDIO_I2S_MASTER | 429 GO7007_AUDIO_WORD_16, 430 .flags = GO7007_BOARD_HAS_AUDIO, 431 .audio_rate = 48000, 432 .audio_bclk_div = 8, 433 .audio_main_div = 2, 434 .hpi_buffer_cap = 7, 435 .sensor_flags = GO7007_SENSOR_656 | 436 GO7007_SENSOR_TV, 437 .num_i2c_devs = 1, 438 .i2c_devs = { 439 { 440 .type = "s2250", 441 .addr = 0x43, 442 .is_video = 1, 443 .is_audio = 1, 444 }, 445 }, 446 .num_inputs = 2, 447 .inputs = { 448 { 449 .video_input = 0, 450 .name = "Composite", 451 }, 452 { 453 .video_input = 1, 454 .name = "S-Video", 455 }, 456 }, 457 .num_aud_inputs = 3, 458 .aud_inputs = { 459 { 460 .audio_input = 0, 461 .name = "Line In", 462 }, 463 { 464 .audio_input = 1, 465 .name = "Mic", 466 }, 467 { 468 .audio_input = 2, 469 .name = "Mic Boost", 470 }, 471 }, 472 }, 473}; 474 475static const struct go7007_usb_board board_ads_usbav_709 = { 476 .flags = GO7007_USB_EZUSB, 477 .main_info = { 478 .flags = GO7007_BOARD_HAS_AUDIO | 479 GO7007_BOARD_USE_ONBOARD_I2C, 480 .audio_flags = GO7007_AUDIO_I2S_MODE_1 | 481 GO7007_AUDIO_I2S_MASTER | 482 GO7007_AUDIO_WORD_16, 483 .audio_rate = 48000, 484 .audio_bclk_div = 8, 485 .audio_main_div = 2, 486 .hpi_buffer_cap = 7, 487 .sensor_flags = GO7007_SENSOR_656 | 488 GO7007_SENSOR_TV | 489 GO7007_SENSOR_VBI, 490 .num_i2c_devs = 1, 491 .i2c_devs = { 492 { 493 .type = "tw9906", 494 .is_video = 1, 495 .addr = 0x44, 496 }, 497 }, 498 .num_inputs = 2, 499 .inputs = { 500 { 501 .video_input = 0, 502 .name = "Composite", 503 }, 504 { 505 .video_input = 10, 506 .name = "S-Video", 507 }, 508 }, 509 }, 510}; 511 512static const struct usb_device_id go7007_usb_id_table[] = { 513 { 514 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION | 515 USB_DEVICE_ID_MATCH_INT_INFO, 516 .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */ 517 .idProduct = 0x7007, /* Product ID of GO7007SB chip */ 518 .bcdDevice_lo = 0x200, /* Revision number of XMen */ 519 .bcdDevice_hi = 0x200, 520 .bInterfaceClass = 255, 521 .bInterfaceSubClass = 0, 522 .bInterfaceProtocol = 255, 523 .driver_info = (kernel_ulong_t)GO7007_BOARDID_XMEN, 524 }, 525 { 526 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, 527 .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */ 528 .idProduct = 0x7007, /* Product ID of GO7007SB chip */ 529 .bcdDevice_lo = 0x202, /* Revision number of Matrix II */ 530 .bcdDevice_hi = 0x202, 531 .driver_info = (kernel_ulong_t)GO7007_BOARDID_MATRIX_II, 532 }, 533 { 534 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, 535 .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */ 536 .idProduct = 0x7007, /* Product ID of GO7007SB chip */ 537 .bcdDevice_lo = 0x204, /* Revision number of Matrix */ 538 .bcdDevice_hi = 0x204, /* Reloaded */ 539 .driver_info = (kernel_ulong_t)GO7007_BOARDID_MATRIX_RELOAD, 540 }, 541 { 542 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION | 543 USB_DEVICE_ID_MATCH_INT_INFO, 544 .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */ 545 .idProduct = 0x7007, /* Product ID of GO7007SB chip */ 546 .bcdDevice_lo = 0x205, /* Revision number of XMen-II */ 547 .bcdDevice_hi = 0x205, 548 .bInterfaceClass = 255, 549 .bInterfaceSubClass = 0, 550 .bInterfaceProtocol = 255, 551 .driver_info = (kernel_ulong_t)GO7007_BOARDID_XMEN_II, 552 }, 553 { 554 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, 555 .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */ 556 .idProduct = 0x7007, /* Product ID of GO7007SB chip */ 557 .bcdDevice_lo = 0x208, /* Revision number of Star Trek */ 558 .bcdDevice_hi = 0x208, 559 .driver_info = (kernel_ulong_t)GO7007_BOARDID_STAR_TREK, 560 }, 561 { 562 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION | 563 USB_DEVICE_ID_MATCH_INT_INFO, 564 .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */ 565 .idProduct = 0x7007, /* Product ID of GO7007SB chip */ 566 .bcdDevice_lo = 0x209, /* Revision number of XMen-III */ 567 .bcdDevice_hi = 0x209, 568 .bInterfaceClass = 255, 569 .bInterfaceSubClass = 0, 570 .bInterfaceProtocol = 255, 571 .driver_info = (kernel_ulong_t)GO7007_BOARDID_XMEN_III, 572 }, 573 { 574 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, 575 .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */ 576 .idProduct = 0x7007, /* Product ID of GO7007SB chip */ 577 .bcdDevice_lo = 0x210, /* Revision number of Matrix */ 578 .bcdDevice_hi = 0x210, /* Revolution */ 579 .driver_info = (kernel_ulong_t)GO7007_BOARDID_MATRIX_REV, 580 }, 581 { 582 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, 583 .idVendor = 0x093b, /* Vendor ID of Plextor */ 584 .idProduct = 0xa102, /* Product ID of M402U */ 585 .bcdDevice_lo = 0x1, /* revision number of Blueberry */ 586 .bcdDevice_hi = 0x1, 587 .driver_info = (kernel_ulong_t)GO7007_BOARDID_PX_M402U, 588 }, 589 { 590 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, 591 .idVendor = 0x093b, /* Vendor ID of Plextor */ 592 .idProduct = 0xa104, /* Product ID of TV402U */ 593 .bcdDevice_lo = 0x1, 594 .bcdDevice_hi = 0x1, 595 .driver_info = (kernel_ulong_t)GO7007_BOARDID_PX_TV402U, 596 }, 597 { 598 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, 599 .idVendor = 0x10fd, /* Vendor ID of Anubis Electronics */ 600 .idProduct = 0xde00, /* Product ID of Lifeview LR192 */ 601 .bcdDevice_lo = 0x1, 602 .bcdDevice_hi = 0x1, 603 .driver_info = (kernel_ulong_t)GO7007_BOARDID_LIFEVIEW_LR192, 604 }, 605 { 606 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, 607 .idVendor = 0x1943, /* Vendor ID Sensoray */ 608 .idProduct = 0x2250, /* Product ID of 2250/2251 */ 609 .bcdDevice_lo = 0x1, 610 .bcdDevice_hi = 0x1, 611 .driver_info = (kernel_ulong_t)GO7007_BOARDID_SENSORAY_2250, 612 }, 613 { 614 .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, 615 .idVendor = 0x06e1, /* Vendor ID of ADS Technologies */ 616 .idProduct = 0x0709, /* Product ID of DVD Xpress DX2 */ 617 .bcdDevice_lo = 0x204, 618 .bcdDevice_hi = 0x204, 619 .driver_info = (kernel_ulong_t)GO7007_BOARDID_ADS_USBAV_709, 620 }, 621 { } /* Terminating entry */ 622}; 623 624MODULE_DEVICE_TABLE(usb, go7007_usb_id_table); 625 626/********************* Driver for EZ-USB HPI interface *********************/ 627 628static int go7007_usb_vendor_request(struct go7007 *go, int request, 629 int value, int index, void *transfer_buffer, int length, int in) 630{ 631 struct go7007_usb *usb = go->hpi_context; 632 int timeout = 5000; 633 634 if (in) { 635 return usb_control_msg(usb->usbdev, 636 usb_rcvctrlpipe(usb->usbdev, 0), request, 637 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 638 value, index, transfer_buffer, length, timeout); 639 } else { 640 return usb_control_msg(usb->usbdev, 641 usb_sndctrlpipe(usb->usbdev, 0), request, 642 USB_TYPE_VENDOR | USB_RECIP_DEVICE, 643 value, index, transfer_buffer, length, timeout); 644 } 645} 646 647static int go7007_usb_interface_reset(struct go7007 *go) 648{ 649 struct go7007_usb *usb = go->hpi_context; 650 u16 intr_val, intr_data; 651 652 if (go->status == STATUS_SHUTDOWN) 653 return -1; 654 /* Reset encoder */ 655 if (go7007_write_interrupt(go, 0x0001, 0x0001) < 0) 656 return -1; 657 msleep(100); 658 659 if (usb->board->flags & GO7007_USB_EZUSB) { 660 /* Reset buffer in EZ-USB */ 661 pr_debug("resetting EZ-USB buffers\n"); 662 if (go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0 || 663 go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0) 664 return -1; 665 666 /* Reset encoder again */ 667 if (go7007_write_interrupt(go, 0x0001, 0x0001) < 0) 668 return -1; 669 msleep(100); 670 } 671 672 /* Wait for an interrupt to indicate successful hardware reset */ 673 if (go7007_read_interrupt(go, &intr_val, &intr_data) < 0 || 674 (intr_val & ~0x1) != 0x55aa) { 675 dev_err(go->dev, "unable to reset the USB interface\n"); 676 return -1; 677 } 678 return 0; 679} 680 681static int go7007_usb_ezusb_write_interrupt(struct go7007 *go, 682 int addr, int data) 683{ 684 struct go7007_usb *usb = go->hpi_context; 685 int i, r; 686 u16 status_reg = 0; 687 int timeout = 500; 688 689 pr_debug("WriteInterrupt: %04x %04x\n", addr, data); 690 691 for (i = 0; i < 100; ++i) { 692 r = usb_control_msg(usb->usbdev, 693 usb_rcvctrlpipe(usb->usbdev, 0), 0x14, 694 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 695 0, HPI_STATUS_ADDR, go->usb_buf, 696 sizeof(status_reg), timeout); 697 if (r < 0) 698 break; 699 status_reg = le16_to_cpu(*((__le16 *)go->usb_buf)); 700 if (!(status_reg & 0x0010)) 701 break; 702 msleep(10); 703 } 704 if (r < 0) 705 goto write_int_error; 706 if (i == 100) { 707 dev_err(go->dev, "device is hung, status reg = 0x%04x\n", status_reg); 708 return -1; 709 } 710 r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 0), 0x12, 711 USB_TYPE_VENDOR | USB_RECIP_DEVICE, data, 712 INT_PARAM_ADDR, NULL, 0, timeout); 713 if (r < 0) 714 goto write_int_error; 715 r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 0), 716 0x12, USB_TYPE_VENDOR | USB_RECIP_DEVICE, addr, 717 INT_INDEX_ADDR, NULL, 0, timeout); 718 if (r < 0) 719 goto write_int_error; 720 return 0; 721 722write_int_error: 723 dev_err(go->dev, "error in WriteInterrupt: %d\n", r); 724 return r; 725} 726 727static int go7007_usb_onboard_write_interrupt(struct go7007 *go, 728 int addr, int data) 729{ 730 struct go7007_usb *usb = go->hpi_context; 731 int r; 732 int timeout = 500; 733 734 pr_debug("WriteInterrupt: %04x %04x\n", addr, data); 735 736 go->usb_buf[0] = data & 0xff; 737 go->usb_buf[1] = data >> 8; 738 go->usb_buf[2] = addr & 0xff; 739 go->usb_buf[3] = addr >> 8; 740 go->usb_buf[4] = go->usb_buf[5] = go->usb_buf[6] = go->usb_buf[7] = 0; 741 r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 2), 0x00, 742 USB_TYPE_VENDOR | USB_RECIP_ENDPOINT, 0x55aa, 743 0xf0f0, go->usb_buf, 8, timeout); 744 if (r < 0) { 745 dev_err(go->dev, "error in WriteInterrupt: %d\n", r); 746 return r; 747 } 748 return 0; 749} 750 751static void go7007_usb_readinterrupt_complete(struct urb *urb) 752{ 753 struct go7007 *go = (struct go7007 *)urb->context; 754 __le16 *regs = (__le16 *)urb->transfer_buffer; 755 int status = urb->status; 756 757 if (status) { 758 if (status != -ESHUTDOWN && 759 go->status != STATUS_SHUTDOWN) { 760 dev_err(go->dev, "error in read interrupt: %d\n", urb->status); 761 } else { 762 wake_up(&go->interrupt_waitq); 763 return; 764 } 765 } else if (urb->actual_length != urb->transfer_buffer_length) { 766 dev_err(go->dev, "short read in interrupt pipe!\n"); 767 } else { 768 go->interrupt_available = 1; 769 go->interrupt_data = __le16_to_cpu(regs[0]); 770 go->interrupt_value = __le16_to_cpu(regs[1]); 771 pr_debug("ReadInterrupt: %04x %04x\n", 772 go->interrupt_value, go->interrupt_data); 773 } 774 775 wake_up(&go->interrupt_waitq); 776} 777 778static int go7007_usb_read_interrupt(struct go7007 *go) 779{ 780 struct go7007_usb *usb = go->hpi_context; 781 int r; 782 783 r = usb_submit_urb(usb->intr_urb, GFP_KERNEL); 784 if (r < 0) { 785 dev_err(go->dev, "unable to submit interrupt urb: %d\n", r); 786 return r; 787 } 788 return 0; 789} 790 791static void go7007_usb_read_video_pipe_complete(struct urb *urb) 792{ 793 struct go7007 *go = (struct go7007 *)urb->context; 794 int r, status = urb->status; 795 796 if (!vb2_is_streaming(&go->vidq)) { 797 wake_up_interruptible(&go->frame_waitq); 798 return; 799 } 800 if (status) { 801 dev_err(go->dev, "error in video pipe: %d\n", status); 802 return; 803 } 804 if (urb->actual_length != urb->transfer_buffer_length) { 805 dev_err(go->dev, "short read in video pipe!\n"); 806 return; 807 } 808 go7007_parse_video_stream(go, urb->transfer_buffer, urb->actual_length); 809 r = usb_submit_urb(urb, GFP_ATOMIC); 810 if (r < 0) 811 dev_err(go->dev, "error in video pipe: %d\n", r); 812} 813 814static void go7007_usb_read_audio_pipe_complete(struct urb *urb) 815{ 816 struct go7007 *go = (struct go7007 *)urb->context; 817 int r, status = urb->status; 818 819 if (!vb2_is_streaming(&go->vidq)) 820 return; 821 if (status) { 822 dev_err(go->dev, "error in audio pipe: %d\n", 823 status); 824 return; 825 } 826 if (urb->actual_length != urb->transfer_buffer_length) { 827 dev_err(go->dev, "short read in audio pipe!\n"); 828 return; 829 } 830 if (go->audio_deliver != NULL) 831 go->audio_deliver(go, urb->transfer_buffer, urb->actual_length); 832 r = usb_submit_urb(urb, GFP_ATOMIC); 833 if (r < 0) 834 dev_err(go->dev, "error in audio pipe: %d\n", r); 835} 836 837static int go7007_usb_stream_start(struct go7007 *go) 838{ 839 struct go7007_usb *usb = go->hpi_context; 840 int i, r; 841 842 for (i = 0; i < 8; ++i) { 843 r = usb_submit_urb(usb->video_urbs[i], GFP_KERNEL); 844 if (r < 0) { 845 dev_err(go->dev, "error submitting video urb %d: %d\n", i, r); 846 goto video_submit_failed; 847 } 848 } 849 if (!go->audio_enabled) 850 return 0; 851 852 for (i = 0; i < 8; ++i) { 853 r = usb_submit_urb(usb->audio_urbs[i], GFP_KERNEL); 854 if (r < 0) { 855 dev_err(go->dev, "error submitting audio urb %d: %d\n", i, r); 856 goto audio_submit_failed; 857 } 858 } 859 return 0; 860 861audio_submit_failed: 862 for (i = 0; i < 7; ++i) 863 usb_kill_urb(usb->audio_urbs[i]); 864video_submit_failed: 865 for (i = 0; i < 8; ++i) 866 usb_kill_urb(usb->video_urbs[i]); 867 return -1; 868} 869 870static int go7007_usb_stream_stop(struct go7007 *go) 871{ 872 struct go7007_usb *usb = go->hpi_context; 873 int i; 874 875 if (go->status == STATUS_SHUTDOWN) 876 return 0; 877 for (i = 0; i < 8; ++i) 878 usb_kill_urb(usb->video_urbs[i]); 879 if (go->audio_enabled) 880 for (i = 0; i < 8; ++i) 881 usb_kill_urb(usb->audio_urbs[i]); 882 return 0; 883} 884 885static int go7007_usb_send_firmware(struct go7007 *go, u8 *data, int len) 886{ 887 struct go7007_usb *usb = go->hpi_context; 888 int transferred, pipe; 889 int timeout = 500; 890 891 pr_debug("DownloadBuffer sending %d bytes\n", len); 892 893 if (usb->board->flags & GO7007_USB_EZUSB) 894 pipe = usb_sndbulkpipe(usb->usbdev, 2); 895 else 896 pipe = usb_sndbulkpipe(usb->usbdev, 3); 897 898 return usb_bulk_msg(usb->usbdev, pipe, data, len, 899 &transferred, timeout); 900} 901 902static void go7007_usb_release(struct go7007 *go) 903{ 904 struct go7007_usb *usb = go->hpi_context; 905 struct urb *vurb, *aurb; 906 int i; 907 908 if (usb->intr_urb) { 909 usb_kill_urb(usb->intr_urb); 910 kfree(usb->intr_urb->transfer_buffer); 911 usb_free_urb(usb->intr_urb); 912 } 913 914 /* Free USB-related structs */ 915 for (i = 0; i < 8; ++i) { 916 vurb = usb->video_urbs[i]; 917 if (vurb) { 918 usb_kill_urb(vurb); 919 kfree(vurb->transfer_buffer); 920 usb_free_urb(vurb); 921 } 922 aurb = usb->audio_urbs[i]; 923 if (aurb) { 924 usb_kill_urb(aurb); 925 kfree(aurb->transfer_buffer); 926 usb_free_urb(aurb); 927 } 928 } 929 930 kfree(go->hpi_context); 931} 932 933static struct go7007_hpi_ops go7007_usb_ezusb_hpi_ops = { 934 .interface_reset = go7007_usb_interface_reset, 935 .write_interrupt = go7007_usb_ezusb_write_interrupt, 936 .read_interrupt = go7007_usb_read_interrupt, 937 .stream_start = go7007_usb_stream_start, 938 .stream_stop = go7007_usb_stream_stop, 939 .send_firmware = go7007_usb_send_firmware, 940 .release = go7007_usb_release, 941}; 942 943static struct go7007_hpi_ops go7007_usb_onboard_hpi_ops = { 944 .interface_reset = go7007_usb_interface_reset, 945 .write_interrupt = go7007_usb_onboard_write_interrupt, 946 .read_interrupt = go7007_usb_read_interrupt, 947 .stream_start = go7007_usb_stream_start, 948 .stream_stop = go7007_usb_stream_stop, 949 .send_firmware = go7007_usb_send_firmware, 950 .release = go7007_usb_release, 951}; 952 953/********************* Driver for EZ-USB I2C adapter *********************/ 954 955static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter, 956 struct i2c_msg msgs[], int num) 957{ 958 struct go7007 *go = i2c_get_adapdata(adapter); 959 struct go7007_usb *usb = go->hpi_context; 960 u8 *buf = go->usb_buf; 961 int buf_len, i; 962 int ret = -EIO; 963 964 if (go->status == STATUS_SHUTDOWN) 965 return -ENODEV; 966 967 mutex_lock(&usb->i2c_lock); 968 969 for (i = 0; i < num; ++i) { 970 /* The hardware command is "write some bytes then read some 971 * bytes", so we try to coalesce a write followed by a read 972 * into a single USB transaction */ 973 if (i + 1 < num && msgs[i].addr == msgs[i + 1].addr && 974 !(msgs[i].flags & I2C_M_RD) && 975 (msgs[i + 1].flags & I2C_M_RD)) { 976#ifdef GO7007_I2C_DEBUG 977 pr_debug("i2c write/read %d/%d bytes on %02x\n", 978 msgs[i].len, msgs[i + 1].len, msgs[i].addr); 979#endif 980 buf[0] = 0x01; 981 buf[1] = msgs[i].len + 1; 982 buf[2] = msgs[i].addr << 1; 983 memcpy(&buf[3], msgs[i].buf, msgs[i].len); 984 buf_len = msgs[i].len + 3; 985 buf[buf_len++] = msgs[++i].len; 986 } else if (msgs[i].flags & I2C_M_RD) { 987#ifdef GO7007_I2C_DEBUG 988 pr_debug("i2c read %d bytes on %02x\n", 989 msgs[i].len, msgs[i].addr); 990#endif 991 buf[0] = 0x01; 992 buf[1] = 1; 993 buf[2] = msgs[i].addr << 1; 994 buf[3] = msgs[i].len; 995 buf_len = 4; 996 } else { 997#ifdef GO7007_I2C_DEBUG 998 pr_debug("i2c write %d bytes on %02x\n", 999 msgs[i].len, msgs[i].addr); 1000#endif 1001 buf[0] = 0x00; 1002 buf[1] = msgs[i].len + 1; 1003 buf[2] = msgs[i].addr << 1; 1004 memcpy(&buf[3], msgs[i].buf, msgs[i].len); 1005 buf_len = msgs[i].len + 3; 1006 buf[buf_len++] = 0; 1007 } 1008 if (go7007_usb_vendor_request(go, 0x24, 0, 0, 1009 buf, buf_len, 0) < 0) 1010 goto i2c_done; 1011 if (msgs[i].flags & I2C_M_RD) { 1012 memset(buf, 0, msgs[i].len + 1); 1013 if (go7007_usb_vendor_request(go, 0x25, 0, 0, buf, 1014 msgs[i].len + 1, 1) < 0) 1015 goto i2c_done; 1016 memcpy(msgs[i].buf, buf + 1, msgs[i].len); 1017 } 1018 } 1019 ret = num; 1020 1021i2c_done: 1022 mutex_unlock(&usb->i2c_lock); 1023 return ret; 1024} 1025 1026static u32 go7007_usb_functionality(struct i2c_adapter *adapter) 1027{ 1028 /* No errors are reported by the hardware, so we don't bother 1029 * supporting quick writes to avoid confusing probing */ 1030 return (I2C_FUNC_SMBUS_EMUL) & ~I2C_FUNC_SMBUS_QUICK; 1031} 1032 1033static struct i2c_algorithm go7007_usb_algo = { 1034 .master_xfer = go7007_usb_i2c_master_xfer, 1035 .functionality = go7007_usb_functionality, 1036}; 1037 1038static struct i2c_adapter go7007_usb_adap_templ = { 1039 .owner = THIS_MODULE, 1040 .name = "WIS GO7007SB EZ-USB", 1041 .algo = &go7007_usb_algo, 1042}; 1043 1044/********************* USB add/remove functions *********************/ 1045 1046static int go7007_usb_probe(struct usb_interface *intf, 1047 const struct usb_device_id *id) 1048{ 1049 struct go7007 *go; 1050 struct go7007_usb *usb; 1051 const struct go7007_usb_board *board; 1052 struct usb_device *usbdev = interface_to_usbdev(intf); 1053 unsigned num_i2c_devs; 1054 char *name; 1055 int video_pipe, i, v_urb_len; 1056 1057 pr_debug("probing new GO7007 USB board\n"); 1058 1059 switch (id->driver_info) { 1060 case GO7007_BOARDID_MATRIX_II: 1061 name = "WIS Matrix II or compatible"; 1062 board = &board_matrix_ii; 1063 break; 1064 case GO7007_BOARDID_MATRIX_RELOAD: 1065 name = "WIS Matrix Reloaded or compatible"; 1066 board = &board_matrix_reload; 1067 break; 1068 case GO7007_BOARDID_MATRIX_REV: 1069 name = "WIS Matrix Revolution or compatible"; 1070 board = &board_matrix_revolution; 1071 break; 1072 case GO7007_BOARDID_STAR_TREK: 1073 name = "WIS Star Trek or compatible"; 1074 board = &board_star_trek; 1075 break; 1076 case GO7007_BOARDID_XMEN: 1077 name = "WIS XMen or compatible"; 1078 board = &board_xmen; 1079 break; 1080 case GO7007_BOARDID_XMEN_II: 1081 name = "WIS XMen II or compatible"; 1082 board = &board_xmen; 1083 break; 1084 case GO7007_BOARDID_XMEN_III: 1085 name = "WIS XMen III or compatible"; 1086 board = &board_xmen; 1087 break; 1088 case GO7007_BOARDID_PX_M402U: 1089 name = "Plextor PX-M402U"; 1090 board = &board_matrix_ii; 1091 break; 1092 case GO7007_BOARDID_PX_TV402U: 1093 name = "Plextor PX-TV402U (unknown tuner)"; 1094 board = &board_px_tv402u; 1095 break; 1096 case GO7007_BOARDID_LIFEVIEW_LR192: 1097 dev_err(&intf->dev, "The Lifeview TV Walker Ultra is not supported. Sorry!\n"); 1098 return -ENODEV; 1099 name = "Lifeview TV Walker Ultra"; 1100 board = &board_lifeview_lr192; 1101 break; 1102 case GO7007_BOARDID_SENSORAY_2250: 1103 dev_info(&intf->dev, "Sensoray 2250 found\n"); 1104 name = "Sensoray 2250/2251"; 1105 board = &board_sensoray_2250; 1106 break; 1107 case GO7007_BOARDID_ADS_USBAV_709: 1108 name = "ADS Tech DVD Xpress DX2"; 1109 board = &board_ads_usbav_709; 1110 break; 1111 default: 1112 dev_err(&intf->dev, "unknown board ID %d!\n", 1113 (unsigned int)id->driver_info); 1114 return -ENODEV; 1115 } 1116 1117 go = go7007_alloc(&board->main_info, &intf->dev); 1118 if (go == NULL) 1119 return -ENOMEM; 1120 1121 usb = kzalloc(sizeof(struct go7007_usb), GFP_KERNEL); 1122 if (usb == NULL) { 1123 kfree(go); 1124 return -ENOMEM; 1125 } 1126 1127 usb->board = board; 1128 usb->usbdev = usbdev; 1129 usb_make_path(usbdev, go->bus_info, sizeof(go->bus_info)); 1130 go->board_id = id->driver_info; 1131 strncpy(go->name, name, sizeof(go->name)); 1132 if (board->flags & GO7007_USB_EZUSB) 1133 go->hpi_ops = &go7007_usb_ezusb_hpi_ops; 1134 else 1135 go->hpi_ops = &go7007_usb_onboard_hpi_ops; 1136 go->hpi_context = usb; 1137 1138 /* Allocate the URB and buffer for receiving incoming interrupts */ 1139 usb->intr_urb = usb_alloc_urb(0, GFP_KERNEL); 1140 if (usb->intr_urb == NULL) 1141 goto allocfail; 1142 usb->intr_urb->transfer_buffer = kmalloc(2*sizeof(u16), GFP_KERNEL); 1143 if (usb->intr_urb->transfer_buffer == NULL) 1144 goto allocfail; 1145 1146 if (go->board_id == GO7007_BOARDID_SENSORAY_2250) 1147 usb_fill_bulk_urb(usb->intr_urb, usb->usbdev, 1148 usb_rcvbulkpipe(usb->usbdev, 4), 1149 usb->intr_urb->transfer_buffer, 2*sizeof(u16), 1150 go7007_usb_readinterrupt_complete, go); 1151 else 1152 usb_fill_int_urb(usb->intr_urb, usb->usbdev, 1153 usb_rcvintpipe(usb->usbdev, 4), 1154 usb->intr_urb->transfer_buffer, 2*sizeof(u16), 1155 go7007_usb_readinterrupt_complete, go, 8); 1156 usb_set_intfdata(intf, &go->v4l2_dev); 1157 1158 /* Boot the GO7007 */ 1159 if (go7007_boot_encoder(go, go->board_info->flags & 1160 GO7007_BOARD_USE_ONBOARD_I2C) < 0) 1161 goto allocfail; 1162 1163 /* Register the EZ-USB I2C adapter, if we're using it */ 1164 if (board->flags & GO7007_USB_EZUSB_I2C) { 1165 memcpy(&go->i2c_adapter, &go7007_usb_adap_templ, 1166 sizeof(go7007_usb_adap_templ)); 1167 mutex_init(&usb->i2c_lock); 1168 go->i2c_adapter.dev.parent = go->dev; 1169 i2c_set_adapdata(&go->i2c_adapter, go); 1170 if (i2c_add_adapter(&go->i2c_adapter) < 0) { 1171 dev_err(go->dev, "error: i2c_add_adapter failed\n"); 1172 goto allocfail; 1173 } 1174 go->i2c_adapter_online = 1; 1175 } 1176 1177 /* Pelco and Adlink reused the XMen and XMen-III vendor and product 1178 * IDs for their own incompatible designs. We can detect XMen boards 1179 * by probing the sensor, but there is no way to probe the sensors on 1180 * the Pelco and Adlink designs so we default to the Adlink. If it 1181 * is actually a Pelco, the user must set the assume_endura module 1182 * parameter. */ 1183 if ((go->board_id == GO7007_BOARDID_XMEN || 1184 go->board_id == GO7007_BOARDID_XMEN_III) && 1185 go->i2c_adapter_online) { 1186 union i2c_smbus_data data; 1187 1188 /* Check to see if register 0x0A is 0x76 */ 1189 i2c_smbus_xfer(&go->i2c_adapter, 0x21, I2C_CLIENT_SCCB, 1190 I2C_SMBUS_READ, 0x0A, I2C_SMBUS_BYTE_DATA, &data); 1191 if (data.byte != 0x76) { 1192 if (assume_endura) { 1193 go->board_id = GO7007_BOARDID_ENDURA; 1194 usb->board = board = &board_endura; 1195 go->board_info = &board->main_info; 1196 strncpy(go->name, "Pelco Endura", 1197 sizeof(go->name)); 1198 } else { 1199 u16 channel; 1200 1201 /* read channel number from GPIO[1:0] */ 1202 go7007_read_addr(go, 0x3c81, &channel); 1203 channel &= 0x3; 1204 go->board_id = GO7007_BOARDID_ADLINK_MPG24; 1205 usb->board = board = &board_adlink_mpg24; 1206 go->board_info = &board->main_info; 1207 go->channel_number = channel; 1208 snprintf(go->name, sizeof(go->name), 1209 "Adlink PCI-MPG24, channel #%d", 1210 channel); 1211 } 1212 go7007_update_board(go); 1213 } 1214 } 1215 1216 num_i2c_devs = go->board_info->num_i2c_devs; 1217 1218 /* Probe the tuner model on the TV402U */ 1219 if (go->board_id == GO7007_BOARDID_PX_TV402U) { 1220 /* Board strapping indicates tuner model */ 1221 if (go7007_usb_vendor_request(go, 0x41, 0, 0, go->usb_buf, 3, 1222 1) < 0) { 1223 dev_err(go->dev, "GPIO read failed!\n"); 1224 goto allocfail; 1225 } 1226 switch (go->usb_buf[0] >> 6) { 1227 case 1: 1228 go->tuner_type = TUNER_SONY_BTF_PG472Z; 1229 go->std = V4L2_STD_PAL; 1230 strncpy(go->name, "Plextor PX-TV402U-EU", 1231 sizeof(go->name)); 1232 break; 1233 case 2: 1234 go->tuner_type = TUNER_SONY_BTF_PK467Z; 1235 go->std = V4L2_STD_NTSC_M_JP; 1236 num_i2c_devs -= 2; 1237 strncpy(go->name, "Plextor PX-TV402U-JP", 1238 sizeof(go->name)); 1239 break; 1240 case 3: 1241 go->tuner_type = TUNER_SONY_BTF_PB463Z; 1242 num_i2c_devs -= 2; 1243 strncpy(go->name, "Plextor PX-TV402U-NA", 1244 sizeof(go->name)); 1245 break; 1246 default: 1247 pr_debug("unable to detect tuner type!\n"); 1248 break; 1249 } 1250 /* Configure tuner mode selection inputs connected 1251 * to the EZ-USB GPIO output pins */ 1252 if (go7007_usb_vendor_request(go, 0x40, 0x7f02, 0, 1253 NULL, 0, 0) < 0) { 1254 dev_err(go->dev, "GPIO write failed!\n"); 1255 goto allocfail; 1256 } 1257 } 1258 1259 /* Print a nasty message if the user attempts to use a USB2.0 device in 1260 * a USB1.1 port. There will be silent corruption of the stream. */ 1261 if ((board->flags & GO7007_USB_EZUSB) && 1262 usbdev->speed != USB_SPEED_HIGH) 1263 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"); 1264 1265 /* Allocate the URBs and buffers for receiving the video stream */ 1266 if (board->flags & GO7007_USB_EZUSB) { 1267 v_urb_len = 1024; 1268 video_pipe = usb_rcvbulkpipe(usb->usbdev, 6); 1269 } else { 1270 v_urb_len = 512; 1271 video_pipe = usb_rcvbulkpipe(usb->usbdev, 1); 1272 } 1273 for (i = 0; i < 8; ++i) { 1274 usb->video_urbs[i] = usb_alloc_urb(0, GFP_KERNEL); 1275 if (usb->video_urbs[i] == NULL) 1276 goto allocfail; 1277 usb->video_urbs[i]->transfer_buffer = 1278 kmalloc(v_urb_len, GFP_KERNEL); 1279 if (usb->video_urbs[i]->transfer_buffer == NULL) 1280 goto allocfail; 1281 usb_fill_bulk_urb(usb->video_urbs[i], usb->usbdev, video_pipe, 1282 usb->video_urbs[i]->transfer_buffer, v_urb_len, 1283 go7007_usb_read_video_pipe_complete, go); 1284 } 1285 1286 /* Allocate the URBs and buffers for receiving the audio stream */ 1287 if ((board->flags & GO7007_USB_EZUSB) && 1288 (board->flags & GO7007_BOARD_HAS_AUDIO)) { 1289 for (i = 0; i < 8; ++i) { 1290 usb->audio_urbs[i] = usb_alloc_urb(0, GFP_KERNEL); 1291 if (usb->audio_urbs[i] == NULL) 1292 goto allocfail; 1293 usb->audio_urbs[i]->transfer_buffer = kmalloc(4096, 1294 GFP_KERNEL); 1295 if (usb->audio_urbs[i]->transfer_buffer == NULL) 1296 goto allocfail; 1297 usb_fill_bulk_urb(usb->audio_urbs[i], usb->usbdev, 1298 usb_rcvbulkpipe(usb->usbdev, 8), 1299 usb->audio_urbs[i]->transfer_buffer, 4096, 1300 go7007_usb_read_audio_pipe_complete, go); 1301 } 1302 } 1303 1304 /* Do any final GO7007 initialization, then register the 1305 * V4L2 and ALSA interfaces */ 1306 if (go7007_register_encoder(go, num_i2c_devs) < 0) 1307 goto allocfail; 1308 1309 go->status = STATUS_ONLINE; 1310 return 0; 1311 1312allocfail: 1313 go7007_usb_release(go); 1314 kfree(go); 1315 return -ENOMEM; 1316} 1317 1318static void go7007_usb_disconnect(struct usb_interface *intf) 1319{ 1320 struct go7007 *go = to_go7007(usb_get_intfdata(intf)); 1321 1322 mutex_lock(&go->queue_lock); 1323 mutex_lock(&go->serialize_lock); 1324 1325 if (go->audio_enabled) 1326 go7007_snd_remove(go); 1327 1328 go->status = STATUS_SHUTDOWN; 1329 v4l2_device_disconnect(&go->v4l2_dev); 1330 video_unregister_device(&go->vdev); 1331 mutex_unlock(&go->serialize_lock); 1332 mutex_unlock(&go->queue_lock); 1333 1334 v4l2_device_put(&go->v4l2_dev); 1335} 1336 1337static struct usb_driver go7007_usb_driver = { 1338 .name = "go7007", 1339 .probe = go7007_usb_probe, 1340 .disconnect = go7007_usb_disconnect, 1341 .id_table = go7007_usb_id_table, 1342}; 1343 1344module_usb_driver(go7007_usb_driver); 1345MODULE_LICENSE("GPL v2"); 1346