2a4c990906013a0a01ac2a701f676bb7fde19dc9
[firefly-linux-kernel-4.4.55.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 static int tuner = -1;
41 module_param(tuner, int, 0444);
42 MODULE_PARM_DESC(tuner, "tuner type");
43
44 static unsigned int disable_ir;
45 module_param(disable_ir, int, 0444);
46 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
47
48 struct em28xx_hash_table {
49         unsigned long hash;
50         unsigned int  model;
51         unsigned int  tuner;
52 };
53
54 /*
55  *  Reset sequences for analog/digital modes
56  */
57
58 /* Reset for the most [analog] boards */
59 static struct em28xx_reg_seq default_analog[] = {
60         {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
61         {       -1,             -1,     -1,             -1},
62 };
63
64 /* Reset for the most [digital] boards */
65 static struct em28xx_reg_seq default_digital[] = {
66         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
67         {       -1,             -1,     -1,             -1},
68 };
69
70 /* Board Hauppauge WinTV HVR 900 analog */
71 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
72         {EM28XX_R08_GPIO,       0x2d,   ~EM_GPIO_4,     10},
73         {0x05,                  0xff,   0x10,           10},
74         {  -1,                  -1,     -1,             -1},
75 };
76
77 /* Board Hauppauge WinTV HVR 900 digital */
78 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
79         {EM28XX_R08_GPIO,       0x2e,   ~EM_GPIO_4,     10},
80         {EM2880_R04_GPO,        0x04,   0x0f,           10},
81         {EM2880_R04_GPO,        0x0c,   0x0f,           10},
82         { -1,                   -1,     -1,             -1},
83 };
84
85 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
86 static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
87         {EM28XX_R08_GPIO,       0x69,   ~EM_GPIO_4,      10},
88         {       -1,             -1,     -1,              -1},
89 };
90
91 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
92
93 /* Board  - EM2870 Kworld 355u
94    Analog - No input analog */
95
96 /* Callback for the most boards */
97 static struct em28xx_reg_seq default_callback[] = {
98         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
99         {EM28XX_R08_GPIO,       0,              EM_GPIO_4,      10},
100         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
101         {  -1,                  -1,             -1,             -1},
102 };
103
104 /* Pinnacle PCTV HD Mini (80e) GPIOs
105    0-5: not used
106    6:   demod reset, active low
107    7:   LED on, active high */
108 static struct em28xx_reg_seq em2874_pinnacle_80e_digital[] = {
109         {EM28XX_R06_I2C_CLK,    0x45,   0xff,             10}, /*400 KHz*/
110         {EM2874_R80_GPIO,       0x80,   0xff,             100},/*Demod reset*/
111         {EM2874_R80_GPIO,       0xc0,   0xff,             10},
112         {  -1,                  -1,     -1,               -1},
113 };
114
115 /*
116  *  Board definitions
117  */
118 struct em28xx_board em28xx_boards[] = {
119         [EM2750_BOARD_UNKNOWN] = {
120                 .name          = "Unknown EM2750/EM2751 webcam grabber",
121                 .xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
122                 .input         = { {
123                         .type     = EM28XX_VMUX_COMPOSITE1,
124                         .vmux     = 0,
125                         .amux     = EM28XX_AMUX_VIDEO,
126                 } },
127         },
128         [EM2800_BOARD_UNKNOWN] = {
129                 .name         = "Unknown EM2800 video grabber",
130                 .is_em2800    = 1,
131                 .tda9887_conf = TDA9887_PRESENT,
132                 .decoder      = EM28XX_SAA711X,
133                 .input        = { {
134                         .type     = EM28XX_VMUX_COMPOSITE1,
135                         .vmux     = SAA7115_COMPOSITE0,
136                         .amux     = EM28XX_AMUX_LINE_IN,
137                 }, {
138                         .type     = EM28XX_VMUX_SVIDEO,
139                         .vmux     = SAA7115_SVIDEO3,
140                         .amux     = EM28XX_AMUX_LINE_IN,
141                 } },
142         },
143         [EM2820_BOARD_UNKNOWN] = {
144                 .name          = "Unknown EM2750/28xx video grabber",
145                 .tuner_type    = TUNER_ABSENT,
146         },
147         [EM2750_BOARD_DLCW_130] = {
148                 /* Beijing Huaqi Information Digital Technology Co., Ltd */
149                 .name          = "Huaqi DLCW-130",
150                 .valid         = EM28XX_BOARD_NOT_VALIDATED,
151                 .xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
152                 .input         = { {
153                         .type     = EM28XX_VMUX_COMPOSITE1,
154                         .vmux     = 0,
155                         .amux     = EM28XX_AMUX_VIDEO,
156                 } },
157         },
158         [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
159                 .name         = "Kworld PVR TV 2800 RF",
160                 .tuner_type   = TUNER_TEMIC_PAL,
161                 .tda9887_conf = TDA9887_PRESENT,
162                 .decoder      = EM28XX_SAA711X,
163                 .input        = { {
164                         .type     = EM28XX_VMUX_COMPOSITE1,
165                         .vmux     = SAA7115_COMPOSITE0,
166                         .amux     = EM28XX_AMUX_LINE_IN,
167                 }, {
168                         .type     = EM28XX_VMUX_SVIDEO,
169                         .vmux     = SAA7115_SVIDEO3,
170                         .amux     = EM28XX_AMUX_LINE_IN,
171                 } },
172         },
173         [EM2820_BOARD_TERRATEC_CINERGY_250] = {
174                 .name         = "Terratec Cinergy 250 USB",
175                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
176                 .tda9887_conf = TDA9887_PRESENT,
177                 .decoder      = EM28XX_SAA711X,
178                 .input        = { {
179                         .type     = EM28XX_VMUX_TELEVISION,
180                         .vmux     = SAA7115_COMPOSITE2,
181                         .amux     = EM28XX_AMUX_LINE_IN,
182                 }, {
183                         .type     = EM28XX_VMUX_COMPOSITE1,
184                         .vmux     = SAA7115_COMPOSITE0,
185                         .amux     = EM28XX_AMUX_LINE_IN,
186                 }, {
187                         .type     = EM28XX_VMUX_SVIDEO,
188                         .vmux     = SAA7115_SVIDEO3,
189                         .amux     = EM28XX_AMUX_LINE_IN,
190                 } },
191         },
192         [EM2820_BOARD_PINNACLE_USB_2] = {
193                 .name         = "Pinnacle PCTV USB 2",
194                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
195                 .tda9887_conf = TDA9887_PRESENT,
196                 .decoder      = EM28XX_SAA711X,
197                 .input        = { {
198                         .type     = EM28XX_VMUX_TELEVISION,
199                         .vmux     = SAA7115_COMPOSITE2,
200                         .amux     = EM28XX_AMUX_VIDEO,
201                 }, {
202                         .type     = EM28XX_VMUX_COMPOSITE1,
203                         .vmux     = SAA7115_COMPOSITE0,
204                         .amux     = EM28XX_AMUX_LINE_IN,
205                 }, {
206                         .type     = EM28XX_VMUX_SVIDEO,
207                         .vmux     = SAA7115_SVIDEO3,
208                         .amux     = EM28XX_AMUX_LINE_IN,
209                 } },
210         },
211         [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
212                 .name         = "Hauppauge WinTV USB 2",
213                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
214                 .tda9887_conf = TDA9887_PRESENT |
215                                 TDA9887_PORT1_ACTIVE|
216                                 TDA9887_PORT2_ACTIVE,
217                 .decoder      = EM28XX_TVP5150,
218                 .has_msp34xx  = 1,
219                 .input        = { {
220                         .type     = EM28XX_VMUX_TELEVISION,
221                         .vmux     = TVP5150_COMPOSITE0,
222                         .amux     = MSP_INPUT_DEFAULT,
223                 }, {
224                         .type     = EM28XX_VMUX_SVIDEO,
225                         .vmux     = TVP5150_SVIDEO,
226                         .amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
227                                         MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
228                 } },
229         },
230         [EM2820_BOARD_DLINK_USB_TV] = {
231                 .name         = "D-Link DUB-T210 TV Tuner",
232                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
233                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
234                 .tda9887_conf = TDA9887_PRESENT,
235                 .decoder      = EM28XX_SAA711X,
236                 .input        = { {
237                         .type     = EM28XX_VMUX_TELEVISION,
238                         .vmux     = SAA7115_COMPOSITE2,
239                         .amux     = EM28XX_AMUX_LINE_IN,
240                 }, {
241                         .type     = EM28XX_VMUX_COMPOSITE1,
242                         .vmux     = SAA7115_COMPOSITE0,
243                         .amux     = EM28XX_AMUX_LINE_IN,
244                 }, {
245                         .type     = EM28XX_VMUX_SVIDEO,
246                         .vmux     = SAA7115_SVIDEO3,
247                         .amux     = EM28XX_AMUX_LINE_IN,
248                 } },
249         },
250         [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
251                 .name         = "Hercules Smart TV USB 2.0",
252                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
253                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
254                 .tda9887_conf = TDA9887_PRESENT,
255                 .decoder      = EM28XX_SAA711X,
256                 .input        = { {
257                         .type     = EM28XX_VMUX_TELEVISION,
258                         .vmux     = SAA7115_COMPOSITE2,
259                         .amux     = EM28XX_AMUX_LINE_IN,
260                 }, {
261                         .type     = EM28XX_VMUX_COMPOSITE1,
262                         .vmux     = SAA7115_COMPOSITE0,
263                         .amux     = EM28XX_AMUX_LINE_IN,
264                 }, {
265                         .type     = EM28XX_VMUX_SVIDEO,
266                         .vmux     = SAA7115_SVIDEO3,
267                         .amux     = EM28XX_AMUX_LINE_IN,
268                 } },
269         },
270         [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
271                 .name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
272                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
273                 .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
274                 .tda9887_conf = TDA9887_PRESENT,
275                 .decoder      = EM28XX_SAA711X,
276                 .input        = { {
277                         .type     = EM28XX_VMUX_TELEVISION,
278                         .vmux     = SAA7115_COMPOSITE2,
279                         .amux     = EM28XX_AMUX_VIDEO,
280                 }, {
281                         .type     = EM28XX_VMUX_COMPOSITE1,
282                         .vmux     = SAA7115_COMPOSITE0,
283                         .amux     = EM28XX_AMUX_LINE_IN,
284                 }, {
285                         .type     = EM28XX_VMUX_SVIDEO,
286                         .vmux     = SAA7115_SVIDEO3,
287                         .amux     = EM28XX_AMUX_LINE_IN,
288                 } },
289         },
290         [EM2820_BOARD_GADMEI_UTV310] = {
291                 .name         = "Gadmei UTV310",
292                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
293                 .tuner_type   = TUNER_TNF_5335MF,
294                 .tda9887_conf = TDA9887_PRESENT,
295                 .decoder      = EM28XX_SAA711X,
296                 .input        = { {
297                         .type     = EM28XX_VMUX_TELEVISION,
298                         .vmux     = SAA7115_COMPOSITE1,
299                         .amux     = EM28XX_AMUX_LINE_IN,
300                 }, {
301                         .type     = EM28XX_VMUX_COMPOSITE1,
302                         .vmux     = SAA7115_COMPOSITE0,
303                         .amux     = EM28XX_AMUX_LINE_IN,
304                 }, {
305                         .type     = EM28XX_VMUX_SVIDEO,
306                         .vmux     = SAA7115_SVIDEO3,
307                         .amux     = EM28XX_AMUX_LINE_IN,
308                 } },
309         },
310         [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
311                 .name         = "Leadtek Winfast USB II Deluxe",
312                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
313                 .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
314                 .tda9887_conf = TDA9887_PRESENT,
315                 .decoder      = EM28XX_SAA711X,
316                 .input        = { {
317                         .type     = EM28XX_VMUX_TELEVISION,
318                         .vmux     = SAA7115_COMPOSITE2,
319                         .amux     = EM28XX_AMUX_VIDEO,
320                 }, {
321                         .type     = EM28XX_VMUX_COMPOSITE1,
322                         .vmux     = SAA7115_COMPOSITE0,
323                         .amux     = EM28XX_AMUX_LINE_IN,
324                 }, {
325                         .type     = EM28XX_VMUX_SVIDEO,
326                         .vmux     = SAA7115_COMPOSITE0,
327                         .amux     = EM28XX_AMUX_LINE_IN,
328                 } },
329         },
330         [EM2820_BOARD_PINNACLE_DVC_100] = {
331                 .name         = "Pinnacle Dazzle DVC 100",
332                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
333                 .decoder      = EM28XX_SAA711X,
334                 .input        = { {
335                         .type     = EM28XX_VMUX_COMPOSITE1,
336                         .vmux     = SAA7115_COMPOSITE0,
337                         .amux     = EM28XX_AMUX_LINE_IN,
338                 }, {
339                         .type     = EM28XX_VMUX_SVIDEO,
340                         .vmux     = SAA7115_SVIDEO3,
341                         .amux     = EM28XX_AMUX_LINE_IN,
342                 } },
343         },
344         [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
345                 .name         = "Videology 20K14XUSB USB2.0",
346                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
347                 .input        = { {
348                         .type     = EM28XX_VMUX_COMPOSITE1,
349                         .vmux     = 0,
350                         .amux     = EM28XX_AMUX_VIDEO,
351                 } },
352         },
353         [EM2821_BOARD_PROLINK_PLAYTV_USB2] = {
354                 .name         = "SIIG AVTuner-PVR/Prolink PlayTV USB 2.0",
355                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
356                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,  /* unknown? */
357                 .tda9887_conf = TDA9887_PRESENT,        /* unknown? */
358                 .decoder      = EM28XX_SAA711X,
359                 .input        = { {
360                         .type     = EM28XX_VMUX_TELEVISION,
361                         .vmux     = SAA7115_COMPOSITE2,
362                         .amux     = EM28XX_AMUX_LINE_IN,
363                 }, {
364                         .type     = EM28XX_VMUX_COMPOSITE1,
365                         .vmux     = SAA7115_COMPOSITE0,
366                         .amux     = EM28XX_AMUX_LINE_IN,
367                 }, {
368                         .type     = EM28XX_VMUX_SVIDEO,
369                         .vmux     = SAA7115_SVIDEO3,
370                         .amux     = EM28XX_AMUX_LINE_IN,
371                 } },
372         },
373         [EM2821_BOARD_SUPERCOMP_USB_2] = {
374                 .name         = "Supercomp USB 2.0 TV",
375                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
376                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
377                 .tda9887_conf = TDA9887_PRESENT |
378                                 TDA9887_PORT1_ACTIVE |
379                                 TDA9887_PORT2_ACTIVE,
380                 .decoder      = EM28XX_SAA711X,
381                 .input        = { {
382                         .type     = EM28XX_VMUX_TELEVISION,
383                         .vmux     = SAA7115_COMPOSITE2,
384                         .amux     = EM28XX_AMUX_LINE_IN,
385                 }, {
386                         .type     = EM28XX_VMUX_COMPOSITE1,
387                         .vmux     = SAA7115_COMPOSITE0,
388                         .amux     = EM28XX_AMUX_VIDEO,
389                 }, {
390                         .type     = EM28XX_VMUX_SVIDEO,
391                         .vmux     = SAA7115_SVIDEO3,
392                         .amux     = EM28XX_AMUX_LINE_IN,
393                 } },
394         },
395         [EM2821_BOARD_USBGEAR_VD204] = {
396                 .name         = "Usbgear VD204v9",
397                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
398                 .decoder      = EM28XX_SAA711X,
399                 .input        = { {
400                         .type  = EM28XX_VMUX_COMPOSITE1,
401                         .vmux  = SAA7115_COMPOSITE0,
402                         .amux  = EM28XX_AMUX_LINE_IN,
403                 }, {
404                         .type  = EM28XX_VMUX_SVIDEO,
405                         .vmux  = SAA7115_SVIDEO3,
406                         .amux  = EM28XX_AMUX_LINE_IN,
407                 } },
408         },
409         [EM2860_BOARD_NETGMBH_CAM] = {
410                 /* Beijing Huaqi Information Digital Technology Co., Ltd */
411                 .name         = "NetGMBH Cam",
412                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
413                 .input        = { {
414                         .type     = EM28XX_VMUX_COMPOSITE1,
415                         .vmux     = 0,
416                         .amux     = EM28XX_AMUX_VIDEO,
417                 } },
418         },
419         [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
420                 .name         = "Typhoon DVD Maker",
421                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
422                 .decoder      = EM28XX_SAA711X,
423                 .input        = { {
424                         .type  = EM28XX_VMUX_COMPOSITE1,
425                         .vmux  = SAA7115_COMPOSITE0,
426                         .amux  = EM28XX_AMUX_LINE_IN,
427                 }, {
428                         .type  = EM28XX_VMUX_SVIDEO,
429                         .vmux  = SAA7115_SVIDEO3,
430                         .amux  = EM28XX_AMUX_LINE_IN,
431                 } },
432         },
433         [EM2860_BOARD_GADMEI_UTV330] = {
434                 .name         = "Gadmei UTV330",
435                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
436                 .tuner_type   = TUNER_TNF_5335MF,
437                 .tda9887_conf = TDA9887_PRESENT,
438                 .decoder      = EM28XX_SAA711X,
439                 .input        = { {
440                         .type     = EM28XX_VMUX_TELEVISION,
441                         .vmux     = SAA7115_COMPOSITE2,
442                         .amux     = EM28XX_AMUX_VIDEO,
443                 }, {
444                         .type     = EM28XX_VMUX_COMPOSITE1,
445                         .vmux     = SAA7115_COMPOSITE0,
446                         .amux     = EM28XX_AMUX_LINE_IN,
447                 }, {
448                         .type     = EM28XX_VMUX_SVIDEO,
449                         .vmux     = SAA7115_SVIDEO3,
450                         .amux     = EM28XX_AMUX_LINE_IN,
451                 } },
452         },
453         [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
454                 .name         = "Terratec Cinergy A Hybrid XS",
455                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
456                 .tuner_type   = TUNER_XC2028,
457                 .decoder      = EM28XX_TVP5150,
458                 .input        = { {
459                         .type     = EM28XX_VMUX_TELEVISION,
460                         .vmux     = TVP5150_COMPOSITE0,
461                         .amux     = EM28XX_AMUX_VIDEO,
462                         .gpio     = hauppauge_wintv_hvr_900_analog,
463                 }, {
464                         .type     = EM28XX_VMUX_COMPOSITE1,
465                         .vmux     = TVP5150_COMPOSITE1,
466                         .amux     = EM28XX_AMUX_LINE_IN,
467                         .gpio     = hauppauge_wintv_hvr_900_analog,
468                 }, {
469                         .type     = EM28XX_VMUX_SVIDEO,
470                         .vmux     = TVP5150_SVIDEO,
471                         .amux     = EM28XX_AMUX_LINE_IN,
472                         .gpio     = hauppauge_wintv_hvr_900_analog,
473                 } },
474         },
475         [EM2861_BOARD_KWORLD_PVRTV_300U] = {
476                 .name         = "KWorld PVRTV 300U",
477                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
478                 .tuner_type   = TUNER_XC2028,
479                 .decoder      = EM28XX_TVP5150,
480                 .input        = { {
481                         .type     = EM28XX_VMUX_TELEVISION,
482                         .vmux     = TVP5150_COMPOSITE0,
483                         .amux     = EM28XX_AMUX_VIDEO,
484                 }, {
485                         .type     = EM28XX_VMUX_COMPOSITE1,
486                         .vmux     = TVP5150_COMPOSITE1,
487                         .amux     = EM28XX_AMUX_LINE_IN,
488                 }, {
489                         .type     = EM28XX_VMUX_SVIDEO,
490                         .vmux     = TVP5150_SVIDEO,
491                         .amux     = EM28XX_AMUX_LINE_IN,
492                 } },
493         },
494         [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
495                 .name          = "Yakumo MovieMixer",
496                 .valid         = EM28XX_BOARD_NOT_VALIDATED,
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_PLEXTOR_PX_TV100U] = {
513                 .name         = "Plextor ConvertX PX-TV100U",
514                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
515                 .tuner_type   = TUNER_TNF_5335MF,
516                 .tda9887_conf = TDA9887_PRESENT,
517                 .decoder      = EM28XX_TVP5150,
518                 .input        = { {
519                         .type     = EM28XX_VMUX_TELEVISION,
520                         .vmux     = TVP5150_COMPOSITE0,
521                         .amux     = EM28XX_AMUX_LINE_IN,
522                 }, {
523                         .type     = EM28XX_VMUX_COMPOSITE1,
524                         .vmux     = TVP5150_COMPOSITE1,
525                         .amux     = EM28XX_AMUX_LINE_IN,
526                 }, {
527                         .type     = EM28XX_VMUX_SVIDEO,
528                         .vmux     = TVP5150_SVIDEO,
529                         .amux     = EM28XX_AMUX_LINE_IN,
530                 } },
531         },
532         [EM2870_BOARD_TERRATEC_XS] = {
533                 .name         = "Terratec Cinergy T XS",
534                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
535                 .tuner_type   = TUNER_XC2028,
536         },
537         [EM2870_BOARD_TERRATEC_XS_MT2060] = {
538                 .name         = "Terratec Cinergy T XS (MT2060)",
539                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
540                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
541         },
542         [EM2870_BOARD_KWORLD_350U] = {
543                 .name         = "Kworld 350 U DVB-T",
544                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
545                 .tuner_type   = TUNER_XC2028,
546         },
547         [EM2870_BOARD_KWORLD_355U] = {
548                 .name         = "Kworld 355 U DVB-T",
549                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
550         },
551         [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
552                 .name         = "Pinnacle PCTV DVB-T",
553                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
554                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
555                 /* djh - I have serious doubts this is right... */
556                 .xclk         = EM28XX_XCLK_IR_RC5_MODE |
557                                 EM28XX_XCLK_FREQUENCY_10MHZ,
558         },
559         [EM2870_BOARD_COMPRO_VIDEOMATE] = {
560                 .name         = "Compro, VideoMate U3",
561                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
562                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
563         },
564         [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
565                 .name         = "Terratec Hybrid XS Secam",
566                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
567                 .has_msp34xx  = 1,
568                 .tuner_type   = TUNER_XC2028,
569                 .decoder      = EM28XX_TVP5150,
570                 .input        = { {
571                         .type     = EM28XX_VMUX_TELEVISION,
572                         .vmux     = TVP5150_COMPOSITE0,
573                         .amux     = EM28XX_AMUX_VIDEO,
574                         .gpio     = default_analog,
575                 }, {
576                         .type     = EM28XX_VMUX_COMPOSITE1,
577                         .vmux     = TVP5150_COMPOSITE1,
578                         .amux     = EM28XX_AMUX_LINE_IN,
579                         .gpio     = default_analog,
580                 }, {
581                         .type     = EM28XX_VMUX_SVIDEO,
582                         .vmux     = TVP5150_SVIDEO,
583                         .amux     = EM28XX_AMUX_LINE_IN,
584                         .gpio     = default_analog,
585                 } },
586         },
587         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
588                 .name         = "Hauppauge WinTV HVR 900",
589                 .tda9887_conf = TDA9887_PRESENT,
590                 .tuner_type   = TUNER_XC2028,
591                 .mts_firmware = 1,
592                 .has_dvb      = 1,
593                 .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
594                 .decoder      = EM28XX_TVP5150,
595                 .input        = { {
596                         .type     = EM28XX_VMUX_TELEVISION,
597                         .vmux     = TVP5150_COMPOSITE0,
598                         .amux     = EM28XX_AMUX_VIDEO,
599                         .gpio     = hauppauge_wintv_hvr_900_analog,
600                 }, {
601                         .type     = EM28XX_VMUX_COMPOSITE1,
602                         .vmux     = TVP5150_COMPOSITE1,
603                         .amux     = EM28XX_AMUX_LINE_IN,
604                         .gpio     = hauppauge_wintv_hvr_900_analog,
605                 }, {
606                         .type     = EM28XX_VMUX_SVIDEO,
607                         .vmux     = TVP5150_SVIDEO,
608                         .amux     = EM28XX_AMUX_LINE_IN,
609                         .gpio     = hauppauge_wintv_hvr_900_analog,
610                 } },
611         },
612         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
613                 .name         = "Hauppauge WinTV HVR 900 (R2)",
614                 .tda9887_conf = TDA9887_PRESENT,
615                 .tuner_type   = TUNER_XC2028,
616                 .mts_firmware = 1,
617                 .decoder      = EM28XX_TVP5150,
618                 .input        = { {
619                         .type     = EM28XX_VMUX_TELEVISION,
620                         .vmux     = TVP5150_COMPOSITE0,
621                         .amux     = EM28XX_AMUX_VIDEO,
622                         .gpio     = hauppauge_wintv_hvr_900_analog,
623                 }, {
624                         .type     = EM28XX_VMUX_COMPOSITE1,
625                         .vmux     = TVP5150_COMPOSITE1,
626                         .amux     = EM28XX_AMUX_LINE_IN,
627                         .gpio     = hauppauge_wintv_hvr_900_analog,
628                 }, {
629                         .type     = EM28XX_VMUX_SVIDEO,
630                         .vmux     = TVP5150_SVIDEO,
631                         .amux     = EM28XX_AMUX_LINE_IN,
632                         .gpio     = hauppauge_wintv_hvr_900_analog,
633                 } },
634         },
635         [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
636                 .name           = "Hauppauge WinTV HVR 950",
637                 .tuner_type     = TUNER_XC2028,
638                 .mts_firmware   = 1,
639                 .has_dvb        = 1,
640                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
641                 .ir_codes       = ir_codes_hauppauge_new,
642                 .decoder        = EM28XX_TVP5150,
643                 .input          = { {
644                         .type     = EM28XX_VMUX_TELEVISION,
645                         .vmux     = TVP5150_COMPOSITE0,
646                         .amux     = EM28XX_AMUX_VIDEO,
647                         .gpio     = hauppauge_wintv_hvr_900_analog,
648                 }, {
649                         .type     = EM28XX_VMUX_COMPOSITE1,
650                         .vmux     = TVP5150_COMPOSITE1,
651                         .amux     = EM28XX_AMUX_LINE_IN,
652                         .gpio     = hauppauge_wintv_hvr_900_analog,
653                 }, {
654                         .type     = EM28XX_VMUX_SVIDEO,
655                         .vmux     = TVP5150_SVIDEO,
656                         .amux     = EM28XX_AMUX_LINE_IN,
657                         .gpio     = hauppauge_wintv_hvr_900_analog,
658                 } },
659         },
660         [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
661                 .name           = "Pinnacle PCTV HD Pro Stick",
662                 .tuner_type     = TUNER_XC2028,
663                 .mts_firmware   = 1,
664                 .has_dvb        = 1,
665                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
666                 .ir_codes       = ir_codes_pinnacle_pctv_hd,
667                 .decoder        = EM28XX_TVP5150,
668                 .input          = { {
669                         .type     = EM28XX_VMUX_TELEVISION,
670                         .vmux     = TVP5150_COMPOSITE0,
671                         .amux     = EM28XX_AMUX_VIDEO,
672                         .gpio     = hauppauge_wintv_hvr_900_analog,
673                 }, {
674                         .type     = EM28XX_VMUX_COMPOSITE1,
675                         .vmux     = TVP5150_COMPOSITE1,
676                         .amux     = EM28XX_AMUX_LINE_IN,
677                         .gpio     = hauppauge_wintv_hvr_900_analog,
678                 }, {
679                         .type     = EM28XX_VMUX_SVIDEO,
680                         .vmux     = TVP5150_SVIDEO,
681                         .amux     = EM28XX_AMUX_LINE_IN,
682                         .gpio     = hauppauge_wintv_hvr_900_analog,
683                 } },
684         },
685         [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
686                 .name           = "AMD ATI TV Wonder HD 600",
687                 .tuner_type     = TUNER_XC2028,
688                 .mts_firmware   = 1,
689                 .has_dvb        = 1,
690                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
691                 .ir_codes       = ir_codes_ati_tv_wonder_hd_600,
692                 .decoder        = EM28XX_TVP5150,
693                 .input          = { {
694                         .type     = EM28XX_VMUX_TELEVISION,
695                         .vmux     = TVP5150_COMPOSITE0,
696                         .amux     = EM28XX_AMUX_VIDEO,
697                         .gpio     = hauppauge_wintv_hvr_900_analog,
698                 }, {
699                         .type     = EM28XX_VMUX_COMPOSITE1,
700                         .vmux     = TVP5150_COMPOSITE1,
701                         .amux     = EM28XX_AMUX_LINE_IN,
702                         .gpio     = hauppauge_wintv_hvr_900_analog,
703                 }, {
704                         .type     = EM28XX_VMUX_SVIDEO,
705                         .vmux     = TVP5150_SVIDEO,
706                         .amux     = EM28XX_AMUX_LINE_IN,
707                         .gpio     = hauppauge_wintv_hvr_900_analog,
708                 } },
709         },
710         [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
711                 .name           = "Terratec Hybrid XS",
712                 .tuner_type     = TUNER_XC2028,
713                 .decoder        = EM28XX_TVP5150,
714                 .has_dvb        = 1,
715                 .dvb_gpio       = default_analog,
716                 .input          = { {
717                         .type     = EM28XX_VMUX_TELEVISION,
718                         .vmux     = TVP5150_COMPOSITE0,
719                         .amux     = EM28XX_AMUX_VIDEO,
720                         .gpio     = default_analog,
721                 }, {
722                         .type     = EM28XX_VMUX_COMPOSITE1,
723                         .vmux     = TVP5150_COMPOSITE1,
724                         .amux     = EM28XX_AMUX_LINE_IN,
725                         .gpio     = default_analog,
726                 }, {
727                         .type     = EM28XX_VMUX_SVIDEO,
728                         .vmux     = TVP5150_SVIDEO,
729                         .amux     = EM28XX_AMUX_LINE_IN,
730                         .gpio     = default_analog,
731                 } },
732         },
733         /* maybe there's a reason behind it why Terratec sells the Hybrid XS
734            as Prodigy XS with a different PID, let's keep it separated for now
735            maybe we'll need it lateron */
736         [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
737                 .name         = "Terratec Prodigy XS",
738                 .tuner_type   = TUNER_XC2028,
739                 .decoder      = EM28XX_TVP5150,
740                 .input        = { {
741                         .type     = EM28XX_VMUX_TELEVISION,
742                         .vmux     = TVP5150_COMPOSITE0,
743                         .amux     = EM28XX_AMUX_VIDEO,
744                         .gpio     = hauppauge_wintv_hvr_900_analog,
745                 }, {
746                         .type     = EM28XX_VMUX_COMPOSITE1,
747                         .vmux     = TVP5150_COMPOSITE1,
748                         .amux     = EM28XX_AMUX_LINE_IN,
749                         .gpio     = hauppauge_wintv_hvr_900_analog,
750                 }, {
751                         .type     = EM28XX_VMUX_SVIDEO,
752                         .vmux     = TVP5150_SVIDEO,
753                         .amux     = EM28XX_AMUX_LINE_IN,
754                         .gpio     = hauppauge_wintv_hvr_900_analog,
755                 } },
756         },
757         [EM2820_BOARD_MSI_VOX_USB_2] = {
758                 .name              = "MSI VOX USB 2.0",
759                 .tuner_type        = TUNER_LG_PAL_NEW_TAPC,
760                 .tda9887_conf      = TDA9887_PRESENT      |
761                                      TDA9887_PORT1_ACTIVE |
762                                      TDA9887_PORT2_ACTIVE,
763                 .max_range_640_480 = 1,
764                 .decoder           = EM28XX_SAA711X,
765                 .input             = { {
766                         .type      = EM28XX_VMUX_TELEVISION,
767                         .vmux      = SAA7115_COMPOSITE4,
768                         .amux      = EM28XX_AMUX_VIDEO,
769                 }, {
770                         .type      = EM28XX_VMUX_COMPOSITE1,
771                         .vmux      = SAA7115_COMPOSITE0,
772                         .amux      = EM28XX_AMUX_LINE_IN,
773                 }, {
774                         .type      = EM28XX_VMUX_SVIDEO,
775                         .vmux      = SAA7115_SVIDEO3,
776                         .amux      = EM28XX_AMUX_LINE_IN,
777                 } },
778         },
779         [EM2800_BOARD_TERRATEC_CINERGY_200] = {
780                 .name         = "Terratec Cinergy 200 USB",
781                 .is_em2800    = 1,
782                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
783                 .tda9887_conf = TDA9887_PRESENT,
784                 .decoder      = EM28XX_SAA711X,
785                 .input        = { {
786                         .type     = EM28XX_VMUX_TELEVISION,
787                         .vmux     = SAA7115_COMPOSITE2,
788                         .amux     = EM28XX_AMUX_VIDEO,
789                 }, {
790                         .type     = EM28XX_VMUX_COMPOSITE1,
791                         .vmux     = SAA7115_COMPOSITE0,
792                         .amux     = EM28XX_AMUX_LINE_IN,
793                 }, {
794                         .type     = EM28XX_VMUX_SVIDEO,
795                         .vmux     = SAA7115_SVIDEO3,
796                         .amux     = EM28XX_AMUX_LINE_IN,
797                 } },
798         },
799         [EM2800_BOARD_GRABBEEX_USB2800] = {
800                 .name         = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
801                 .is_em2800    = 1,
802                 .decoder      = EM28XX_SAA711X,
803                 .input        = { {
804                         .type     = EM28XX_VMUX_COMPOSITE1,
805                         .vmux     = SAA7115_COMPOSITE0,
806                         .amux     = EM28XX_AMUX_LINE_IN,
807                 }, {
808                         .type     = EM28XX_VMUX_SVIDEO,
809                         .vmux     = SAA7115_SVIDEO3,
810                         .amux     = EM28XX_AMUX_LINE_IN,
811                 } },
812         },
813         [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
814                 .name         = "Leadtek Winfast USB II",
815                 .is_em2800    = 1,
816                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
817                 .tda9887_conf = TDA9887_PRESENT,
818                 .decoder      = EM28XX_SAA711X,
819                 .input        = { {
820                         .type     = EM28XX_VMUX_TELEVISION,
821                         .vmux     = SAA7115_COMPOSITE2,
822                         .amux     = EM28XX_AMUX_VIDEO,
823                 }, {
824                         .type     = EM28XX_VMUX_COMPOSITE1,
825                         .vmux     = SAA7115_COMPOSITE0,
826                         .amux     = EM28XX_AMUX_LINE_IN,
827                 }, {
828                         .type     = EM28XX_VMUX_SVIDEO,
829                         .vmux     = SAA7115_SVIDEO3,
830                         .amux     = EM28XX_AMUX_LINE_IN,
831                 } },
832         },
833         [EM2800_BOARD_KWORLD_USB2800] = {
834                 .name         = "Kworld USB2800",
835                 .is_em2800    = 1,
836                 .tuner_type   = TUNER_PHILIPS_FCV1236D,
837                 .tda9887_conf = TDA9887_PRESENT,
838                 .decoder      = EM28XX_SAA711X,
839                 .input        = { {
840                         .type     = EM28XX_VMUX_TELEVISION,
841                         .vmux     = SAA7115_COMPOSITE2,
842                         .amux     = EM28XX_AMUX_VIDEO,
843                 }, {
844                         .type     = EM28XX_VMUX_COMPOSITE1,
845                         .vmux     = SAA7115_COMPOSITE0,
846                         .amux     = EM28XX_AMUX_LINE_IN,
847                 }, {
848                         .type     = EM28XX_VMUX_SVIDEO,
849                         .vmux     = SAA7115_SVIDEO3,
850                         .amux     = EM28XX_AMUX_LINE_IN,
851                 } },
852         },
853         [EM2820_BOARD_PINNACLE_DVC_90] = {
854                 .name         = "Pinnacle Dazzle DVC 90/DVC 100",
855                 .tuner_type   = TUNER_ABSENT,
856                 .decoder      = EM28XX_SAA711X,
857                 .input        = { {
858                         .type     = EM28XX_VMUX_COMPOSITE1,
859                         .vmux     = SAA7115_COMPOSITE0,
860                         .amux     = EM28XX_AMUX_LINE_IN,
861                 }, {
862                         .type     = EM28XX_VMUX_SVIDEO,
863                         .vmux     = SAA7115_SVIDEO3,
864                         .amux     = EM28XX_AMUX_LINE_IN,
865                 } },
866         },
867         [EM2800_BOARD_VGEAR_POCKETTV] = {
868                 .name         = "V-Gear PocketTV",
869                 .is_em2800    = 1,
870                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
871                 .tda9887_conf = TDA9887_PRESENT,
872                 .decoder      = EM28XX_SAA711X,
873                 .input        = { {
874                         .type     = EM28XX_VMUX_TELEVISION,
875                         .vmux     = SAA7115_COMPOSITE2,
876                         .amux     = EM28XX_AMUX_VIDEO,
877                 }, {
878                         .type     = EM28XX_VMUX_COMPOSITE1,
879                         .vmux     = SAA7115_COMPOSITE0,
880                         .amux     = EM28XX_AMUX_LINE_IN,
881                 }, {
882                         .type     = EM28XX_VMUX_SVIDEO,
883                         .vmux     = SAA7115_SVIDEO3,
884                         .amux     = EM28XX_AMUX_LINE_IN,
885                 } },
886         },
887         [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
888                 .name         = "Pixelview Prolink PlayTV USB 2.0",
889                 .tda9887_conf = TDA9887_PRESENT,
890                 .tuner_type   = TUNER_YMEC_TVF_5533MF,
891                 .decoder      = EM28XX_SAA711X,
892                 .input        = { {
893                         .type     = EM28XX_VMUX_TELEVISION,
894                         .vmux     = SAA7115_COMPOSITE2,
895                         .amux     = EM28XX_AMUX_VIDEO,
896                         .aout     = EM28XX_AOUT_MONO |  /* I2S */
897                                     EM28XX_AOUT_MASTER, /* Line out pin */
898                 }, {
899                         .type     = EM28XX_VMUX_COMPOSITE1,
900                         .vmux     = SAA7115_COMPOSITE0,
901                         .amux     = EM28XX_AMUX_LINE_IN,
902                 }, {
903                         .type     = EM28XX_VMUX_SVIDEO,
904                         .vmux     = SAA7115_SVIDEO3,
905                         .amux     = EM28XX_AMUX_LINE_IN,
906                 } },
907         },
908         [EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA] = {
909                 .name                = "PointNix Intra-Oral Camera",
910                 .has_snapshot_button = 1,
911                 .tda9887_conf        = TDA9887_PRESENT,
912                 .tuner_type          = TUNER_ABSENT,
913                 .decoder             = EM28XX_SAA711X,
914                 .input               = { {
915                         .type     = EM28XX_VMUX_SVIDEO,
916                         .vmux     = SAA7115_SVIDEO3,
917                         .amux     = EM28XX_AMUX_VIDEO,
918                 } },
919         },
920         [EM2880_BOARD_MSI_DIGIVOX_AD] = {
921                 .name         = "MSI DigiVox A/D",
922                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
923                 .tuner_type   = TUNER_XC2028,
924                 .decoder      = EM28XX_TVP5150,
925                 .input        = { {
926                         .type     = EM28XX_VMUX_TELEVISION,
927                         .vmux     = TVP5150_COMPOSITE0,
928                         .amux     = EM28XX_AMUX_VIDEO,
929                         .gpio     = em2880_msi_digivox_ad_analog,
930                 }, {
931                         .type     = EM28XX_VMUX_COMPOSITE1,
932                         .vmux     = TVP5150_COMPOSITE1,
933                         .amux     = EM28XX_AMUX_LINE_IN,
934                         .gpio     = em2880_msi_digivox_ad_analog,
935                 }, {
936                         .type     = EM28XX_VMUX_SVIDEO,
937                         .vmux     = TVP5150_SVIDEO,
938                         .amux     = EM28XX_AMUX_LINE_IN,
939                         .gpio     = em2880_msi_digivox_ad_analog,
940                 } },
941         },
942         [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
943                 .name         = "MSI DigiVox A/D II",
944                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
945                 .tuner_type   = TUNER_XC2028,
946                 .decoder      = EM28XX_TVP5150,
947                 .input        = { {
948                         .type     = EM28XX_VMUX_TELEVISION,
949                         .vmux     = TVP5150_COMPOSITE0,
950                         .amux     = EM28XX_AMUX_VIDEO,
951                         .gpio     = em2880_msi_digivox_ad_analog,
952                 }, {
953                         .type     = EM28XX_VMUX_COMPOSITE1,
954                         .vmux     = TVP5150_COMPOSITE1,
955                         .amux     = EM28XX_AMUX_LINE_IN,
956                         .gpio     = em2880_msi_digivox_ad_analog,
957                 }, {
958                         .type     = EM28XX_VMUX_SVIDEO,
959                         .vmux     = TVP5150_SVIDEO,
960                         .amux     = EM28XX_AMUX_LINE_IN,
961                         .gpio     = em2880_msi_digivox_ad_analog,
962                 } },
963         },
964         [EM2880_BOARD_KWORLD_DVB_305U] = {
965                 .name         = "KWorld DVB-T 305U",
966                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
967                 .tuner_type   = TUNER_XC2028,
968                 .decoder      = EM28XX_TVP5150,
969                 .input        = { {
970                         .type     = EM28XX_VMUX_TELEVISION,
971                         .vmux     = TVP5150_COMPOSITE0,
972                         .amux     = EM28XX_AMUX_VIDEO,
973                 }, {
974                         .type     = EM28XX_VMUX_COMPOSITE1,
975                         .vmux     = TVP5150_COMPOSITE1,
976                         .amux     = EM28XX_AMUX_LINE_IN,
977                 }, {
978                         .type     = EM28XX_VMUX_SVIDEO,
979                         .vmux     = TVP5150_SVIDEO,
980                         .amux     = EM28XX_AMUX_LINE_IN,
981                 } },
982         },
983         [EM2880_BOARD_KWORLD_DVB_310U] = {
984                 .name         = "KWorld DVB-T 310U",
985                 .tuner_type   = TUNER_XC2028,
986                 .has_dvb      = 1,
987                 .dvb_gpio     = default_digital,
988                 .mts_firmware = 1,
989                 .decoder      = EM28XX_TVP5150,
990                 .input        = { {
991                         .type     = EM28XX_VMUX_TELEVISION,
992                         .vmux     = TVP5150_COMPOSITE0,
993                         .amux     = EM28XX_AMUX_VIDEO,
994                         .gpio     = default_analog,
995                 }, {
996                         .type     = EM28XX_VMUX_COMPOSITE1,
997                         .vmux     = TVP5150_COMPOSITE1,
998                         .amux     = EM28XX_AMUX_LINE_IN,
999                         .gpio     = default_analog,
1000                 }, {    /* S-video has not been tested yet */
1001                         .type     = EM28XX_VMUX_SVIDEO,
1002                         .vmux     = TVP5150_SVIDEO,
1003                         .amux     = EM28XX_AMUX_LINE_IN,
1004                         .gpio     = default_analog,
1005                 } },
1006         },
1007         [EM2881_BOARD_DNT_DA2_HYBRID] = {
1008                 .name         = "DNT DA2 Hybrid",
1009                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1010                 .tuner_type   = TUNER_XC2028,
1011                 .decoder      = EM28XX_TVP5150,
1012                 .input        = { {
1013                         .type     = EM28XX_VMUX_TELEVISION,
1014                         .vmux     = TVP5150_COMPOSITE0,
1015                         .amux     = EM28XX_AMUX_VIDEO,
1016                         .gpio     = default_analog,
1017                 }, {
1018                         .type     = EM28XX_VMUX_COMPOSITE1,
1019                         .vmux     = TVP5150_COMPOSITE1,
1020                         .amux     = EM28XX_AMUX_LINE_IN,
1021                         .gpio     = default_analog,
1022                 }, {
1023                         .type     = EM28XX_VMUX_SVIDEO,
1024                         .vmux     = TVP5150_SVIDEO,
1025                         .amux     = EM28XX_AMUX_LINE_IN,
1026                         .gpio     = default_analog,
1027                 } },
1028         },
1029         [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
1030                 .name         = "Pinnacle Hybrid Pro",
1031                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1032                 .tuner_type   = TUNER_XC2028,
1033                 .decoder      = EM28XX_TVP5150,
1034                 .input        = { {
1035                         .type     = EM28XX_VMUX_TELEVISION,
1036                         .vmux     = TVP5150_COMPOSITE0,
1037                         .amux     = EM28XX_AMUX_VIDEO,
1038                         .gpio     = default_analog,
1039                 }, {
1040                         .type     = EM28XX_VMUX_COMPOSITE1,
1041                         .vmux     = TVP5150_COMPOSITE1,
1042                         .amux     = EM28XX_AMUX_LINE_IN,
1043                         .gpio     = default_analog,
1044                 }, {
1045                         .type     = EM28XX_VMUX_SVIDEO,
1046                         .vmux     = TVP5150_SVIDEO,
1047                         .amux     = EM28XX_AMUX_LINE_IN,
1048                         .gpio     = default_analog,
1049                 } },
1050         },
1051         [EM2882_BOARD_PINNACLE_HYBRID_PRO] = {
1052                 .name         = "Pinnacle Hybrid Pro (2)",
1053                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1054                 .tuner_type   = TUNER_XC2028,
1055                 .mts_firmware = 1,
1056                 .decoder      = EM28XX_TVP5150,
1057                 .input        = { {
1058                         .type     = EM28XX_VMUX_TELEVISION,
1059                         .vmux     = TVP5150_COMPOSITE0,
1060                         .amux     = EM28XX_AMUX_VIDEO,
1061                         .gpio     = hauppauge_wintv_hvr_900_analog,
1062                 }, {
1063                         .type     = EM28XX_VMUX_COMPOSITE1,
1064                         .vmux     = TVP5150_COMPOSITE1,
1065                         .amux     = EM28XX_AMUX_LINE_IN,
1066                         .gpio     = hauppauge_wintv_hvr_900_analog,
1067                 }, {
1068                         .type     = EM28XX_VMUX_SVIDEO,
1069                         .vmux     = TVP5150_SVIDEO,
1070                         .amux     = EM28XX_AMUX_LINE_IN,
1071                         .gpio     = hauppauge_wintv_hvr_900_analog,
1072                 } },
1073         },
1074         [EM2882_BOARD_KWORLD_VS_DVBT] = {
1075                 .name         = "Kworld VS-DVB-T 323UR",
1076                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1077                 .tuner_type   = TUNER_XC2028,
1078                 .decoder      = EM28XX_TVP5150,
1079                 .input        = { {
1080                         .type     = EM28XX_VMUX_TELEVISION,
1081                         .vmux     = TVP5150_COMPOSITE0,
1082                         .amux     = EM28XX_AMUX_VIDEO,
1083                 }, {
1084                         .type     = EM28XX_VMUX_COMPOSITE1,
1085                         .vmux     = TVP5150_COMPOSITE1,
1086                         .amux     = EM28XX_AMUX_LINE_IN,
1087                 }, {
1088                         .type     = EM28XX_VMUX_SVIDEO,
1089                         .vmux     = TVP5150_SVIDEO,
1090                         .amux     = EM28XX_AMUX_LINE_IN,
1091                 } },
1092         },
1093         [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
1094                 .name         = "Terratec Hybrid XS (em2882)",
1095                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1096                 .tuner_type   = TUNER_XC2028,
1097                 .decoder      = EM28XX_TVP5150,
1098                 .input        = { {
1099                         .type     = EM28XX_VMUX_TELEVISION,
1100                         .vmux     = TVP5150_COMPOSITE0,
1101                         .amux     = EM28XX_AMUX_VIDEO,
1102                         .gpio     = hauppauge_wintv_hvr_900_analog,
1103                 }, {
1104                         .type     = EM28XX_VMUX_COMPOSITE1,
1105                         .vmux     = TVP5150_COMPOSITE1,
1106                         .amux     = EM28XX_AMUX_LINE_IN,
1107                         .gpio     = hauppauge_wintv_hvr_900_analog,
1108                 }, {
1109                         .type     = EM28XX_VMUX_SVIDEO,
1110                         .vmux     = TVP5150_SVIDEO,
1111                         .amux     = EM28XX_AMUX_LINE_IN,
1112                         .gpio     = hauppauge_wintv_hvr_900_analog,
1113                 } },
1114         },
1115         [EM2883_BOARD_KWORLD_HYBRID_A316] = {
1116                 .name         = "Kworld PlusTV HD Hybrid 330",
1117                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1118                 .tuner_type   = TUNER_XC2028,
1119                 .decoder      = EM28XX_TVP5150,
1120                 .input        = { {
1121                         .type     = EM28XX_VMUX_TELEVISION,
1122                         .vmux     = TVP5150_COMPOSITE0,
1123                         .amux     = EM28XX_AMUX_VIDEO,
1124                         .gpio     = hauppauge_wintv_hvr_900_analog,
1125                 }, {
1126                         .type     = EM28XX_VMUX_COMPOSITE1,
1127                         .vmux     = TVP5150_COMPOSITE1,
1128                         .amux     = EM28XX_AMUX_LINE_IN,
1129                         .gpio     = hauppauge_wintv_hvr_900_analog,
1130                 }, {
1131                         .type     = EM28XX_VMUX_SVIDEO,
1132                         .vmux     = TVP5150_SVIDEO,
1133                         .amux     = EM28XX_AMUX_LINE_IN,
1134                         .gpio     = hauppauge_wintv_hvr_900_analog,
1135                 } },
1136         },
1137         [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
1138                 .name         = "Compro VideoMate ForYou/Stereo",
1139                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1140                 .tda9887_conf = TDA9887_PRESENT,
1141                 .decoder      = EM28XX_TVP5150,
1142                 .input        = { {
1143                         .type     = EM28XX_VMUX_TELEVISION,
1144                         .vmux     = TVP5150_COMPOSITE0,
1145                         .amux     = EM28XX_AMUX_LINE_IN,
1146                 }, {
1147                         .type     = EM28XX_VMUX_SVIDEO,
1148                         .vmux     = TVP5150_SVIDEO,
1149                         .amux     = EM28XX_AMUX_LINE_IN,
1150                 } },
1151         },
1152         [EM2874_BOARD_PINNACLE_PCTV_80E] = {
1153                 .name         = "Pinnacle PCTV HD Mini",
1154                 .tuner_type   = TUNER_ABSENT,
1155                 .has_dvb      = 1,
1156                 .dvb_gpio     = em2874_pinnacle_80e_digital,
1157                 .ir_codes     = ir_codes_pinnacle_pctv_hd,
1158                 .decoder      = EM28XX_NODECODER,
1159                 .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1160                                 EM2874_I2C_SECONDARY_BUS_SELECT |
1161                                 EM28XX_I2C_FREQ_400_KHZ,
1162 #ifdef DJH_DEBUG
1163                 .input        = { {
1164                         .type     = EM28XX_VMUX_TELEVISION,
1165                         .vmux     = TVP5150_COMPOSITE0,
1166                         .amux     = EM28XX_AMUX_LINE_IN,
1167                 } },
1168 #endif
1169         },
1170 };
1171 const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
1172
1173 /* table of devices that work with this driver */
1174 struct usb_device_id em28xx_id_table [] = {
1175         { USB_DEVICE(0xeb1a, 0x2750),
1176                         .driver_info = EM2750_BOARD_UNKNOWN },
1177         { USB_DEVICE(0xeb1a, 0x2751),
1178                         .driver_info = EM2750_BOARD_UNKNOWN },
1179         { USB_DEVICE(0xeb1a, 0x2800),
1180                         .driver_info = EM2800_BOARD_UNKNOWN },
1181         { USB_DEVICE(0xeb1a, 0x2820),
1182                         .driver_info = EM2820_BOARD_UNKNOWN },
1183         { USB_DEVICE(0xeb1a, 0x2821),
1184                         .driver_info = EM2820_BOARD_PROLINK_PLAYTV_USB2 },
1185         { USB_DEVICE(0xeb1a, 0x2860),
1186                         .driver_info = EM2820_BOARD_UNKNOWN },
1187         { USB_DEVICE(0xeb1a, 0x2861),
1188                         .driver_info = EM2820_BOARD_UNKNOWN },
1189         { USB_DEVICE(0xeb1a, 0x2870),
1190                         .driver_info = EM2820_BOARD_UNKNOWN },
1191         { USB_DEVICE(0xeb1a, 0x2881),
1192                         .driver_info = EM2820_BOARD_UNKNOWN },
1193         { USB_DEVICE(0xeb1a, 0x2883),
1194                         .driver_info = EM2820_BOARD_UNKNOWN },
1195         { USB_DEVICE(0xeb1a, 0xe300),
1196                         .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
1197         { USB_DEVICE(0xeb1a, 0xe305),
1198                         .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
1199         { USB_DEVICE(0xeb1a, 0xe310),
1200                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
1201         { USB_DEVICE(0xeb1a, 0xa316),
1202                         .driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 },
1203         { USB_DEVICE(0xeb1a, 0xe320),
1204                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
1205         { USB_DEVICE(0xeb1a, 0xe323),
1206                         .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
1207         { USB_DEVICE(0xeb1a, 0xe350),
1208                         .driver_info = EM2870_BOARD_KWORLD_350U },
1209         { USB_DEVICE(0xeb1a, 0xe355),
1210                         .driver_info = EM2870_BOARD_KWORLD_355U },
1211         { USB_DEVICE(0xeb1a, 0x2801),
1212                         .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
1213         { USB_DEVICE(0xeb1a, 0xe357),
1214                         .driver_info = EM2870_BOARD_KWORLD_355U },
1215         { USB_DEVICE(0x0ccd, 0x0036),
1216                         .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
1217         { USB_DEVICE(0x0ccd, 0x004c),
1218                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
1219         { USB_DEVICE(0x0ccd, 0x004f),
1220                         .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
1221         { USB_DEVICE(0x0ccd, 0x005e),
1222                         .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
1223         { USB_DEVICE(0x0ccd, 0x0042),
1224                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS },
1225         { USB_DEVICE(0x0ccd, 0x0043),
1226                         .driver_info = EM2870_BOARD_TERRATEC_XS },
1227         { USB_DEVICE(0x0ccd, 0x0047),
1228                         .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
1229         { USB_DEVICE(0x185b, 0x2870),
1230                         .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
1231         { USB_DEVICE(0x185b, 0x2041),
1232                         .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
1233         { USB_DEVICE(0x2040, 0x4200),
1234                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
1235         { USB_DEVICE(0x2040, 0x4201),
1236                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
1237         { USB_DEVICE(0x2040, 0x6500),
1238                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
1239         { USB_DEVICE(0x2040, 0x6502),
1240                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
1241         { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
1242                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1243         { USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
1244                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1245         { USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
1246                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1247         { USB_DEVICE(0x2040, 0x651f), /* HCW HVR-850 */
1248                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1249         { USB_DEVICE(0x0438, 0xb002),
1250                         .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
1251         { USB_DEVICE(0x2001, 0xf112),
1252                         .driver_info = EM2820_BOARD_DLINK_USB_TV },
1253         { USB_DEVICE(0x2304, 0x0207),
1254                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1255         { USB_DEVICE(0x2304, 0x0208),
1256                         .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
1257         { USB_DEVICE(0x2304, 0x021a),
1258                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1259         { USB_DEVICE(0x2304, 0x0226),
1260                         .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO },
1261         { USB_DEVICE(0x2304, 0x0227),
1262                         .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
1263         { USB_DEVICE(0x2304, 0x023f),
1264                         .driver_info = EM2874_BOARD_PINNACLE_PCTV_80E },
1265         { USB_DEVICE(0x0413, 0x6023),
1266                         .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
1267         { USB_DEVICE(0x093b, 0xa005),
1268                         .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
1269         { },
1270 };
1271 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
1272
1273 /*
1274  * EEPROM hash table for devices with generic USB IDs
1275  */
1276 static struct em28xx_hash_table em28xx_eeprom_hash [] = {
1277         /* P/N: SA 60002070465 Tuner: TVF7533-MF */
1278         {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
1279         {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
1280 };
1281
1282 /* I2C devicelist hash table for devices with generic USB IDs */
1283 static struct em28xx_hash_table em28xx_i2c_hash[] = {
1284         {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
1285         {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
1286         {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT},
1287 };
1288
1289 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
1290 {
1291         int rc = 0;
1292         struct em28xx *dev = ptr;
1293
1294         if (dev->tuner_type != TUNER_XC2028)
1295                 return 0;
1296
1297         if (command != XC2028_TUNER_RESET)
1298                 return 0;
1299
1300         rc = em28xx_gpio_set(dev, dev->tuner_gpio);
1301
1302         return rc;
1303 }
1304 EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
1305
1306 static void inline em28xx_set_model(struct em28xx *dev)
1307 {
1308         memcpy(&dev->board, &em28xx_boards[dev->model], sizeof(dev->board));
1309 }
1310
1311 /* Since em28xx_pre_card_setup() requires a proper dev->model,
1312  * this won't work for boards with generic PCI IDs
1313  */
1314 void em28xx_pre_card_setup(struct em28xx *dev)
1315 {
1316         int rc;
1317
1318         em28xx_set_model(dev);
1319
1320         em28xx_info("Found %s\n", dev->board.name);
1321
1322         /* Set the default GPO/GPIO for legacy devices */
1323         dev->reg_gpo_num = EM2880_R04_GPO;
1324         dev->reg_gpio_num = EM28XX_R08_GPIO;
1325
1326         dev->wait_after_write = 5;
1327
1328         /* Based on the Chip ID, set the device configuration */
1329         rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
1330         if (rc > 0) {
1331                 dev->chip_id = rc;
1332
1333                 switch (dev->chip_id) {
1334                 case CHIP_ID_EM2750:
1335                         em28xx_info("chip ID is em2750\n");
1336                         break;
1337                 case CHIP_ID_EM2820:
1338                         em28xx_info("chip ID is em2820\n");
1339                         break;
1340                 case CHIP_ID_EM2840:
1341                         em28xx_info("chip ID is em2840\n");
1342                         break;
1343                 case CHIP_ID_EM2860:
1344                         em28xx_info("chip ID is em2860\n");
1345                         break;
1346                 case CHIP_ID_EM2874:
1347                         em28xx_info("chip ID is em2874\n");
1348                         dev->reg_gpio_num = EM2874_R80_GPIO;
1349                         dev->wait_after_write = 0;
1350                         break;
1351                 case CHIP_ID_EM2883:
1352                         em28xx_info("chip ID is em2882/em2883\n");
1353                         dev->wait_after_write = 0;
1354                         break;
1355                 default:
1356                         em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
1357                 }
1358         }
1359
1360         /* Prepopulate cached GPO register content */
1361         rc = em28xx_read_reg(dev, dev->reg_gpo_num);
1362         if (rc >= 0)
1363                 dev->reg_gpo = rc;
1364
1365         /* Those are the default values for the majority of boards
1366            Use those values if not specified otherwise at boards entry
1367          */
1368         if (!dev->board.xclk)
1369                 dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE |
1370                                   EM28XX_XCLK_FREQUENCY_12MHZ;
1371
1372         if (!dev->board.i2c_speed)
1373                 dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
1374                                        EM28XX_I2C_FREQ_100_KHZ;
1375
1376         em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
1377         em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
1378         msleep(50);
1379
1380         /* request some modules */
1381         switch (dev->model) {
1382         case EM2861_BOARD_PLEXTOR_PX_TV100U:
1383                 /* FIXME guess */
1384                 /* Turn on analog audio output */
1385                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
1386                 break;
1387         case EM2861_BOARD_KWORLD_PVRTV_300U:
1388         case EM2880_BOARD_KWORLD_DVB_305U:
1389                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x6d);
1390                 msleep(10);
1391                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d);
1392                 msleep(10);
1393                 break;
1394         case EM2870_BOARD_COMPRO_VIDEOMATE:
1395                 /* TODO: someone can do some cleanup here...
1396                          not everything's needed */
1397                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
1398                 msleep(10);
1399                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
1400                 msleep(10);
1401                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
1402                 mdelay(70);
1403                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
1404                 mdelay(70);
1405                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xdc);
1406                 mdelay(70);
1407                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
1408                 mdelay(70);
1409                 break;
1410         case EM2870_BOARD_TERRATEC_XS_MT2060:
1411                 /* this device needs some gpio writes to get the DVB-T
1412                    demod work */
1413                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
1414                 mdelay(70);
1415                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
1416                 mdelay(70);
1417                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
1418                 mdelay(70);
1419                 break;
1420         case EM2870_BOARD_PINNACLE_PCTV_DVB:
1421                 /* this device needs some gpio writes to get the
1422                    DVB-T demod work */
1423                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
1424                 mdelay(70);
1425                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
1426                 mdelay(70);
1427                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
1428                 mdelay(70);
1429                 break;
1430         case EM2820_BOARD_GADMEI_UTV310:
1431         case EM2820_BOARD_MSI_VOX_USB_2:
1432                 /* enables audio for that devices */
1433                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
1434                 break;
1435         }
1436
1437         /* Sets the default callback. Used only for certain tuners */
1438         if (!dev->tuner_gpio)
1439                 dev->tuner_gpio       = default_callback;
1440
1441         em28xx_gpio_set(dev, dev->tuner_gpio);
1442         em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
1443
1444         /* Unlock device */
1445         em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
1446 }
1447
1448 static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
1449 {
1450         memset(ctl, 0, sizeof(*ctl));
1451
1452         ctl->fname   = XC2028_DEFAULT_FIRMWARE;
1453         ctl->max_len = 64;
1454         ctl->mts = em28xx_boards[dev->model].mts_firmware;
1455
1456         switch (dev->model) {
1457         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1458                 ctl->demod = XC3028_FE_ZARLINK456;
1459                 break;
1460         case EM2880_BOARD_TERRATEC_HYBRID_XS:
1461                 ctl->demod = XC3028_FE_ZARLINK456;
1462                 break;
1463         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1464                 /* djh - Not sure which demod we need here */
1465                 ctl->demod = XC3028_FE_DEFAULT;
1466                 break;
1467         case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
1468                 ctl->demod = XC3028_FE_DEFAULT;
1469                 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
1470                 break;
1471         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1472         case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
1473                 /* FIXME: Better to specify the needed IF */
1474                 ctl->demod = XC3028_FE_DEFAULT;
1475                 break;
1476         default:
1477                 ctl->demod = XC3028_FE_OREN538;
1478         }
1479 }
1480
1481 static void em28xx_config_tuner(struct em28xx *dev)
1482 {
1483         struct v4l2_priv_tun_config  xc2028_cfg;
1484         struct tuner_setup           tun_setup;
1485         struct v4l2_frequency        f;
1486
1487         if (dev->tuner_type == TUNER_ABSENT)
1488                 return;
1489
1490         tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
1491         tun_setup.type = dev->tuner_type;
1492         tun_setup.addr = dev->tuner_addr;
1493         tun_setup.tuner_callback = em28xx_tuner_callback;
1494
1495         em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup);
1496
1497         if (dev->tuner_type == TUNER_XC2028) {
1498                 struct xc2028_ctrl           ctl;
1499
1500                 em28xx_setup_xc3028(dev, &ctl);
1501
1502                 xc2028_cfg.tuner = TUNER_XC2028;
1503                 xc2028_cfg.priv  = &ctl;
1504
1505                 em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg);
1506         }
1507
1508         /* configure tuner */
1509         f.tuner = 0;
1510         f.type = V4L2_TUNER_ANALOG_TV;
1511         f.frequency = 9076;     /* just a magic number */
1512         dev->ctl_freq = f.frequency;
1513         em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f);
1514 }
1515
1516 static int em28xx_hint_board(struct em28xx *dev)
1517 {
1518         int i;
1519
1520         /* HINT method: EEPROM
1521          *
1522          * This method works only for boards with eeprom.
1523          * Uses a hash of all eeprom bytes. The hash should be
1524          * unique for a vendor/tuner pair.
1525          * There are a high chance that tuners for different
1526          * video standards produce different hashes.
1527          */
1528         for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
1529                 if (dev->hash == em28xx_eeprom_hash[i].hash) {
1530                         dev->model = em28xx_eeprom_hash[i].model;
1531                         dev->tuner_type = em28xx_eeprom_hash[i].tuner;
1532
1533                         em28xx_errdev("Your board has no unique USB ID.\n");
1534                         em28xx_errdev("A hint were successfully done, "
1535                                       "based on eeprom hash.\n");
1536                         em28xx_errdev("This method is not 100%% failproof.\n");
1537                         em28xx_errdev("If the board were missdetected, "
1538                                       "please email this log to:\n");
1539                         em28xx_errdev("\tV4L Mailing List "
1540                                       " <video4linux-list@redhat.com>\n");
1541                         em28xx_errdev("Board detected as %s\n",
1542                                       em28xx_boards[dev->model].name);
1543
1544                         return 0;
1545                 }
1546         }
1547
1548         /* HINT method: I2C attached devices
1549          *
1550          * This method works for all boards.
1551          * Uses a hash of i2c scanned devices.
1552          * Devices with the same i2c attached chips will
1553          * be considered equal.
1554          * This method is less precise than the eeprom one.
1555          */
1556
1557         /* user did not request i2c scanning => do it now */
1558         if (!dev->i2c_hash)
1559                 em28xx_do_i2c_scan(dev);
1560
1561         for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
1562                 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
1563                         dev->model = em28xx_i2c_hash[i].model;
1564                         dev->tuner_type = em28xx_i2c_hash[i].tuner;
1565                         em28xx_errdev("Your board has no unique USB ID.\n");
1566                         em28xx_errdev("A hint were successfully done, "
1567                                       "based on i2c devicelist hash.\n");
1568                         em28xx_errdev("This method is not 100%% failproof.\n");
1569                         em28xx_errdev("If the board were missdetected, "
1570                                       "please email this log to:\n");
1571                         em28xx_errdev("\tV4L Mailing List "
1572                                       " <video4linux-list@redhat.com>\n");
1573                         em28xx_errdev("Board detected as %s\n",
1574                                       em28xx_boards[dev->model].name);
1575
1576                         return 0;
1577                 }
1578         }
1579
1580         em28xx_errdev("Your board has no unique USB ID and thus need a "
1581                       "hint to be detected.\n");
1582         em28xx_errdev("You may try to use card=<n> insmod option to "
1583                       "workaround that.\n");
1584         em28xx_errdev("Please send an email with this log to:\n");
1585         em28xx_errdev("\tV4L Mailing List <video4linux-list@redhat.com>\n");
1586         em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
1587         em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
1588
1589         em28xx_errdev("Here is a list of valid choices for the card=<n>"
1590                       " insmod option:\n");
1591         for (i = 0; i < em28xx_bcount; i++) {
1592                 em28xx_errdev("    card=%d -> %s\n",
1593                                 i, em28xx_boards[i].name);
1594         }
1595         return -1;
1596 }
1597
1598 /* ----------------------------------------------------------------------- */
1599 void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir)
1600 {
1601         if (disable_ir) {
1602                 ir->get_key = NULL;
1603                 return ;
1604         }
1605
1606         /* detect & configure */
1607         switch (dev->model) {
1608         case (EM2800_BOARD_UNKNOWN):
1609                 break;
1610         case (EM2820_BOARD_UNKNOWN):
1611                 break;
1612         case (EM2800_BOARD_TERRATEC_CINERGY_200):
1613         case (EM2820_BOARD_TERRATEC_CINERGY_250):
1614                 ir->ir_codes = ir_codes_em_terratec;
1615                 ir->get_key = em28xx_get_key_terratec;
1616                 snprintf(ir->c.name, sizeof(ir->c.name),
1617                          "i2c IR (EM28XX Terratec)");
1618                 break;
1619         case (EM2820_BOARD_PINNACLE_USB_2):
1620                 ir->ir_codes = ir_codes_pinnacle_grey;
1621                 ir->get_key = em28xx_get_key_pinnacle_usb_grey;
1622                 snprintf(ir->c.name, sizeof(ir->c.name),
1623                          "i2c IR (EM28XX Pinnacle PCTV)");
1624                 break;
1625         case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
1626                 ir->ir_codes = ir_codes_hauppauge_new;
1627                 ir->get_key = em28xx_get_key_em_haup;
1628                 snprintf(ir->c.name, sizeof(ir->c.name),
1629                          "i2c IR (EM2840 Hauppauge)");
1630                 break;
1631         case (EM2820_BOARD_MSI_VOX_USB_2):
1632                 break;
1633         case (EM2800_BOARD_LEADTEK_WINFAST_USBII):
1634                 break;
1635         case (EM2800_BOARD_KWORLD_USB2800):
1636                 break;
1637         case (EM2800_BOARD_GRABBEEX_USB2800):
1638                 break;
1639         }
1640 }
1641
1642 void em28xx_card_setup(struct em28xx *dev)
1643 {
1644         em28xx_set_model(dev);
1645
1646         dev->tuner_type = em28xx_boards[dev->model].tuner_type;
1647         if (em28xx_boards[dev->model].tuner_addr)
1648                 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr;
1649
1650         /* request some modules */
1651         switch (dev->model) {
1652         case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
1653         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1654         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1655         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1656         {
1657                 struct tveeprom tv;
1658 #ifdef CONFIG_MODULES
1659                 request_module("tveeprom");
1660 #endif
1661                 /* Call first TVeeprom */
1662
1663                 dev->i2c_client.addr = 0xa0 >> 1;
1664                 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
1665
1666                 dev->tuner_type = tv.tuner_type;
1667
1668                 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) {
1669                         dev->i2s_speed = 2048000;
1670                         dev->board.has_msp34xx = 1;
1671                 }
1672 #ifdef CONFIG_MODULES
1673                 if (tv.has_ir)
1674                         request_module("ir-kbd-i2c");
1675 #endif
1676                 break;
1677         }
1678         case EM2820_BOARD_KWORLD_PVRTV2800RF:
1679                 /* GPIO enables sound on KWORLD PVR TV 2800RF */
1680                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9);
1681                 break;
1682         case EM2820_BOARD_UNKNOWN:
1683         case EM2800_BOARD_UNKNOWN:
1684                 /*
1685                  * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
1686                  *
1687                  * This occurs because they share identical USB vendor and
1688                  * product IDs.
1689                  *
1690                  * What we do here is look up the EEPROM hash of the K-WORLD
1691                  * and if it is found then we decide that we do not have
1692                  * a DIGIVOX and reset the device to the K-WORLD instead.
1693                  *
1694                  * This solution is only valid if they do not share eeprom
1695                  * hash identities which has not been determined as yet.
1696                  */
1697         case EM2880_BOARD_MSI_DIGIVOX_AD:
1698                 if (!em28xx_hint_board(dev))
1699                         em28xx_set_model(dev);
1700                 break;
1701         }
1702
1703         if (dev->board.has_snapshot_button)
1704                 em28xx_register_snapshot_button(dev);
1705
1706         if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
1707                 em28xx_errdev("\n\n");
1708                 em28xx_errdev("The support for this board weren't "
1709                               "valid yet.\n");
1710                 em28xx_errdev("Please send a report of having this working\n");
1711                 em28xx_errdev("not to V4L mailing list (and/or to other "
1712                                 "addresses)\n\n");
1713         }
1714
1715         /* Allow override tuner type by a module parameter */
1716         if (tuner >= 0)
1717                 dev->tuner_type = tuner;
1718
1719 #ifdef CONFIG_MODULES
1720         /* request some modules */
1721         if (dev->board.has_msp34xx)
1722                 request_module("msp3400");
1723         if (dev->board.decoder == EM28XX_SAA711X)
1724                 request_module("saa7115");
1725         if (dev->board.decoder == EM28XX_TVP5150)
1726                 request_module("tvp5150");
1727         if (dev->board.tuner_type != TUNER_ABSENT)
1728                 request_module("tuner");
1729 #endif
1730
1731         em28xx_config_tuner(dev);
1732
1733         em28xx_ir_init(dev);
1734 }
1735