V4L/DVB (9979): em28xx: move usb probe code to a proper place
[pandora-kernel.git] / drivers / media / video / em28xx / em28xx-cards.c
1 /*
2    em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
3                     video capture devices
4
5    Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
6                       Markus Rechberger <mrechberger@gmail.com>
7                       Mauro Carvalho Chehab <mchehab@infradead.org>
8                       Sascha Sommer <saschasommer@freenet.de>
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
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/v4l2-common.h>
36 #include <media/v4l2-chip-ident.h>
37
38 #include "em28xx.h"
39
40 #define DRIVER_NAME         "em28xx"
41
42 static int tuner = -1;
43 module_param(tuner, int, 0444);
44 MODULE_PARM_DESC(tuner, "tuner type");
45
46 static unsigned int disable_ir;
47 module_param(disable_ir, int, 0444);
48 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
49
50 static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
51 module_param_array(card,  int, NULL, 0444);
52 MODULE_PARM_DESC(card,     "card type");
53
54 /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */
55 static unsigned long em28xx_devused;
56
57 struct em28xx_hash_table {
58         unsigned long hash;
59         unsigned int  model;
60         unsigned int  tuner;
61 };
62
63 /*
64  *  Reset sequences for analog/digital modes
65  */
66
67 /* Reset for the most [analog] boards */
68 static struct em28xx_reg_seq default_analog[] = {
69         {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
70         {       -1,             -1,     -1,             -1},
71 };
72
73 /* Reset for the most [digital] boards */
74 static struct em28xx_reg_seq default_digital[] = {
75         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
76         {       -1,             -1,     -1,             -1},
77 };
78
79 /* Board Hauppauge WinTV HVR 900 analog */
80 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
81         {EM28XX_R08_GPIO,       0x2d,   ~EM_GPIO_4,     10},
82         {0x05,                  0xff,   0x10,           10},
83         {  -1,                  -1,     -1,             -1},
84 };
85
86 /* Board Hauppauge WinTV HVR 900 digital */
87 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
88         {EM28XX_R08_GPIO,       0x2e,   ~EM_GPIO_4,     10},
89         {EM2880_R04_GPO,        0x04,   0x0f,           10},
90         {EM2880_R04_GPO,        0x0c,   0x0f,           10},
91         { -1,                   -1,     -1,             -1},
92 };
93
94 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
95 static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
96         {EM28XX_R08_GPIO,       0x69,   ~EM_GPIO_4,      10},
97         {       -1,             -1,     -1,              -1},
98 };
99
100 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
101
102 /* Board  - EM2870 Kworld 355u
103    Analog - No input analog */
104
105 /* Callback for the most boards */
106 static struct em28xx_reg_seq default_tuner_gpio[] = {
107         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
108         {EM28XX_R08_GPIO,       0,              EM_GPIO_4,      10},
109         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
110         {  -1,                  -1,             -1,             -1},
111 };
112
113 /* Pinnacle PCTV HD Mini (80e) GPIOs
114    0-5: not used
115    6:   demod reset, active low
116    7:   LED on, active high */
117 static struct em28xx_reg_seq em2874_pinnacle_80e_digital[] = {
118         {EM28XX_R06_I2C_CLK,    0x45,   0xff,             10}, /*400 KHz*/
119         {EM2874_R80_GPIO,       0x80,   0xff,             100},/*Demod reset*/
120         {EM2874_R80_GPIO,       0xc0,   0xff,             10},
121         {  -1,                  -1,     -1,               -1},
122 };
123
124 /*
125  *  Board definitions
126  */
127 struct em28xx_board em28xx_boards[] = {
128         [EM2750_BOARD_UNKNOWN] = {
129                 .name          = "Unknown EM2750/EM2751 webcam grabber",
130                 .xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
131                 .tuner_type    = TUNER_ABSENT,  /* This is a webcam */
132                 .input         = { {
133                         .type     = EM28XX_VMUX_COMPOSITE1,
134                         .vmux     = 0,
135                         .amux     = EM28XX_AMUX_VIDEO,
136                 } },
137         },
138         [EM2800_BOARD_UNKNOWN] = {
139                 .name         = "Unknown EM2800 video grabber",
140                 .is_em2800    = 1,
141                 .tda9887_conf = TDA9887_PRESENT,
142                 .decoder      = EM28XX_SAA711X,
143                 .tuner_type   = TUNER_ABSENT,
144                 .input        = { {
145                         .type     = EM28XX_VMUX_COMPOSITE1,
146                         .vmux     = SAA7115_COMPOSITE0,
147                         .amux     = EM28XX_AMUX_LINE_IN,
148                 }, {
149                         .type     = EM28XX_VMUX_SVIDEO,
150                         .vmux     = SAA7115_SVIDEO3,
151                         .amux     = EM28XX_AMUX_LINE_IN,
152                 } },
153         },
154         [EM2820_BOARD_UNKNOWN] = {
155                 .name          = "Unknown EM2750/28xx video grabber",
156                 .tuner_type    = TUNER_ABSENT,
157         },
158         [EM2750_BOARD_DLCW_130] = {
159                 /* Beijing Huaqi Information Digital Technology Co., Ltd */
160                 .name          = "Huaqi DLCW-130",
161                 .valid         = EM28XX_BOARD_NOT_VALIDATED,
162                 .xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
163                 .tuner_type    = TUNER_ABSENT,  /* This is a webcam */
164                 .input         = { {
165                         .type     = EM28XX_VMUX_COMPOSITE1,
166                         .vmux     = 0,
167                         .amux     = EM28XX_AMUX_VIDEO,
168                 } },
169         },
170         [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
171                 .name         = "Kworld PVR TV 2800 RF",
172                 .tuner_type   = TUNER_TEMIC_PAL,
173                 .tda9887_conf = TDA9887_PRESENT,
174                 .decoder      = EM28XX_SAA711X,
175                 .input        = { {
176                         .type     = EM28XX_VMUX_COMPOSITE1,
177                         .vmux     = SAA7115_COMPOSITE0,
178                         .amux     = EM28XX_AMUX_LINE_IN,
179                 }, {
180                         .type     = EM28XX_VMUX_SVIDEO,
181                         .vmux     = SAA7115_SVIDEO3,
182                         .amux     = EM28XX_AMUX_LINE_IN,
183                 } },
184         },
185         [EM2820_BOARD_TERRATEC_CINERGY_250] = {
186                 .name         = "Terratec Cinergy 250 USB",
187                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
188                 .tda9887_conf = TDA9887_PRESENT,
189                 .decoder      = EM28XX_SAA711X,
190                 .input        = { {
191                         .type     = EM28XX_VMUX_TELEVISION,
192                         .vmux     = SAA7115_COMPOSITE2,
193                         .amux     = EM28XX_AMUX_LINE_IN,
194                 }, {
195                         .type     = EM28XX_VMUX_COMPOSITE1,
196                         .vmux     = SAA7115_COMPOSITE0,
197                         .amux     = EM28XX_AMUX_LINE_IN,
198                 }, {
199                         .type     = EM28XX_VMUX_SVIDEO,
200                         .vmux     = SAA7115_SVIDEO3,
201                         .amux     = EM28XX_AMUX_LINE_IN,
202                 } },
203         },
204         [EM2820_BOARD_PINNACLE_USB_2] = {
205                 .name         = "Pinnacle PCTV USB 2",
206                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
207                 .tda9887_conf = TDA9887_PRESENT,
208                 .decoder      = EM28XX_SAA711X,
209                 .input        = { {
210                         .type     = EM28XX_VMUX_TELEVISION,
211                         .vmux     = SAA7115_COMPOSITE2,
212                         .amux     = EM28XX_AMUX_VIDEO,
213                 }, {
214                         .type     = EM28XX_VMUX_COMPOSITE1,
215                         .vmux     = SAA7115_COMPOSITE0,
216                         .amux     = EM28XX_AMUX_LINE_IN,
217                 }, {
218                         .type     = EM28XX_VMUX_SVIDEO,
219                         .vmux     = SAA7115_SVIDEO3,
220                         .amux     = EM28XX_AMUX_LINE_IN,
221                 } },
222         },
223         [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
224                 .name         = "Hauppauge WinTV USB 2",
225                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
226                 .tda9887_conf = TDA9887_PRESENT |
227                                 TDA9887_PORT1_ACTIVE|
228                                 TDA9887_PORT2_ACTIVE,
229                 .decoder      = EM28XX_TVP5150,
230                 .has_msp34xx  = 1,
231                 .input        = { {
232                         .type     = EM28XX_VMUX_TELEVISION,
233                         .vmux     = TVP5150_COMPOSITE0,
234                         .amux     = MSP_INPUT_DEFAULT,
235                 }, {
236                         .type     = EM28XX_VMUX_SVIDEO,
237                         .vmux     = TVP5150_SVIDEO,
238                         .amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
239                                         MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
240                 } },
241         },
242         [EM2820_BOARD_DLINK_USB_TV] = {
243                 .name         = "D-Link DUB-T210 TV Tuner",
244                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
245                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
246                 .tda9887_conf = TDA9887_PRESENT,
247                 .decoder      = EM28XX_SAA711X,
248                 .input        = { {
249                         .type     = EM28XX_VMUX_TELEVISION,
250                         .vmux     = SAA7115_COMPOSITE2,
251                         .amux     = EM28XX_AMUX_LINE_IN,
252                 }, {
253                         .type     = EM28XX_VMUX_COMPOSITE1,
254                         .vmux     = SAA7115_COMPOSITE0,
255                         .amux     = EM28XX_AMUX_LINE_IN,
256                 }, {
257                         .type     = EM28XX_VMUX_SVIDEO,
258                         .vmux     = SAA7115_SVIDEO3,
259                         .amux     = EM28XX_AMUX_LINE_IN,
260                 } },
261         },
262         [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
263                 .name         = "Hercules Smart TV USB 2.0",
264                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
265                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
266                 .tda9887_conf = TDA9887_PRESENT,
267                 .decoder      = EM28XX_SAA711X,
268                 .input        = { {
269                         .type     = EM28XX_VMUX_TELEVISION,
270                         .vmux     = SAA7115_COMPOSITE2,
271                         .amux     = EM28XX_AMUX_LINE_IN,
272                 }, {
273                         .type     = EM28XX_VMUX_COMPOSITE1,
274                         .vmux     = SAA7115_COMPOSITE0,
275                         .amux     = EM28XX_AMUX_LINE_IN,
276                 }, {
277                         .type     = EM28XX_VMUX_SVIDEO,
278                         .vmux     = SAA7115_SVIDEO3,
279                         .amux     = EM28XX_AMUX_LINE_IN,
280                 } },
281         },
282         [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
283                 .name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
284                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
285                 .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
286                 .tda9887_conf = TDA9887_PRESENT,
287                 .decoder      = EM28XX_SAA711X,
288                 .input        = { {
289                         .type     = EM28XX_VMUX_TELEVISION,
290                         .vmux     = SAA7115_COMPOSITE2,
291                         .amux     = EM28XX_AMUX_VIDEO,
292                 }, {
293                         .type     = EM28XX_VMUX_COMPOSITE1,
294                         .vmux     = SAA7115_COMPOSITE0,
295                         .amux     = EM28XX_AMUX_LINE_IN,
296                 }, {
297                         .type     = EM28XX_VMUX_SVIDEO,
298                         .vmux     = SAA7115_SVIDEO3,
299                         .amux     = EM28XX_AMUX_LINE_IN,
300                 } },
301         },
302         [EM2820_BOARD_GADMEI_UTV310] = {
303                 .name         = "Gadmei UTV310",
304                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
305                 .tuner_type   = TUNER_TNF_5335MF,
306                 .tda9887_conf = TDA9887_PRESENT,
307                 .decoder      = EM28XX_SAA711X,
308                 .input        = { {
309                         .type     = EM28XX_VMUX_TELEVISION,
310                         .vmux     = SAA7115_COMPOSITE1,
311                         .amux     = EM28XX_AMUX_LINE_IN,
312                 }, {
313                         .type     = EM28XX_VMUX_COMPOSITE1,
314                         .vmux     = SAA7115_COMPOSITE0,
315                         .amux     = EM28XX_AMUX_LINE_IN,
316                 }, {
317                         .type     = EM28XX_VMUX_SVIDEO,
318                         .vmux     = SAA7115_SVIDEO3,
319                         .amux     = EM28XX_AMUX_LINE_IN,
320                 } },
321         },
322         [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
323                 .name         = "Leadtek Winfast USB II Deluxe",
324                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
325                 .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
326                 .tda9887_conf = TDA9887_PRESENT,
327                 .decoder      = EM28XX_SAA711X,
328                 .input        = { {
329                         .type     = EM28XX_VMUX_TELEVISION,
330                         .vmux     = SAA7115_COMPOSITE2,
331                         .amux     = EM28XX_AMUX_VIDEO,
332                 }, {
333                         .type     = EM28XX_VMUX_COMPOSITE1,
334                         .vmux     = SAA7115_COMPOSITE0,
335                         .amux     = EM28XX_AMUX_LINE_IN,
336                 }, {
337                         .type     = EM28XX_VMUX_SVIDEO,
338                         .vmux     = SAA7115_COMPOSITE0,
339                         .amux     = EM28XX_AMUX_LINE_IN,
340                 } },
341         },
342         [EM2820_BOARD_PINNACLE_DVC_100] = {
343                 .name         = "Pinnacle Dazzle DVC 100",
344                 .decoder      = EM28XX_SAA711X,
345                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
346                 .input        = { {
347                         .type     = EM28XX_VMUX_COMPOSITE1,
348                         .vmux     = SAA7115_COMPOSITE0,
349                         .amux     = EM28XX_AMUX_LINE_IN,
350                 }, {
351                         .type     = EM28XX_VMUX_SVIDEO,
352                         .vmux     = SAA7115_SVIDEO3,
353                         .amux     = EM28XX_AMUX_LINE_IN,
354                 } },
355         },
356         [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
357                 .name         = "Videology 20K14XUSB USB2.0",
358                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
359                 .tuner_type   = TUNER_ABSENT,   /* This is a webcam */
360                 .input        = { {
361                         .type     = EM28XX_VMUX_COMPOSITE1,
362                         .vmux     = 0,
363                         .amux     = EM28XX_AMUX_VIDEO,
364                 } },
365         },
366         [EM2821_BOARD_PROLINK_PLAYTV_USB2] = {
367                 .name         = "SIIG AVTuner-PVR/Prolink PlayTV USB 2.0",
368                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
369                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,  /* unknown? */
370                 .tda9887_conf = TDA9887_PRESENT,        /* unknown? */
371                 .decoder      = EM28XX_SAA711X,
372                 .input        = { {
373                         .type     = EM28XX_VMUX_TELEVISION,
374                         .vmux     = SAA7115_COMPOSITE2,
375                         .amux     = EM28XX_AMUX_LINE_IN,
376                 }, {
377                         .type     = EM28XX_VMUX_COMPOSITE1,
378                         .vmux     = SAA7115_COMPOSITE0,
379                         .amux     = EM28XX_AMUX_LINE_IN,
380                 }, {
381                         .type     = EM28XX_VMUX_SVIDEO,
382                         .vmux     = SAA7115_SVIDEO3,
383                         .amux     = EM28XX_AMUX_LINE_IN,
384                 } },
385         },
386         [EM2821_BOARD_SUPERCOMP_USB_2] = {
387                 .name         = "Supercomp USB 2.0 TV",
388                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
389                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
390                 .tda9887_conf = TDA9887_PRESENT |
391                                 TDA9887_PORT1_ACTIVE |
392                                 TDA9887_PORT2_ACTIVE,
393                 .decoder      = EM28XX_SAA711X,
394                 .input        = { {
395                         .type     = EM28XX_VMUX_TELEVISION,
396                         .vmux     = SAA7115_COMPOSITE2,
397                         .amux     = EM28XX_AMUX_LINE_IN,
398                 }, {
399                         .type     = EM28XX_VMUX_COMPOSITE1,
400                         .vmux     = SAA7115_COMPOSITE0,
401                         .amux     = EM28XX_AMUX_VIDEO,
402                 }, {
403                         .type     = EM28XX_VMUX_SVIDEO,
404                         .vmux     = SAA7115_SVIDEO3,
405                         .amux     = EM28XX_AMUX_LINE_IN,
406                 } },
407         },
408         [EM2821_BOARD_USBGEAR_VD204] = {
409                 .name         = "Usbgear VD204v9",
410                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
411                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
412                 .decoder      = EM28XX_SAA711X,
413                 .input        = { {
414                         .type  = EM28XX_VMUX_COMPOSITE1,
415                         .vmux  = SAA7115_COMPOSITE0,
416                         .amux  = EM28XX_AMUX_LINE_IN,
417                 }, {
418                         .type  = EM28XX_VMUX_SVIDEO,
419                         .vmux  = SAA7115_SVIDEO3,
420                         .amux  = EM28XX_AMUX_LINE_IN,
421                 } },
422         },
423         [EM2860_BOARD_NETGMBH_CAM] = {
424                 /* Beijing Huaqi Information Digital Technology Co., Ltd */
425                 .name         = "NetGMBH Cam",
426                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
427                 .tuner_type   = TUNER_ABSENT,   /* This is a webcam */
428                 .input        = { {
429                         .type     = EM28XX_VMUX_COMPOSITE1,
430                         .vmux     = 0,
431                         .amux     = EM28XX_AMUX_VIDEO,
432                 } },
433         },
434         [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
435                 .name         = "Typhoon DVD Maker",
436                 .decoder      = EM28XX_SAA711X,
437                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
438                 .input        = { {
439                         .type  = EM28XX_VMUX_COMPOSITE1,
440                         .vmux  = SAA7115_COMPOSITE0,
441                         .amux  = EM28XX_AMUX_LINE_IN,
442                 }, {
443                         .type  = EM28XX_VMUX_SVIDEO,
444                         .vmux  = SAA7115_SVIDEO3,
445                         .amux  = EM28XX_AMUX_LINE_IN,
446                 } },
447         },
448         [EM2860_BOARD_GADMEI_UTV330] = {
449                 .name         = "Gadmei UTV330",
450                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
451                 .tuner_type   = TUNER_TNF_5335MF,
452                 .tda9887_conf = TDA9887_PRESENT,
453                 .decoder      = EM28XX_SAA711X,
454                 .input        = { {
455                         .type     = EM28XX_VMUX_TELEVISION,
456                         .vmux     = SAA7115_COMPOSITE2,
457                         .amux     = EM28XX_AMUX_VIDEO,
458                 }, {
459                         .type     = EM28XX_VMUX_COMPOSITE1,
460                         .vmux     = SAA7115_COMPOSITE0,
461                         .amux     = EM28XX_AMUX_LINE_IN,
462                 }, {
463                         .type     = EM28XX_VMUX_SVIDEO,
464                         .vmux     = SAA7115_SVIDEO3,
465                         .amux     = EM28XX_AMUX_LINE_IN,
466                 } },
467         },
468         [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
469                 .name         = "Terratec Cinergy A Hybrid XS",
470                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
471                 .tuner_type   = TUNER_XC2028,
472                 .tuner_gpio   = default_tuner_gpio,
473                 .decoder      = EM28XX_TVP5150,
474
475                 .input        = { {
476                         .type     = EM28XX_VMUX_TELEVISION,
477                         .vmux     = TVP5150_COMPOSITE0,
478                         .amux     = EM28XX_AMUX_VIDEO,
479                         .gpio     = hauppauge_wintv_hvr_900_analog,
480                 }, {
481                         .type     = EM28XX_VMUX_COMPOSITE1,
482                         .vmux     = TVP5150_COMPOSITE1,
483                         .amux     = EM28XX_AMUX_LINE_IN,
484                         .gpio     = hauppauge_wintv_hvr_900_analog,
485                 }, {
486                         .type     = EM28XX_VMUX_SVIDEO,
487                         .vmux     = TVP5150_SVIDEO,
488                         .amux     = EM28XX_AMUX_LINE_IN,
489                         .gpio     = hauppauge_wintv_hvr_900_analog,
490                 } },
491         },
492         [EM2861_BOARD_KWORLD_PVRTV_300U] = {
493                 .name         = "KWorld PVRTV 300U",
494                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
495                 .tuner_type   = TUNER_XC2028,
496                 .tuner_gpio   = default_tuner_gpio,
497                 .decoder      = EM28XX_TVP5150,
498                 .input        = { {
499                         .type     = EM28XX_VMUX_TELEVISION,
500                         .vmux     = TVP5150_COMPOSITE0,
501                         .amux     = EM28XX_AMUX_VIDEO,
502                 }, {
503                         .type     = EM28XX_VMUX_COMPOSITE1,
504                         .vmux     = TVP5150_COMPOSITE1,
505                         .amux     = EM28XX_AMUX_LINE_IN,
506                 }, {
507                         .type     = EM28XX_VMUX_SVIDEO,
508                         .vmux     = TVP5150_SVIDEO,
509                         .amux     = EM28XX_AMUX_LINE_IN,
510                 } },
511         },
512         [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
513                 .name          = "Yakumo MovieMixer",
514                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
515                 .decoder       = EM28XX_TVP5150,
516                 .input         = { {
517                         .type     = EM28XX_VMUX_TELEVISION,
518                         .vmux     = TVP5150_COMPOSITE0,
519                         .amux     = EM28XX_AMUX_VIDEO,
520                 }, {
521                         .type     = EM28XX_VMUX_COMPOSITE1,
522                         .vmux     = TVP5150_COMPOSITE1,
523                         .amux     = EM28XX_AMUX_LINE_IN,
524                 }, {
525                         .type     = EM28XX_VMUX_SVIDEO,
526                         .vmux     = TVP5150_SVIDEO,
527                         .amux     = EM28XX_AMUX_LINE_IN,
528                 } },
529         },
530         [EM2861_BOARD_PLEXTOR_PX_TV100U] = {
531                 .name         = "Plextor ConvertX PX-TV100U",
532                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
533                 .tuner_type   = TUNER_TNF_5335MF,
534                 .tda9887_conf = TDA9887_PRESENT,
535                 .decoder      = EM28XX_TVP5150,
536                 .input        = { {
537                         .type     = EM28XX_VMUX_TELEVISION,
538                         .vmux     = TVP5150_COMPOSITE0,
539                         .amux     = EM28XX_AMUX_LINE_IN,
540                 }, {
541                         .type     = EM28XX_VMUX_COMPOSITE1,
542                         .vmux     = TVP5150_COMPOSITE1,
543                         .amux     = EM28XX_AMUX_LINE_IN,
544                 }, {
545                         .type     = EM28XX_VMUX_SVIDEO,
546                         .vmux     = TVP5150_SVIDEO,
547                         .amux     = EM28XX_AMUX_LINE_IN,
548                 } },
549         },
550
551         /* Those boards with em2870 are DVB Only*/
552
553         [EM2870_BOARD_TERRATEC_XS] = {
554                 .name         = "Terratec Cinergy T XS",
555                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
556                 .tuner_type   = TUNER_XC2028,
557                 .tuner_gpio   = default_tuner_gpio,
558         },
559         [EM2870_BOARD_TERRATEC_XS_MT2060] = {
560                 .name         = "Terratec Cinergy T XS (MT2060)",
561                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
562                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
563         },
564         [EM2870_BOARD_KWORLD_350U] = {
565                 .name         = "Kworld 350 U DVB-T",
566                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
567                 .tuner_type   = TUNER_XC2028,
568                 .tuner_gpio   = default_tuner_gpio,
569         },
570         [EM2870_BOARD_KWORLD_355U] = {
571                 .name         = "Kworld 355 U DVB-T",
572                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
573         },
574         [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
575                 .name         = "Pinnacle PCTV DVB-T",
576                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
577                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
578                 /* djh - I have serious doubts this is right... */
579                 .xclk         = EM28XX_XCLK_IR_RC5_MODE |
580                                 EM28XX_XCLK_FREQUENCY_10MHZ,
581         },
582         [EM2870_BOARD_COMPRO_VIDEOMATE] = {
583                 .name         = "Compro, VideoMate U3",
584                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
585                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
586         },
587
588         [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
589                 .name         = "Terratec Hybrid XS Secam",
590                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
591                 .has_msp34xx  = 1,
592                 .tuner_type   = TUNER_XC2028,
593                 .tuner_gpio   = default_tuner_gpio,
594                 .decoder      = EM28XX_TVP5150,
595                 .input        = { {
596                         .type     = EM28XX_VMUX_TELEVISION,
597                         .vmux     = TVP5150_COMPOSITE0,
598                         .amux     = EM28XX_AMUX_VIDEO,
599                         .gpio     = default_analog,
600                 }, {
601                         .type     = EM28XX_VMUX_COMPOSITE1,
602                         .vmux     = TVP5150_COMPOSITE1,
603                         .amux     = EM28XX_AMUX_LINE_IN,
604                         .gpio     = default_analog,
605                 }, {
606                         .type     = EM28XX_VMUX_SVIDEO,
607                         .vmux     = TVP5150_SVIDEO,
608                         .amux     = EM28XX_AMUX_LINE_IN,
609                         .gpio     = default_analog,
610                 } },
611         },
612         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
613                 .name         = "Hauppauge WinTV HVR 900",
614                 .tda9887_conf = TDA9887_PRESENT,
615                 .tuner_type   = TUNER_XC2028,
616                 .tuner_gpio   = default_tuner_gpio,
617                 .mts_firmware = 1,
618                 .has_dvb      = 1,
619                 .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
620                 .decoder      = EM28XX_TVP5150,
621                 .input        = { {
622                         .type     = EM28XX_VMUX_TELEVISION,
623                         .vmux     = TVP5150_COMPOSITE0,
624                         .amux     = EM28XX_AMUX_VIDEO,
625                         .gpio     = hauppauge_wintv_hvr_900_analog,
626                 }, {
627                         .type     = EM28XX_VMUX_COMPOSITE1,
628                         .vmux     = TVP5150_COMPOSITE1,
629                         .amux     = EM28XX_AMUX_LINE_IN,
630                         .gpio     = hauppauge_wintv_hvr_900_analog,
631                 }, {
632                         .type     = EM28XX_VMUX_SVIDEO,
633                         .vmux     = TVP5150_SVIDEO,
634                         .amux     = EM28XX_AMUX_LINE_IN,
635                         .gpio     = hauppauge_wintv_hvr_900_analog,
636                 } },
637         },
638         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
639                 .name         = "Hauppauge WinTV HVR 900 (R2)",
640                 .tda9887_conf = TDA9887_PRESENT,
641                 .tuner_type   = TUNER_XC2028,
642                 .tuner_gpio   = default_tuner_gpio,
643                 .mts_firmware = 1,
644                 .decoder      = EM28XX_TVP5150,
645                 .input        = { {
646                         .type     = EM28XX_VMUX_TELEVISION,
647                         .vmux     = TVP5150_COMPOSITE0,
648                         .amux     = EM28XX_AMUX_VIDEO,
649                         .gpio     = hauppauge_wintv_hvr_900_analog,
650                 }, {
651                         .type     = EM28XX_VMUX_COMPOSITE1,
652                         .vmux     = TVP5150_COMPOSITE1,
653                         .amux     = EM28XX_AMUX_LINE_IN,
654                         .gpio     = hauppauge_wintv_hvr_900_analog,
655                 }, {
656                         .type     = EM28XX_VMUX_SVIDEO,
657                         .vmux     = TVP5150_SVIDEO,
658                         .amux     = EM28XX_AMUX_LINE_IN,
659                         .gpio     = hauppauge_wintv_hvr_900_analog,
660                 } },
661         },
662         [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
663                 .name           = "Hauppauge WinTV HVR 850",
664                 .tuner_type     = TUNER_XC2028,
665                 .tuner_gpio     = default_tuner_gpio,
666                 .mts_firmware   = 1,
667                 .has_dvb        = 1,
668                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
669                 .ir_codes       = ir_codes_hauppauge_new,
670                 .decoder        = EM28XX_TVP5150,
671                 .input          = { {
672                         .type     = EM28XX_VMUX_TELEVISION,
673                         .vmux     = TVP5150_COMPOSITE0,
674                         .amux     = EM28XX_AMUX_VIDEO,
675                         .gpio     = hauppauge_wintv_hvr_900_analog,
676                 }, {
677                         .type     = EM28XX_VMUX_COMPOSITE1,
678                         .vmux     = TVP5150_COMPOSITE1,
679                         .amux     = EM28XX_AMUX_LINE_IN,
680                         .gpio     = hauppauge_wintv_hvr_900_analog,
681                 }, {
682                         .type     = EM28XX_VMUX_SVIDEO,
683                         .vmux     = TVP5150_SVIDEO,
684                         .amux     = EM28XX_AMUX_LINE_IN,
685                         .gpio     = hauppauge_wintv_hvr_900_analog,
686                 } },
687         },
688         [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
689                 .name           = "Hauppauge WinTV HVR 950",
690                 .tuner_type     = TUNER_XC2028,
691                 .tuner_gpio     = default_tuner_gpio,
692                 .mts_firmware   = 1,
693                 .has_dvb        = 1,
694                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
695                 .ir_codes       = ir_codes_hauppauge_new,
696                 .decoder        = EM28XX_TVP5150,
697                 .input          = { {
698                         .type     = EM28XX_VMUX_TELEVISION,
699                         .vmux     = TVP5150_COMPOSITE0,
700                         .amux     = EM28XX_AMUX_VIDEO,
701                         .gpio     = hauppauge_wintv_hvr_900_analog,
702                 }, {
703                         .type     = EM28XX_VMUX_COMPOSITE1,
704                         .vmux     = TVP5150_COMPOSITE1,
705                         .amux     = EM28XX_AMUX_LINE_IN,
706                         .gpio     = hauppauge_wintv_hvr_900_analog,
707                 }, {
708                         .type     = EM28XX_VMUX_SVIDEO,
709                         .vmux     = TVP5150_SVIDEO,
710                         .amux     = EM28XX_AMUX_LINE_IN,
711                         .gpio     = hauppauge_wintv_hvr_900_analog,
712                 } },
713         },
714         [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
715                 .name           = "Pinnacle PCTV HD Pro Stick",
716                 .tuner_type     = TUNER_XC2028,
717                 .tuner_gpio   = default_tuner_gpio,
718                 .mts_firmware   = 1,
719                 .has_dvb        = 1,
720                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
721                 .ir_codes       = ir_codes_pinnacle_pctv_hd,
722                 .decoder        = EM28XX_TVP5150,
723                 .input          = { {
724                         .type     = EM28XX_VMUX_TELEVISION,
725                         .vmux     = TVP5150_COMPOSITE0,
726                         .amux     = EM28XX_AMUX_VIDEO,
727                         .gpio     = hauppauge_wintv_hvr_900_analog,
728                 }, {
729                         .type     = EM28XX_VMUX_COMPOSITE1,
730                         .vmux     = TVP5150_COMPOSITE1,
731                         .amux     = EM28XX_AMUX_LINE_IN,
732                         .gpio     = hauppauge_wintv_hvr_900_analog,
733                 }, {
734                         .type     = EM28XX_VMUX_SVIDEO,
735                         .vmux     = TVP5150_SVIDEO,
736                         .amux     = EM28XX_AMUX_LINE_IN,
737                         .gpio     = hauppauge_wintv_hvr_900_analog,
738                 } },
739         },
740         [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
741                 .name           = "AMD ATI TV Wonder HD 600",
742                 .tuner_type     = TUNER_XC2028,
743                 .tuner_gpio     = default_tuner_gpio,
744                 .mts_firmware   = 1,
745                 .has_dvb        = 1,
746                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
747                 .ir_codes       = ir_codes_ati_tv_wonder_hd_600,
748                 .decoder        = EM28XX_TVP5150,
749                 .input          = { {
750                         .type     = EM28XX_VMUX_TELEVISION,
751                         .vmux     = TVP5150_COMPOSITE0,
752                         .amux     = EM28XX_AMUX_VIDEO,
753                         .gpio     = hauppauge_wintv_hvr_900_analog,
754                 }, {
755                         .type     = EM28XX_VMUX_COMPOSITE1,
756                         .vmux     = TVP5150_COMPOSITE1,
757                         .amux     = EM28XX_AMUX_LINE_IN,
758                         .gpio     = hauppauge_wintv_hvr_900_analog,
759                 }, {
760                         .type     = EM28XX_VMUX_SVIDEO,
761                         .vmux     = TVP5150_SVIDEO,
762                         .amux     = EM28XX_AMUX_LINE_IN,
763                         .gpio     = hauppauge_wintv_hvr_900_analog,
764                 } },
765         },
766         [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
767                 .name           = "Terratec Hybrid XS",
768                 .tuner_type     = TUNER_XC2028,
769                 .tuner_gpio     = default_tuner_gpio,
770                 .decoder        = EM28XX_TVP5150,
771                 .has_dvb        = 1,
772                 .dvb_gpio       = default_analog,
773                 .input          = { {
774                         .type     = EM28XX_VMUX_TELEVISION,
775                         .vmux     = TVP5150_COMPOSITE0,
776                         .amux     = EM28XX_AMUX_VIDEO,
777                         .gpio     = default_analog,
778                 }, {
779                         .type     = EM28XX_VMUX_COMPOSITE1,
780                         .vmux     = TVP5150_COMPOSITE1,
781                         .amux     = EM28XX_AMUX_LINE_IN,
782                         .gpio     = default_analog,
783                 }, {
784                         .type     = EM28XX_VMUX_SVIDEO,
785                         .vmux     = TVP5150_SVIDEO,
786                         .amux     = EM28XX_AMUX_LINE_IN,
787                         .gpio     = default_analog,
788                 } },
789         },
790         /* maybe there's a reason behind it why Terratec sells the Hybrid XS
791            as Prodigy XS with a different PID, let's keep it separated for now
792            maybe we'll need it lateron */
793         [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
794                 .name         = "Terratec Prodigy XS",
795                 .tuner_type   = TUNER_XC2028,
796                 .tuner_gpio   = default_tuner_gpio,
797                 .decoder      = EM28XX_TVP5150,
798                 .input        = { {
799                         .type     = EM28XX_VMUX_TELEVISION,
800                         .vmux     = TVP5150_COMPOSITE0,
801                         .amux     = EM28XX_AMUX_VIDEO,
802                         .gpio     = hauppauge_wintv_hvr_900_analog,
803                 }, {
804                         .type     = EM28XX_VMUX_COMPOSITE1,
805                         .vmux     = TVP5150_COMPOSITE1,
806                         .amux     = EM28XX_AMUX_LINE_IN,
807                         .gpio     = hauppauge_wintv_hvr_900_analog,
808                 }, {
809                         .type     = EM28XX_VMUX_SVIDEO,
810                         .vmux     = TVP5150_SVIDEO,
811                         .amux     = EM28XX_AMUX_LINE_IN,
812                         .gpio     = hauppauge_wintv_hvr_900_analog,
813                 } },
814         },
815         [EM2820_BOARD_MSI_VOX_USB_2] = {
816                 .name              = "MSI VOX USB 2.0",
817                 .tuner_type        = TUNER_LG_PAL_NEW_TAPC,
818                 .tda9887_conf      = TDA9887_PRESENT      |
819                                      TDA9887_PORT1_ACTIVE |
820                                      TDA9887_PORT2_ACTIVE,
821                 .max_range_640_480 = 1,
822                 .decoder           = EM28XX_SAA711X,
823                 .input             = { {
824                         .type      = EM28XX_VMUX_TELEVISION,
825                         .vmux      = SAA7115_COMPOSITE4,
826                         .amux      = EM28XX_AMUX_VIDEO,
827                 }, {
828                         .type      = EM28XX_VMUX_COMPOSITE1,
829                         .vmux      = SAA7115_COMPOSITE0,
830                         .amux      = EM28XX_AMUX_LINE_IN,
831                 }, {
832                         .type      = EM28XX_VMUX_SVIDEO,
833                         .vmux      = SAA7115_SVIDEO3,
834                         .amux      = EM28XX_AMUX_LINE_IN,
835                 } },
836         },
837         [EM2800_BOARD_TERRATEC_CINERGY_200] = {
838                 .name         = "Terratec Cinergy 200 USB",
839                 .is_em2800    = 1,
840                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
841                 .tda9887_conf = TDA9887_PRESENT,
842                 .decoder      = EM28XX_SAA711X,
843                 .input        = { {
844                         .type     = EM28XX_VMUX_TELEVISION,
845                         .vmux     = SAA7115_COMPOSITE2,
846                         .amux     = EM28XX_AMUX_VIDEO,
847                 }, {
848                         .type     = EM28XX_VMUX_COMPOSITE1,
849                         .vmux     = SAA7115_COMPOSITE0,
850                         .amux     = EM28XX_AMUX_LINE_IN,
851                 }, {
852                         .type     = EM28XX_VMUX_SVIDEO,
853                         .vmux     = SAA7115_SVIDEO3,
854                         .amux     = EM28XX_AMUX_LINE_IN,
855                 } },
856         },
857         [EM2800_BOARD_GRABBEEX_USB2800] = {
858                 .name         = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
859                 .is_em2800    = 1,
860                 .decoder      = EM28XX_SAA711X,
861                 .tuner_type   = TUNER_ABSENT, /* capture only board */
862                 .input        = { {
863                         .type     = EM28XX_VMUX_COMPOSITE1,
864                         .vmux     = SAA7115_COMPOSITE0,
865                         .amux     = EM28XX_AMUX_LINE_IN,
866                 }, {
867                         .type     = EM28XX_VMUX_SVIDEO,
868                         .vmux     = SAA7115_SVIDEO3,
869                         .amux     = EM28XX_AMUX_LINE_IN,
870                 } },
871         },
872         [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
873                 .name         = "Leadtek Winfast USB II",
874                 .is_em2800    = 1,
875                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
876                 .tda9887_conf = TDA9887_PRESENT,
877                 .decoder      = EM28XX_SAA711X,
878                 .input        = { {
879                         .type     = EM28XX_VMUX_TELEVISION,
880                         .vmux     = SAA7115_COMPOSITE2,
881                         .amux     = EM28XX_AMUX_VIDEO,
882                 }, {
883                         .type     = EM28XX_VMUX_COMPOSITE1,
884                         .vmux     = SAA7115_COMPOSITE0,
885                         .amux     = EM28XX_AMUX_LINE_IN,
886                 }, {
887                         .type     = EM28XX_VMUX_SVIDEO,
888                         .vmux     = SAA7115_SVIDEO3,
889                         .amux     = EM28XX_AMUX_LINE_IN,
890                 } },
891         },
892         [EM2800_BOARD_KWORLD_USB2800] = {
893                 .name         = "Kworld USB2800",
894                 .is_em2800    = 1,
895                 .tuner_type   = TUNER_PHILIPS_FCV1236D,
896                 .tda9887_conf = TDA9887_PRESENT,
897                 .decoder      = EM28XX_SAA711X,
898                 .input        = { {
899                         .type     = EM28XX_VMUX_TELEVISION,
900                         .vmux     = SAA7115_COMPOSITE2,
901                         .amux     = EM28XX_AMUX_VIDEO,
902                 }, {
903                         .type     = EM28XX_VMUX_COMPOSITE1,
904                         .vmux     = SAA7115_COMPOSITE0,
905                         .amux     = EM28XX_AMUX_LINE_IN,
906                 }, {
907                         .type     = EM28XX_VMUX_SVIDEO,
908                         .vmux     = SAA7115_SVIDEO3,
909                         .amux     = EM28XX_AMUX_LINE_IN,
910                 } },
911         },
912         [EM2820_BOARD_PINNACLE_DVC_90] = {
913                 .name         = "Pinnacle Dazzle DVC 90/DVC 100",
914                 .tuner_type   = TUNER_ABSENT, /* capture only board */
915                 .decoder      = EM28XX_SAA711X,
916                 .input        = { {
917                         .type     = EM28XX_VMUX_COMPOSITE1,
918                         .vmux     = SAA7115_COMPOSITE0,
919                         .amux     = EM28XX_AMUX_LINE_IN,
920                 }, {
921                         .type     = EM28XX_VMUX_SVIDEO,
922                         .vmux     = SAA7115_SVIDEO3,
923                         .amux     = EM28XX_AMUX_LINE_IN,
924                 } },
925         },
926         [EM2800_BOARD_VGEAR_POCKETTV] = {
927                 .name         = "V-Gear PocketTV",
928                 .is_em2800    = 1,
929                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
930                 .tda9887_conf = TDA9887_PRESENT,
931                 .decoder      = EM28XX_SAA711X,
932                 .input        = { {
933                         .type     = EM28XX_VMUX_TELEVISION,
934                         .vmux     = SAA7115_COMPOSITE2,
935                         .amux     = EM28XX_AMUX_VIDEO,
936                 }, {
937                         .type     = EM28XX_VMUX_COMPOSITE1,
938                         .vmux     = SAA7115_COMPOSITE0,
939                         .amux     = EM28XX_AMUX_LINE_IN,
940                 }, {
941                         .type     = EM28XX_VMUX_SVIDEO,
942                         .vmux     = SAA7115_SVIDEO3,
943                         .amux     = EM28XX_AMUX_LINE_IN,
944                 } },
945         },
946         [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
947                 .name         = "Pixelview Prolink PlayTV USB 2.0",
948                 .tda9887_conf = TDA9887_PRESENT,
949                 .tuner_type   = TUNER_YMEC_TVF_5533MF,
950                 .decoder      = EM28XX_SAA711X,
951                 .input        = { {
952                         .type     = EM28XX_VMUX_TELEVISION,
953                         .vmux     = SAA7115_COMPOSITE2,
954                         .amux     = EM28XX_AMUX_VIDEO,
955                         .aout     = EM28XX_AOUT_MONO |  /* I2S */
956                                     EM28XX_AOUT_MASTER, /* Line out pin */
957                 }, {
958                         .type     = EM28XX_VMUX_COMPOSITE1,
959                         .vmux     = SAA7115_COMPOSITE0,
960                         .amux     = EM28XX_AMUX_LINE_IN,
961                 }, {
962                         .type     = EM28XX_VMUX_SVIDEO,
963                         .vmux     = SAA7115_SVIDEO3,
964                         .amux     = EM28XX_AMUX_LINE_IN,
965                 } },
966         },
967         [EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA] = {
968                 .name                = "PointNix Intra-Oral Camera",
969                 .has_snapshot_button = 1,
970                 .tda9887_conf        = TDA9887_PRESENT,
971                 .tuner_type          = TUNER_ABSENT,
972                 .decoder             = EM28XX_SAA711X,
973                 .input               = { {
974                         .type     = EM28XX_VMUX_SVIDEO,
975                         .vmux     = SAA7115_SVIDEO3,
976                         .amux     = EM28XX_AMUX_VIDEO,
977                 } },
978         },
979         [EM2880_BOARD_MSI_DIGIVOX_AD] = {
980                 .name         = "MSI DigiVox A/D",
981                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
982                 .tuner_type   = TUNER_XC2028,
983                 .tuner_gpio   = default_tuner_gpio,
984                 .decoder      = EM28XX_TVP5150,
985                 .input        = { {
986                         .type     = EM28XX_VMUX_TELEVISION,
987                         .vmux     = TVP5150_COMPOSITE0,
988                         .amux     = EM28XX_AMUX_VIDEO,
989                         .gpio     = em2880_msi_digivox_ad_analog,
990                 }, {
991                         .type     = EM28XX_VMUX_COMPOSITE1,
992                         .vmux     = TVP5150_COMPOSITE1,
993                         .amux     = EM28XX_AMUX_LINE_IN,
994                         .gpio     = em2880_msi_digivox_ad_analog,
995                 }, {
996                         .type     = EM28XX_VMUX_SVIDEO,
997                         .vmux     = TVP5150_SVIDEO,
998                         .amux     = EM28XX_AMUX_LINE_IN,
999                         .gpio     = em2880_msi_digivox_ad_analog,
1000                 } },
1001         },
1002         [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
1003                 .name         = "MSI DigiVox A/D II",
1004                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1005                 .tuner_type   = TUNER_XC2028,
1006                 .tuner_gpio   = default_tuner_gpio,
1007                 .decoder      = EM28XX_TVP5150,
1008                 .input        = { {
1009                         .type     = EM28XX_VMUX_TELEVISION,
1010                         .vmux     = TVP5150_COMPOSITE0,
1011                         .amux     = EM28XX_AMUX_VIDEO,
1012                         .gpio     = em2880_msi_digivox_ad_analog,
1013                 }, {
1014                         .type     = EM28XX_VMUX_COMPOSITE1,
1015                         .vmux     = TVP5150_COMPOSITE1,
1016                         .amux     = EM28XX_AMUX_LINE_IN,
1017                         .gpio     = em2880_msi_digivox_ad_analog,
1018                 }, {
1019                         .type     = EM28XX_VMUX_SVIDEO,
1020                         .vmux     = TVP5150_SVIDEO,
1021                         .amux     = EM28XX_AMUX_LINE_IN,
1022                         .gpio     = em2880_msi_digivox_ad_analog,
1023                 } },
1024         },
1025         [EM2880_BOARD_KWORLD_DVB_305U] = {
1026                 .name         = "KWorld DVB-T 305U",
1027                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1028                 .tuner_type   = TUNER_XC2028,
1029                 .tuner_gpio   = default_tuner_gpio,
1030                 .decoder      = EM28XX_TVP5150,
1031                 .input        = { {
1032                         .type     = EM28XX_VMUX_TELEVISION,
1033                         .vmux     = TVP5150_COMPOSITE0,
1034                         .amux     = EM28XX_AMUX_VIDEO,
1035                 }, {
1036                         .type     = EM28XX_VMUX_COMPOSITE1,
1037                         .vmux     = TVP5150_COMPOSITE1,
1038                         .amux     = EM28XX_AMUX_LINE_IN,
1039                 }, {
1040                         .type     = EM28XX_VMUX_SVIDEO,
1041                         .vmux     = TVP5150_SVIDEO,
1042                         .amux     = EM28XX_AMUX_LINE_IN,
1043                 } },
1044         },
1045         [EM2880_BOARD_KWORLD_DVB_310U] = {
1046                 .name         = "KWorld DVB-T 310U",
1047                 .tuner_type   = TUNER_XC2028,
1048                 .tuner_gpio   = default_tuner_gpio,
1049                 .has_dvb      = 1,
1050                 .dvb_gpio     = default_digital,
1051                 .mts_firmware = 1,
1052                 .decoder      = EM28XX_TVP5150,
1053                 .input        = { {
1054                         .type     = EM28XX_VMUX_TELEVISION,
1055                         .vmux     = TVP5150_COMPOSITE0,
1056                         .amux     = EM28XX_AMUX_VIDEO,
1057                         .gpio     = default_analog,
1058                 }, {
1059                         .type     = EM28XX_VMUX_COMPOSITE1,
1060                         .vmux     = TVP5150_COMPOSITE1,
1061                         .amux     = EM28XX_AMUX_LINE_IN,
1062                         .gpio     = default_analog,
1063                 }, {    /* S-video has not been tested yet */
1064                         .type     = EM28XX_VMUX_SVIDEO,
1065                         .vmux     = TVP5150_SVIDEO,
1066                         .amux     = EM28XX_AMUX_LINE_IN,
1067                         .gpio     = default_analog,
1068                 } },
1069         },
1070         [EM2881_BOARD_DNT_DA2_HYBRID] = {
1071                 .name         = "DNT DA2 Hybrid",
1072                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1073                 .tuner_type   = TUNER_XC2028,
1074                 .tuner_gpio   = default_tuner_gpio,
1075                 .decoder      = EM28XX_TVP5150,
1076                 .input        = { {
1077                         .type     = EM28XX_VMUX_TELEVISION,
1078                         .vmux     = TVP5150_COMPOSITE0,
1079                         .amux     = EM28XX_AMUX_VIDEO,
1080                         .gpio     = default_analog,
1081                 }, {
1082                         .type     = EM28XX_VMUX_COMPOSITE1,
1083                         .vmux     = TVP5150_COMPOSITE1,
1084                         .amux     = EM28XX_AMUX_LINE_IN,
1085                         .gpio     = default_analog,
1086                 }, {
1087                         .type     = EM28XX_VMUX_SVIDEO,
1088                         .vmux     = TVP5150_SVIDEO,
1089                         .amux     = EM28XX_AMUX_LINE_IN,
1090                         .gpio     = default_analog,
1091                 } },
1092         },
1093         [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
1094                 .name         = "Pinnacle Hybrid Pro",
1095                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1096                 .tuner_type   = TUNER_XC2028,
1097                 .tuner_gpio   = default_tuner_gpio,
1098                 .decoder      = EM28XX_TVP5150,
1099                 .input        = { {
1100                         .type     = EM28XX_VMUX_TELEVISION,
1101                         .vmux     = TVP5150_COMPOSITE0,
1102                         .amux     = EM28XX_AMUX_VIDEO,
1103                         .gpio     = default_analog,
1104                 }, {
1105                         .type     = EM28XX_VMUX_COMPOSITE1,
1106                         .vmux     = TVP5150_COMPOSITE1,
1107                         .amux     = EM28XX_AMUX_LINE_IN,
1108                         .gpio     = default_analog,
1109                 }, {
1110                         .type     = EM28XX_VMUX_SVIDEO,
1111                         .vmux     = TVP5150_SVIDEO,
1112                         .amux     = EM28XX_AMUX_LINE_IN,
1113                         .gpio     = default_analog,
1114                 } },
1115         },
1116         [EM2882_BOARD_PINNACLE_HYBRID_PRO] = {
1117                 .name         = "Pinnacle Hybrid Pro (2)",
1118                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1119                 .tuner_type   = TUNER_XC2028,
1120                 .tuner_gpio   = default_tuner_gpio,
1121                 .mts_firmware = 1,
1122                 .decoder      = EM28XX_TVP5150,
1123                 .input        = { {
1124                         .type     = EM28XX_VMUX_TELEVISION,
1125                         .vmux     = TVP5150_COMPOSITE0,
1126                         .amux     = EM28XX_AMUX_VIDEO,
1127                         .gpio     = hauppauge_wintv_hvr_900_analog,
1128                 }, {
1129                         .type     = EM28XX_VMUX_COMPOSITE1,
1130                         .vmux     = TVP5150_COMPOSITE1,
1131                         .amux     = EM28XX_AMUX_LINE_IN,
1132                         .gpio     = hauppauge_wintv_hvr_900_analog,
1133                 }, {
1134                         .type     = EM28XX_VMUX_SVIDEO,
1135                         .vmux     = TVP5150_SVIDEO,
1136                         .amux     = EM28XX_AMUX_LINE_IN,
1137                         .gpio     = hauppauge_wintv_hvr_900_analog,
1138                 } },
1139         },
1140         [EM2882_BOARD_KWORLD_VS_DVBT] = {
1141                 .name         = "Kworld VS-DVB-T 323UR",
1142                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1143                 .tuner_type   = TUNER_XC2028,
1144                 .tuner_gpio   = default_tuner_gpio,
1145                 .decoder      = EM28XX_TVP5150,
1146                 .input        = { {
1147                         .type     = EM28XX_VMUX_TELEVISION,
1148                         .vmux     = TVP5150_COMPOSITE0,
1149                         .amux     = EM28XX_AMUX_VIDEO,
1150                 }, {
1151                         .type     = EM28XX_VMUX_COMPOSITE1,
1152                         .vmux     = TVP5150_COMPOSITE1,
1153                         .amux     = EM28XX_AMUX_LINE_IN,
1154                 }, {
1155                         .type     = EM28XX_VMUX_SVIDEO,
1156                         .vmux     = TVP5150_SVIDEO,
1157                         .amux     = EM28XX_AMUX_LINE_IN,
1158                 } },
1159         },
1160         [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
1161                 .name         = "Terratec Hybrid XS (em2882)",
1162                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1163                 .tuner_type   = TUNER_XC2028,
1164                 .tuner_gpio   = default_tuner_gpio,
1165                 .decoder      = EM28XX_TVP5150,
1166                 .input        = { {
1167                         .type     = EM28XX_VMUX_TELEVISION,
1168                         .vmux     = TVP5150_COMPOSITE0,
1169                         .amux     = EM28XX_AMUX_VIDEO,
1170                         .gpio     = hauppauge_wintv_hvr_900_analog,
1171                 }, {
1172                         .type     = EM28XX_VMUX_COMPOSITE1,
1173                         .vmux     = TVP5150_COMPOSITE1,
1174                         .amux     = EM28XX_AMUX_LINE_IN,
1175                         .gpio     = hauppauge_wintv_hvr_900_analog,
1176                 }, {
1177                         .type     = EM28XX_VMUX_SVIDEO,
1178                         .vmux     = TVP5150_SVIDEO,
1179                         .amux     = EM28XX_AMUX_LINE_IN,
1180                         .gpio     = hauppauge_wintv_hvr_900_analog,
1181                 } },
1182         },
1183         [EM2883_BOARD_KWORLD_HYBRID_A316] = {
1184                 .name         = "Kworld PlusTV HD Hybrid 330",
1185                 .tuner_type   = TUNER_XC2028,
1186                 .tuner_gpio   = default_tuner_gpio,
1187                 .decoder      = EM28XX_TVP5150,
1188                 .mts_firmware = 1,
1189                 .has_dvb      = 1,
1190                 .dvb_gpio     = default_digital,
1191                 .input        = { {
1192                         .type     = EM28XX_VMUX_TELEVISION,
1193                         .vmux     = TVP5150_COMPOSITE0,
1194                         .amux     = EM28XX_AMUX_VIDEO,
1195                         .gpio     = default_analog,
1196                 }, {
1197                         .type     = EM28XX_VMUX_COMPOSITE1,
1198                         .vmux     = TVP5150_COMPOSITE1,
1199                         .amux     = EM28XX_AMUX_LINE_IN,
1200                         .gpio     = hauppauge_wintv_hvr_900_analog,
1201                 }, {
1202                         .type     = EM28XX_VMUX_SVIDEO,
1203                         .vmux     = TVP5150_SVIDEO,
1204                         .amux     = EM28XX_AMUX_LINE_IN,
1205                         .gpio     = hauppauge_wintv_hvr_900_analog,
1206                 } },
1207         },
1208         [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
1209                 .name         = "Compro VideoMate ForYou/Stereo",
1210                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1211                 .tda9887_conf = TDA9887_PRESENT,
1212                 .decoder      = EM28XX_TVP5150,
1213                 .input        = { {
1214                         .type     = EM28XX_VMUX_TELEVISION,
1215                         .vmux     = TVP5150_COMPOSITE0,
1216                         .amux     = EM28XX_AMUX_LINE_IN,
1217                 }, {
1218                         .type     = EM28XX_VMUX_SVIDEO,
1219                         .vmux     = TVP5150_SVIDEO,
1220                         .amux     = EM28XX_AMUX_LINE_IN,
1221                 } },
1222         },
1223
1224         /* em2874 tuners are DVB only */
1225
1226         [EM2874_BOARD_PINNACLE_PCTV_80E] = {
1227                 .name         = "Pinnacle PCTV HD Mini",
1228                 .tuner_type   = TUNER_ABSENT,
1229                 .has_dvb      = 1,
1230                 .dvb_gpio     = em2874_pinnacle_80e_digital,
1231                 .ir_codes     = ir_codes_pinnacle_pctv_hd,
1232                 .decoder      = EM28XX_NODECODER,
1233                 .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1234                                 EM2874_I2C_SECONDARY_BUS_SELECT |
1235                                 EM28XX_I2C_FREQ_400_KHZ,
1236 #ifdef DJH_DEBUG
1237                 .input        = { {
1238                         .type     = EM28XX_VMUX_TELEVISION,
1239                         .vmux     = TVP5150_COMPOSITE0,
1240                         .amux     = EM28XX_AMUX_LINE_IN,
1241                 } },
1242 #endif
1243         },
1244 };
1245 const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
1246
1247 /* table of devices that work with this driver */
1248 struct usb_device_id em28xx_id_table [] = {
1249         { USB_DEVICE(0xeb1a, 0x2750),
1250                         .driver_info = EM2750_BOARD_UNKNOWN },
1251         { USB_DEVICE(0xeb1a, 0x2751),
1252                         .driver_info = EM2750_BOARD_UNKNOWN },
1253         { USB_DEVICE(0xeb1a, 0x2800),
1254                         .driver_info = EM2800_BOARD_UNKNOWN },
1255         { USB_DEVICE(0xeb1a, 0x2820),
1256                         .driver_info = EM2820_BOARD_UNKNOWN },
1257         { USB_DEVICE(0xeb1a, 0x2821),
1258                         .driver_info = EM2820_BOARD_UNKNOWN },
1259         { USB_DEVICE(0xeb1a, 0x2860),
1260                         .driver_info = EM2820_BOARD_UNKNOWN },
1261         { USB_DEVICE(0xeb1a, 0x2861),
1262                         .driver_info = EM2820_BOARD_UNKNOWN },
1263         { USB_DEVICE(0xeb1a, 0x2870),
1264                         .driver_info = EM2820_BOARD_UNKNOWN },
1265         { USB_DEVICE(0xeb1a, 0x2881),
1266                         .driver_info = EM2820_BOARD_UNKNOWN },
1267         { USB_DEVICE(0xeb1a, 0x2883),
1268                         .driver_info = EM2820_BOARD_UNKNOWN },
1269         { USB_DEVICE(0xeb1a, 0xe300),
1270                         .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
1271         { USB_DEVICE(0xeb1a, 0xe305),
1272                         .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
1273         { USB_DEVICE(0xeb1a, 0xe310),
1274                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
1275         { USB_DEVICE(0xeb1a, 0xa316),
1276                         .driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 },
1277         { USB_DEVICE(0xeb1a, 0xe320),
1278                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
1279         { USB_DEVICE(0xeb1a, 0xe323),
1280                         .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
1281         { USB_DEVICE(0xeb1a, 0xe350),
1282                         .driver_info = EM2870_BOARD_KWORLD_350U },
1283         { USB_DEVICE(0xeb1a, 0xe355),
1284                         .driver_info = EM2870_BOARD_KWORLD_355U },
1285         { USB_DEVICE(0xeb1a, 0x2801),
1286                         .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
1287         { USB_DEVICE(0xeb1a, 0xe357),
1288                         .driver_info = EM2870_BOARD_KWORLD_355U },
1289         { USB_DEVICE(0x0ccd, 0x0036),
1290                         .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
1291         { USB_DEVICE(0x0ccd, 0x004c),
1292                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
1293         { USB_DEVICE(0x0ccd, 0x004f),
1294                         .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
1295         { USB_DEVICE(0x0ccd, 0x005e),
1296                         .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
1297         { USB_DEVICE(0x0ccd, 0x0042),
1298                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS },
1299         { USB_DEVICE(0x0ccd, 0x0043),
1300                         .driver_info = EM2870_BOARD_TERRATEC_XS },
1301         { USB_DEVICE(0x0ccd, 0x0047),
1302                         .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
1303         { USB_DEVICE(0x185b, 0x2870),
1304                         .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
1305         { USB_DEVICE(0x185b, 0x2041),
1306                         .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
1307         { USB_DEVICE(0x2040, 0x4200),
1308                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
1309         { USB_DEVICE(0x2040, 0x4201),
1310                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
1311         { USB_DEVICE(0x2040, 0x6500),
1312                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
1313         { USB_DEVICE(0x2040, 0x6502),
1314                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
1315         { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
1316                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1317         { USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
1318                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1319         { USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
1320                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1321         { USB_DEVICE(0x2040, 0x651f),
1322                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
1323         { USB_DEVICE(0x0438, 0xb002),
1324                         .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
1325         { USB_DEVICE(0x2001, 0xf112),
1326                         .driver_info = EM2820_BOARD_DLINK_USB_TV },
1327         { USB_DEVICE(0x2304, 0x0207),
1328                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1329         { USB_DEVICE(0x2304, 0x0208),
1330                         .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
1331         { USB_DEVICE(0x2304, 0x021a),
1332                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1333         { USB_DEVICE(0x2304, 0x0226),
1334                         .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO },
1335         { USB_DEVICE(0x2304, 0x0227),
1336                         .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
1337         { USB_DEVICE(0x2304, 0x023f),
1338                         .driver_info = EM2874_BOARD_PINNACLE_PCTV_80E },
1339         { USB_DEVICE(0x0413, 0x6023),
1340                         .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
1341         { USB_DEVICE(0x093b, 0xa005),
1342                         .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
1343         { },
1344 };
1345 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
1346
1347 /*
1348  * EEPROM hash table for devices with generic USB IDs
1349  */
1350 static struct em28xx_hash_table em28xx_eeprom_hash [] = {
1351         /* P/N: SA 60002070465 Tuner: TVF7533-MF */
1352         {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
1353         {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
1354 };
1355
1356 /* I2C devicelist hash table for devices with generic USB IDs */
1357 static struct em28xx_hash_table em28xx_i2c_hash[] = {
1358         {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
1359         {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
1360         {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT},
1361 };
1362
1363 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
1364 {
1365         int rc = 0;
1366         struct em28xx *dev = ptr;
1367
1368         if (dev->tuner_type != TUNER_XC2028)
1369                 return 0;
1370
1371         if (command != XC2028_TUNER_RESET)
1372                 return 0;
1373
1374         rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
1375
1376         return rc;
1377 }
1378 EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
1379
1380 static void inline em28xx_set_model(struct em28xx *dev)
1381 {
1382         memcpy(&dev->board, &em28xx_boards[dev->model], sizeof(dev->board));
1383 }
1384
1385 /* Since em28xx_pre_card_setup() requires a proper dev->model,
1386  * this won't work for boards with generic PCI IDs
1387  */
1388 void em28xx_pre_card_setup(struct em28xx *dev)
1389 {
1390         int rc;
1391
1392         em28xx_set_model(dev);
1393
1394         em28xx_info("Identified as %s (card=%d)\n",
1395                     dev->board.name, dev->model);
1396
1397         /* Set the default GPO/GPIO for legacy devices */
1398         dev->reg_gpo_num = EM2880_R04_GPO;
1399         dev->reg_gpio_num = EM28XX_R08_GPIO;
1400
1401         dev->wait_after_write = 5;
1402
1403         /* Based on the Chip ID, set the device configuration */
1404         rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
1405         if (rc > 0) {
1406                 dev->chip_id = rc;
1407
1408                 switch (dev->chip_id) {
1409                 case CHIP_ID_EM2750:
1410                         em28xx_info("chip ID is em2750\n");
1411                         break;
1412                 case CHIP_ID_EM2820:
1413                         em28xx_info("chip ID is em2820\n");
1414                         break;
1415                 case CHIP_ID_EM2840:
1416                         em28xx_info("chip ID is em2840\n");
1417                         break;
1418                 case CHIP_ID_EM2860:
1419                         em28xx_info("chip ID is em2860\n");
1420                         break;
1421                 case CHIP_ID_EM2870:
1422                         em28xx_info("chip ID is em2870\n");
1423                         dev->wait_after_write = 0;
1424                         break;
1425                 case CHIP_ID_EM2874:
1426                         em28xx_info("chip ID is em2874\n");
1427                         dev->reg_gpio_num = EM2874_R80_GPIO;
1428                         dev->wait_after_write = 0;
1429                         break;
1430                 case CHIP_ID_EM2883:
1431                         em28xx_info("chip ID is em2882/em2883\n");
1432                         dev->wait_after_write = 0;
1433                         break;
1434                 default:
1435                         em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
1436                 }
1437         }
1438
1439         /* Prepopulate cached GPO register content */
1440         rc = em28xx_read_reg(dev, dev->reg_gpo_num);
1441         if (rc >= 0)
1442                 dev->reg_gpo = rc;
1443
1444         /* Those are the default values for the majority of boards
1445            Use those values if not specified otherwise at boards entry
1446          */
1447         if (!dev->board.xclk)
1448                 dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE |
1449                                   EM28XX_XCLK_FREQUENCY_12MHZ;
1450
1451         if (!dev->board.i2c_speed)
1452                 dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
1453                                        EM28XX_I2C_FREQ_100_KHZ;
1454
1455         em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
1456         em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
1457         msleep(50);
1458
1459         /* request some modules */
1460         switch (dev->model) {
1461         case EM2861_BOARD_PLEXTOR_PX_TV100U:
1462                 /* FIXME guess */
1463                 /* Turn on analog audio output */
1464                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
1465                 break;
1466         case EM2861_BOARD_KWORLD_PVRTV_300U:
1467         case EM2880_BOARD_KWORLD_DVB_305U:
1468                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x6d);
1469                 msleep(10);
1470                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d);
1471                 msleep(10);
1472                 break;
1473         case EM2870_BOARD_COMPRO_VIDEOMATE:
1474                 /* TODO: someone can do some cleanup here...
1475                          not everything's needed */
1476                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
1477                 msleep(10);
1478                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
1479                 msleep(10);
1480                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
1481                 mdelay(70);
1482                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
1483                 mdelay(70);
1484                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xdc);
1485                 mdelay(70);
1486                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
1487                 mdelay(70);
1488                 break;
1489         case EM2870_BOARD_TERRATEC_XS_MT2060:
1490                 /* this device needs some gpio writes to get the DVB-T
1491                    demod work */
1492                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
1493                 mdelay(70);
1494                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
1495                 mdelay(70);
1496                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
1497                 mdelay(70);
1498                 break;
1499         case EM2870_BOARD_PINNACLE_PCTV_DVB:
1500                 /* this device needs some gpio writes to get the
1501                    DVB-T demod work */
1502                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
1503                 mdelay(70);
1504                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
1505                 mdelay(70);
1506                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
1507                 mdelay(70);
1508                 break;
1509         case EM2820_BOARD_GADMEI_UTV310:
1510         case EM2820_BOARD_MSI_VOX_USB_2:
1511                 /* enables audio for that devices */
1512                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
1513                 break;
1514         }
1515
1516         em28xx_gpio_set(dev, dev->board.tuner_gpio);
1517         em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
1518
1519         /* Unlock device */
1520         em28xx_set_mode(dev, EM28XX_SUSPEND);
1521 }
1522
1523 static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
1524 {
1525         memset(ctl, 0, sizeof(*ctl));
1526
1527         ctl->fname   = XC2028_DEFAULT_FIRMWARE;
1528         ctl->max_len = 64;
1529         ctl->mts = em28xx_boards[dev->model].mts_firmware;
1530
1531         switch (dev->model) {
1532         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1533                 ctl->demod = XC3028_FE_ZARLINK456;
1534                 break;
1535         case EM2880_BOARD_TERRATEC_HYBRID_XS:
1536                 ctl->demod = XC3028_FE_ZARLINK456;
1537                 break;
1538         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1539                 /* djh - Not sure which demod we need here */
1540                 ctl->demod = XC3028_FE_DEFAULT;
1541                 break;
1542         case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
1543                 ctl->demod = XC3028_FE_DEFAULT;
1544                 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
1545                 break;
1546         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
1547         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1548         case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
1549                 /* FIXME: Better to specify the needed IF */
1550                 ctl->demod = XC3028_FE_DEFAULT;
1551                 break;
1552         default:
1553                 ctl->demod = XC3028_FE_OREN538;
1554         }
1555 }
1556
1557 static void em28xx_config_tuner(struct em28xx *dev)
1558 {
1559         struct v4l2_priv_tun_config  xc2028_cfg;
1560         struct tuner_setup           tun_setup;
1561         struct v4l2_frequency        f;
1562
1563         if (dev->tuner_type == TUNER_ABSENT)
1564                 return;
1565
1566         tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
1567         tun_setup.type = dev->tuner_type;
1568         tun_setup.addr = dev->tuner_addr;
1569         tun_setup.tuner_callback = em28xx_tuner_callback;
1570
1571         em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup);
1572
1573         if (dev->tuner_type == TUNER_XC2028) {
1574                 struct xc2028_ctrl           ctl;
1575
1576                 em28xx_setup_xc3028(dev, &ctl);
1577
1578                 xc2028_cfg.tuner = TUNER_XC2028;
1579                 xc2028_cfg.priv  = &ctl;
1580
1581                 em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg);
1582         }
1583
1584         /* configure tuner */
1585         f.tuner = 0;
1586         f.type = V4L2_TUNER_ANALOG_TV;
1587         f.frequency = 9076;     /* just a magic number */
1588         dev->ctl_freq = f.frequency;
1589         em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f);
1590 }
1591
1592 static int em28xx_hint_board(struct em28xx *dev)
1593 {
1594         int i;
1595
1596         /* HINT method: EEPROM
1597          *
1598          * This method works only for boards with eeprom.
1599          * Uses a hash of all eeprom bytes. The hash should be
1600          * unique for a vendor/tuner pair.
1601          * There are a high chance that tuners for different
1602          * video standards produce different hashes.
1603          */
1604         for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
1605                 if (dev->hash == em28xx_eeprom_hash[i].hash) {
1606                         dev->model = em28xx_eeprom_hash[i].model;
1607                         dev->tuner_type = em28xx_eeprom_hash[i].tuner;
1608
1609                         em28xx_errdev("Your board has no unique USB ID.\n");
1610                         em28xx_errdev("A hint were successfully done, "
1611                                       "based on eeprom hash.\n");
1612                         em28xx_errdev("This method is not 100%% failproof.\n");
1613                         em28xx_errdev("If the board were missdetected, "
1614                                       "please email this log to:\n");
1615                         em28xx_errdev("\tV4L Mailing List "
1616                                       " <video4linux-list@redhat.com>\n");
1617                         em28xx_errdev("Board detected as %s\n",
1618                                       em28xx_boards[dev->model].name);
1619
1620                         return 0;
1621                 }
1622         }
1623
1624         /* HINT method: I2C attached devices
1625          *
1626          * This method works for all boards.
1627          * Uses a hash of i2c scanned devices.
1628          * Devices with the same i2c attached chips will
1629          * be considered equal.
1630          * This method is less precise than the eeprom one.
1631          */
1632
1633         /* user did not request i2c scanning => do it now */
1634         if (!dev->i2c_hash)
1635                 em28xx_do_i2c_scan(dev);
1636
1637         for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
1638                 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
1639                         dev->model = em28xx_i2c_hash[i].model;
1640                         dev->tuner_type = em28xx_i2c_hash[i].tuner;
1641                         em28xx_errdev("Your board has no unique USB ID.\n");
1642                         em28xx_errdev("A hint were successfully done, "
1643                                       "based on i2c devicelist hash.\n");
1644                         em28xx_errdev("This method is not 100%% failproof.\n");
1645                         em28xx_errdev("If the board were missdetected, "
1646                                       "please email this log to:\n");
1647                         em28xx_errdev("\tV4L Mailing List "
1648                                       " <video4linux-list@redhat.com>\n");
1649                         em28xx_errdev("Board detected as %s\n",
1650                                       em28xx_boards[dev->model].name);
1651
1652                         return 0;
1653                 }
1654         }
1655
1656         em28xx_errdev("Your board has no unique USB ID and thus need a "
1657                       "hint to be detected.\n");
1658         em28xx_errdev("You may try to use card=<n> insmod option to "
1659                       "workaround that.\n");
1660         em28xx_errdev("Please send an email with this log to:\n");
1661         em28xx_errdev("\tV4L Mailing List <video4linux-list@redhat.com>\n");
1662         em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
1663         em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
1664
1665         em28xx_errdev("Here is a list of valid choices for the card=<n>"
1666                       " insmod option:\n");
1667         for (i = 0; i < em28xx_bcount; i++) {
1668                 em28xx_errdev("    card=%d -> %s\n",
1669                                 i, em28xx_boards[i].name);
1670         }
1671         return -1;
1672 }
1673
1674 /* ----------------------------------------------------------------------- */
1675 void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir)
1676 {
1677         if (disable_ir) {
1678                 ir->get_key = NULL;
1679                 return ;
1680         }
1681
1682         /* detect & configure */
1683         switch (dev->model) {
1684         case (EM2800_BOARD_UNKNOWN):
1685                 break;
1686         case (EM2820_BOARD_UNKNOWN):
1687                 break;
1688         case (EM2800_BOARD_TERRATEC_CINERGY_200):
1689         case (EM2820_BOARD_TERRATEC_CINERGY_250):
1690                 ir->ir_codes = ir_codes_em_terratec;
1691                 ir->get_key = em28xx_get_key_terratec;
1692                 snprintf(ir->c.name, sizeof(ir->c.name),
1693                          "i2c IR (EM28XX Terratec)");
1694                 break;
1695         case (EM2820_BOARD_PINNACLE_USB_2):
1696                 ir->ir_codes = ir_codes_pinnacle_grey;
1697                 ir->get_key = em28xx_get_key_pinnacle_usb_grey;
1698                 snprintf(ir->c.name, sizeof(ir->c.name),
1699                          "i2c IR (EM28XX Pinnacle PCTV)");
1700                 break;
1701         case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
1702                 ir->ir_codes = ir_codes_hauppauge_new;
1703                 ir->get_key = em28xx_get_key_em_haup;
1704                 snprintf(ir->c.name, sizeof(ir->c.name),
1705                          "i2c IR (EM2840 Hauppauge)");
1706                 break;
1707         case (EM2820_BOARD_MSI_VOX_USB_2):
1708                 break;
1709         case (EM2800_BOARD_LEADTEK_WINFAST_USBII):
1710                 break;
1711         case (EM2800_BOARD_KWORLD_USB2800):
1712                 break;
1713         case (EM2800_BOARD_GRABBEEX_USB2800):
1714                 break;
1715         }
1716 }
1717
1718 void em28xx_card_setup(struct em28xx *dev)
1719 {
1720         em28xx_set_model(dev);
1721
1722         dev->tuner_type = em28xx_boards[dev->model].tuner_type;
1723         if (em28xx_boards[dev->model].tuner_addr)
1724                 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr;
1725
1726         /* request some modules */
1727         switch (dev->model) {
1728         case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
1729         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1730         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1731         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
1732         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1733         {
1734                 struct tveeprom tv;
1735 #ifdef CONFIG_MODULES
1736                 request_module("tveeprom");
1737 #endif
1738                 /* Call first TVeeprom */
1739
1740                 dev->i2c_client.addr = 0xa0 >> 1;
1741                 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
1742
1743                 dev->tuner_type = tv.tuner_type;
1744
1745                 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) {
1746                         dev->i2s_speed = 2048000;
1747                         dev->board.has_msp34xx = 1;
1748                 }
1749 #ifdef CONFIG_MODULES
1750                 if (tv.has_ir)
1751                         request_module("ir-kbd-i2c");
1752 #endif
1753                 break;
1754         }
1755         case EM2820_BOARD_KWORLD_PVRTV2800RF:
1756                 /* GPIO enables sound on KWORLD PVR TV 2800RF */
1757                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9);
1758                 break;
1759         case EM2820_BOARD_UNKNOWN:
1760         case EM2800_BOARD_UNKNOWN:
1761                 /*
1762                  * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
1763                  *
1764                  * This occurs because they share identical USB vendor and
1765                  * product IDs.
1766                  *
1767                  * What we do here is look up the EEPROM hash of the K-WORLD
1768                  * and if it is found then we decide that we do not have
1769                  * a DIGIVOX and reset the device to the K-WORLD instead.
1770                  *
1771                  * This solution is only valid if they do not share eeprom
1772                  * hash identities which has not been determined as yet.
1773                  */
1774         case EM2880_BOARD_MSI_DIGIVOX_AD:
1775                 if (!em28xx_hint_board(dev))
1776                         em28xx_set_model(dev);
1777                 break;
1778         }
1779
1780         if (dev->board.has_snapshot_button)
1781                 em28xx_register_snapshot_button(dev);
1782
1783         if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
1784                 em28xx_errdev("\n\n");
1785                 em28xx_errdev("The support for this board weren't "
1786                               "valid yet.\n");
1787                 em28xx_errdev("Please send a report of having this working\n");
1788                 em28xx_errdev("not to V4L mailing list (and/or to other "
1789                                 "addresses)\n\n");
1790         }
1791
1792         /* Allow override tuner type by a module parameter */
1793         if (tuner >= 0)
1794                 dev->tuner_type = tuner;
1795
1796 #ifdef CONFIG_MODULES
1797         /* request some modules */
1798         if (dev->board.has_msp34xx)
1799                 request_module("msp3400");
1800         if (dev->board.decoder == EM28XX_SAA711X)
1801                 request_module("saa7115");
1802         if (dev->board.decoder == EM28XX_TVP5150)
1803                 request_module("tvp5150");
1804         if (dev->board.tuner_type != TUNER_ABSENT)
1805                 request_module("tuner");
1806 #endif
1807
1808         em28xx_config_tuner(dev);
1809
1810         em28xx_ir_init(dev);
1811 }
1812
1813
1814 #if defined(CONFIG_MODULES) && defined(MODULE)
1815 static void request_module_async(struct work_struct *work)
1816 {
1817         struct em28xx *dev = container_of(work,
1818                              struct em28xx, request_module_wk);
1819
1820         if (dev->has_audio_class)
1821                 request_module("snd-usb-audio");
1822         else if (dev->has_alsa_audio)
1823                 request_module("em28xx-alsa");
1824
1825         if (dev->board.has_dvb)
1826                 request_module("em28xx-dvb");
1827 }
1828
1829 static void request_modules(struct em28xx *dev)
1830 {
1831         INIT_WORK(&dev->request_module_wk, request_module_async);
1832         schedule_work(&dev->request_module_wk);
1833 }
1834 #else
1835 #define request_modules(dev)
1836 #endif /* CONFIG_MODULES */
1837
1838 /*
1839  * em28xx_realease_resources()
1840  * unregisters the v4l2,i2c and usb devices
1841  * called when the device gets disconected or at module unload
1842 */
1843 void em28xx_release_resources(struct em28xx *dev)
1844 {
1845         if (dev->sbutton_input_dev)
1846                 em28xx_deregister_snapshot_button(dev);
1847
1848         if (dev->ir)
1849                 em28xx_ir_fini(dev);
1850
1851         /*FIXME: I2C IR should be disconnected */
1852
1853         em28xx_release_analog_resources(dev);
1854
1855         em28xx_remove_from_devlist(dev);
1856
1857         em28xx_i2c_unregister(dev);
1858         usb_put_dev(dev->udev);
1859
1860         /* Mark device as unused */
1861         em28xx_devused &= ~(1 << dev->devno);
1862 };
1863
1864 /*
1865  * em28xx_init_dev()
1866  * allocates and inits the device structs, registers i2c bus and v4l device
1867  */
1868 int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
1869                            int minor)
1870 {
1871         struct em28xx *dev = *devhandle;
1872         int retval = -ENOMEM;
1873         int errCode;
1874
1875         dev->udev = udev;
1876         mutex_init(&dev->ctrl_urb_lock);
1877         spin_lock_init(&dev->slock);
1878         init_waitqueue_head(&dev->open);
1879         init_waitqueue_head(&dev->wait_frame);
1880         init_waitqueue_head(&dev->wait_stream);
1881
1882         dev->em28xx_write_regs = em28xx_write_regs;
1883         dev->em28xx_read_reg = em28xx_read_reg;
1884         dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
1885         dev->em28xx_write_regs_req = em28xx_write_regs_req;
1886         dev->em28xx_read_reg_req = em28xx_read_reg_req;
1887         dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
1888
1889         em28xx_pre_card_setup(dev);
1890
1891         if (!dev->board.is_em2800) {
1892                 /* Sets I2C speed to 100 KHz */
1893                 retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
1894                 if (retval < 0) {
1895                         em28xx_errdev("%s: em28xx_write_regs_req failed!"
1896                                       " retval [%d]\n",
1897                                       __func__, retval);
1898                         return retval;
1899                 }
1900         }
1901
1902         /* register i2c bus */
1903         errCode = em28xx_i2c_register(dev);
1904         if (errCode < 0) {
1905                 em28xx_errdev("%s: em28xx_i2c_register - errCode [%d]!\n",
1906                         __func__, errCode);
1907                 return errCode;
1908         }
1909
1910         /* Do board specific init and eeprom reading */
1911         em28xx_card_setup(dev);
1912
1913         /* Configure audio */
1914         errCode = em28xx_audio_setup(dev);
1915         if (errCode < 0) {
1916                 em28xx_errdev("%s: Error while setting audio - errCode [%d]!\n",
1917                         __func__, errCode);
1918         }
1919
1920         /* wake i2c devices */
1921         em28xx_wake_i2c(dev);
1922
1923         /* init video dma queues */
1924         INIT_LIST_HEAD(&dev->vidq.active);
1925         INIT_LIST_HEAD(&dev->vidq.queued);
1926
1927
1928         if (dev->board.has_msp34xx) {
1929                 /* Send a reset to other chips via gpio */
1930                 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
1931                 if (errCode < 0) {
1932                         em28xx_errdev("%s: em28xx_write_regs_req - "
1933                                       "msp34xx(1) failed! errCode [%d]\n",
1934                                       __func__, errCode);
1935                         return errCode;
1936                 }
1937                 msleep(3);
1938
1939                 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
1940                 if (errCode < 0) {
1941                         em28xx_errdev("%s: em28xx_write_regs_req - "
1942                                       "msp34xx(2) failed! errCode [%d]\n",
1943                                       __func__, errCode);
1944                         return errCode;
1945                 }
1946                 msleep(3);
1947         }
1948
1949         em28xx_add_into_devlist(dev);
1950
1951         errCode = em28xx_analog_config(dev);
1952         if (errCode) {
1953                 em28xx_errdev("error configuring device\n");
1954                 return -ENOMEM;
1955         }
1956
1957         retval = em28xx_register_analog_devices(dev);
1958         if (retval < 0) {
1959                 em28xx_release_resources(dev);
1960                 goto fail_reg_devices;
1961         }
1962
1963         em28xx_init_extension(dev);
1964
1965         /* Save some power by putting tuner to sleep */
1966         em28xx_i2c_call_clients(dev, TUNER_SET_STANDBY, NULL);
1967
1968         return 0;
1969
1970 fail_reg_devices:
1971         return retval;
1972 }
1973
1974 /*
1975  * em28xx_usb_probe()
1976  * checks for supported devices
1977  */
1978 static int em28xx_usb_probe(struct usb_interface *interface,
1979                             const struct usb_device_id *id)
1980 {
1981         const struct usb_endpoint_descriptor *endpoint;
1982         struct usb_device *udev;
1983         struct usb_interface *uif;
1984         struct em28xx *dev = NULL;
1985         int retval = -ENODEV;
1986         int i, nr, ifnum, isoc_pipe;
1987         char *speed;
1988         char descr[255] = "";
1989
1990         udev = usb_get_dev(interface_to_usbdev(interface));
1991         ifnum = interface->altsetting[0].desc.bInterfaceNumber;
1992
1993         /* Check to see next free device and mark as used */
1994         nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS);
1995         em28xx_devused |= 1<<nr;
1996
1997         /* Don't register audio interfaces */
1998         if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
1999                 em28xx_err(DRIVER_NAME " audio device (%04x:%04x): "
2000                         "interface %i, class %i\n",
2001                         le16_to_cpu(udev->descriptor.idVendor),
2002                         le16_to_cpu(udev->descriptor.idProduct),
2003                         ifnum,
2004                         interface->altsetting[0].desc.bInterfaceClass);
2005
2006                 em28xx_devused &= ~(1<<nr);
2007                 return -ENODEV;
2008         }
2009
2010         endpoint = &interface->cur_altsetting->endpoint[0].desc;
2011
2012         /* check if the device has the iso in endpoint at the correct place */
2013         if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
2014             USB_ENDPOINT_XFER_ISOC &&
2015             (interface->altsetting[1].endpoint[0].desc.wMaxPacketSize == 940)) {
2016                 /* It's a newer em2874/em2875 device */
2017                 isoc_pipe = 0;
2018         } else {
2019                 int check_interface = 1;
2020                 isoc_pipe = 1;
2021                 endpoint = &interface->cur_altsetting->endpoint[1].desc;
2022                 if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
2023                     USB_ENDPOINT_XFER_ISOC)
2024                         check_interface = 0;
2025
2026                 if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT)
2027                         check_interface = 0;
2028
2029                 if (!check_interface) {
2030                         em28xx_err(DRIVER_NAME " video device (%04x:%04x): "
2031                                 "interface %i, class %i found.\n",
2032                                 le16_to_cpu(udev->descriptor.idVendor),
2033                                 le16_to_cpu(udev->descriptor.idProduct),
2034                                 ifnum,
2035                                 interface->altsetting[0].desc.bInterfaceClass);
2036
2037                         em28xx_err(DRIVER_NAME " This is an anciliary "
2038                                 "interface not used by the driver\n");
2039
2040                         em28xx_devused &= ~(1<<nr);
2041                         return -ENODEV;
2042                 }
2043         }
2044
2045         switch (udev->speed) {
2046         case USB_SPEED_LOW:
2047                 speed = "1.5";
2048                 break;
2049         case USB_SPEED_UNKNOWN:
2050         case USB_SPEED_FULL:
2051                 speed = "12";
2052                 break;
2053         case USB_SPEED_HIGH:
2054                 speed = "480";
2055                 break;
2056         default:
2057                 speed = "unknown";
2058         }
2059
2060         if (udev->manufacturer)
2061                 strlcpy(descr, udev->manufacturer, sizeof(descr));
2062
2063         if (udev->product) {
2064                 if (*descr)
2065                         strlcat(descr, " ", sizeof(descr));
2066                 strlcat(descr, udev->product, sizeof(descr));
2067         }
2068         if (*descr)
2069                 strlcat(descr, " ", sizeof(descr));
2070
2071         printk(DRIVER_NAME ": New device %s@ %s Mbps "
2072                 "(%04x:%04x, interface %d, class %d)\n",
2073                 descr,
2074                 speed,
2075                 le16_to_cpu(udev->descriptor.idVendor),
2076                 le16_to_cpu(udev->descriptor.idProduct),
2077                 ifnum,
2078                 interface->altsetting->desc.bInterfaceNumber);
2079
2080         if (nr >= EM28XX_MAXBOARDS) {
2081                 printk(DRIVER_NAME ": Supports only %i em28xx boards.\n",
2082                                 EM28XX_MAXBOARDS);
2083                 em28xx_devused &= ~(1<<nr);
2084                 return -ENOMEM;
2085         }
2086
2087         /* allocate memory for our device state and initialize it */
2088         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
2089         if (dev == NULL) {
2090                 em28xx_err(DRIVER_NAME ": out of memory!\n");
2091                 em28xx_devused &= ~(1<<nr);
2092                 return -ENOMEM;
2093         }
2094
2095         snprintf(dev->name, 29, "em28xx #%d", nr);
2096         dev->devno = nr;
2097         dev->model = id->driver_info;
2098         dev->alt   = -1;
2099
2100         /* Checks if audio is provided by some interface */
2101         for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
2102                 uif = udev->config->interface[i];
2103                 if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
2104                         dev->has_audio_class = 1;
2105                         break;
2106                 }
2107         }
2108
2109         /* compute alternate max packet sizes */
2110         uif = udev->actconfig->interface[0];
2111
2112         dev->num_alt = uif->num_altsetting;
2113         dev->alt_max_pkt_size = kmalloc(32 * dev->num_alt, GFP_KERNEL);
2114
2115         if (dev->alt_max_pkt_size == NULL) {
2116                 em28xx_errdev("out of memory!\n");
2117                 em28xx_devused &= ~(1<<nr);
2118                 kfree(dev);
2119                 return -ENOMEM;
2120         }
2121
2122         for (i = 0; i < dev->num_alt ; i++) {
2123                 u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
2124                 dev->alt_max_pkt_size[i] =
2125                     (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
2126         }
2127
2128         if ((card[nr] >= 0) && (card[nr] < em28xx_bcount))
2129                 dev->model = card[nr];
2130
2131         /* allocate device struct */
2132         mutex_init(&dev->lock);
2133         mutex_lock(&dev->lock);
2134         retval = em28xx_init_dev(&dev, udev, nr);
2135         if (retval) {
2136                 em28xx_devused &= ~(1<<dev->devno);
2137                 kfree(dev);
2138
2139                 return retval;
2140         }
2141
2142         /* save our data pointer in this interface device */
2143         usb_set_intfdata(interface, dev);
2144
2145         request_modules(dev);
2146
2147         /* Should be the last thing to do, to avoid newer udev's to
2148            open the device before fully initializing it
2149          */
2150         mutex_unlock(&dev->lock);
2151
2152         return 0;
2153 }
2154
2155 /*
2156  * em28xx_usb_disconnect()
2157  * called when the device gets diconencted
2158  * video device will be unregistered on v4l2_close in case it is still open
2159  */
2160 static void em28xx_usb_disconnect(struct usb_interface *interface)
2161 {
2162         struct em28xx *dev;
2163
2164         dev = usb_get_intfdata(interface);
2165         usb_set_intfdata(interface, NULL);
2166
2167         if (!dev)
2168                 return;
2169
2170         em28xx_info("disconnecting %s\n", dev->vdev->name);
2171
2172         /* wait until all current v4l2 io is finished then deallocate
2173            resources */
2174         mutex_lock(&dev->lock);
2175
2176         wake_up_interruptible_all(&dev->open);
2177
2178         if (dev->users) {
2179                 em28xx_warn
2180                     ("device /dev/video%d is open! Deregistration and memory "
2181                      "deallocation are deferred on close.\n",
2182                                 dev->vdev->num);
2183
2184                 dev->state |= DEV_MISCONFIGURED;
2185                 em28xx_uninit_isoc(dev);
2186                 dev->state |= DEV_DISCONNECTED;
2187                 wake_up_interruptible(&dev->wait_frame);
2188                 wake_up_interruptible(&dev->wait_stream);
2189         } else {
2190                 dev->state |= DEV_DISCONNECTED;
2191                 em28xx_release_resources(dev);
2192         }
2193
2194         em28xx_close_extension(dev);
2195
2196         mutex_unlock(&dev->lock);
2197
2198         if (!dev->users) {
2199                 kfree(dev->alt_max_pkt_size);
2200                 kfree(dev);
2201         }
2202 }
2203
2204 static struct usb_driver em28xx_usb_driver = {
2205         .name = "em28xx",
2206         .probe = em28xx_usb_probe,
2207         .disconnect = em28xx_usb_disconnect,
2208         .id_table = em28xx_id_table,
2209 };
2210
2211 static int __init em28xx_module_init(void)
2212 {
2213         int result;
2214
2215         /* register this driver with the USB subsystem */
2216         result = usb_register(&em28xx_usb_driver);
2217         if (result)
2218                 em28xx_err(DRIVER_NAME
2219                            " usb_register failed. Error number %d.\n", result);
2220
2221         printk(KERN_INFO DRIVER_NAME " driver loaded\n");
2222
2223         return result;
2224 }
2225
2226 static void __exit em28xx_module_exit(void)
2227 {
2228         /* deregister this driver with the USB subsystem */
2229         usb_deregister(&em28xx_usb_driver);
2230 }
2231
2232 module_init(em28xx_module_init);
2233 module_exit(em28xx_module_exit);