Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/media/video/em28xx/em28xx-cards.c (Version 2.6.25.8) and /linux/drivers/media/video/em28xx/em28xx-cards.c (Version 2.6.11.8)


  1 /*                                                  1 
  2    em28xx-cards.c - driver for Empia EM2800/EM    
  3                     video capture devices         
  4                                                   
  5    Copyright (C) 2005 Ludovico Cavedon <cavedo    
  6                       Markus Rechberger <mrech    
  7                       Mauro Carvalho Chehab <m    
  8                       Sascha Sommer <saschasom    
  9                                                   
 10    This program is free software; you can redi    
 11    it under the terms of the GNU General Publi    
 12    the Free Software Foundation; either versio    
 13    (at your option) any later version.            
 14                                                   
 15    This program is distributed in the hope tha    
 16    but WITHOUT ANY WARRANTY; without even the     
 17    MERCHANTABILITY or FITNESS FOR A PARTICULAR    
 18    GNU General Public License for more details    
 19                                                   
 20    You should have received a copy of the GNU     
 21    along with this program; if not, write to t    
 22    Foundation, Inc., 675 Mass Ave, Cambridge,     
 23  */                                               
 24                                                   
 25 #include <linux/init.h>                           
 26 #include <linux/module.h>                         
 27 #include <linux/delay.h>                          
 28 #include <linux/i2c.h>                            
 29 #include <linux/usb.h>                            
 30 #include <media/tuner.h>                          
 31 #include <media/msp3400.h>                        
 32 #include <media/saa7115.h>                        
 33 #include <media/tvp5150.h>                        
 34 #include <media/tveeprom.h>                       
 35 #include <media/audiochip.h>                      
 36 #include <media/v4l2-common.h>                    
 37                                                   
 38 #include "em28xx.h"                               
 39 #include "tuner-xc2028.h"                         
 40                                                   
 41 static int tuner = -1;                            
 42 module_param(tuner, int, 0444);                   
 43 MODULE_PARM_DESC(tuner, "tuner type");            
 44                                                   
 45 static unsigned int disable_ir;                   
 46 module_param(disable_ir, int, 0444);              
 47 MODULE_PARM_DESC(disable_ir, "disable infrared    
 48                                                   
 49 struct em28xx_hash_table {                        
 50         unsigned long hash;                       
 51         unsigned int  model;                      
 52         unsigned int  tuner;                      
 53 };                                                
 54                                                   
 55 /* Boards supported by driver */                  
 56                                                   
 57 #define EM2800_BOARD_UNKNOWN                      
 58 #define EM2820_BOARD_UNKNOWN                      
 59 #define EM2820_BOARD_TERRATEC_CINERGY_250         
 60 #define EM2820_BOARD_PINNACLE_USB_2               
 61 #define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2        
 62 #define EM2820_BOARD_MSI_VOX_USB_2                
 63 #define EM2800_BOARD_TERRATEC_CINERGY_200         
 64 #define EM2800_BOARD_LEADTEK_WINFAST_USBII        
 65 #define EM2800_BOARD_KWORLD_USB2800               
 66 #define EM2820_BOARD_PINNACLE_DVC_90              
 67 #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900      
 68 #define EM2880_BOARD_TERRATEC_HYBRID_XS           
 69 #define EM2820_BOARD_KWORLD_PVRTV2800RF           
 70 #define EM2880_BOARD_TERRATEC_PRODIGY_XS          
 71 #define EM2820_BOARD_PROLINK_PLAYTV_USB2          
 72 #define EM2800_BOARD_VGEAR_POCKETTV               
 73 #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950      
 74                                                   
 75 struct em28xx_board em28xx_boards[] = {           
 76         [EM2800_BOARD_UNKNOWN] = {                
 77                 .name         = "Unknown EM280    
 78                 .is_em2800    = 1,                
 79                 .vchannels    = 2,                
 80                 .tda9887_conf = TDA9887_PRESEN    
 81                 .decoder      = EM28XX_SAA7113    
 82                 .input           = { {            
 83                         .type     = EM28XX_VMU    
 84                         .vmux     = SAA7115_CO    
 85                         .amux     = 1,            
 86                 }, {                              
 87                         .type     = EM28XX_VMU    
 88                         .vmux     = SAA7115_SV    
 89                         .amux     = 1,            
 90                 } },                              
 91         },                                        
 92         [EM2820_BOARD_UNKNOWN] = {                
 93                 .name         = "Unknown EM275    
 94                 .is_em2800    = 0,                
 95                 .tuner_type   = TUNER_ABSENT,     
 96         },                                        
 97         [EM2820_BOARD_KWORLD_PVRTV2800RF] = {     
 98                 .name         = "Kworld PVR TV    
 99                 .is_em2800    = 0,                
100                 .vchannels    = 2,                
101                 .tuner_type   = TUNER_TEMIC_PA    
102                 .tda9887_conf = TDA9887_PRESEN    
103                 .decoder      = EM28XX_SAA7113    
104                 .input           = { {            
105                         .type     = EM28XX_VMU    
106                         .vmux     = SAA7115_CO    
107                         .amux     = 1,            
108                 }, {                              
109                         .type     = EM28XX_VMU    
110                         .vmux     = SAA7115_SV    
111                         .amux     = 1,            
112                 } },                              
113         },                                        
114         [EM2820_BOARD_TERRATEC_CINERGY_250] =     
115                 .name         = "Terratec Cine    
116                 .vchannels    = 3,                
117                 .tuner_type   = TUNER_LG_PAL_N    
118                 .tda9887_conf = TDA9887_PRESEN    
119                 .decoder      = EM28XX_SAA7113    
120                 .input          = { {             
121                         .type     = EM28XX_VMU    
122                         .vmux     = SAA7115_CO    
123                         .amux     = 1,            
124                 }, {                              
125                         .type     = EM28XX_VMU    
126                         .vmux     = SAA7115_CO    
127                         .amux     = 1,            
128                 }, {                              
129                         .type     = EM28XX_VMU    
130                         .vmux     = SAA7115_SV    
131                         .amux     = 1,            
132                 } },                              
133         },                                        
134         [EM2820_BOARD_PINNACLE_USB_2] = {         
135                 .name         = "Pinnacle PCTV    
136                 .vchannels    = 3,                
137                 .tuner_type   = TUNER_LG_PAL_N    
138                 .tda9887_conf = TDA9887_PRESEN    
139                 .decoder      = EM28XX_SAA7113    
140                 .input          = { {             
141                         .type     = EM28XX_VMU    
142                         .vmux     = SAA7115_CO    
143                         .amux     = 0,            
144                 }, {                              
145                         .type     = EM28XX_VMU    
146                         .vmux     = SAA7115_CO    
147                         .amux     = 1,            
148                 }, {                              
149                         .type     = EM28XX_VMU    
150                         .vmux     = SAA7115_SV    
151                         .amux     = 1,            
152                 } },                              
153         },                                        
154         [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] =    
155                 .name         = "Hauppauge Win    
156                 .vchannels    = 3,                
157                 .tuner_type   = TUNER_PHILIPS_    
158                 .tda9887_conf = TDA9887_PRESEN    
159                                 TDA9887_PORT1_    
160                                 TDA9887_PORT2_    
161                 .decoder      = EM28XX_TVP5150    
162                 .has_msp34xx  = 1,                
163                 /*FIXME: S-Video not tested */    
164                 .input          = { {             
165                         .type     = EM28XX_VMU    
166                         .vmux     = TVP5150_CO    
167                         .amux     = MSP_INPUT_    
168                 }, {                              
169                         .type     = EM28XX_VMU    
170                         .vmux     = TVP5150_SV    
171                         .amux     = MSP_INPUT(    
172                                         MSP_DS    
173                 } },                              
174         },                                        
175         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900]    
176                 .name         = "Hauppauge Win    
177                 .vchannels    = 3,                
178                 .tda9887_conf = TDA9887_PRESEN    
179                 .tuner_type   = TUNER_XC2028,     
180                 .mts_firmware = 1,                
181                 .decoder      = EM28XX_TVP5150    
182                 .input          = { {             
183                         .type     = EM28XX_VMU    
184                         .vmux     = TVP5150_CO    
185                         .amux     = 0,            
186                 }, {                              
187                         .type     = EM28XX_VMU    
188                         .vmux     = TVP5150_CO    
189                         .amux     = 1,            
190                 }, {                              
191                         .type     = EM28XX_VMU    
192                         .vmux     = TVP5150_SV    
193                         .amux     = 1,            
194                 } },                              
195         },                                        
196         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950]    
197                 .name           = "Hauppauge W    
198                 .vchannels      = 3,              
199                 .tda9887_conf   = TDA9887_PRES    
200                 .tuner_type     = TUNER_XC2028    
201                 .mts_firmware   = 1,              
202                 .has_12mhz_i2s  = 1,              
203                 .decoder        = EM28XX_TVP51    
204                 .input          = { {             
205                         .type     = EM28XX_VMU    
206                         .vmux     = TVP5150_CO    
207                         .amux     = 0,            
208                 }, {                              
209                         .type     = EM28XX_VMU    
210                         .vmux     = TVP5150_CO    
211                         .amux     = 1,            
212                 }, {                              
213                         .type     = EM28XX_VMU    
214                         .vmux     = TVP5150_SV    
215                         .amux     = 1,            
216                 } },                              
217                                                   
218                 /* gpio's 4, 1, 0 */              
219                 .analog_gpio = 0x003d2d,          
220         },                                        
221         [EM2880_BOARD_TERRATEC_HYBRID_XS] = {     
222                 .name         = "Terratec Hybr    
223                 .vchannels    = 3,                
224                 .tda9887_conf = TDA9887_PRESEN    
225                 .tuner_type   = TUNER_XC2028,     
226                 .decoder      = EM28XX_TVP5150    
227                 .input          = { {             
228                         .type     = EM28XX_VMU    
229                         .vmux     = TVP5150_CO    
230                         .amux     = 0,            
231                 }, {                              
232                         .type     = EM28XX_VMU    
233                         .vmux     = TVP5150_CO    
234                         .amux     = 1,            
235                 }, {                              
236                         .type     = EM28XX_VMU    
237                         .vmux     = TVP5150_SV    
238                         .amux     = 1,            
239                 } },                              
240         },                                        
241         /* maybe there's a reason behind it wh    
242            as Prodigy XS with a different PID,    
243            maybe we'll need it lateron */         
244         [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {    
245                 .name         = "Terratec Prod    
246                 .vchannels    = 3,                
247                 .tda9887_conf = TDA9887_PRESEN    
248                 .tuner_type   = TUNER_XC2028,     
249                 .decoder      = EM28XX_TVP5150    
250                 .input          = { {             
251                         .type     = EM28XX_VMU    
252                         .vmux     = TVP5150_CO    
253                         .amux     = 0,            
254                 }, {                              
255                         .type     = EM28XX_VMU    
256                         .vmux     = TVP5150_CO    
257                         .amux     = 1,            
258                 }, {                              
259                         .type     = EM28XX_VMU    
260                         .vmux     = TVP5150_SV    
261                         .amux     = 1,            
262                 } },                              
263         },                                        
264         [EM2820_BOARD_MSI_VOX_USB_2] = {          
265                 .name              = "MSI VOX     
266                 .vchannels         = 3,           
267                 .tuner_type        = TUNER_LG_    
268                 .tda9887_conf      = TDA9887_P    
269                                      TDA9887_P    
270                                      TDA9887_P    
271                 .max_range_640_480 = 1,           
272                                                   
273                 .decoder           = EM28XX_SA    
274                 .input             = { {          
275                         .type      = EM28XX_VM    
276                         .vmux      = SAA7115_C    
277                         .amux      = 0,           
278                 }, {                              
279                         .type      = EM28XX_VM    
280                         .vmux      = SAA7115_C    
281                         .amux      = 1,           
282                 }, {                              
283                         .type      = EM28XX_VM    
284                         .vmux      = SAA7115_S    
285                         .amux      = 1,           
286                 } },                              
287         },                                        
288         [EM2800_BOARD_TERRATEC_CINERGY_200] =     
289                 .name         = "Terratec Cine    
290                 .is_em2800    = 1,                
291                 .vchannels    = 3,                
292                 .tuner_type   = TUNER_LG_PAL_N    
293                 .tda9887_conf = TDA9887_PRESEN    
294                 .decoder      = EM28XX_SAA7113    
295                 .input          = { {             
296                         .type     = EM28XX_VMU    
297                         .vmux     = SAA7115_CO    
298                         .amux     = 0,            
299                 }, {                              
300                         .type     = EM28XX_VMU    
301                         .vmux     = SAA7115_CO    
302                         .amux     = 1,            
303                 }, {                              
304                         .type     = EM28XX_VMU    
305                         .vmux     = SAA7115_SV    
306                         .amux     = 1,            
307                 } },                              
308         },                                        
309         [EM2800_BOARD_LEADTEK_WINFAST_USBII] =    
310                 .name         = "Leadtek Winfa    
311                 .is_em2800    = 1,                
312                 .vchannels    = 3,                
313                 .tuner_type   = TUNER_LG_PAL_N    
314                 .tda9887_conf = TDA9887_PRESEN    
315                 .decoder      = EM28XX_SAA7113    
316                 .input          = { {             
317                         .type     = EM28XX_VMU    
318                         .vmux     = SAA7115_CO    
319                         .amux     = 0,            
320                 }, {                              
321                         .type     = EM28XX_VMU    
322                         .vmux     = SAA7115_CO    
323                         .amux     = 1,            
324                 }, {                              
325                         .type     = EM28XX_VMU    
326                         .vmux     = SAA7115_SV    
327                         .amux     = 1,            
328                 } },                              
329         },                                        
330         [EM2800_BOARD_KWORLD_USB2800] = {         
331                 .name         = "Kworld USB280    
332                 .is_em2800    = 1,                
333                 .vchannels    = 3,                
334                 .tuner_type   = TUNER_PHILIPS_    
335                 .tda9887_conf = TDA9887_PRESEN    
336                 .decoder      = EM28XX_SAA7113    
337                 .input          = { {             
338                         .type     = EM28XX_VMU    
339                         .vmux     = SAA7115_CO    
340                         .amux     = 0,            
341                 }, {                              
342                         .type     = EM28XX_VMU    
343                         .vmux     = SAA7115_CO    
344                         .amux     = 1,            
345                 }, {                              
346                         .type     = EM28XX_VMU    
347                         .vmux     = SAA7115_SV    
348                         .amux     = 1,            
349                 } },                              
350         },                                        
351         [EM2820_BOARD_PINNACLE_DVC_90] = {        
352                 .name         = "Pinnacle Dazz    
353                 .vchannels    = 3,                
354                 .tuner_type   = TUNER_ABSENT,     
355                 .decoder      = EM28XX_SAA7113    
356                 .input          = { {             
357                         .type     = EM28XX_VMU    
358                         .vmux     = SAA7115_CO    
359                         .amux     = 1,            
360                 }, {                              
361                         .type     = EM28XX_VMU    
362                         .vmux     = SAA7115_SV    
363                         .amux     = 1,            
364                 } },                              
365         },                                        
366         [EM2800_BOARD_VGEAR_POCKETTV] = {         
367                 .name         = "V-Gear Pocket    
368                 .is_em2800    = 1,                
369                 .vchannels    = 3,                
370                 .tuner_type   = TUNER_LG_PAL_N    
371                 .tda9887_conf = TDA9887_PRESEN    
372                 .decoder      = EM28XX_SAA7113    
373                 .input          = { {             
374                         .type     = EM28XX_VMU    
375                         .vmux     = SAA7115_CO    
376                         .amux     = 0,            
377                 }, {                              
378                         .type     = EM28XX_VMU    
379                         .vmux     = SAA7115_CO    
380                         .amux     = 1,            
381                 }, {                              
382                         .type     = EM28XX_VMU    
383                         .vmux     = SAA7115_SV    
384                         .amux     = 1,            
385                 } },                              
386         },                                        
387         [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {    
388                 .name         = "Pixelview Pro    
389                 .vchannels    = 3,                
390                 .tda9887_conf = TDA9887_PRESEN    
391                 .tuner_type   = TUNER_YMEC_TVF    
392                 .decoder      = EM28XX_SAA7113    
393                 .input          = { {             
394                         .type     = EM28XX_VMU    
395                         .vmux     = SAA7115_CO    
396                         .amux     = EM28XX_AMU    
397                 }, {                              
398                         .type     = EM28XX_VMU    
399                         .vmux     = SAA7115_CO    
400                         .amux     = EM28XX_AMU    
401                 }, {                              
402                         .type     = EM28XX_VMU    
403                         .vmux     = SAA7115_SV    
404                         .amux     = EM28XX_AMU    
405                 } },                              
406         },                                        
407 };                                                
408 const unsigned int em28xx_bcount = ARRAY_SIZE(    
409                                                   
410 /* table of devices that work with this driver    
411 struct usb_device_id em28xx_id_table [] = {       
412         { USB_DEVICE(0xeb1a, 0x2750),             
413                         .driver_info = EM2820_    
414         { USB_DEVICE(0xeb1a, 0x2800),             
415                         .driver_info = EM2800_    
416         { USB_DEVICE(0xeb1a, 0x2820),             
417                         .driver_info = EM2820_    
418         { USB_DEVICE(0xeb1a, 0x2821),             
419                         .driver_info = EM2820_    
420         { USB_DEVICE(0xeb1a, 0x2860),             
421                         .driver_info = EM2820_    
422         { USB_DEVICE(0xeb1a, 0x2861),             
423                         .driver_info = EM2820_    
424         { USB_DEVICE(0xeb1a, 0x2870),             
425                         .driver_info = EM2820_    
426         { USB_DEVICE(0xeb1a, 0x2881),             
427                         .driver_info = EM2820_    
428         { USB_DEVICE(0xeb1a, 0x2883),             
429                         .driver_info = EM2820_    
430         { USB_DEVICE(0x0ccd, 0x0036),             
431                         .driver_info = EM2820_    
432         { USB_DEVICE(0x2304, 0x0208),             
433                         .driver_info = EM2820_    
434         { USB_DEVICE(0x2040, 0x4200),             
435                         .driver_info = EM2820_    
436         { USB_DEVICE(0x2040, 0x4201),             
437                         .driver_info = EM2820_    
438         { USB_DEVICE(0x2304, 0x0207),             
439                         .driver_info = EM2820_    
440         { USB_DEVICE(0x2304, 0x021a),             
441                         .driver_info = EM2820_    
442         { USB_DEVICE(0x2040, 0x6500),             
443                         .driver_info = EM2880_    
444         { USB_DEVICE(0x2040, 0x6502),             
445                         .driver_info = EM2880_    
446         { USB_DEVICE(0x2040, 0x6513),             
447                         .driver_info = EM2880_    
448         { USB_DEVICE(0x0ccd, 0x0042),             
449                         .driver_info = EM2880_    
450         { USB_DEVICE(0x0ccd, 0x0047),             
451                         .driver_info = EM2880_    
452         { },                                      
453 };                                                
454 MODULE_DEVICE_TABLE(usb, em28xx_id_table);        
455                                                   
456 /* EEPROM hash table for devices with generic     
457 static struct em28xx_hash_table em28xx_eeprom_    
458         /* P/N: SA 60002070465 Tuner: TVF7533-    
459         {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAY    
460 };                                                
461                                                   
462 /* I2C devicelist hash table for devices with     
463 static struct em28xx_hash_table em28xx_i2c_has    
464         {0xb06a32c3, EM2800_BOARD_TERRATEC_CIN    
465         {0xf51200e3, EM2800_BOARD_VGEAR_POCKET    
466 };                                                
467                                                   
468 /* Since em28xx_pre_card_setup() requires a pr    
469  * this won't work for boards with generic PCI    
470  */                                               
471 void em28xx_pre_card_setup(struct em28xx *dev)    
472 {                                                 
473         /* request some modules */                
474         switch (dev->model) {                     
475         case EM2880_BOARD_TERRATEC_PRODIGY_XS:    
476         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_    
477         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_    
478         case EM2880_BOARD_TERRATEC_HYBRID_XS:     
479                 em28xx_write_regs(dev, XCLK_RE    
480                 em28xx_write_regs(dev, I2C_CLK    
481                 em28xx_write_regs(dev, 0x08, "    
482                 em28xx_write_regs(dev, 0x04, "    
483                 msleep(100);                      
484                 em28xx_write_regs(dev, 0x04, "    
485                 msleep(100);                      
486                 em28xx_write_regs(dev, 0x08, "    
487                 msleep(50);                       
488                 em28xx_write_regs(dev, 0x08, "    
489                 msleep(50);                       
490                 em28xx_write_regs(dev, 0x08, "    
491                 break;                            
492         }                                         
493 }                                                 
494                                                   
495 static int em28xx_tuner_callback(void *ptr, in    
496 {                                                 
497         int rc = 0;                               
498         struct em28xx *dev = ptr;                 
499                                                   
500         if (dev->tuner_type != TUNER_XC2028)      
501                 return 0;                         
502                                                   
503         switch (command) {                        
504         case XC2028_TUNER_RESET:                  
505         {                                         
506                 /* GPIO and initialization cod    
507                    This code should be complem    
508                    codes are different.           
509                  */                               
510                                                   
511                 dev->em28xx_write_regs_req(dev    
512                 dev->em28xx_write_regs_req(dev    
513                                                   
514                 if (dev->analog_gpio) {           
515                         char gpio0 = dev->anal    
516                         char gpio1 = (dev->ana    
517                         char gpio4 = dev->anal    
518                                                   
519                         if (gpio4) {              
520                                 dev->em28xx_wr    
521                                 msleep(140);      
522                         }                         
523                                                   
524                         msleep(6);                
525                         dev->em28xx_write_regs    
526                         msleep(10);               
527                         dev->em28xx_write_regs    
528                         msleep(5);                
529                 }                                 
530                                                   
531                 break;                            
532         }                                         
533         }                                         
534         return rc;                                
535 }                                                 
536                                                   
537 static void em28xx_config_tuner(struct em28xx     
538 {                                                 
539         struct v4l2_priv_tun_config  xc2028_cf    
540         struct xc2028_ctrl           ctl;         
541         struct tuner_setup           tun_setup    
542         struct v4l2_frequency        f;           
543                                                   
544         if (dev->tuner_type == TUNER_ABSENT)      
545                 return;                           
546                                                   
547         tun_setup.mode_mask = T_ANALOG_TV | T_    
548         tun_setup.type = dev->tuner_type;         
549         tun_setup.addr = dev->tuner_addr;         
550         tun_setup.tuner_callback = em28xx_tune    
551                                                   
552         em28xx_i2c_call_clients(dev, TUNER_SET    
553                                                   
554         if (dev->tuner_type == TUNER_XC2028) {    
555                 memset(&ctl, 0, sizeof(ctl));     
556                                                   
557                 ctl.fname   = XC2028_DEFAULT_F    
558                 ctl.max_len = 64;                 
559                 ctl.mts = em28xx_boards[dev->m    
560                                                   
561                 xc2028_cfg.tuner = TUNER_XC202    
562                 xc2028_cfg.priv  = &ctl;          
563                                                   
564                 em28xx_i2c_call_clients(dev, T    
565         }                                         
566                                                   
567         /* configure tuner */                     
568         f.tuner = 0;                              
569         f.type = V4L2_TUNER_ANALOG_TV;            
570         f.frequency = 9076;     /* just a magi    
571         dev->ctl_freq = f.frequency;              
572         em28xx_i2c_call_clients(dev, VIDIOC_S_    
573 }                                                 
574                                                   
575 static int em28xx_hint_board(struct em28xx *de    
576 {                                                 
577         int i;                                    
578                                                   
579         /* HINT method: EEPROM                    
580          *                                        
581          * This method works only for boards w    
582          * Uses a hash of all eeprom bytes. Th    
583          * unique for a vendor/tuner pair.        
584          * There are a high chance that tuners    
585          * video standards produce different h    
586          */                                       
587         for (i = 0; i < ARRAY_SIZE(em28xx_eepr    
588                 if (dev->hash == em28xx_eeprom    
589                         dev->model = em28xx_ee    
590                         dev->tuner_type = em28    
591                                                   
592                         em28xx_errdev("Your bo    
593                         em28xx_errdev("A hint     
594                                       "based o    
595                         em28xx_errdev("This me    
596                         em28xx_errdev("If the     
597                                       "please     
598                         em28xx_errdev("\tV4L M    
599                                       " <video    
600                         em28xx_errdev("Board d    
601                                       em28xx_b    
602                                                   
603                         return 0;                 
604                 }                                 
605         }                                         
606                                                   
607         /* HINT method: I2C attached devices      
608          *                                        
609          * This method works for all boards.      
610          * Uses a hash of i2c scanned devices.    
611          * Devices with the same i2c attached     
612          * be considered equal.                   
613          * This method is less precise than th    
614          */                                       
615                                                   
616         /* user did not request i2c scanning =    
617         if (!dev->i2c_hash)                       
618                 em28xx_do_i2c_scan(dev);          
619                                                   
620         for (i = 0; i < ARRAY_SIZE(em28xx_i2c_    
621                 if (dev->i2c_hash == em28xx_i2    
622                         dev->model = em28xx_i2    
623                         dev->tuner_type = em28    
624                         em28xx_errdev("Your bo    
625                         em28xx_errdev("A hint     
626                                       "based o    
627                         em28xx_errdev("This me    
628                         em28xx_errdev("If the     
629                                       "please     
630                         em28xx_errdev("\tV4L M    
631                                       " <video    
632                         em28xx_errdev("Board d    
633                                       em28xx_b    
634                                                   
635                         return 0;                 
636                 }                                 
637         }                                         
638                                                   
639         em28xx_errdev("Your board has no uniqu    
640                       "hint to be detected.\n"    
641         em28xx_errdev("You may try to use card    
642                       "workaround that.\n");      
643         em28xx_errdev("Please send an email wi    
644         em28xx_errdev("\tV4L Mailing List <vid    
645         em28xx_errdev("Board eeprom hash is 0x    
646         em28xx_errdev("Board i2c devicelist ha    
647                                                   
648         em28xx_errdev("Here is a list of valid    
649                       " insmod option:\n");       
650         for (i = 0; i < em28xx_bcount; i++) {     
651                 em28xx_errdev("    card=%d ->     
652                                 i, em28xx_boar    
653         }                                         
654         return -1;                                
655 }                                                 
656                                                   
657                                                   
658 static void em28xx_set_model(struct em28xx *de    
659 {                                                 
660         dev->is_em2800 = em28xx_boards[dev->mo    
661         dev->has_msp34xx = em28xx_boards[dev->    
662         dev->tda9887_conf = em28xx_boards[dev-    
663         dev->decoder = em28xx_boards[dev->mode    
664         dev->video_inputs = em28xx_boards[dev-    
665         dev->analog_gpio = em28xx_boards[dev->    
666         dev->has_12mhz_i2s = em28xx_boards[dev    
667         dev->max_range_640_480 = em28xx_boards    
668 }                                                 
669                                                   
670 /* -------------------------------------------    
671 void em28xx_set_ir(struct em28xx *dev, struct     
672 {                                                 
673         if (disable_ir) {                         
674                 ir->get_key = NULL;               
675                 return ;                          
676         }                                         
677                                                   
678         /* detect & configure */                  
679         switch (dev->model) {                     
680         case (EM2800_BOARD_UNKNOWN):              
681                 break;                            
682         case (EM2820_BOARD_UNKNOWN):              
683                 break;                            
684         case (EM2800_BOARD_TERRATEC_CINERGY_20    
685         case (EM2820_BOARD_TERRATEC_CINERGY_25    
686                 ir->ir_codes = ir_codes_em_ter    
687                 ir->get_key = em28xx_get_key_t    
688                 snprintf(ir->c.name, sizeof(ir    
689                          "i2c IR (EM28XX Terra    
690                 break;                            
691         case (EM2820_BOARD_PINNACLE_USB_2):       
692                 ir->ir_codes = ir_codes_pinnac    
693                 ir->get_key = em28xx_get_key_p    
694                 snprintf(ir->c.name, sizeof(ir    
695                          "i2c IR (EM28XX Pinna    
696                 break;                            
697         case (EM2820_BOARD_HAUPPAUGE_WINTV_USB    
698                 ir->ir_codes = ir_codes_hauppa    
699                 ir->get_key = em28xx_get_key_e    
700                 snprintf(ir->c.name, sizeof(ir    
701                          "i2c IR (EM2840 Haupp    
702                 break;                            
703         case (EM2820_BOARD_MSI_VOX_USB_2):        
704                 break;                            
705         case (EM2800_BOARD_LEADTEK_WINFAST_USB    
706                 break;                            
707         case (EM2800_BOARD_KWORLD_USB2800):       
708                 break;                            
709         }                                         
710 }                                                 
711                                                   
712 void em28xx_card_setup(struct em28xx *dev)        
713 {                                                 
714         em28xx_set_model(dev);                    
715                                                   
716         dev->tuner_type = em28xx_boards[dev->m    
717                                                   
718         /* request some modules */                
719         switch (dev->model) {                     
720         case EM2820_BOARD_HAUPPAUGE_WINTV_USB_    
721         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_    
722         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_    
723         {                                         
724                 struct tveeprom tv;               
725 #ifdef CONFIG_MODULES                             
726                 request_module("tveeprom");       
727 #endif                                            
728                 /* Call first TVeeprom */         
729                                                   
730                 dev->i2c_client.addr = 0xa0 >>    
731                 tveeprom_hauppauge_analog(&dev    
732                                                   
733                 dev->tuner_type = tv.tuner_typ    
734                                                   
735                 if (tv.audio_processor == AUDI    
736                         dev->i2s_speed = 20480    
737                         dev->has_msp34xx = 1;     
738                 }                                 
739 #ifdef CONFIG_MODULES                             
740                 if (tv.has_ir)                    
741                         request_module("ir-kbd    
742 #endif                                            
743                 break;                            
744         }                                         
745         case EM2820_BOARD_KWORLD_PVRTV2800RF:     
746                 /* GPIO enables sound on KWORL    
747                 em28xx_write_regs_req(dev, 0x0    
748                 break;                            
749         case EM2820_BOARD_UNKNOWN:                
750         case EM2800_BOARD_UNKNOWN:                
751                 if (!em28xx_hint_board(dev))      
752                         em28xx_set_model(dev);    
753         }                                         
754                                                   
755         /* Allow override tuner type by a modu    
756         if (tuner >= 0)                           
757                 dev->tuner_type = tuner;          
758                                                   
759 #ifdef CONFIG_MODULES                             
760         /* request some modules */                
761         if (dev->has_msp34xx)                     
762                 request_module("msp3400");        
763         if (dev->decoder == EM28XX_SAA7113 ||     
764                 request_module("saa7115");        
765         if (dev->decoder == EM28XX_TVP5150)       
766                 request_module("tvp5150");        
767         if (dev->tuner_type != TUNER_ABSENT)      
768                 request_module("tuner");          
769 #endif                                            
770                                                   
771         em28xx_config_tuner(dev);                 
772 }                                                 
773                                                   
  This page was automatically generated by the LXR engine.