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 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 u32 initialize_cx231xx(struct cx231xx *dev)
658 {
659 	u32 config_info = 0;
660 	struct pcb_config *p_pcb_info;
661 	u8 usb_speed = 1;	/* from register,1--HS, 0--FS  */
662 	u8 data[4] = { 0, 0, 0, 0 };
663 	u32 ts1_source = 0;
664 	u32 ts2_source = 0;
665 	u32 analog_source = 0;
666 	u8 _current_scenario_idx = 0xff;
667 
668 	ts1_source = SOURCE_TS_BDA;
669 	ts2_source = SOURCE_TS_BDA;
670 
671 	/* read board config register to find out which
672 	pcb config it is related to */
673 	cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, BOARD_CFG_STAT, data, 4);
674 
675 	config_info = *((u32 *) data);
676 	usb_speed = (u8) (config_info & 0x1);
677 
678 	/* Verify this device belongs to Bus power or Self power device */
679 	if (config_info & BUS_POWER) {	/* bus-power */
680 		switch (config_info & BUSPOWER_MASK) {
681 		case TS1_PORT | BUS_POWER:
682 			cx231xx_Scenario[INDEX_BUSPOWER_DIGITAL_ONLY].speed =
683 			    usb_speed;
684 			p_pcb_info =
685 			    &cx231xx_Scenario[INDEX_BUSPOWER_DIGITAL_ONLY];
686 			_current_scenario_idx = INDEX_BUSPOWER_DIGITAL_ONLY;
687 			break;
688 		case AVDEC_ENABLE | BUS_POWER:
689 			cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY].speed =
690 			    usb_speed;
691 			p_pcb_info =
692 			    &cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY];
693 			_current_scenario_idx = INDEX_BUSPOWER_ANALOG_ONLY;
694 			break;
695 		case AVDEC_ENABLE | BUS_POWER | TS1_PORT:
696 			cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY].speed =
697 			    usb_speed;
698 			p_pcb_info = &cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY];
699 			_current_scenario_idx = INDEX_BUSPOWER_DIF_ONLY;
700 			break;
701 		default:
702 			cx231xx_info("bad config in buspower!!!!\n");
703 			cx231xx_info("config_info=%x\n",
704 				     (config_info & BUSPOWER_MASK));
705 			return 1;
706 		}
707 	} else {		/* self-power */
708 
709 		switch (config_info & SELFPOWER_MASK) {
710 		case TS1_PORT | SELF_POWER:
711 			cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY].speed =
712 			    usb_speed;
713 			p_pcb_info =
714 			    &cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY];
715 			_current_scenario_idx = INDEX_SELFPOWER_DIGITAL_ONLY;
716 			break;
717 		case TS1_TS2_PORT | SELF_POWER:
718 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL].speed =
719 			    usb_speed;
720 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL].
721 			    ts2_source = ts2_source;
722 			p_pcb_info =
723 			    &cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL];
724 			_current_scenario_idx = INDEX_SELFPOWER_DUAL_DIGITAL;
725 			break;
726 		case AVDEC_ENABLE | SELF_POWER:
727 			cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY].speed =
728 			    usb_speed;
729 			cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY].
730 			    analog_source = analog_source;
731 			p_pcb_info =
732 			    &cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY];
733 			_current_scenario_idx = INDEX_SELFPOWER_ANALOG_ONLY;
734 			break;
735 		case AVDEC_ENABLE | TS1_PORT | SELF_POWER:
736 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL].speed =
737 			    usb_speed;
738 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL].ts1_source =
739 			    ts1_source;
740 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL].analog_source =
741 			    analog_source;
742 			p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_DUAL];
743 			_current_scenario_idx = INDEX_SELFPOWER_DUAL;
744 			break;
745 		case AVDEC_ENABLE | TS1_TS2_PORT | SELF_POWER:
746 			cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].speed =
747 			    usb_speed;
748 			cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts1_source =
749 			    ts1_source;
750 			cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts2_source =
751 			    ts2_source;
752 			cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].analog_source =
753 			    analog_source;
754 			p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE];
755 			_current_scenario_idx = INDEX_SELFPOWER_TRIPLE;
756 			break;
757 		case AVDEC_ENABLE | TS1VIP_TS2_PORT | SELF_POWER:
758 			cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR].speed =
759 			    usb_speed;
760 			cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR].
761 			    analog_source = analog_source;
762 			p_pcb_info =
763 			    &cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR];
764 			_current_scenario_idx = INDEX_SELFPOWER_COMPRESSOR;
765 			break;
766 		default:
767 			cx231xx_info("bad senario!!!!!\n");
768 			cx231xx_info("config_info=%x\n",
769 				     (config_info & SELFPOWER_MASK));
770 			return 1;
771 		}
772 	}
773 
774 	dev->current_scenario_idx = _current_scenario_idx;
775 
776 	memcpy(&dev->current_pcb_config, p_pcb_info,
777 		   sizeof(struct pcb_config));
778 
779 	if (pcb_debug) {
780 		cx231xx_info("SC(0x00) register = 0x%x\n", config_info);
781 		cx231xx_info("scenario %d\n",
782 			    (dev->current_pcb_config.index) + 1);
783 		cx231xx_info("type=%x\n", dev->current_pcb_config.type);
784 		cx231xx_info("mode=%x\n", dev->current_pcb_config.mode);
785 		cx231xx_info("speed=%x\n", dev->current_pcb_config.speed);
786 		cx231xx_info("ts1_source=%x\n",
787 			     dev->current_pcb_config.ts1_source);
788 		cx231xx_info("ts2_source=%x\n",
789 			     dev->current_pcb_config.ts2_source);
790 		cx231xx_info("analog_source=%x\n",
791 			     dev->current_pcb_config.analog_source);
792 	}
793 
794 	return 0;
795 }
796