1 // SPDX-License-Identifier: GPL-2.0-or-later
3 cx231xx-pcb-config.c - driver for Conexant
4 Cx23100/101/102 USB video capture devices
6 Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
11 #include "cx231xx-conf-reg.h"
13 static unsigned int pcb_debug;
14 module_param(pcb_debug, int, 0644);
15 MODULE_PARM_DESC(pcb_debug, "enable pcb config debug messages [video]");
17 /******************************************************************************/
19 static struct pcb_config cx231xx_Scenario[] = {
21 INDEX_SELFPOWER_DIGITAL_ONLY, /* index */
22 USB_SELF_POWER, /* power_type */
23 0, /* speed , not decide yet */
24 MOD_DIGITAL, /* mode */
25 SOURCE_TS_BDA, /* ts1_source, digital tv only */
26 NOT_SUPPORTED, /* ts2_source */
27 NOT_SUPPORTED, /* analog source */
29 0, /* digital_index */
32 0, /* external_index */
34 1, /* only one configuration */
39 0, /* interrupt ep index */
41 NOT_SUPPORTED, /* TS2 index */
42 NOT_SUPPORTED, /* AUDIO */
43 NOT_SUPPORTED, /* VIDEO */
44 NOT_SUPPORTED, /* VANC */
45 NOT_SUPPORTED, /* HANC */
46 NOT_SUPPORTED /* ir_index */
51 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
52 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
56 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
57 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
62 /* full-speed config */
67 0, /* interrupt ep index */
69 NOT_SUPPORTED, /* TS2 index */
70 NOT_SUPPORTED, /* AUDIO */
71 NOT_SUPPORTED, /* VIDEO */
72 NOT_SUPPORTED, /* VANC */
73 NOT_SUPPORTED, /* HANC */
74 NOT_SUPPORTED /* ir_index */
78 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
79 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
83 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
84 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
92 INDEX_SELFPOWER_DUAL_DIGITAL, /* index */
93 USB_SELF_POWER, /* power_type */
94 0, /* speed , not decide yet */
95 MOD_DIGITAL, /* mode */
96 SOURCE_TS_BDA, /* ts1_source, digital tv only */
97 0, /* ts2_source,need update from register */
98 NOT_SUPPORTED, /* analog source */
99 0, /* digital_index */
100 0, /* analog index */
102 0, /* external_index */
104 1, /* only one configuration */
107 0, /* config index */
109 0, /* interrupt ep index */
112 NOT_SUPPORTED, /* AUDIO */
113 NOT_SUPPORTED, /* VIDEO */
114 NOT_SUPPORTED, /* VANC */
115 NOT_SUPPORTED, /* HANC */
116 NOT_SUPPORTED /* ir_index */
120 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
121 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
125 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
126 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
134 0, /* config index */
136 0, /* interrupt ep index */
139 NOT_SUPPORTED, /* AUDIO */
140 NOT_SUPPORTED, /* VIDEO */
141 NOT_SUPPORTED, /* VANC */
142 NOT_SUPPORTED, /* HANC */
143 NOT_SUPPORTED /* ir_index */
147 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
148 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
152 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
153 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
161 INDEX_SELFPOWER_ANALOG_ONLY, /* index */
162 USB_SELF_POWER, /* power_type */
163 0, /* speed , not decide yet */
164 MOD_ANALOG | MOD_DIF | MOD_EXTERNAL, /* mode ,analog tv only */
165 NOT_SUPPORTED, /* ts1_source, NOT SUPPORT */
166 NOT_SUPPORTED, /* ts2_source,NOT SUPPORT */
167 0, /* analog source, need update */
169 0, /* digital_index */
170 0, /* analog index */
172 0, /* external_index */
174 1, /* only one configuration */
177 0, /* config index */
179 0, /* interrupt ep index */
180 NOT_SUPPORTED, /* ts1 index */
181 NOT_SUPPORTED, /* TS2 index */
186 NOT_SUPPORTED /* ir_index */
190 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
191 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
195 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
196 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
204 0, /* config index */
206 0, /* interrupt ep index */
207 NOT_SUPPORTED, /* ts1 index */
208 NOT_SUPPORTED, /* TS2 index */
211 NOT_SUPPORTED, /* VANC */
212 NOT_SUPPORTED, /* HANC */
213 NOT_SUPPORTED /* ir_index */
217 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
218 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
222 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
223 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
231 INDEX_SELFPOWER_DUAL, /* index */
232 USB_SELF_POWER, /* power_type */
233 0, /* speed , not decide yet */
234 /* mode ,analog tv and digital path */
235 MOD_ANALOG | MOD_DIF | MOD_DIGITAL | MOD_EXTERNAL,
236 0, /* ts1_source,will update in register */
237 NOT_SUPPORTED, /* ts2_source,NOT SUPPORT */
238 0, /* analog source need update */
239 0, /* digital_index */
240 0, /* analog index */
242 0, /* external_index */
243 1, /* only one configuration */
246 0, /* config index */
248 0, /* interrupt ep index */
250 NOT_SUPPORTED, /* TS2 index */
255 NOT_SUPPORTED /* ir_index */
259 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
260 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
264 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
265 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
273 0, /* config index */
275 0, /* interrupt ep index */
277 NOT_SUPPORTED, /* TS2 index */
280 NOT_SUPPORTED, /* VANC */
281 NOT_SUPPORTED, /* HANC */
282 NOT_SUPPORTED /* ir_index */
286 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
287 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
291 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
292 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
300 INDEX_SELFPOWER_TRIPLE, /* index */
301 USB_SELF_POWER, /* power_type */
302 0, /* speed , not decide yet */
303 /* mode ,analog tv and digital path */
304 MOD_ANALOG | MOD_DIF | MOD_DIGITAL | MOD_EXTERNAL,
305 0, /* ts1_source, update in register */
306 0, /* ts2_source,update in register */
307 0, /* analog source, need update */
309 0, /* digital_index */
310 0, /* analog index */
312 0, /* external_index */
313 1, /* only one configuration */
316 0, /* config index */
318 0, /* interrupt ep index */
325 NOT_SUPPORTED /* ir_index */
329 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
330 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
334 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
335 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
343 0, /* config index */
345 0, /* interrupt ep index */
350 NOT_SUPPORTED, /* VANC */
351 NOT_SUPPORTED, /* HANC */
352 NOT_SUPPORTED /* ir_index */
356 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
357 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
361 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
362 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
370 INDEX_SELFPOWER_COMPRESSOR, /* index */
371 USB_SELF_POWER, /* power_type */
372 0, /* speed , not decide yet */
373 /* mode ,analog tv AND DIGITAL path */
374 MOD_ANALOG | MOD_DIF | MOD_DIGITAL | MOD_EXTERNAL,
375 NOT_SUPPORTED, /* ts1_source, disable */
376 SOURCE_TS_BDA, /* ts2_source */
377 0, /* analog source,need update */
378 0, /* digital_index */
379 0, /* analog index */
381 0, /* external_index */
382 1, /* only one configuration */
385 0, /* config index */
387 0, /* interrupt ep index */
388 NOT_SUPPORTED, /* ts1 index */
394 NOT_SUPPORTED /* ir_index */
398 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
399 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
403 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
404 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
412 0, /* config index */
414 0, /* interrupt ep index */
415 NOT_SUPPORTED, /* ts1 index */
419 NOT_SUPPORTED, /* VANC */
420 NOT_SUPPORTED, /* HANC */
421 NOT_SUPPORTED /* ir_index */
425 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
426 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
430 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
431 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
439 INDEX_BUSPOWER_DIGITAL_ONLY, /* index */
440 USB_BUS_POWER, /* power_type */
441 0, /* speed , not decide yet */
442 MOD_DIGITAL, /* mode ,analog tv AND DIGITAL path */
443 SOURCE_TS_BDA, /* ts1_source, disable */
444 NOT_SUPPORTED, /* ts2_source */
445 NOT_SUPPORTED, /* analog source */
447 0, /* digital_index */
448 0, /* analog index */
450 0, /* external_index */
452 1, /* only one configuration */
455 0, /* config index */
457 0, /* interrupt ep index = 2 */
459 NOT_SUPPORTED, /* TS2 index */
460 NOT_SUPPORTED, /* AUDIO */
461 NOT_SUPPORTED, /* VIDEO */
462 NOT_SUPPORTED, /* VANC */
463 NOT_SUPPORTED, /* HANC */
464 NOT_SUPPORTED /* ir_index */
468 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
469 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
473 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
474 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
482 0, /* config index */
484 0, /* interrupt ep index = 2 */
486 NOT_SUPPORTED, /* TS2 index */
487 NOT_SUPPORTED, /* AUDIO */
488 NOT_SUPPORTED, /* VIDEO */
489 NOT_SUPPORTED, /* VANC */
490 NOT_SUPPORTED, /* HANC */
491 NOT_SUPPORTED /* ir_index */
495 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
496 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
500 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
501 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
508 INDEX_BUSPOWER_ANALOG_ONLY, /* index */
509 USB_BUS_POWER, /* power_type */
510 0, /* speed , not decide yet */
511 MOD_ANALOG, /* mode ,analog tv AND DIGITAL path */
512 NOT_SUPPORTED, /* ts1_source, disable */
513 NOT_SUPPORTED, /* ts2_source */
514 SOURCE_ANALOG, /* analog source--analog */
515 0, /* digital_index */
516 0, /* analog index */
518 0, /* external_index */
519 1, /* only one configuration */
522 0, /* config index */
524 0, /* interrupt ep index */
525 NOT_SUPPORTED, /* ts1 index */
526 NOT_SUPPORTED, /* TS2 index */
531 NOT_SUPPORTED /* ir_index */
535 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
536 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
540 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
541 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
548 0, /* config index */
550 0, /* interrupt ep index */
551 NOT_SUPPORTED, /* ts1 index */
552 NOT_SUPPORTED, /* TS2 index */
555 NOT_SUPPORTED, /* VANC */
556 NOT_SUPPORTED, /* HANC */
557 NOT_SUPPORTED /* ir_index */
561 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
562 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
566 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
567 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
574 INDEX_BUSPOWER_DIF_ONLY, /* index */
575 USB_BUS_POWER, /* power_type */
576 0, /* speed , not decide yet */
577 /* mode ,analog tv AND DIGITAL path */
578 MOD_DIF | MOD_ANALOG | MOD_DIGITAL | MOD_EXTERNAL,
579 SOURCE_TS_BDA, /* ts1_source, disable */
580 NOT_SUPPORTED, /* ts2_source */
581 SOURCE_DIF | SOURCE_ANALOG | SOURCE_EXTERNAL, /* analog source, dif */
582 0, /* digital_index */
583 0, /* analog index */
585 0, /* external_index */
586 1, /* only one configuration */
589 0, /* config index */
591 0, /* interrupt ep index */
593 NOT_SUPPORTED, /* TS2 index */
598 NOT_SUPPORTED /* ir_index */
602 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
603 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
607 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
608 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
615 0, /* config index */
617 0, /* interrupt ep index */
619 NOT_SUPPORTED, /* TS2 index */
622 NOT_SUPPORTED, /* VANC */
623 NOT_SUPPORTED, /* HANC */
624 NOT_SUPPORTED /* ir_index */
628 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
629 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
633 {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
634 NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
643 /*****************************************************************/
645 int initialize_cx231xx(struct cx231xx *dev)
649 struct pcb_config *p_pcb_info;
650 u8 usb_speed = 1; /* from register,1--HS, 0--FS */
651 u8 data[4] = { 0, 0, 0, 0 };
654 u32 analog_source = 0;
655 u8 _current_scenario_idx = 0xff;
657 ts1_source = SOURCE_TS_BDA;
658 ts2_source = SOURCE_TS_BDA;
660 /* read board config register to find out which
661 pcb config it is related to */
662 retval = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, BOARD_CFG_STAT,
667 config_info = le32_to_cpu(*((__le32 *)data));
668 usb_speed = (u8) (config_info & 0x1);
670 /* Verify this device belongs to Bus power or Self power device */
671 if (config_info & BUS_POWER) { /* bus-power */
672 switch (config_info & BUSPOWER_MASK) {
673 case TS1_PORT | BUS_POWER:
674 cx231xx_Scenario[INDEX_BUSPOWER_DIGITAL_ONLY].speed =
677 &cx231xx_Scenario[INDEX_BUSPOWER_DIGITAL_ONLY];
678 _current_scenario_idx = INDEX_BUSPOWER_DIGITAL_ONLY;
680 case AVDEC_ENABLE | BUS_POWER:
681 cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY].speed =
684 &cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY];
685 _current_scenario_idx = INDEX_BUSPOWER_ANALOG_ONLY;
687 case AVDEC_ENABLE | BUS_POWER | TS1_PORT:
688 cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY].speed =
690 p_pcb_info = &cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY];
691 _current_scenario_idx = INDEX_BUSPOWER_DIF_ONLY;
695 "bad config in buspower!!!!\nconfig_info=%x\n",
696 config_info & BUSPOWER_MASK);
699 } else { /* self-power */
701 switch (config_info & SELFPOWER_MASK) {
702 case TS1_PORT | SELF_POWER:
703 cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY].speed =
706 &cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY];
707 _current_scenario_idx = INDEX_SELFPOWER_DIGITAL_ONLY;
709 case TS1_TS2_PORT | SELF_POWER:
710 cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL].speed =
712 cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL].
713 ts2_source = ts2_source;
715 &cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL];
716 _current_scenario_idx = INDEX_SELFPOWER_DUAL_DIGITAL;
718 case AVDEC_ENABLE | SELF_POWER:
719 cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY].speed =
721 cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY].
722 analog_source = analog_source;
724 &cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY];
725 _current_scenario_idx = INDEX_SELFPOWER_ANALOG_ONLY;
727 case AVDEC_ENABLE | TS1_PORT | SELF_POWER:
728 cx231xx_Scenario[INDEX_SELFPOWER_DUAL].speed =
730 cx231xx_Scenario[INDEX_SELFPOWER_DUAL].ts1_source =
732 cx231xx_Scenario[INDEX_SELFPOWER_DUAL].analog_source =
734 p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_DUAL];
735 _current_scenario_idx = INDEX_SELFPOWER_DUAL;
737 case AVDEC_ENABLE | TS1_TS2_PORT | SELF_POWER:
738 cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].speed =
740 cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts1_source =
742 cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts2_source =
744 cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].analog_source =
746 p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE];
747 _current_scenario_idx = INDEX_SELFPOWER_TRIPLE;
749 case AVDEC_ENABLE | TS1VIP_TS2_PORT | SELF_POWER:
750 cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR].speed =
752 cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR].
753 analog_source = analog_source;
755 &cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR];
756 _current_scenario_idx = INDEX_SELFPOWER_COMPRESSOR;
760 "bad scenario!!!!!\nconfig_info=%x\n",
761 config_info & SELFPOWER_MASK);
766 dev->current_scenario_idx = _current_scenario_idx;
768 memcpy(&dev->current_pcb_config, p_pcb_info,
769 sizeof(struct pcb_config));
773 "SC(0x00) register = 0x%x\n", config_info);
776 (dev->current_pcb_config.index) + 1);
779 dev->current_pcb_config.type);
782 dev->current_pcb_config.mode);
785 dev->current_pcb_config.speed);
788 dev->current_pcb_config.ts1_source);
791 dev->current_pcb_config.ts2_source);
793 "analog_source=%x\n",
794 dev->current_pcb_config.analog_source);