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 32 static unsigned int assume_endura; 33 module_param(assume_endura, int, 0644); 34 MODULE_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 56 struct go7007_usb_board { 57 unsigned int flags; 58 struct go7007_board_info main_info; 59 }; 60 61 struct 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 72 static 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 112 static 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 149 static 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 196 static 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 270 static 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 304 static 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 342 static 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 370 static 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 394 static 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 426 static 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 477 static 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 514 static 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 626 MODULE_DEVICE_TABLE(usb, go7007_usb_id_table); 627 628 /********************* Driver for EZ-USB HPI interface *********************/ 629 630 static 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 649 static 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 683 static 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 724 write_int_error: 725 dev_err(go->dev, "error in WriteInterrupt: %d\n", r); 726 return r; 727 } 728 729 static 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 753 static 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 780 static 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 793 static 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 816 static 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 839 static 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 863 audio_submit_failed: 864 for (i = 0; i < 7; ++i) 865 usb_kill_urb(usb->audio_urbs[i]); 866 video_submit_failed: 867 for (i = 0; i < 8; ++i) 868 usb_kill_urb(usb->video_urbs[i]); 869 return -1; 870 } 871 872 static 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 887 static 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 904 static 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 935 static 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 945 static 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 957 static 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 1023 i2c_done: 1024 mutex_unlock(&usb->i2c_lock); 1025 return ret; 1026 } 1027 1028 static 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 1035 static struct i2c_algorithm go7007_usb_algo = { 1036 .master_xfer = go7007_usb_i2c_master_xfer, 1037 .functionality = go7007_usb_functionality, 1038 }; 1039 1040 static 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 1048 static 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->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 1316 allocfail: 1317 go7007_usb_release(go); 1318 kfree(go); 1319 return -ENOMEM; 1320 } 1321 1322 static 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 1341 static 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 1348 module_usb_driver(go7007_usb_driver); 1349 MODULE_LICENSE("GPL v2"); 1350