1 /* 2 cx231xx-pcb-config.c - driver for Conexant 3 Cx23100/101/102 USB video capture devices 4 5 Copyright (C) 2008 <srinivasa.deevi at conexant dot com> 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 22 #include "cx231xx.h" 23 #include "cx231xx-conf-reg.h" 24 25 static unsigned int pcb_debug; 26 module_param(pcb_debug, int, 0644); 27 MODULE_PARM_DESC(pcb_debug, "enable pcb config debug messages [video]"); 28 29 /******************************************************************************/ 30 31 static struct pcb_config cx231xx_Scenario[] = { 32 { 33 INDEX_SELFPOWER_DIGITAL_ONLY, /* index */ 34 USB_SELF_POWER, /* power_type */ 35 0, /* speed , not decide yet */ 36 MOD_DIGITAL, /* mode */ 37 SOURCE_TS_BDA, /* ts1_source, digital tv only */ 38 NOT_SUPPORTED, /* ts2_source */ 39 NOT_SUPPORTED, /* analog source */ 40 41 0, /* digital_index */ 42 0, /* analog index */ 43 0, /* dif_index */ 44 0, /* external_index */ 45 46 1, /* only one configuration */ 47 { 48 { 49 0, /* config index */ 50 { 51 0, /* interrupt ep index */ 52 1, /* ts1 index */ 53 NOT_SUPPORTED, /* TS2 index */ 54 NOT_SUPPORTED, /* AUDIO */ 55 NOT_SUPPORTED, /* VIDEO */ 56 NOT_SUPPORTED, /* VANC */ 57 NOT_SUPPORTED, /* HANC */ 58 NOT_SUPPORTED /* ir_index */ 59 } 60 , 61 } 62 , 63 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 64 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 65 NOT_SUPPORTED} 66 } 67 , 68 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 69 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 70 NOT_SUPPORTED} 71 } 72 } 73 , 74 /* full-speed config */ 75 { 76 { 77 0, /* config index */ 78 { 79 0, /* interrupt ep index */ 80 1, /* ts1 index */ 81 NOT_SUPPORTED, /* TS2 index */ 82 NOT_SUPPORTED, /* AUDIO */ 83 NOT_SUPPORTED, /* VIDEO */ 84 NOT_SUPPORTED, /* VANC */ 85 NOT_SUPPORTED, /* HANC */ 86 NOT_SUPPORTED /* ir_index */ 87 } 88 } 89 , 90 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 91 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 92 NOT_SUPPORTED} 93 } 94 , 95 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 96 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 97 NOT_SUPPORTED} 98 } 99 } 100 } 101 , 102 103 { 104 INDEX_SELFPOWER_DUAL_DIGITAL, /* index */ 105 USB_SELF_POWER, /* power_type */ 106 0, /* speed , not decide yet */ 107 MOD_DIGITAL, /* mode */ 108 SOURCE_TS_BDA, /* ts1_source, digital tv only */ 109 0, /* ts2_source,need update from register */ 110 NOT_SUPPORTED, /* analog source */ 111 0, /* digital_index */ 112 0, /* analog index */ 113 0, /* dif_index */ 114 0, /* external_index */ 115 116 1, /* only one configuration */ 117 { 118 { 119 0, /* config index */ 120 { 121 0, /* interrupt ep index */ 122 1, /* ts1 index */ 123 2, /* TS2 index */ 124 NOT_SUPPORTED, /* AUDIO */ 125 NOT_SUPPORTED, /* VIDEO */ 126 NOT_SUPPORTED, /* VANC */ 127 NOT_SUPPORTED, /* HANC */ 128 NOT_SUPPORTED /* ir_index */ 129 } 130 } 131 , 132 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 133 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 134 NOT_SUPPORTED} 135 } 136 , 137 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 138 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 139 NOT_SUPPORTED} 140 } 141 } 142 , 143 /* full-speed */ 144 { 145 { 146 0, /* config index */ 147 { 148 0, /* interrupt ep index */ 149 1, /* ts1 index */ 150 2, /* TS2 index */ 151 NOT_SUPPORTED, /* AUDIO */ 152 NOT_SUPPORTED, /* VIDEO */ 153 NOT_SUPPORTED, /* VANC */ 154 NOT_SUPPORTED, /* HANC */ 155 NOT_SUPPORTED /* ir_index */ 156 } 157 } 158 , 159 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 160 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 161 NOT_SUPPORTED} 162 } 163 , 164 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 165 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 166 NOT_SUPPORTED} 167 } 168 } 169 } 170 , 171 172 { 173 INDEX_SELFPOWER_ANALOG_ONLY, /* index */ 174 USB_SELF_POWER, /* power_type */ 175 0, /* speed , not decide yet */ 176 MOD_ANALOG | MOD_DIF | MOD_EXTERNAL, /* mode ,analog tv only */ 177 NOT_SUPPORTED, /* ts1_source, NOT SUPPORT */ 178 NOT_SUPPORTED, /* ts2_source,NOT SUPPORT */ 179 0, /* analog source, need update */ 180 181 0, /* digital_index */ 182 0, /* analog index */ 183 0, /* dif_index */ 184 0, /* external_index */ 185 186 1, /* only one configuration */ 187 { 188 { 189 0, /* config index */ 190 { 191 0, /* interrupt ep index */ 192 NOT_SUPPORTED, /* ts1 index */ 193 NOT_SUPPORTED, /* TS2 index */ 194 1, /* AUDIO */ 195 2, /* VIDEO */ 196 3, /* VANC */ 197 4, /* HANC */ 198 NOT_SUPPORTED /* ir_index */ 199 } 200 } 201 , 202 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 203 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 204 NOT_SUPPORTED} 205 } 206 , 207 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 208 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 209 NOT_SUPPORTED} 210 } 211 } 212 , 213 /* full-speed */ 214 { 215 { 216 0, /* config index */ 217 { 218 0, /* interrupt ep index */ 219 NOT_SUPPORTED, /* ts1 index */ 220 NOT_SUPPORTED, /* TS2 index */ 221 1, /* AUDIO */ 222 2, /* VIDEO */ 223 NOT_SUPPORTED, /* VANC */ 224 NOT_SUPPORTED, /* HANC */ 225 NOT_SUPPORTED /* ir_index */ 226 } 227 } 228 , 229 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 230 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 231 NOT_SUPPORTED} 232 } 233 , 234 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 235 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 236 NOT_SUPPORTED} 237 } 238 } 239 } 240 , 241 242 { 243 INDEX_SELFPOWER_DUAL, /* index */ 244 USB_SELF_POWER, /* power_type */ 245 0, /* speed , not decide yet */ 246 /* mode ,analog tv and digital path */ 247 MOD_ANALOG | MOD_DIF | MOD_DIGITAL | MOD_EXTERNAL, 248 0, /* ts1_source,will update in register */ 249 NOT_SUPPORTED, /* ts2_source,NOT SUPPORT */ 250 0, /* analog source need update */ 251 0, /* digital_index */ 252 0, /* analog index */ 253 0, /* dif_index */ 254 0, /* external_index */ 255 1, /* only one configuration */ 256 { 257 { 258 0, /* config index */ 259 { 260 0, /* interrupt ep index */ 261 1, /* ts1 index */ 262 NOT_SUPPORTED, /* TS2 index */ 263 2, /* AUDIO */ 264 3, /* VIDEO */ 265 4, /* VANC */ 266 5, /* HANC */ 267 NOT_SUPPORTED /* ir_index */ 268 } 269 } 270 , 271 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 272 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 273 NOT_SUPPORTED} 274 } 275 , 276 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 277 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 278 NOT_SUPPORTED} 279 } 280 } 281 , 282 /* full-speed */ 283 { 284 { 285 0, /* config index */ 286 { 287 0, /* interrupt ep index */ 288 1, /* ts1 index */ 289 NOT_SUPPORTED, /* TS2 index */ 290 2, /* AUDIO */ 291 3, /* VIDEO */ 292 NOT_SUPPORTED, /* VANC */ 293 NOT_SUPPORTED, /* HANC */ 294 NOT_SUPPORTED /* ir_index */ 295 } 296 } 297 , 298 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 299 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 300 NOT_SUPPORTED} 301 } 302 , 303 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 304 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 305 NOT_SUPPORTED} 306 } 307 } 308 } 309 , 310 311 { 312 INDEX_SELFPOWER_TRIPLE, /* index */ 313 USB_SELF_POWER, /* power_type */ 314 0, /* speed , not decide yet */ 315 /* mode ,analog tv and digital path */ 316 MOD_ANALOG | MOD_DIF | MOD_DIGITAL | MOD_EXTERNAL, 317 0, /* ts1_source, update in register */ 318 0, /* ts2_source,update in register */ 319 0, /* analog source, need update */ 320 321 0, /* digital_index */ 322 0, /* analog index */ 323 0, /* dif_index */ 324 0, /* external_index */ 325 1, /* only one configuration */ 326 { 327 { 328 0, /* config index */ 329 { 330 0, /* interrupt ep index */ 331 1, /* ts1 index */ 332 2, /* TS2 index */ 333 3, /* AUDIO */ 334 4, /* VIDEO */ 335 5, /* VANC */ 336 6, /* HANC */ 337 NOT_SUPPORTED /* ir_index */ 338 } 339 } 340 , 341 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 342 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 343 NOT_SUPPORTED} 344 } 345 , 346 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 347 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 348 NOT_SUPPORTED} 349 } 350 } 351 , 352 /* full-speed */ 353 { 354 { 355 0, /* config index */ 356 { 357 0, /* interrupt ep index */ 358 1, /* ts1 index */ 359 2, /* TS2 index */ 360 3, /* AUDIO */ 361 4, /* VIDEO */ 362 NOT_SUPPORTED, /* VANC */ 363 NOT_SUPPORTED, /* HANC */ 364 NOT_SUPPORTED /* ir_index */ 365 } 366 } 367 , 368 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 369 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 370 NOT_SUPPORTED} 371 } 372 , 373 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 374 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 375 NOT_SUPPORTED} 376 } 377 } 378 } 379 , 380 381 { 382 INDEX_SELFPOWER_COMPRESSOR, /* index */ 383 USB_SELF_POWER, /* power_type */ 384 0, /* speed , not decide yet */ 385 /* mode ,analog tv AND DIGITAL path */ 386 MOD_ANALOG | MOD_DIF | MOD_DIGITAL | MOD_EXTERNAL, 387 NOT_SUPPORTED, /* ts1_source, disable */ 388 SOURCE_TS_BDA, /* ts2_source */ 389 0, /* analog source,need update */ 390 0, /* digital_index */ 391 0, /* analog index */ 392 0, /* dif_index */ 393 0, /* external_index */ 394 1, /* only one configuration */ 395 { 396 { 397 0, /* config index */ 398 { 399 0, /* interrupt ep index */ 400 NOT_SUPPORTED, /* ts1 index */ 401 1, /* TS2 index */ 402 2, /* AUDIO */ 403 3, /* VIDEO */ 404 4, /* VANC */ 405 5, /* HANC */ 406 NOT_SUPPORTED /* ir_index */ 407 } 408 } 409 , 410 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 411 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 412 NOT_SUPPORTED} 413 } 414 , 415 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 416 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 417 NOT_SUPPORTED} 418 } 419 } 420 , 421 /* full-speed */ 422 { 423 { 424 0, /* config index */ 425 { 426 0, /* interrupt ep index */ 427 NOT_SUPPORTED, /* ts1 index */ 428 1, /* TS2 index */ 429 2, /* AUDIO */ 430 3, /* VIDEO */ 431 NOT_SUPPORTED, /* VANC */ 432 NOT_SUPPORTED, /* HANC */ 433 NOT_SUPPORTED /* ir_index */ 434 } 435 } 436 , 437 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 438 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 439 NOT_SUPPORTED} 440 } 441 , 442 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 443 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 444 NOT_SUPPORTED} 445 } 446 } 447 } 448 , 449 450 { 451 INDEX_BUSPOWER_DIGITAL_ONLY, /* index */ 452 USB_BUS_POWER, /* power_type */ 453 0, /* speed , not decide yet */ 454 MOD_DIGITAL, /* mode ,analog tv AND DIGITAL path */ 455 SOURCE_TS_BDA, /* ts1_source, disable */ 456 NOT_SUPPORTED, /* ts2_source */ 457 NOT_SUPPORTED, /* analog source */ 458 459 0, /* digital_index */ 460 0, /* analog index */ 461 0, /* dif_index */ 462 0, /* external_index */ 463 464 1, /* only one configuration */ 465 { 466 { 467 0, /* config index */ 468 { 469 0, /* interrupt ep index = 2 */ 470 1, /* ts1 index */ 471 NOT_SUPPORTED, /* TS2 index */ 472 NOT_SUPPORTED, /* AUDIO */ 473 NOT_SUPPORTED, /* VIDEO */ 474 NOT_SUPPORTED, /* VANC */ 475 NOT_SUPPORTED, /* HANC */ 476 NOT_SUPPORTED /* ir_index */ 477 } 478 } 479 , 480 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 481 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 482 NOT_SUPPORTED} 483 } 484 , 485 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 486 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 487 NOT_SUPPORTED} 488 } 489 } 490 , 491 /* full-speed */ 492 { 493 { 494 0, /* config index */ 495 { 496 0, /* interrupt ep index = 2 */ 497 1, /* ts1 index */ 498 NOT_SUPPORTED, /* TS2 index */ 499 NOT_SUPPORTED, /* AUDIO */ 500 NOT_SUPPORTED, /* VIDEO */ 501 NOT_SUPPORTED, /* VANC */ 502 NOT_SUPPORTED, /* HANC */ 503 NOT_SUPPORTED /* ir_index */ 504 } 505 } 506 , 507 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 508 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 509 NOT_SUPPORTED} 510 } 511 , 512 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 513 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 514 NOT_SUPPORTED} 515 } 516 } 517 } 518 , 519 { 520 INDEX_BUSPOWER_ANALOG_ONLY, /* index */ 521 USB_BUS_POWER, /* power_type */ 522 0, /* speed , not decide yet */ 523 MOD_ANALOG, /* mode ,analog tv AND DIGITAL path */ 524 NOT_SUPPORTED, /* ts1_source, disable */ 525 NOT_SUPPORTED, /* ts2_source */ 526 SOURCE_ANALOG, /* analog source--analog */ 527 0, /* digital_index */ 528 0, /* analog index */ 529 0, /* dif_index */ 530 0, /* external_index */ 531 1, /* only one configuration */ 532 { 533 { 534 0, /* config index */ 535 { 536 0, /* interrupt ep index */ 537 NOT_SUPPORTED, /* ts1 index */ 538 NOT_SUPPORTED, /* TS2 index */ 539 1, /* AUDIO */ 540 2, /* VIDEO */ 541 3, /* VANC */ 542 4, /* HANC */ 543 NOT_SUPPORTED /* ir_index */ 544 } 545 } 546 , 547 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 548 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 549 NOT_SUPPORTED} 550 } 551 , 552 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 553 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 554 NOT_SUPPORTED} 555 } 556 } 557 , 558 { /* full-speed */ 559 { 560 0, /* config index */ 561 { 562 0, /* interrupt ep index */ 563 NOT_SUPPORTED, /* ts1 index */ 564 NOT_SUPPORTED, /* TS2 index */ 565 1, /* AUDIO */ 566 2, /* VIDEO */ 567 NOT_SUPPORTED, /* VANC */ 568 NOT_SUPPORTED, /* HANC */ 569 NOT_SUPPORTED /* ir_index */ 570 } 571 } 572 , 573 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 574 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 575 NOT_SUPPORTED} 576 } 577 , 578 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 579 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 580 NOT_SUPPORTED} 581 } 582 } 583 } 584 , 585 { 586 INDEX_BUSPOWER_DIF_ONLY, /* index */ 587 USB_BUS_POWER, /* power_type */ 588 0, /* speed , not decide yet */ 589 /* mode ,analog tv AND DIGITAL path */ 590 MOD_DIF | MOD_ANALOG | MOD_DIGITAL | MOD_EXTERNAL, 591 SOURCE_TS_BDA, /* ts1_source, disable */ 592 NOT_SUPPORTED, /* ts2_source */ 593 SOURCE_DIF | SOURCE_ANALOG | SOURCE_EXTERNAL, /* analog source, dif */ 594 0, /* digital_index */ 595 0, /* analog index */ 596 0, /* dif_index */ 597 0, /* external_index */ 598 1, /* only one configuration */ 599 { 600 { 601 0, /* config index */ 602 { 603 0, /* interrupt ep index */ 604 1, /* ts1 index */ 605 NOT_SUPPORTED, /* TS2 index */ 606 2, /* AUDIO */ 607 3, /* VIDEO */ 608 4, /* VANC */ 609 5, /* HANC */ 610 NOT_SUPPORTED /* ir_index */ 611 } 612 } 613 , 614 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 615 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 616 NOT_SUPPORTED} 617 } 618 , 619 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 620 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 621 NOT_SUPPORTED} 622 } 623 } 624 , 625 { /* full speed */ 626 { 627 0, /* config index */ 628 { 629 0, /* interrupt ep index */ 630 1, /* ts1 index */ 631 NOT_SUPPORTED, /* TS2 index */ 632 2, /* AUDIO */ 633 3, /* VIDEO */ 634 NOT_SUPPORTED, /* VANC */ 635 NOT_SUPPORTED, /* HANC */ 636 NOT_SUPPORTED /* ir_index */ 637 } 638 } 639 , 640 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 641 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 642 NOT_SUPPORTED} 643 } 644 , 645 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 646 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED, 647 NOT_SUPPORTED} 648 } 649 } 650 } 651 , 652 653 }; 654 655 /*****************************************************************/ 656 657 int initialize_cx231xx(struct cx231xx *dev) 658 { 659 int retval; 660 u32 config_info = 0; 661 struct pcb_config *p_pcb_info; 662 u8 usb_speed = 1; /* from register,1--HS, 0--FS */ 663 u8 data[4] = { 0, 0, 0, 0 }; 664 u32 ts1_source = 0; 665 u32 ts2_source = 0; 666 u32 analog_source = 0; 667 u8 _current_scenario_idx = 0xff; 668 669 ts1_source = SOURCE_TS_BDA; 670 ts2_source = SOURCE_TS_BDA; 671 672 /* read board config register to find out which 673 pcb config it is related to */ 674 retval = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, BOARD_CFG_STAT, 675 data, 4); 676 if (retval < 0) 677 return retval; 678 679 config_info = le32_to_cpu(*((__le32 *)data)); 680 usb_speed = (u8) (config_info & 0x1); 681 682 /* Verify this device belongs to Bus power or Self power device */ 683 if (config_info & BUS_POWER) { /* bus-power */ 684 switch (config_info & BUSPOWER_MASK) { 685 case TS1_PORT | BUS_POWER: 686 cx231xx_Scenario[INDEX_BUSPOWER_DIGITAL_ONLY].speed = 687 usb_speed; 688 p_pcb_info = 689 &cx231xx_Scenario[INDEX_BUSPOWER_DIGITAL_ONLY]; 690 _current_scenario_idx = INDEX_BUSPOWER_DIGITAL_ONLY; 691 break; 692 case AVDEC_ENABLE | BUS_POWER: 693 cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY].speed = 694 usb_speed; 695 p_pcb_info = 696 &cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY]; 697 _current_scenario_idx = INDEX_BUSPOWER_ANALOG_ONLY; 698 break; 699 case AVDEC_ENABLE | BUS_POWER | TS1_PORT: 700 cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY].speed = 701 usb_speed; 702 p_pcb_info = &cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY]; 703 _current_scenario_idx = INDEX_BUSPOWER_DIF_ONLY; 704 break; 705 default: 706 dev_err(dev->dev, 707 "bad config in buspower!!!!\nconfig_info=%x\n", 708 config_info & BUSPOWER_MASK); 709 return 1; 710 } 711 } else { /* self-power */ 712 713 switch (config_info & SELFPOWER_MASK) { 714 case TS1_PORT | SELF_POWER: 715 cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY].speed = 716 usb_speed; 717 p_pcb_info = 718 &cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY]; 719 _current_scenario_idx = INDEX_SELFPOWER_DIGITAL_ONLY; 720 break; 721 case TS1_TS2_PORT | SELF_POWER: 722 cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL].speed = 723 usb_speed; 724 cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL]. 725 ts2_source = ts2_source; 726 p_pcb_info = 727 &cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL]; 728 _current_scenario_idx = INDEX_SELFPOWER_DUAL_DIGITAL; 729 break; 730 case AVDEC_ENABLE | SELF_POWER: 731 cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY].speed = 732 usb_speed; 733 cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY]. 734 analog_source = analog_source; 735 p_pcb_info = 736 &cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY]; 737 _current_scenario_idx = INDEX_SELFPOWER_ANALOG_ONLY; 738 break; 739 case AVDEC_ENABLE | TS1_PORT | SELF_POWER: 740 cx231xx_Scenario[INDEX_SELFPOWER_DUAL].speed = 741 usb_speed; 742 cx231xx_Scenario[INDEX_SELFPOWER_DUAL].ts1_source = 743 ts1_source; 744 cx231xx_Scenario[INDEX_SELFPOWER_DUAL].analog_source = 745 analog_source; 746 p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_DUAL]; 747 _current_scenario_idx = INDEX_SELFPOWER_DUAL; 748 break; 749 case AVDEC_ENABLE | TS1_TS2_PORT | SELF_POWER: 750 cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].speed = 751 usb_speed; 752 cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts1_source = 753 ts1_source; 754 cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts2_source = 755 ts2_source; 756 cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].analog_source = 757 analog_source; 758 p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE]; 759 _current_scenario_idx = INDEX_SELFPOWER_TRIPLE; 760 break; 761 case AVDEC_ENABLE | TS1VIP_TS2_PORT | SELF_POWER: 762 cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR].speed = 763 usb_speed; 764 cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR]. 765 analog_source = analog_source; 766 p_pcb_info = 767 &cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR]; 768 _current_scenario_idx = INDEX_SELFPOWER_COMPRESSOR; 769 break; 770 default: 771 dev_err(dev->dev, 772 "bad scenario!!!!!\nconfig_info=%x\n", 773 config_info & SELFPOWER_MASK); 774 return -ENODEV; 775 } 776 } 777 778 dev->current_scenario_idx = _current_scenario_idx; 779 780 memcpy(&dev->current_pcb_config, p_pcb_info, 781 sizeof(struct pcb_config)); 782 783 if (pcb_debug) { 784 dev_info(dev->dev, 785 "SC(0x00) register = 0x%x\n", config_info); 786 dev_info(dev->dev, 787 "scenario %d\n", 788 (dev->current_pcb_config.index) + 1); 789 dev_info(dev->dev, 790 "type=%x\n", 791 dev->current_pcb_config.type); 792 dev_info(dev->dev, 793 "mode=%x\n", 794 dev->current_pcb_config.mode); 795 dev_info(dev->dev, 796 "speed=%x\n", 797 dev->current_pcb_config.speed); 798 dev_info(dev->dev, 799 "ts1_source=%x\n", 800 dev->current_pcb_config.ts1_source); 801 dev_info(dev->dev, 802 "ts2_source=%x\n", 803 dev->current_pcb_config.ts2_source); 804 dev_info(dev->dev, 805 "analog_source=%x\n", 806 dev->current_pcb_config.analog_source); 807 } 808 809 return 0; 810 } 811