1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3    cx231xx-pcb-config.c - driver for Conexant
4 		Cx23100/101/102 USB video capture devices
5 
6    Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
7 
8  */
9 
10 #include "cx231xx.h"
11 #include "cx231xx-conf-reg.h"
12 
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]");
16 
17 /******************************************************************************/
18 
19 static struct pcb_config cx231xx_Scenario[] = {
20 	{
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 */
28 
29 	 0,			/* digital_index  */
30 	 0,			/* analog index */
31 	 0,			/* dif_index   */
32 	 0,			/* external_index */
33 
34 	 1,			/* only one configuration */
35 	 {
36 	  {
37 	   0,			/* config index */
38 	   {
39 	    0,			/* interrupt ep index */
40 	    1,			/* ts1 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 */
47 	    }
48 	   ,
49 	   }
50 	  ,
51 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
52 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
53 			   NOT_SUPPORTED}
54 	   }
55 	  ,
56 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
57 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
58 			   NOT_SUPPORTED}
59 	   }
60 	  }
61 	 ,
62 	 /* full-speed config */
63 	 {
64 	  {
65 	   0,			/* config index */
66 	   {
67 	    0,			/* interrupt ep index */
68 	    1,			/* ts1 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 */
75 	    }
76 	   }
77 	  ,
78 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
79 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
80 			   NOT_SUPPORTED}
81 	   }
82 	  ,
83 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
84 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
85 			   NOT_SUPPORTED}
86 	   }
87 	  }
88 	 }
89 	,
90 
91 	{
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 */
101 	 0,			/* dif_index */
102 	 0,			/* external_index */
103 
104 	 1,			/* only one configuration */
105 	 {
106 	  {
107 	   0,			/* config index */
108 	   {
109 	    0,			/* interrupt ep index */
110 	    1,			/* ts1 index */
111 	    2,			/* TS2 index */
112 	    NOT_SUPPORTED,	/* AUDIO */
113 	    NOT_SUPPORTED,	/* VIDEO */
114 	    NOT_SUPPORTED,	/* VANC */
115 	    NOT_SUPPORTED,	/* HANC */
116 	    NOT_SUPPORTED	/* ir_index */
117 	    }
118 	   }
119 	  ,
120 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
121 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
122 			   NOT_SUPPORTED}
123 	   }
124 	  ,
125 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
126 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
127 			   NOT_SUPPORTED}
128 	   }
129 	  }
130 	 ,
131 	 /* full-speed */
132 	 {
133 	  {
134 	   0,			/* config index */
135 	   {
136 	    0,			/* interrupt ep index */
137 	    1,			/* ts1 index */
138 	    2,			/* TS2 index */
139 	    NOT_SUPPORTED,	/* AUDIO */
140 	    NOT_SUPPORTED,	/* VIDEO */
141 	    NOT_SUPPORTED,	/* VANC */
142 	    NOT_SUPPORTED,	/* HANC */
143 	    NOT_SUPPORTED	/* ir_index */
144 	    }
145 	   }
146 	  ,
147 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
148 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
149 			   NOT_SUPPORTED}
150 	   }
151 	  ,
152 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
153 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
154 			   NOT_SUPPORTED}
155 	   }
156 	  }
157 	 }
158 	,
159 
160 	{
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 */
168 
169 	 0,			/* digital_index  */
170 	 0,			/* analog index */
171 	 0,			/* dif_index */
172 	 0,			/* external_index */
173 
174 	 1,			/* only one configuration */
175 	 {
176 	  {
177 	   0,			/* config index */
178 	   {
179 	    0,			/* interrupt ep index */
180 	    NOT_SUPPORTED,	/* ts1 index */
181 	    NOT_SUPPORTED,	/* TS2 index */
182 	    1,			/* AUDIO */
183 	    2,			/* VIDEO */
184 	    3,			/* VANC */
185 	    4,			/* HANC */
186 	    NOT_SUPPORTED	/* ir_index */
187 	    }
188 	   }
189 	  ,
190 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
191 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
192 			   NOT_SUPPORTED}
193 	   }
194 	  ,
195 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
196 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
197 			   NOT_SUPPORTED}
198 	   }
199 	  }
200 	 ,
201 	 /* full-speed */
202 	 {
203 	  {
204 	   0,			/* config index */
205 	   {
206 	    0,			/* interrupt ep index */
207 	    NOT_SUPPORTED,	/* ts1 index */
208 	    NOT_SUPPORTED,	/* TS2 index */
209 	    1,			/* AUDIO */
210 	    2,			/* VIDEO */
211 	    NOT_SUPPORTED,	/* VANC */
212 	    NOT_SUPPORTED,	/* HANC */
213 	    NOT_SUPPORTED	/* ir_index */
214 	    }
215 	   }
216 	  ,
217 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
218 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
219 			   NOT_SUPPORTED}
220 	   }
221 	  ,
222 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
223 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
224 			   NOT_SUPPORTED}
225 	   }
226 	  }
227 	 }
228 	,
229 
230 	{
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 */
241 	 0,			/* dif_index */
242 	 0,			/* external_index */
243 	 1,			/* only one configuration */
244 	 {
245 	  {
246 	   0,			/* config index */
247 	   {
248 	    0,			/* interrupt ep index */
249 	    1,			/* ts1 index */
250 	    NOT_SUPPORTED,	/* TS2 index */
251 	    2,			/* AUDIO */
252 	    3,			/* VIDEO */
253 	    4,			/* VANC */
254 	    5,			/* HANC */
255 	    NOT_SUPPORTED	/* ir_index */
256 	    }
257 	   }
258 	  ,
259 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
260 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
261 			   NOT_SUPPORTED}
262 	   }
263 	  ,
264 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
265 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
266 			   NOT_SUPPORTED}
267 	   }
268 	  }
269 	 ,
270 	 /* full-speed */
271 	 {
272 	  {
273 	   0,			/* config index */
274 	   {
275 	    0,			/* interrupt ep index */
276 	    1,			/* ts1 index */
277 	    NOT_SUPPORTED,	/* TS2 index */
278 	    2,			/* AUDIO */
279 	    3,			/* VIDEO */
280 	    NOT_SUPPORTED,	/* VANC */
281 	    NOT_SUPPORTED,	/* HANC */
282 	    NOT_SUPPORTED	/* ir_index */
283 	    }
284 	   }
285 	  ,
286 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
287 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
288 			   NOT_SUPPORTED}
289 	   }
290 	  ,
291 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
292 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
293 			   NOT_SUPPORTED}
294 	   }
295 	  }
296 	 }
297 	,
298 
299 	{
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 */
308 
309 	 0,			/* digital_index  */
310 	 0,			/* analog index */
311 	 0,			/* dif_index */
312 	 0,			/* external_index */
313 	 1,			/* only one configuration */
314 	 {
315 	  {
316 	   0,			/* config index */
317 	   {
318 	    0,			/* interrupt ep index */
319 	    1,			/* ts1 index */
320 	    2,			/* TS2 index */
321 	    3,			/* AUDIO */
322 	    4,			/* VIDEO */
323 	    5,			/* VANC */
324 	    6,			/* HANC */
325 	    NOT_SUPPORTED	/* ir_index */
326 	    }
327 	   }
328 	  ,
329 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
330 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
331 			   NOT_SUPPORTED}
332 	   }
333 	  ,
334 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
335 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
336 			   NOT_SUPPORTED}
337 	   }
338 	  }
339 	 ,
340 	 /* full-speed */
341 	 {
342 	  {
343 	   0,			/* config index */
344 	   {
345 	    0,			/* interrupt ep index */
346 	    1,			/* ts1 index */
347 	    2,			/* TS2 index */
348 	    3,			/* AUDIO */
349 	    4,			/* VIDEO */
350 	    NOT_SUPPORTED,	/* VANC */
351 	    NOT_SUPPORTED,	/* HANC */
352 	    NOT_SUPPORTED	/* ir_index */
353 	    }
354 	   }
355 	  ,
356 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
357 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
358 			   NOT_SUPPORTED}
359 	   }
360 	  ,
361 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
362 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
363 			   NOT_SUPPORTED}
364 	   }
365 	  }
366 	 }
367 	,
368 
369 	{
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 */
380 	 0,			/* dif_index */
381 	 0,			/* external_index */
382 	 1,			/* only one configuration */
383 	 {
384 	  {
385 	   0,			/* config index */
386 	   {
387 	    0,			/* interrupt ep index */
388 	    NOT_SUPPORTED,	/* ts1 index */
389 	    1,			/* TS2 index */
390 	    2,			/* AUDIO */
391 	    3,			/* VIDEO */
392 	    4,			/* VANC */
393 	    5,			/* HANC */
394 	    NOT_SUPPORTED	/* ir_index */
395 	    }
396 	   }
397 	  ,
398 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
399 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
400 			   NOT_SUPPORTED}
401 	   }
402 	  ,
403 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
404 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
405 			   NOT_SUPPORTED}
406 	   }
407 	  }
408 	 ,
409 	 /* full-speed  */
410 	 {
411 	  {
412 	   0,			/* config index */
413 	   {
414 	    0,			/* interrupt ep index */
415 	    NOT_SUPPORTED,	/* ts1 index */
416 	    1,			/* TS2 index */
417 	    2,			/* AUDIO */
418 	    3,			/* VIDEO */
419 	    NOT_SUPPORTED,	/* VANC */
420 	    NOT_SUPPORTED,	/* HANC */
421 	    NOT_SUPPORTED	/* ir_index */
422 	    }
423 	   }
424 	  ,
425 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
426 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
427 			   NOT_SUPPORTED}
428 	   }
429 	  ,
430 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
431 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
432 			   NOT_SUPPORTED}
433 	   }
434 	  }
435 	 }
436 	,
437 
438 	{
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 */
446 
447 	 0,			/* digital_index  */
448 	 0,			/* analog index */
449 	 0,			/* dif_index */
450 	 0,			/* external_index */
451 
452 	 1,			/* only one configuration */
453 	 {
454 	  {
455 	   0,			/* config index */
456 	   {
457 	    0,			/* interrupt ep index  = 2 */
458 	    1,			/* ts1 index */
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 */
465 	    }
466 	   }
467 	  ,
468 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
469 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
470 			   NOT_SUPPORTED}
471 	   }
472 	  ,
473 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
474 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
475 			   NOT_SUPPORTED}
476 	   }
477 	  }
478 	 ,
479 	 /* full-speed */
480 	 {
481 	  {
482 	   0,			/* config index */
483 	   {
484 	    0,			/* interrupt ep index  = 2 */
485 	    1,			/* ts1 index */
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 */
492 	    }
493 	   }
494 	  ,
495 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
496 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
497 			   NOT_SUPPORTED}
498 	   }
499 	  ,
500 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
501 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
502 			   NOT_SUPPORTED}
503 	   }
504 	  }
505 	 }
506 	,
507 	{
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 */
517 	 0,			/* dif_index */
518 	 0,			/* external_index */
519 	 1,			/* only one configuration */
520 	 {
521 	  {
522 	   0,			/* config index */
523 	   {
524 	    0,			/* interrupt ep index */
525 	    NOT_SUPPORTED,	/* ts1 index */
526 	    NOT_SUPPORTED,	/* TS2 index */
527 	    1,			/* AUDIO */
528 	    2,			/* VIDEO */
529 	    3,			/* VANC */
530 	    4,			/* HANC */
531 	    NOT_SUPPORTED	/* ir_index */
532 	    }
533 	   }
534 	  ,
535 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
536 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
537 			   NOT_SUPPORTED}
538 	   }
539 	  ,
540 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
541 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
542 			   NOT_SUPPORTED}
543 	   }
544 	  }
545 	 ,
546 	 {			/* full-speed */
547 	  {
548 	   0,			/* config index */
549 	   {
550 	    0,			/* interrupt ep index */
551 	    NOT_SUPPORTED,	/* ts1 index */
552 	    NOT_SUPPORTED,	/* TS2 index */
553 	    1,			/* AUDIO */
554 	    2,			/* VIDEO */
555 	    NOT_SUPPORTED,	/* VANC */
556 	    NOT_SUPPORTED,	/* HANC */
557 	    NOT_SUPPORTED	/* ir_index */
558 	    }
559 	   }
560 	  ,
561 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
562 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
563 			   NOT_SUPPORTED}
564 	   }
565 	  ,
566 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
567 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
568 			   NOT_SUPPORTED}
569 	   }
570 	  }
571 	 }
572 	,
573 	{
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 */
584 	 0,			/* dif_index */
585 	 0,			/* external_index */
586 	 1,			/* only one configuration */
587 	 {
588 	  {
589 	   0,			/* config index */
590 	   {
591 	    0,			/* interrupt ep index */
592 	    1,			/* ts1 index */
593 	    NOT_SUPPORTED,	/* TS2 index */
594 	    2,			/* AUDIO */
595 	    3,			/* VIDEO */
596 	    4,			/* VANC */
597 	    5,			/* HANC */
598 	    NOT_SUPPORTED	/* ir_index */
599 	    }
600 	   }
601 	  ,
602 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
603 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
604 			   NOT_SUPPORTED}
605 	   }
606 	  ,
607 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
608 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
609 			   NOT_SUPPORTED}
610 	   }
611 	  }
612 	 ,
613 	 {			/* full speed */
614 	  {
615 	   0,			/* config index */
616 	   {
617 	    0,			/* interrupt ep index */
618 	    1,			/* ts1 index */
619 	    NOT_SUPPORTED,	/* TS2 index */
620 	    2,			/* AUDIO */
621 	    3,			/* VIDEO */
622 	    NOT_SUPPORTED,	/* VANC */
623 	    NOT_SUPPORTED,	/* HANC */
624 	    NOT_SUPPORTED	/* ir_index */
625 	    }
626 	   }
627 	  ,
628 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
629 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
630 			   NOT_SUPPORTED}
631 	   }
632 	  ,
633 	  {NOT_SUPPORTED, {NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
634 			   NOT_SUPPORTED, NOT_SUPPORTED, NOT_SUPPORTED,
635 			   NOT_SUPPORTED}
636 	   }
637 	  }
638 	 }
639 	,
640 
641 };
642 
643 /*****************************************************************/
644 
645 int initialize_cx231xx(struct cx231xx *dev)
646 {
647 	int retval;
648 	u32 config_info = 0;
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 };
652 	u32 ts1_source = 0;
653 	u32 ts2_source = 0;
654 	u32 analog_source = 0;
655 	u8 _current_scenario_idx = 0xff;
656 
657 	ts1_source = SOURCE_TS_BDA;
658 	ts2_source = SOURCE_TS_BDA;
659 
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,
663 				       data, 4);
664 	if (retval < 0)
665 		return retval;
666 
667 	config_info = le32_to_cpu(*((__le32 *)data));
668 	usb_speed = (u8) (config_info & 0x1);
669 
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 =
675 			    usb_speed;
676 			p_pcb_info =
677 			    &cx231xx_Scenario[INDEX_BUSPOWER_DIGITAL_ONLY];
678 			_current_scenario_idx = INDEX_BUSPOWER_DIGITAL_ONLY;
679 			break;
680 		case AVDEC_ENABLE | BUS_POWER:
681 			cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY].speed =
682 			    usb_speed;
683 			p_pcb_info =
684 			    &cx231xx_Scenario[INDEX_BUSPOWER_ANALOG_ONLY];
685 			_current_scenario_idx = INDEX_BUSPOWER_ANALOG_ONLY;
686 			break;
687 		case AVDEC_ENABLE | BUS_POWER | TS1_PORT:
688 			cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY].speed =
689 			    usb_speed;
690 			p_pcb_info = &cx231xx_Scenario[INDEX_BUSPOWER_DIF_ONLY];
691 			_current_scenario_idx = INDEX_BUSPOWER_DIF_ONLY;
692 			break;
693 		default:
694 			dev_err(dev->dev,
695 				"bad config in buspower!!!!\nconfig_info=%x\n",
696 				config_info & BUSPOWER_MASK);
697 			return 1;
698 		}
699 	} else {		/* self-power */
700 
701 		switch (config_info & SELFPOWER_MASK) {
702 		case TS1_PORT | SELF_POWER:
703 			cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY].speed =
704 			    usb_speed;
705 			p_pcb_info =
706 			    &cx231xx_Scenario[INDEX_SELFPOWER_DIGITAL_ONLY];
707 			_current_scenario_idx = INDEX_SELFPOWER_DIGITAL_ONLY;
708 			break;
709 		case TS1_TS2_PORT | SELF_POWER:
710 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL].speed =
711 			    usb_speed;
712 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL].
713 			    ts2_source = ts2_source;
714 			p_pcb_info =
715 			    &cx231xx_Scenario[INDEX_SELFPOWER_DUAL_DIGITAL];
716 			_current_scenario_idx = INDEX_SELFPOWER_DUAL_DIGITAL;
717 			break;
718 		case AVDEC_ENABLE | SELF_POWER:
719 			cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY].speed =
720 			    usb_speed;
721 			cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY].
722 			    analog_source = analog_source;
723 			p_pcb_info =
724 			    &cx231xx_Scenario[INDEX_SELFPOWER_ANALOG_ONLY];
725 			_current_scenario_idx = INDEX_SELFPOWER_ANALOG_ONLY;
726 			break;
727 		case AVDEC_ENABLE | TS1_PORT | SELF_POWER:
728 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL].speed =
729 			    usb_speed;
730 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL].ts1_source =
731 			    ts1_source;
732 			cx231xx_Scenario[INDEX_SELFPOWER_DUAL].analog_source =
733 			    analog_source;
734 			p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_DUAL];
735 			_current_scenario_idx = INDEX_SELFPOWER_DUAL;
736 			break;
737 		case AVDEC_ENABLE | TS1_TS2_PORT | SELF_POWER:
738 			cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].speed =
739 			    usb_speed;
740 			cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts1_source =
741 			    ts1_source;
742 			cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].ts2_source =
743 			    ts2_source;
744 			cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE].analog_source =
745 			    analog_source;
746 			p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE];
747 			_current_scenario_idx = INDEX_SELFPOWER_TRIPLE;
748 			break;
749 		case AVDEC_ENABLE | TS1VIP_TS2_PORT | SELF_POWER:
750 			cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR].speed =
751 			    usb_speed;
752 			cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR].
753 			    analog_source = analog_source;
754 			p_pcb_info =
755 			    &cx231xx_Scenario[INDEX_SELFPOWER_COMPRESSOR];
756 			_current_scenario_idx = INDEX_SELFPOWER_COMPRESSOR;
757 			break;
758 		default:
759 			dev_err(dev->dev,
760 				"bad scenario!!!!!\nconfig_info=%x\n",
761 				config_info & SELFPOWER_MASK);
762 			return -ENODEV;
763 		}
764 	}
765 
766 	dev->current_scenario_idx = _current_scenario_idx;
767 
768 	memcpy(&dev->current_pcb_config, p_pcb_info,
769 		   sizeof(struct pcb_config));
770 
771 	if (pcb_debug) {
772 		dev_info(dev->dev,
773 			 "SC(0x00) register = 0x%x\n", config_info);
774 		dev_info(dev->dev,
775 			 "scenario %d\n",
776 			 (dev->current_pcb_config.index) + 1);
777 		dev_info(dev->dev,
778 			"type=%x\n",
779 			 dev->current_pcb_config.type);
780 		dev_info(dev->dev,
781 			 "mode=%x\n",
782 			 dev->current_pcb_config.mode);
783 		dev_info(dev->dev,
784 			 "speed=%x\n",
785 			 dev->current_pcb_config.speed);
786 		dev_info(dev->dev,
787 			 "ts1_source=%x\n",
788 			 dev->current_pcb_config.ts1_source);
789 		dev_info(dev->dev,
790 			 "ts2_source=%x\n",
791 			 dev->current_pcb_config.ts2_source);
792 		dev_info(dev->dev,
793 			 "analog_source=%x\n",
794 			 dev->current_pcb_config.analog_source);
795 	}
796 
797 	return 0;
798 }
799