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
13static unsigned int pcb_debug;
14module_param(pcb_debug, int, 0644);
15MODULE_PARM_DESC(pcb_debug, "enable pcb config debug messages [video]");
16
17/******************************************************************************/
18
19static 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
645int 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