Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cx231xx-pcb-cfg.c
Go to the documentation of this file.
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 
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  ,
65  NOT_SUPPORTED}
66  }
67  ,
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  ,
92  NOT_SUPPORTED}
93  }
94  ,
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  ,
134  NOT_SUPPORTED}
135  }
136  ,
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  ,
161  NOT_SUPPORTED}
162  }
163  ,
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  ,
204  NOT_SUPPORTED}
205  }
206  ,
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  ,
231  NOT_SUPPORTED}
232  }
233  ,
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 */
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  ,
273  NOT_SUPPORTED}
274  }
275  ,
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  ,
300  NOT_SUPPORTED}
301  }
302  ,
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 */
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  ,
343  NOT_SUPPORTED}
344  }
345  ,
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  ,
370  NOT_SUPPORTED}
371  }
372  ,
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 */
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  ,
412  NOT_SUPPORTED}
413  }
414  ,
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  ,
439  NOT_SUPPORTED}
440  }
441  ,
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  ,
482  NOT_SUPPORTED}
483  }
484  ,
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  ,
509  NOT_SUPPORTED}
510  }
511  ,
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  ,
549  NOT_SUPPORTED}
550  }
551  ,
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  ,
575  NOT_SUPPORTED}
576  }
577  ,
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 */
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  ,
616  NOT_SUPPORTED}
617  }
618  ,
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  ,
642  NOT_SUPPORTED}
643  }
644  ,
647  NOT_SUPPORTED}
648  }
649  }
650  }
651  ,
652 
653 };
654 
655 /*****************************************************************/
656 
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 */
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;
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 =
742  p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_DUAL];
743  _current_scenario_idx = INDEX_SELFPOWER_DUAL;
744  break;
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 =
754  p_pcb_info = &cx231xx_Scenario[INDEX_SELFPOWER_TRIPLE];
755  _current_scenario_idx = INDEX_SELFPOWER_TRIPLE;
756  break;
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 }