| Linux kernel & device driver programming |
| [ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] |
1 /* 1 /*
2 em28xx-cards.c - driver for Empia EM2800/EM 2 em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
3 video capture devices 3 video capture devices
4 4
5 Copyright (C) 2005 Ludovico Cavedon <cavedo 5 Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
6 Markus Rechberger <mrech 6 Markus Rechberger <mrechberger@gmail.com>
7 Mauro Carvalho Chehab <m 7 Mauro Carvalho Chehab <mchehab@infradead.org>
8 Sascha Sommer <saschasom 8 Sascha Sommer <saschasommer@freenet.de>
9 9
10 This program is free software; you can redi 10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Publi 11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either versio 12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version. 13 (at your option) any later version.
14 14
15 This program is distributed in the hope tha 15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the 16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details 18 GNU General Public License for more details.
19 19
20 You should have received a copy of the GNU 20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to t 21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, 22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */ 23 */
24 24
25 #include <linux/init.h> 25 #include <linux/init.h>
26 #include <linux/module.h> 26 #include <linux/module.h>
27 #include <linux/delay.h> 27 #include <linux/delay.h>
28 #include <linux/i2c.h> 28 #include <linux/i2c.h>
29 #include <linux/usb.h> 29 #include <linux/usb.h>
30 #include <media/tuner.h> 30 #include <media/tuner.h>
31 #include <media/msp3400.h> 31 #include <media/msp3400.h>
32 #include <media/saa7115.h> 32 #include <media/saa7115.h>
33 #include <media/tvp5150.h> 33 #include <media/tvp5150.h>
>> 34 #include <media/tvaudio.h>
>> 35 #include <media/i2c-addr.h>
34 #include <media/tveeprom.h> 36 #include <media/tveeprom.h>
35 #include <media/audiochip.h> <<
36 #include <media/v4l2-common.h> 37 #include <media/v4l2-common.h>
>> 38 #include <media/v4l2-chip-ident.h>
37 39
38 #include "em28xx.h" 40 #include "em28xx.h"
39 #include "tuner-xc2028.h" !! 41
>> 42 #define DRIVER_NAME "em28xx"
40 43
41 static int tuner = -1; 44 static int tuner = -1;
42 module_param(tuner, int, 0444); 45 module_param(tuner, int, 0444);
43 MODULE_PARM_DESC(tuner, "tuner type"); 46 MODULE_PARM_DESC(tuner, "tuner type");
44 47
45 static unsigned int disable_ir; 48 static unsigned int disable_ir;
46 module_param(disable_ir, int, 0444); 49 module_param(disable_ir, int, 0444);
47 MODULE_PARM_DESC(disable_ir, "disable infrared 50 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
48 51
>> 52 static unsigned int disable_usb_speed_check;
>> 53 module_param(disable_usb_speed_check, int, 0444);
>> 54 MODULE_PARM_DESC(disable_usb_speed_check,
>> 55 "override min bandwidth requirement of 480M bps");
>> 56
>> 57 static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
>> 58 module_param_array(card, int, NULL, 0444);
>> 59 MODULE_PARM_DESC(card, "card type");
>> 60
>> 61 /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */
>> 62 static unsigned long em28xx_devused;
>> 63
49 struct em28xx_hash_table { 64 struct em28xx_hash_table {
50 unsigned long hash; 65 unsigned long hash;
51 unsigned int model; 66 unsigned int model;
52 unsigned int tuner; 67 unsigned int tuner;
53 }; 68 };
54 69
55 /* Boards supported by driver */ !! 70 /*
>> 71 * Reset sequences for analog/digital modes
>> 72 */
>> 73
>> 74 /* Reset for the most [analog] boards */
>> 75 static struct em28xx_reg_seq default_analog[] = {
>> 76 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10},
>> 77 { -1, -1, -1, -1},
>> 78 };
>> 79
>> 80 /* Reset for the most [digital] boards */
>> 81 static struct em28xx_reg_seq default_digital[] = {
>> 82 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10},
>> 83 { -1, -1, -1, -1},
>> 84 };
>> 85
>> 86 /* Board Hauppauge WinTV HVR 900 analog */
>> 87 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
>> 88 {EM28XX_R08_GPIO, 0x2d, ~EM_GPIO_4, 10},
>> 89 {0x05, 0xff, 0x10, 10},
>> 90 { -1, -1, -1, -1},
>> 91 };
>> 92
>> 93 /* Board Hauppauge WinTV HVR 900 digital */
>> 94 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
>> 95 {EM28XX_R08_GPIO, 0x2e, ~EM_GPIO_4, 10},
>> 96 {EM2880_R04_GPO, 0x04, 0x0f, 10},
>> 97 {EM2880_R04_GPO, 0x0c, 0x0f, 10},
>> 98 { -1, -1, -1, -1},
>> 99 };
>> 100
>> 101 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
>> 102 static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
>> 103 {EM28XX_R08_GPIO, 0x69, ~EM_GPIO_4, 10},
>> 104 { -1, -1, -1, -1},
>> 105 };
>> 106
>> 107 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
>> 108
>> 109 /* Board - EM2870 Kworld 355u
>> 110 Analog - No input analog */
>> 111
>> 112 /* Board - EM2882 Kworld 315U digital */
>> 113 static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
>> 114 {EM28XX_R08_GPIO, 0xff, 0xff, 10},
>> 115 {EM28XX_R08_GPIO, 0xfe, 0xff, 10},
>> 116 {EM2880_R04_GPO, 0x04, 0xff, 10},
>> 117 {EM2880_R04_GPO, 0x0c, 0xff, 10},
>> 118 {EM28XX_R08_GPIO, 0x7e, 0xff, 10},
>> 119 { -1, -1, -1, -1},
>> 120 };
>> 121
>> 122 static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
>> 123 {EM2880_R04_GPO, 0x08, 0xff, 10},
>> 124 {EM2880_R04_GPO, 0x0c, 0xff, 10},
>> 125 {EM2880_R04_GPO, 0x08, 0xff, 10},
>> 126 {EM2880_R04_GPO, 0x0c, 0xff, 10},
>> 127 { -1, -1, -1, -1},
>> 128 };
>> 129
>> 130 static struct em28xx_reg_seq kworld_330u_analog[] = {
>> 131 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10},
>> 132 {EM2880_R04_GPO, 0x00, 0xff, 10},
>> 133 { -1, -1, -1, -1},
>> 134 };
>> 135
>> 136 static struct em28xx_reg_seq kworld_330u_digital[] = {
>> 137 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10},
>> 138 {EM2880_R04_GPO, 0x08, 0xff, 10},
>> 139 { -1, -1, -1, -1},
>> 140 };
>> 141
>> 142 /* Evga inDtube
>> 143 GPIO0 - Enable digital power (s5h1409) - low to enable
>> 144 GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
>> 145 GPIO4 - xc3028 reset
>> 146 GOP3 - s5h1409 reset
>> 147 */
>> 148 static struct em28xx_reg_seq evga_indtube_analog[] = {
>> 149 {EM28XX_R08_GPIO, 0x79, 0xff, 60},
>> 150 { -1, -1, -1, -1},
>> 151 };
>> 152
>> 153 static struct em28xx_reg_seq evga_indtube_digital[] = {
>> 154 {EM28XX_R08_GPIO, 0x7a, 0xff, 1},
>> 155 {EM2880_R04_GPO, 0x04, 0xff, 10},
>> 156 {EM2880_R04_GPO, 0x0c, 0xff, 1},
>> 157 { -1, -1, -1, -1},
>> 158 };
>> 159
>> 160 /* Pinnacle Hybrid Pro eb1a:2881 */
>> 161 static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
>> 162 {EM28XX_R08_GPIO, 0xfd, ~EM_GPIO_4, 10},
>> 163 { -1, -1, -1, -1},
>> 164 };
>> 165
>> 166 static struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
>> 167 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10},
>> 168 {EM2880_R04_GPO, 0x04, 0xff, 100},/* zl10353 reset */
>> 169 {EM2880_R04_GPO, 0x0c, 0xff, 1},
>> 170 { -1, -1, -1, -1},
>> 171 };
>> 172
>> 173
>> 174 /* Callback for the most boards */
>> 175 static struct em28xx_reg_seq default_tuner_gpio[] = {
>> 176 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10},
>> 177 {EM28XX_R08_GPIO, 0, EM_GPIO_4, 10},
>> 178 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10},
>> 179 { -1, -1, -1, -1},
>> 180 };
>> 181
>> 182 /* Mute/unmute */
>> 183 static struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
>> 184 {EM28XX_R08_GPIO, 5, 7, 10},
>> 185 { -1, -1, -1, -1},
>> 186 };
>> 187
>> 188 static struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
>> 189 {EM28XX_R08_GPIO, 4, 7, 10},
>> 190 { -1, -1, -1, -1},
>> 191 };
56 192
57 #define EM2800_BOARD_UNKNOWN !! 193 static struct em28xx_reg_seq compro_mute_gpio[] = {
58 #define EM2820_BOARD_UNKNOWN !! 194 {EM28XX_R08_GPIO, 6, 7, 10},
59 #define EM2820_BOARD_TERRATEC_CINERGY_250 !! 195 { -1, -1, -1, -1},
60 #define EM2820_BOARD_PINNACLE_USB_2 !! 196 };
61 #define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 !! 197
62 #define EM2820_BOARD_MSI_VOX_USB_2 !! 198 /* Terratec AV350 */
63 #define EM2800_BOARD_TERRATEC_CINERGY_200 !! 199 static struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
64 #define EM2800_BOARD_LEADTEK_WINFAST_USBII !! 200 {EM28XX_R08_GPIO, 0xff, 0x7f, 10},
65 #define EM2800_BOARD_KWORLD_USB2800 !! 201 { -1, -1, -1, -1},
66 #define EM2820_BOARD_PINNACLE_DVC_90 !! 202 };
67 #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 !! 203
68 #define EM2880_BOARD_TERRATEC_HYBRID_XS !! 204 static struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
69 #define EM2820_BOARD_KWORLD_PVRTV2800RF !! 205 {EM28XX_R08_GPIO, 0xff, 0xff, 10},
70 #define EM2880_BOARD_TERRATEC_PRODIGY_XS !! 206 { -1, -1, -1, -1},
71 #define EM2820_BOARD_PROLINK_PLAYTV_USB2 !! 207 };
72 #define EM2800_BOARD_VGEAR_POCKETTV !! 208
73 #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 !! 209 static struct em28xx_reg_seq silvercrest_reg_seq[] = {
>> 210 {EM28XX_R08_GPIO, 0xff, 0xff, 10},
>> 211 {EM28XX_R08_GPIO, 0x01, 0xf7, 10},
>> 212 { -1, -1, -1, -1},
>> 213 };
74 214
>> 215 /*
>> 216 * Board definitions
>> 217 */
75 struct em28xx_board em28xx_boards[] = { 218 struct em28xx_board em28xx_boards[] = {
>> 219 [EM2750_BOARD_UNKNOWN] = {
>> 220 .name = "EM2710/EM2750/EM2751 webcam grabber",
>> 221 .xclk = EM28XX_XCLK_FREQUENCY_20MHZ,
>> 222 .tuner_type = TUNER_ABSENT,
>> 223 .is_webcam = 1,
>> 224 .input = { {
>> 225 .type = EM28XX_VMUX_COMPOSITE1,
>> 226 .vmux = 0,
>> 227 .amux = EM28XX_AMUX_VIDEO,
>> 228 .gpio = silvercrest_reg_seq,
>> 229 } },
>> 230 },
76 [EM2800_BOARD_UNKNOWN] = { 231 [EM2800_BOARD_UNKNOWN] = {
77 .name = "Unknown EM280 232 .name = "Unknown EM2800 video grabber",
78 .is_em2800 = 1, 233 .is_em2800 = 1,
79 .vchannels = 2, <<
80 .tda9887_conf = TDA9887_PRESEN 234 .tda9887_conf = TDA9887_PRESENT,
81 .decoder = EM28XX_SAA7113 !! 235 .decoder = EM28XX_SAA711X,
82 .input = { { !! 236 .tuner_type = TUNER_ABSENT,
>> 237 .input = { {
83 .type = EM28XX_VMU 238 .type = EM28XX_VMUX_COMPOSITE1,
84 .vmux = SAA7115_CO 239 .vmux = SAA7115_COMPOSITE0,
85 .amux = 1, !! 240 .amux = EM28XX_AMUX_LINE_IN,
86 }, { 241 }, {
87 .type = EM28XX_VMU 242 .type = EM28XX_VMUX_SVIDEO,
88 .vmux = SAA7115_SV 243 .vmux = SAA7115_SVIDEO3,
89 .amux = 1, !! 244 .amux = EM28XX_AMUX_LINE_IN,
90 } }, 245 } },
91 }, 246 },
92 [EM2820_BOARD_UNKNOWN] = { 247 [EM2820_BOARD_UNKNOWN] = {
93 .name = "Unknown EM275 !! 248 .name = "Unknown EM2750/28xx video grabber",
94 .is_em2800 = 0, !! 249 .tuner_type = TUNER_ABSENT,
95 .tuner_type = TUNER_ABSENT, !! 250 .is_webcam = 1, /* To enable sensor probe */
>> 251 },
>> 252 [EM2750_BOARD_DLCW_130] = {
>> 253 /* Beijing Huaqi Information Digital Technology Co., Ltd */
>> 254 .name = "Huaqi DLCW-130",
>> 255 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 256 .xclk = EM28XX_XCLK_FREQUENCY_48MHZ,
>> 257 .tuner_type = TUNER_ABSENT,
>> 258 .is_webcam = 1,
>> 259 .input = { {
>> 260 .type = EM28XX_VMUX_COMPOSITE1,
>> 261 .vmux = 0,
>> 262 .amux = EM28XX_AMUX_VIDEO,
>> 263 } },
96 }, 264 },
97 [EM2820_BOARD_KWORLD_PVRTV2800RF] = { 265 [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
98 .name = "Kworld PVR TV 266 .name = "Kworld PVR TV 2800 RF",
99 .is_em2800 = 0, <<
100 .vchannels = 2, <<
101 .tuner_type = TUNER_TEMIC_PA 267 .tuner_type = TUNER_TEMIC_PAL,
102 .tda9887_conf = TDA9887_PRESEN 268 .tda9887_conf = TDA9887_PRESENT,
103 .decoder = EM28XX_SAA7113 !! 269 .decoder = EM28XX_SAA711X,
104 .input = { { !! 270 .input = { {
>> 271 .type = EM28XX_VMUX_COMPOSITE1,
>> 272 .vmux = SAA7115_COMPOSITE0,
>> 273 .amux = EM28XX_AMUX_LINE_IN,
>> 274 }, {
>> 275 .type = EM28XX_VMUX_SVIDEO,
>> 276 .vmux = SAA7115_SVIDEO3,
>> 277 .amux = EM28XX_AMUX_LINE_IN,
>> 278 } },
>> 279 },
>> 280 [EM2820_BOARD_GADMEI_TVR200] = {
>> 281 .name = "Gadmei TVR200",
>> 282 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
>> 283 .tda9887_conf = TDA9887_PRESENT,
>> 284 .decoder = EM28XX_SAA711X,
>> 285 .input = { {
>> 286 .type = EM28XX_VMUX_TELEVISION,
>> 287 .vmux = SAA7115_COMPOSITE2,
>> 288 .amux = EM28XX_AMUX_LINE_IN,
>> 289 }, {
105 .type = EM28XX_VMU 290 .type = EM28XX_VMUX_COMPOSITE1,
106 .vmux = SAA7115_CO 291 .vmux = SAA7115_COMPOSITE0,
107 .amux = 1, !! 292 .amux = EM28XX_AMUX_LINE_IN,
108 }, { 293 }, {
109 .type = EM28XX_VMU 294 .type = EM28XX_VMUX_SVIDEO,
110 .vmux = SAA7115_SV 295 .vmux = SAA7115_SVIDEO3,
111 .amux = 1, !! 296 .amux = EM28XX_AMUX_LINE_IN,
112 } }, 297 } },
113 }, 298 },
114 [EM2820_BOARD_TERRATEC_CINERGY_250] = 299 [EM2820_BOARD_TERRATEC_CINERGY_250] = {
115 .name = "Terratec Cine 300 .name = "Terratec Cinergy 250 USB",
116 .vchannels = 3, <<
117 .tuner_type = TUNER_LG_PAL_N 301 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
118 .tda9887_conf = TDA9887_PRESEN 302 .tda9887_conf = TDA9887_PRESENT,
119 .decoder = EM28XX_SAA7113 !! 303 .decoder = EM28XX_SAA711X,
120 .input = { { !! 304 .input = { {
121 .type = EM28XX_VMU 305 .type = EM28XX_VMUX_TELEVISION,
122 .vmux = SAA7115_CO 306 .vmux = SAA7115_COMPOSITE2,
123 .amux = 1, !! 307 .amux = EM28XX_AMUX_LINE_IN,
124 }, { 308 }, {
125 .type = EM28XX_VMU 309 .type = EM28XX_VMUX_COMPOSITE1,
126 .vmux = SAA7115_CO 310 .vmux = SAA7115_COMPOSITE0,
127 .amux = 1, !! 311 .amux = EM28XX_AMUX_LINE_IN,
128 }, { 312 }, {
129 .type = EM28XX_VMU 313 .type = EM28XX_VMUX_SVIDEO,
130 .vmux = SAA7115_SV 314 .vmux = SAA7115_SVIDEO3,
131 .amux = 1, !! 315 .amux = EM28XX_AMUX_LINE_IN,
132 } }, 316 } },
133 }, 317 },
134 [EM2820_BOARD_PINNACLE_USB_2] = { 318 [EM2820_BOARD_PINNACLE_USB_2] = {
135 .name = "Pinnacle PCTV 319 .name = "Pinnacle PCTV USB 2",
136 .vchannels = 3, <<
137 .tuner_type = TUNER_LG_PAL_N 320 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
138 .tda9887_conf = TDA9887_PRESEN 321 .tda9887_conf = TDA9887_PRESENT,
139 .decoder = EM28XX_SAA7113 !! 322 .decoder = EM28XX_SAA711X,
140 .input = { { !! 323 .input = { {
141 .type = EM28XX_VMU 324 .type = EM28XX_VMUX_TELEVISION,
142 .vmux = SAA7115_CO 325 .vmux = SAA7115_COMPOSITE2,
143 .amux = 0, !! 326 .amux = EM28XX_AMUX_VIDEO,
144 }, { 327 }, {
145 .type = EM28XX_VMU 328 .type = EM28XX_VMUX_COMPOSITE1,
146 .vmux = SAA7115_CO 329 .vmux = SAA7115_COMPOSITE0,
147 .amux = 1, !! 330 .amux = EM28XX_AMUX_LINE_IN,
148 }, { 331 }, {
149 .type = EM28XX_VMU 332 .type = EM28XX_VMUX_SVIDEO,
150 .vmux = SAA7115_SV 333 .vmux = SAA7115_SVIDEO3,
151 .amux = 1, !! 334 .amux = EM28XX_AMUX_LINE_IN,
152 } }, 335 } },
153 }, 336 },
154 [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = 337 [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
155 .name = "Hauppauge Win 338 .name = "Hauppauge WinTV USB 2",
156 .vchannels = 3, <<
157 .tuner_type = TUNER_PHILIPS_ 339 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
158 .tda9887_conf = TDA9887_PRESEN 340 .tda9887_conf = TDA9887_PRESENT |
159 TDA9887_PORT1_ !! 341 TDA9887_PORT1_ACTIVE |
160 TDA9887_PORT2_ 342 TDA9887_PORT2_ACTIVE,
161 .decoder = EM28XX_TVP5150 343 .decoder = EM28XX_TVP5150,
162 .has_msp34xx = 1, 344 .has_msp34xx = 1,
163 /*FIXME: S-Video not tested */ !! 345 .input = { {
164 .input = { { <<
165 .type = EM28XX_VMU 346 .type = EM28XX_VMUX_TELEVISION,
166 .vmux = TVP5150_CO 347 .vmux = TVP5150_COMPOSITE0,
167 .amux = MSP_INPUT_ 348 .amux = MSP_INPUT_DEFAULT,
168 }, { 349 }, {
169 .type = EM28XX_VMU 350 .type = EM28XX_VMUX_SVIDEO,
170 .vmux = TVP5150_SV 351 .vmux = TVP5150_SVIDEO,
171 .amux = MSP_INPUT( 352 .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
172 MSP_DS 353 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
173 } }, 354 } },
174 }, 355 },
175 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] !! 356 [EM2820_BOARD_DLINK_USB_TV] = {
176 .name = "Hauppauge Win !! 357 .name = "D-Link DUB-T210 TV Tuner",
177 .vchannels = 3, !! 358 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 359 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
178 .tda9887_conf = TDA9887_PRESEN 360 .tda9887_conf = TDA9887_PRESENT,
179 .tuner_type = TUNER_XC2028, !! 361 .decoder = EM28XX_SAA711X,
180 .mts_firmware = 1, !! 362 .input = { {
181 .decoder = EM28XX_TVP5150 <<
182 .input = { { <<
183 .type = EM28XX_VMU <<
184 .vmux = TVP5150_CO <<
185 .amux = 0, <<
186 }, { <<
187 .type = EM28XX_VMU <<
188 .vmux = TVP5150_CO <<
189 .amux = 1, <<
190 }, { <<
191 .type = EM28XX_VMU <<
192 .vmux = TVP5150_SV <<
193 .amux = 1, <<
194 } }, <<
195 }, <<
196 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950] <<
197 .name = "Hauppauge W <<
198 .vchannels = 3, <<
199 .tda9887_conf = TDA9887_PRES <<
200 .tuner_type = TUNER_XC2028 <<
201 .mts_firmware = 1, <<
202 .has_12mhz_i2s = 1, <<
203 .decoder = EM28XX_TVP51 <<
204 .input = { { <<
205 .type = EM28XX_VMU 363 .type = EM28XX_VMUX_TELEVISION,
206 .vmux = TVP5150_CO !! 364 .vmux = SAA7115_COMPOSITE2,
207 .amux = 0, !! 365 .amux = EM28XX_AMUX_LINE_IN,
208 }, { 366 }, {
209 .type = EM28XX_VMU 367 .type = EM28XX_VMUX_COMPOSITE1,
210 .vmux = TVP5150_CO !! 368 .vmux = SAA7115_COMPOSITE0,
211 .amux = 1, !! 369 .amux = EM28XX_AMUX_LINE_IN,
212 }, { 370 }, {
213 .type = EM28XX_VMU 371 .type = EM28XX_VMUX_SVIDEO,
214 .vmux = TVP5150_SV !! 372 .vmux = SAA7115_SVIDEO3,
215 .amux = 1, !! 373 .amux = EM28XX_AMUX_LINE_IN,
216 } }, 374 } },
217 <<
218 /* gpio's 4, 1, 0 */ <<
219 .analog_gpio = 0x003d2d, <<
220 }, 375 },
221 [EM2880_BOARD_TERRATEC_HYBRID_XS] = { !! 376 [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
222 .name = "Terratec Hybr !! 377 .name = "Hercules Smart TV USB 2.0",
223 .vchannels = 3, !! 378 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 379 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
224 .tda9887_conf = TDA9887_PRESEN 380 .tda9887_conf = TDA9887_PRESENT,
225 .tuner_type = TUNER_XC2028, !! 381 .decoder = EM28XX_SAA711X,
226 .decoder = EM28XX_TVP5150 !! 382 .input = { {
227 .input = { { <<
228 .type = EM28XX_VMU 383 .type = EM28XX_VMUX_TELEVISION,
229 .vmux = TVP5150_CO !! 384 .vmux = SAA7115_COMPOSITE2,
230 .amux = 0, !! 385 .amux = EM28XX_AMUX_LINE_IN,
231 }, { 386 }, {
232 .type = EM28XX_VMU 387 .type = EM28XX_VMUX_COMPOSITE1,
233 .vmux = TVP5150_CO !! 388 .vmux = SAA7115_COMPOSITE0,
234 .amux = 1, !! 389 .amux = EM28XX_AMUX_LINE_IN,
235 }, { 390 }, {
236 .type = EM28XX_VMU 391 .type = EM28XX_VMUX_SVIDEO,
237 .vmux = TVP5150_SV !! 392 .vmux = SAA7115_SVIDEO3,
238 .amux = 1, !! 393 .amux = EM28XX_AMUX_LINE_IN,
239 } }, 394 } },
240 }, 395 },
241 /* maybe there's a reason behind it wh !! 396 [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
242 as Prodigy XS with a different PID, !! 397 .name = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
243 maybe we'll need it lateron */ !! 398 .valid = EM28XX_BOARD_NOT_VALIDATED,
244 [EM2880_BOARD_TERRATEC_PRODIGY_XS] = { !! 399 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
245 .name = "Terratec Prod <<
246 .vchannels = 3, <<
247 .tda9887_conf = TDA9887_PRESEN 400 .tda9887_conf = TDA9887_PRESENT,
248 .tuner_type = TUNER_XC2028, !! 401 .decoder = EM28XX_SAA711X,
249 .decoder = EM28XX_TVP5150 !! 402 .input = { {
250 .input = { { <<
251 .type = EM28XX_VMU 403 .type = EM28XX_VMUX_TELEVISION,
252 .vmux = TVP5150_CO !! 404 .vmux = SAA7115_COMPOSITE2,
253 .amux = 0, !! 405 .amux = EM28XX_AMUX_VIDEO,
254 }, { 406 }, {
255 .type = EM28XX_VMU 407 .type = EM28XX_VMUX_COMPOSITE1,
256 .vmux = TVP5150_CO !! 408 .vmux = SAA7115_COMPOSITE0,
257 .amux = 1, !! 409 .amux = EM28XX_AMUX_LINE_IN,
258 }, { 410 }, {
259 .type = EM28XX_VMU 411 .type = EM28XX_VMUX_SVIDEO,
260 .vmux = TVP5150_SV !! 412 .vmux = SAA7115_SVIDEO3,
261 .amux = 1, !! 413 .amux = EM28XX_AMUX_LINE_IN,
262 } }, <<
263 }, <<
264 [EM2820_BOARD_MSI_VOX_USB_2] = { <<
265 .name = "MSI VOX <<
266 .vchannels = 3, <<
267 .tuner_type = TUNER_LG_ <<
268 .tda9887_conf = TDA9887_P <<
269 TDA9887_P <<
270 TDA9887_P <<
271 .max_range_640_480 = 1, <<
272 <<
273 .decoder = EM28XX_SA <<
274 .input = { { <<
275 .type = EM28XX_VM <<
276 .vmux = SAA7115_C <<
277 .amux = 0, <<
278 }, { <<
279 .type = EM28XX_VM <<
280 .vmux = SAA7115_C <<
281 .amux = 1, <<
282 }, { <<
283 .type = EM28XX_VM <<
284 .vmux = SAA7115_S <<
285 .amux = 1, <<
286 } }, 414 } },
287 }, 415 },
288 [EM2800_BOARD_TERRATEC_CINERGY_200] = !! 416 [EM2820_BOARD_GADMEI_UTV310] = {
289 .name = "Terratec Cine !! 417 .name = "Gadmei UTV310",
290 .is_em2800 = 1, !! 418 .valid = EM28XX_BOARD_NOT_VALIDATED,
291 .vchannels = 3, !! 419 .tuner_type = TUNER_TNF_5335MF,
292 .tuner_type = TUNER_LG_PAL_N <<
293 .tda9887_conf = TDA9887_PRESEN 420 .tda9887_conf = TDA9887_PRESENT,
294 .decoder = EM28XX_SAA7113 !! 421 .decoder = EM28XX_SAA711X,
295 .input = { { !! 422 .input = { {
296 .type = EM28XX_VMU 423 .type = EM28XX_VMUX_TELEVISION,
297 .vmux = SAA7115_CO !! 424 .vmux = SAA7115_COMPOSITE1,
298 .amux = 0, !! 425 .amux = EM28XX_AMUX_LINE_IN,
299 }, { 426 }, {
300 .type = EM28XX_VMU 427 .type = EM28XX_VMUX_COMPOSITE1,
301 .vmux = SAA7115_CO 428 .vmux = SAA7115_COMPOSITE0,
302 .amux = 1, !! 429 .amux = EM28XX_AMUX_LINE_IN,
303 }, { 430 }, {
304 .type = EM28XX_VMU 431 .type = EM28XX_VMUX_SVIDEO,
305 .vmux = SAA7115_SV 432 .vmux = SAA7115_SVIDEO3,
306 .amux = 1, !! 433 .amux = EM28XX_AMUX_LINE_IN,
307 } }, 434 } },
308 }, 435 },
309 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = !! 436 [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
310 .name = "Leadtek Winfa !! 437 .name = "Leadtek Winfast USB II Deluxe",
311 .is_em2800 = 1, !! 438 .valid = EM28XX_BOARD_NOT_VALIDATED,
312 .vchannels = 3, !! 439 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
313 .tuner_type = TUNER_LG_PAL_N <<
314 .tda9887_conf = TDA9887_PRESEN 440 .tda9887_conf = TDA9887_PRESENT,
315 .decoder = EM28XX_SAA7113 !! 441 .decoder = EM28XX_SAA711X,
316 .input = { { !! 442 .input = { {
317 .type = EM28XX_VMU 443 .type = EM28XX_VMUX_TELEVISION,
318 .vmux = SAA7115_CO 444 .vmux = SAA7115_COMPOSITE2,
319 .amux = 0, !! 445 .amux = EM28XX_AMUX_VIDEO,
320 }, { 446 }, {
321 .type = EM28XX_VMU 447 .type = EM28XX_VMUX_COMPOSITE1,
322 .vmux = SAA7115_CO 448 .vmux = SAA7115_COMPOSITE0,
323 .amux = 1, !! 449 .amux = EM28XX_AMUX_LINE_IN,
324 }, { 450 }, {
325 .type = EM28XX_VMU 451 .type = EM28XX_VMUX_SVIDEO,
326 .vmux = SAA7115_SV !! 452 .vmux = SAA7115_COMPOSITE0,
327 .amux = 1, !! 453 .amux = EM28XX_AMUX_LINE_IN,
328 } }, 454 } },
329 }, 455 },
330 [EM2800_BOARD_KWORLD_USB2800] = { !! 456 [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
331 .name = "Kworld USB280 !! 457 .name = "Videology 20K14XUSB USB2.0",
332 .is_em2800 = 1, !! 458 .valid = EM28XX_BOARD_NOT_VALIDATED,
333 .vchannels = 3, !! 459 .tuner_type = TUNER_ABSENT,
334 .tuner_type = TUNER_PHILIPS_ !! 460 .is_webcam = 1,
335 .tda9887_conf = TDA9887_PRESEN !! 461 .input = { {
336 .decoder = EM28XX_SAA7113 !! 462 .type = EM28XX_VMUX_COMPOSITE1,
337 .input = { { !! 463 .vmux = 0,
>> 464 .amux = EM28XX_AMUX_VIDEO,
>> 465 } },
>> 466 },
>> 467 [EM2820_BOARD_SILVERCREST_WEBCAM] = {
>> 468 .name = "Silvercrest Webcam 1.3mpix",
>> 469 .tuner_type = TUNER_ABSENT,
>> 470 .is_webcam = 1,
>> 471 .input = { {
>> 472 .type = EM28XX_VMUX_COMPOSITE1,
>> 473 .vmux = 0,
>> 474 .amux = EM28XX_AMUX_VIDEO,
>> 475 .gpio = silvercrest_reg_seq,
>> 476 } },
>> 477 },
>> 478 [EM2821_BOARD_SUPERCOMP_USB_2] = {
>> 479 .name = "Supercomp USB 2.0 TV",
>> 480 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 481 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
>> 482 .tda9887_conf = TDA9887_PRESENT |
>> 483 TDA9887_PORT1_ACTIVE |
>> 484 TDA9887_PORT2_ACTIVE,
>> 485 .decoder = EM28XX_SAA711X,
>> 486 .input = { {
338 .type = EM28XX_VMU 487 .type = EM28XX_VMUX_TELEVISION,
339 .vmux = SAA7115_CO 488 .vmux = SAA7115_COMPOSITE2,
340 .amux = 0, !! 489 .amux = EM28XX_AMUX_LINE_IN,
341 }, { 490 }, {
342 .type = EM28XX_VMU 491 .type = EM28XX_VMUX_COMPOSITE1,
343 .vmux = SAA7115_CO 492 .vmux = SAA7115_COMPOSITE0,
344 .amux = 1, !! 493 .amux = EM28XX_AMUX_VIDEO,
345 }, { 494 }, {
346 .type = EM28XX_VMU 495 .type = EM28XX_VMUX_SVIDEO,
347 .vmux = SAA7115_SV 496 .vmux = SAA7115_SVIDEO3,
348 .amux = 1, !! 497 .amux = EM28XX_AMUX_LINE_IN,
349 } }, 498 } },
350 }, 499 },
351 [EM2820_BOARD_PINNACLE_DVC_90] = { !! 500 [EM2821_BOARD_USBGEAR_VD204] = {
352 .name = "Pinnacle Dazz !! 501 .name = "Usbgear VD204v9",
353 .vchannels = 3, !! 502 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 503 .tuner_type = TUNER_ABSENT, /* Capture only device */
>> 504 .decoder = EM28XX_SAA711X,
>> 505 .input = { {
>> 506 .type = EM28XX_VMUX_COMPOSITE1,
>> 507 .vmux = SAA7115_COMPOSITE0,
>> 508 .amux = EM28XX_AMUX_LINE_IN,
>> 509 }, {
>> 510 .type = EM28XX_VMUX_SVIDEO,
>> 511 .vmux = SAA7115_SVIDEO3,
>> 512 .amux = EM28XX_AMUX_LINE_IN,
>> 513 } },
>> 514 },
>> 515 [EM2860_BOARD_NETGMBH_CAM] = {
>> 516 /* Beijing Huaqi Information Digital Technology Co., Ltd */
>> 517 .name = "NetGMBH Cam",
>> 518 .valid = EM28XX_BOARD_NOT_VALIDATED,
354 .tuner_type = TUNER_ABSENT, 519 .tuner_type = TUNER_ABSENT,
355 .decoder = EM28XX_SAA7113 !! 520 .is_webcam = 1,
356 .input = { { !! 521 .input = { {
357 .type = EM28XX_VMU 522 .type = EM28XX_VMUX_COMPOSITE1,
358 .vmux = SAA7115_CO !! 523 .vmux = 0,
359 .amux = 1, !! 524 .amux = EM28XX_AMUX_VIDEO,
360 }, { <<
361 .type = EM28XX_VMU <<
362 .vmux = SAA7115_SV <<
363 .amux = 1, <<
364 } }, 525 } },
365 }, 526 },
366 [EM2800_BOARD_VGEAR_POCKETTV] = { !! 527 [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
367 .name = "V-Gear Pocket !! 528 .name = "Typhoon DVD Maker",
368 .is_em2800 = 1, !! 529 .decoder = EM28XX_SAA711X,
369 .vchannels = 3, !! 530 .tuner_type = TUNER_ABSENT, /* Capture only device */
370 .tuner_type = TUNER_LG_PAL_N !! 531 .input = { {
>> 532 .type = EM28XX_VMUX_COMPOSITE1,
>> 533 .vmux = SAA7115_COMPOSITE0,
>> 534 .amux = EM28XX_AMUX_LINE_IN,
>> 535 }, {
>> 536 .type = EM28XX_VMUX_SVIDEO,
>> 537 .vmux = SAA7115_SVIDEO3,
>> 538 .amux = EM28XX_AMUX_LINE_IN,
>> 539 } },
>> 540 },
>> 541 [EM2860_BOARD_GADMEI_UTV330] = {
>> 542 .name = "Gadmei UTV330",
>> 543 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 544 .tuner_type = TUNER_TNF_5335MF,
371 .tda9887_conf = TDA9887_PRESEN 545 .tda9887_conf = TDA9887_PRESENT,
372 .decoder = EM28XX_SAA7113 !! 546 .decoder = EM28XX_SAA711X,
373 .input = { { !! 547 .input = { {
374 .type = EM28XX_VMU 548 .type = EM28XX_VMUX_TELEVISION,
375 .vmux = SAA7115_CO 549 .vmux = SAA7115_COMPOSITE2,
376 .amux = 0, !! 550 .amux = EM28XX_AMUX_VIDEO,
377 }, { 551 }, {
378 .type = EM28XX_VMU 552 .type = EM28XX_VMUX_COMPOSITE1,
379 .vmux = SAA7115_CO 553 .vmux = SAA7115_COMPOSITE0,
380 .amux = 1, !! 554 .amux = EM28XX_AMUX_LINE_IN,
381 }, { 555 }, {
382 .type = EM28XX_VMU 556 .type = EM28XX_VMUX_SVIDEO,
383 .vmux = SAA7115_SV 557 .vmux = SAA7115_SVIDEO3,
384 .amux = 1, !! 558 .amux = EM28XX_AMUX_LINE_IN,
385 } }, 559 } },
386 }, 560 },
387 [EM2820_BOARD_PROLINK_PLAYTV_USB2] = { !! 561 [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
388 .name = "Pixelview Pro !! 562 .name = "Terratec Cinergy A Hybrid XS",
389 .vchannels = 3, !! 563 .valid = EM28XX_BOARD_NOT_VALIDATED,
390 .tda9887_conf = TDA9887_PRESEN !! 564 .tuner_type = TUNER_XC2028,
391 .tuner_type = TUNER_YMEC_TVF !! 565 .tuner_gpio = default_tuner_gpio,
392 .decoder = EM28XX_SAA7113 !! 566 .decoder = EM28XX_TVP5150,
393 .input = { { !! 567
>> 568 .input = { {
394 .type = EM28XX_VMU 569 .type = EM28XX_VMUX_TELEVISION,
395 .vmux = SAA7115_CO !! 570 .vmux = TVP5150_COMPOSITE0,
396 .amux = EM28XX_AMU !! 571 .amux = EM28XX_AMUX_VIDEO,
>> 572 .gpio = hauppauge_wintv_hvr_900_analog,
397 }, { 573 }, {
398 .type = EM28XX_VMU 574 .type = EM28XX_VMUX_COMPOSITE1,
399 .vmux = SAA7115_CO !! 575 .vmux = TVP5150_COMPOSITE1,
400 .amux = EM28XX_AMU 576 .amux = EM28XX_AMUX_LINE_IN,
>> 577 .gpio = hauppauge_wintv_hvr_900_analog,
401 }, { 578 }, {
402 .type = EM28XX_VMU 579 .type = EM28XX_VMUX_SVIDEO,
403 .vmux = SAA7115_SV !! 580 .vmux = TVP5150_SVIDEO,
404 .amux = EM28XX_AMU 581 .amux = EM28XX_AMUX_LINE_IN,
>> 582 .gpio = hauppauge_wintv_hvr_900_analog,
405 } }, 583 } },
406 }, 584 },
407 }; !! 585 [EM2861_BOARD_KWORLD_PVRTV_300U] = {
408 const unsigned int em28xx_bcount = ARRAY_SIZE( !! 586 .name = "KWorld PVRTV 300U",
409 !! 587 .valid = EM28XX_BOARD_NOT_VALIDATED,
410 /* table of devices that work with this driver !! 588 .tuner_type = TUNER_XC2028,
411 struct usb_device_id em28xx_id_table [] = { !! 589 .tuner_gpio = default_tuner_gpio,
412 { USB_DEVICE(0xeb1a, 0x2750), !! 590 .decoder = EM28XX_TVP5150,
413 .driver_info = EM2820_ !! 591 .input = { {
414 { USB_DEVICE(0xeb1a, 0x2800), !! 592 .type = EM28XX_VMUX_TELEVISION,
415 .driver_info = EM2800_ !! 593 .vmux = TVP5150_COMPOSITE0,
416 { USB_DEVICE(0xeb1a, 0x2820), !! 594 .amux = EM28XX_AMUX_VIDEO,
>> 595 }, {
>> 596 .type = EM28XX_VMUX_COMPOSITE1,
>> 597 .vmux = TVP5150_COMPOSITE1,
>> 598 .amux = EM28XX_AMUX_LINE_IN,
>> 599 }, {
>> 600 .type = EM28XX_VMUX_SVIDEO,
>> 601 .vmux = TVP5150_SVIDEO,
>> 602 .amux = EM28XX_AMUX_LINE_IN,
>> 603 } },
>> 604 },
>> 605 [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
>> 606 .name = "Yakumo MovieMixer",
>> 607 .tuner_type = TUNER_ABSENT, /* Capture only device */
>> 608 .decoder = EM28XX_TVP5150,
>> 609 .input = { {
>> 610 .type = EM28XX_VMUX_TELEVISION,
>> 611 .vmux = TVP5150_COMPOSITE0,
>> 612 .amux = EM28XX_AMUX_VIDEO,
>> 613 }, {
>> 614 .type = EM28XX_VMUX_COMPOSITE1,
>> 615 .vmux = TVP5150_COMPOSITE1,
>> 616 .amux = EM28XX_AMUX_LINE_IN,
>> 617 }, {
>> 618 .type = EM28XX_VMUX_SVIDEO,
>> 619 .vmux = TVP5150_SVIDEO,
>> 620 .amux = EM28XX_AMUX_LINE_IN,
>> 621 } },
>> 622 },
>> 623 [EM2861_BOARD_PLEXTOR_PX_TV100U] = {
>> 624 .name = "Plextor ConvertX PX-TV100U",
>> 625 .tuner_type = TUNER_TNF_5335MF,
>> 626 .xclk = EM28XX_XCLK_I2S_MSB_TIMING |
>> 627 EM28XX_XCLK_FREQUENCY_12MHZ,
>> 628 .tda9887_conf = TDA9887_PRESENT,
>> 629 .decoder = EM28XX_TVP5150,
>> 630 .has_msp34xx = 1,
>> 631 .input = { {
>> 632 .type = EM28XX_VMUX_TELEVISION,
>> 633 .vmux = TVP5150_COMPOSITE0,
>> 634 .amux = EM28XX_AMUX_LINE_IN,
>> 635 .gpio = pinnacle_hybrid_pro_analog,
>> 636 }, {
>> 637 .type = EM28XX_VMUX_COMPOSITE1,
>> 638 .vmux = TVP5150_COMPOSITE1,
>> 639 .amux = EM28XX_AMUX_LINE_IN,
>> 640 .gpio = pinnacle_hybrid_pro_analog,
>> 641 }, {
>> 642 .type = EM28XX_VMUX_SVIDEO,
>> 643 .vmux = TVP5150_SVIDEO,
>> 644 .amux = EM28XX_AMUX_LINE_IN,
>> 645 .gpio = pinnacle_hybrid_pro_analog,
>> 646 } },
>> 647 },
>> 648
>> 649 /* Those boards with em2870 are DVB Only*/
>> 650
>> 651 [EM2870_BOARD_TERRATEC_XS] = {
>> 652 .name = "Terratec Cinergy T XS",
>> 653 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 654 .tuner_type = TUNER_XC2028,
>> 655 .tuner_gpio = default_tuner_gpio,
>> 656 },
>> 657 [EM2870_BOARD_TERRATEC_XS_MT2060] = {
>> 658 .name = "Terratec Cinergy T XS (MT2060)",
>> 659 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 660 .tuner_type = TUNER_ABSENT, /* MT2060 */
>> 661 },
>> 662 [EM2870_BOARD_KWORLD_350U] = {
>> 663 .name = "Kworld 350 U DVB-T",
>> 664 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 665 .tuner_type = TUNER_XC2028,
>> 666 .tuner_gpio = default_tuner_gpio,
>> 667 },
>> 668 [EM2870_BOARD_KWORLD_355U] = {
>> 669 .name = "Kworld 355 U DVB-T",
>> 670 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 671 },
>> 672 [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
>> 673 .name = "Pinnacle PCTV DVB-T",
>> 674 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 675 .tuner_type = TUNER_ABSENT, /* MT2060 */
>> 676 /* djh - I have serious doubts this is right... */
>> 677 .xclk = EM28XX_XCLK_IR_RC5_MODE |
>> 678 EM28XX_XCLK_FREQUENCY_10MHZ,
>> 679 },
>> 680 [EM2870_BOARD_COMPRO_VIDEOMATE] = {
>> 681 .name = "Compro, VideoMate U3",
>> 682 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 683 .tuner_type = TUNER_ABSENT, /* MT2060 */
>> 684 },
>> 685
>> 686 [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
>> 687 .name = "Terratec Hybrid XS Secam",
>> 688 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 689 .has_msp34xx = 1,
>> 690 .tuner_type = TUNER_XC2028,
>> 691 .tuner_gpio = default_tuner_gpio,
>> 692 .decoder = EM28XX_TVP5150,
>> 693 .input = { {
>> 694 .type = EM28XX_VMUX_TELEVISION,
>> 695 .vmux = TVP5150_COMPOSITE0,
>> 696 .amux = EM28XX_AMUX_VIDEO,
>> 697 .gpio = default_analog,
>> 698 }, {
>> 699 .type = EM28XX_VMUX_COMPOSITE1,
>> 700 .vmux = TVP5150_COMPOSITE1,
>> 701 .amux = EM28XX_AMUX_LINE_IN,
>> 702 .gpio = default_analog,
>> 703 }, {
>> 704 .type = EM28XX_VMUX_SVIDEO,
>> 705 .vmux = TVP5150_SVIDEO,
>> 706 .amux = EM28XX_AMUX_LINE_IN,
>> 707 .gpio = default_analog,
>> 708 } },
>> 709 },
>> 710 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
>> 711 .name = "Hauppauge WinTV HVR 900",
>> 712 .tda9887_conf = TDA9887_PRESENT,
>> 713 .tuner_type = TUNER_XC2028,
>> 714 .tuner_gpio = default_tuner_gpio,
>> 715 .mts_firmware = 1,
>> 716 .has_dvb = 1,
>> 717 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
>> 718 .ir_codes = ir_codes_hauppauge_new,
>> 719 .decoder = EM28XX_TVP5150,
>> 720 .input = { {
>> 721 .type = EM28XX_VMUX_TELEVISION,
>> 722 .vmux = TVP5150_COMPOSITE0,
>> 723 .amux = EM28XX_AMUX_VIDEO,
>> 724 .gpio = hauppauge_wintv_hvr_900_analog,
>> 725 }, {
>> 726 .type = EM28XX_VMUX_COMPOSITE1,
>> 727 .vmux = TVP5150_COMPOSITE1,
>> 728 .amux = EM28XX_AMUX_LINE_IN,
>> 729 .gpio = hauppauge_wintv_hvr_900_analog,
>> 730 }, {
>> 731 .type = EM28XX_VMUX_SVIDEO,
>> 732 .vmux = TVP5150_SVIDEO,
>> 733 .amux = EM28XX_AMUX_LINE_IN,
>> 734 .gpio = hauppauge_wintv_hvr_900_analog,
>> 735 } },
>> 736 },
>> 737 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
>> 738 .name = "Hauppauge WinTV HVR 900 (R2)",
>> 739 .tda9887_conf = TDA9887_PRESENT,
>> 740 .tuner_type = TUNER_XC2028,
>> 741 .tuner_gpio = default_tuner_gpio,
>> 742 .mts_firmware = 1,
>> 743 .ir_codes = ir_codes_hauppauge_new,
>> 744 .decoder = EM28XX_TVP5150,
>> 745 .input = { {
>> 746 .type = EM28XX_VMUX_TELEVISION,
>> 747 .vmux = TVP5150_COMPOSITE0,
>> 748 .amux = EM28XX_AMUX_VIDEO,
>> 749 .gpio = hauppauge_wintv_hvr_900_analog,
>> 750 }, {
>> 751 .type = EM28XX_VMUX_COMPOSITE1,
>> 752 .vmux = TVP5150_COMPOSITE1,
>> 753 .amux = EM28XX_AMUX_LINE_IN,
>> 754 .gpio = hauppauge_wintv_hvr_900_analog,
>> 755 }, {
>> 756 .type = EM28XX_VMUX_SVIDEO,
>> 757 .vmux = TVP5150_SVIDEO,
>> 758 .amux = EM28XX_AMUX_LINE_IN,
>> 759 .gpio = hauppauge_wintv_hvr_900_analog,
>> 760 } },
>> 761 },
>> 762 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
>> 763 .name = "Hauppauge WinTV HVR 850",
>> 764 .tuner_type = TUNER_XC2028,
>> 765 .tuner_gpio = default_tuner_gpio,
>> 766 .mts_firmware = 1,
>> 767 .has_dvb = 1,
>> 768 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
>> 769 .ir_codes = ir_codes_hauppauge_new,
>> 770 .decoder = EM28XX_TVP5150,
>> 771 .input = { {
>> 772 .type = EM28XX_VMUX_TELEVISION,
>> 773 .vmux = TVP5150_COMPOSITE0,
>> 774 .amux = EM28XX_AMUX_VIDEO,
>> 775 .gpio = hauppauge_wintv_hvr_900_analog,
>> 776 }, {
>> 777 .type = EM28XX_VMUX_COMPOSITE1,
>> 778 .vmux = TVP5150_COMPOSITE1,
>> 779 .amux = EM28XX_AMUX_LINE_IN,
>> 780 .gpio = hauppauge_wintv_hvr_900_analog,
>> 781 }, {
>> 782 .type = EM28XX_VMUX_SVIDEO,
>> 783 .vmux = TVP5150_SVIDEO,
>> 784 .amux = EM28XX_AMUX_LINE_IN,
>> 785 .gpio = hauppauge_wintv_hvr_900_analog,
>> 786 } },
>> 787 },
>> 788 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
>> 789 .name = "Hauppauge WinTV HVR 950",
>> 790 .tuner_type = TUNER_XC2028,
>> 791 .tuner_gpio = default_tuner_gpio,
>> 792 .mts_firmware = 1,
>> 793 .has_dvb = 1,
>> 794 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
>> 795 .ir_codes = ir_codes_hauppauge_new,
>> 796 .decoder = EM28XX_TVP5150,
>> 797 .input = { {
>> 798 .type = EM28XX_VMUX_TELEVISION,
>> 799 .vmux = TVP5150_COMPOSITE0,
>> 800 .amux = EM28XX_AMUX_VIDEO,
>> 801 .gpio = hauppauge_wintv_hvr_900_analog,
>> 802 }, {
>> 803 .type = EM28XX_VMUX_COMPOSITE1,
>> 804 .vmux = TVP5150_COMPOSITE1,
>> 805 .amux = EM28XX_AMUX_LINE_IN,
>> 806 .gpio = hauppauge_wintv_hvr_900_analog,
>> 807 }, {
>> 808 .type = EM28XX_VMUX_SVIDEO,
>> 809 .vmux = TVP5150_SVIDEO,
>> 810 .amux = EM28XX_AMUX_LINE_IN,
>> 811 .gpio = hauppauge_wintv_hvr_900_analog,
>> 812 } },
>> 813 },
>> 814 [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
>> 815 .name = "Pinnacle PCTV HD Pro Stick",
>> 816 .tuner_type = TUNER_XC2028,
>> 817 .tuner_gpio = default_tuner_gpio,
>> 818 .mts_firmware = 1,
>> 819 .has_dvb = 1,
>> 820 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
>> 821 .ir_codes = ir_codes_pinnacle_pctv_hd,
>> 822 .decoder = EM28XX_TVP5150,
>> 823 .input = { {
>> 824 .type = EM28XX_VMUX_TELEVISION,
>> 825 .vmux = TVP5150_COMPOSITE0,
>> 826 .amux = EM28XX_AMUX_VIDEO,
>> 827 .gpio = hauppauge_wintv_hvr_900_analog,
>> 828 }, {
>> 829 .type = EM28XX_VMUX_COMPOSITE1,
>> 830 .vmux = TVP5150_COMPOSITE1,
>> 831 .amux = EM28XX_AMUX_LINE_IN,
>> 832 .gpio = hauppauge_wintv_hvr_900_analog,
>> 833 }, {
>> 834 .type = EM28XX_VMUX_SVIDEO,
>> 835 .vmux = TVP5150_SVIDEO,
>> 836 .amux = EM28XX_AMUX_LINE_IN,
>> 837 .gpio = hauppauge_wintv_hvr_900_analog,
>> 838 } },
>> 839 },
>> 840 [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
>> 841 .name = "AMD ATI TV Wonder HD 600",
>> 842 .tuner_type = TUNER_XC2028,
>> 843 .tuner_gpio = default_tuner_gpio,
>> 844 .mts_firmware = 1,
>> 845 .has_dvb = 1,
>> 846 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
>> 847 .ir_codes = ir_codes_ati_tv_wonder_hd_600,
>> 848 .decoder = EM28XX_TVP5150,
>> 849 .input = { {
>> 850 .type = EM28XX_VMUX_TELEVISION,
>> 851 .vmux = TVP5150_COMPOSITE0,
>> 852 .amux = EM28XX_AMUX_VIDEO,
>> 853 .gpio = hauppauge_wintv_hvr_900_analog,
>> 854 }, {
>> 855 .type = EM28XX_VMUX_COMPOSITE1,
>> 856 .vmux = TVP5150_COMPOSITE1,
>> 857 .amux = EM28XX_AMUX_LINE_IN,
>> 858 .gpio = hauppauge_wintv_hvr_900_analog,
>> 859 }, {
>> 860 .type = EM28XX_VMUX_SVIDEO,
>> 861 .vmux = TVP5150_SVIDEO,
>> 862 .amux = EM28XX_AMUX_LINE_IN,
>> 863 .gpio = hauppauge_wintv_hvr_900_analog,
>> 864 } },
>> 865 },
>> 866 [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
>> 867 .name = "Terratec Hybrid XS",
>> 868 .tuner_type = TUNER_XC2028,
>> 869 .tuner_gpio = default_tuner_gpio,
>> 870 .decoder = EM28XX_TVP5150,
>> 871 .has_dvb = 1,
>> 872 .dvb_gpio = default_digital,
>> 873 .input = { {
>> 874 .type = EM28XX_VMUX_TELEVISION,
>> 875 .vmux = TVP5150_COMPOSITE0,
>> 876 .amux = EM28XX_AMUX_VIDEO,
>> 877 .gpio = default_analog,
>> 878 }, {
>> 879 .type = EM28XX_VMUX_COMPOSITE1,
>> 880 .vmux = TVP5150_COMPOSITE1,
>> 881 .amux = EM28XX_AMUX_LINE_IN,
>> 882 .gpio = default_analog,
>> 883 }, {
>> 884 .type = EM28XX_VMUX_SVIDEO,
>> 885 .vmux = TVP5150_SVIDEO,
>> 886 .amux = EM28XX_AMUX_LINE_IN,
>> 887 .gpio = default_analog,
>> 888 } },
>> 889 },
>> 890 /* maybe there's a reason behind it why Terratec sells the Hybrid XS
>> 891 as Prodigy XS with a different PID, let's keep it separated for now
>> 892 maybe we'll need it lateron */
>> 893 [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
>> 894 .name = "Terratec Prodigy XS",
>> 895 .tuner_type = TUNER_XC2028,
>> 896 .tuner_gpio = default_tuner_gpio,
>> 897 .decoder = EM28XX_TVP5150,
>> 898 .input = { {
>> 899 .type = EM28XX_VMUX_TELEVISION,
>> 900 .vmux = TVP5150_COMPOSITE0,
>> 901 .amux = EM28XX_AMUX_VIDEO,
>> 902 .gpio = hauppauge_wintv_hvr_900_analog,
>> 903 }, {
>> 904 .type = EM28XX_VMUX_COMPOSITE1,
>> 905 .vmux = TVP5150_COMPOSITE1,
>> 906 .amux = EM28XX_AMUX_LINE_IN,
>> 907 .gpio = hauppauge_wintv_hvr_900_analog,
>> 908 }, {
>> 909 .type = EM28XX_VMUX_SVIDEO,
>> 910 .vmux = TVP5150_SVIDEO,
>> 911 .amux = EM28XX_AMUX_LINE_IN,
>> 912 .gpio = hauppauge_wintv_hvr_900_analog,
>> 913 } },
>> 914 },
>> 915 [EM2820_BOARD_MSI_VOX_USB_2] = {
>> 916 .name = "MSI VOX USB 2.0",
>> 917 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
>> 918 .tda9887_conf = TDA9887_PRESENT |
>> 919 TDA9887_PORT1_ACTIVE |
>> 920 TDA9887_PORT2_ACTIVE,
>> 921 .max_range_640_480 = 1,
>> 922 .decoder = EM28XX_SAA711X,
>> 923 .input = { {
>> 924 .type = EM28XX_VMUX_TELEVISION,
>> 925 .vmux = SAA7115_COMPOSITE4,
>> 926 .amux = EM28XX_AMUX_VIDEO,
>> 927 }, {
>> 928 .type = EM28XX_VMUX_COMPOSITE1,
>> 929 .vmux = SAA7115_COMPOSITE0,
>> 930 .amux = EM28XX_AMUX_LINE_IN,
>> 931 }, {
>> 932 .type = EM28XX_VMUX_SVIDEO,
>> 933 .vmux = SAA7115_SVIDEO3,
>> 934 .amux = EM28XX_AMUX_LINE_IN,
>> 935 } },
>> 936 },
>> 937 [EM2800_BOARD_TERRATEC_CINERGY_200] = {
>> 938 .name = "Terratec Cinergy 200 USB",
>> 939 .is_em2800 = 1,
>> 940 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
>> 941 .tda9887_conf = TDA9887_PRESENT,
>> 942 .decoder = EM28XX_SAA711X,
>> 943 .input = { {
>> 944 .type = EM28XX_VMUX_TELEVISION,
>> 945 .vmux = SAA7115_COMPOSITE2,
>> 946 .amux = EM28XX_AMUX_VIDEO,
>> 947 }, {
>> 948 .type = EM28XX_VMUX_COMPOSITE1,
>> 949 .vmux = SAA7115_COMPOSITE0,
>> 950 .amux = EM28XX_AMUX_LINE_IN,
>> 951 }, {
>> 952 .type = EM28XX_VMUX_SVIDEO,
>> 953 .vmux = SAA7115_SVIDEO3,
>> 954 .amux = EM28XX_AMUX_LINE_IN,
>> 955 } },
>> 956 },
>> 957 [EM2800_BOARD_GRABBEEX_USB2800] = {
>> 958 .name = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
>> 959 .is_em2800 = 1,
>> 960 .decoder = EM28XX_SAA711X,
>> 961 .tuner_type = TUNER_ABSENT, /* capture only board */
>> 962 .input = { {
>> 963 .type = EM28XX_VMUX_COMPOSITE1,
>> 964 .vmux = SAA7115_COMPOSITE0,
>> 965 .amux = EM28XX_AMUX_LINE_IN,
>> 966 }, {
>> 967 .type = EM28XX_VMUX_SVIDEO,
>> 968 .vmux = SAA7115_SVIDEO3,
>> 969 .amux = EM28XX_AMUX_LINE_IN,
>> 970 } },
>> 971 },
>> 972 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
>> 973 .name = "Leadtek Winfast USB II",
>> 974 .is_em2800 = 1,
>> 975 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
>> 976 .tda9887_conf = TDA9887_PRESENT,
>> 977 .decoder = EM28XX_SAA711X,
>> 978 .input = { {
>> 979 .type = EM28XX_VMUX_TELEVISION,
>> 980 .vmux = SAA7115_COMPOSITE2,
>> 981 .amux = EM28XX_AMUX_VIDEO,
>> 982 }, {
>> 983 .type = EM28XX_VMUX_COMPOSITE1,
>> 984 .vmux = SAA7115_COMPOSITE0,
>> 985 .amux = EM28XX_AMUX_LINE_IN,
>> 986 }, {
>> 987 .type = EM28XX_VMUX_SVIDEO,
>> 988 .vmux = SAA7115_SVIDEO3,
>> 989 .amux = EM28XX_AMUX_LINE_IN,
>> 990 } },
>> 991 },
>> 992 [EM2800_BOARD_KWORLD_USB2800] = {
>> 993 .name = "Kworld USB2800",
>> 994 .is_em2800 = 1,
>> 995 .tuner_type = TUNER_PHILIPS_FCV1236D,
>> 996 .tda9887_conf = TDA9887_PRESENT,
>> 997 .decoder = EM28XX_SAA711X,
>> 998 .input = { {
>> 999 .type = EM28XX_VMUX_TELEVISION,
>> 1000 .vmux = SAA7115_COMPOSITE2,
>> 1001 .amux = EM28XX_AMUX_VIDEO,
>> 1002 }, {
>> 1003 .type = EM28XX_VMUX_COMPOSITE1,
>> 1004 .vmux = SAA7115_COMPOSITE0,
>> 1005 .amux = EM28XX_AMUX_LINE_IN,
>> 1006 }, {
>> 1007 .type = EM28XX_VMUX_SVIDEO,
>> 1008 .vmux = SAA7115_SVIDEO3,
>> 1009 .amux = EM28XX_AMUX_LINE_IN,
>> 1010 } },
>> 1011 },
>> 1012 [EM2820_BOARD_PINNACLE_DVC_90] = {
>> 1013 .name = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker",
>> 1014 .tuner_type = TUNER_ABSENT, /* capture only board */
>> 1015 .decoder = EM28XX_SAA711X,
>> 1016 .input = { {
>> 1017 .type = EM28XX_VMUX_COMPOSITE1,
>> 1018 .vmux = SAA7115_COMPOSITE0,
>> 1019 .amux = EM28XX_AMUX_LINE_IN,
>> 1020 }, {
>> 1021 .type = EM28XX_VMUX_SVIDEO,
>> 1022 .vmux = SAA7115_SVIDEO3,
>> 1023 .amux = EM28XX_AMUX_LINE_IN,
>> 1024 } },
>> 1025 },
>> 1026 [EM2800_BOARD_VGEAR_POCKETTV] = {
>> 1027 .name = "V-Gear PocketTV",
>> 1028 .is_em2800 = 1,
>> 1029 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
>> 1030 .tda9887_conf = TDA9887_PRESENT,
>> 1031 .decoder = EM28XX_SAA711X,
>> 1032 .input = { {
>> 1033 .type = EM28XX_VMUX_TELEVISION,
>> 1034 .vmux = SAA7115_COMPOSITE2,
>> 1035 .amux = EM28XX_AMUX_VIDEO,
>> 1036 }, {
>> 1037 .type = EM28XX_VMUX_COMPOSITE1,
>> 1038 .vmux = SAA7115_COMPOSITE0,
>> 1039 .amux = EM28XX_AMUX_LINE_IN,
>> 1040 }, {
>> 1041 .type = EM28XX_VMUX_SVIDEO,
>> 1042 .vmux = SAA7115_SVIDEO3,
>> 1043 .amux = EM28XX_AMUX_LINE_IN,
>> 1044 } },
>> 1045 },
>> 1046 [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
>> 1047 .name = "Pixelview PlayTV Box 4 USB 2.0",
>> 1048 .tda9887_conf = TDA9887_PRESENT,
>> 1049 .tuner_type = TUNER_YMEC_TVF_5533MF,
>> 1050 .decoder = EM28XX_SAA711X,
>> 1051 .input = { {
>> 1052 .type = EM28XX_VMUX_TELEVISION,
>> 1053 .vmux = SAA7115_COMPOSITE2,
>> 1054 .amux = EM28XX_AMUX_VIDEO,
>> 1055 .aout = EM28XX_AOUT_MONO | /* I2S */
>> 1056 EM28XX_AOUT_MASTER, /* Line out pin */
>> 1057 }, {
>> 1058 .type = EM28XX_VMUX_COMPOSITE1,
>> 1059 .vmux = SAA7115_COMPOSITE0,
>> 1060 .amux = EM28XX_AMUX_LINE_IN,
>> 1061 }, {
>> 1062 .type = EM28XX_VMUX_SVIDEO,
>> 1063 .vmux = SAA7115_SVIDEO3,
>> 1064 .amux = EM28XX_AMUX_LINE_IN,
>> 1065 } },
>> 1066 },
>> 1067 [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
>> 1068 .name = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
>> 1069 .has_snapshot_button = 1,
>> 1070 .tda9887_conf = TDA9887_PRESENT,
>> 1071 .tuner_type = TUNER_YMEC_TVF_5533MF,
>> 1072 .decoder = EM28XX_SAA711X,
>> 1073 .input = { {
>> 1074 .type = EM28XX_VMUX_TELEVISION,
>> 1075 .vmux = SAA7115_COMPOSITE2,
>> 1076 .amux = EM28XX_AMUX_VIDEO,
>> 1077 .aout = EM28XX_AOUT_MONO | /* I2S */
>> 1078 EM28XX_AOUT_MASTER, /* Line out pin */
>> 1079 }, {
>> 1080 .type = EM28XX_VMUX_COMPOSITE1,
>> 1081 .vmux = SAA7115_COMPOSITE0,
>> 1082 .amux = EM28XX_AMUX_LINE_IN,
>> 1083 }, {
>> 1084 .type = EM28XX_VMUX_SVIDEO,
>> 1085 .vmux = SAA7115_SVIDEO3,
>> 1086 .amux = EM28XX_AMUX_LINE_IN,
>> 1087 } },
>> 1088 },
>> 1089 [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
>> 1090 .name = "EM2860/SAA711X Reference Design",
>> 1091 .has_snapshot_button = 1,
>> 1092 .tuner_type = TUNER_ABSENT,
>> 1093 .decoder = EM28XX_SAA711X,
>> 1094 .input = { {
>> 1095 .type = EM28XX_VMUX_SVIDEO,
>> 1096 .vmux = SAA7115_SVIDEO3,
>> 1097 }, {
>> 1098 .type = EM28XX_VMUX_COMPOSITE1,
>> 1099 .vmux = SAA7115_COMPOSITE0,
>> 1100 } },
>> 1101 },
>> 1102 [EM2880_BOARD_MSI_DIGIVOX_AD] = {
>> 1103 .name = "MSI DigiVox A/D",
>> 1104 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 1105 .tuner_type = TUNER_XC2028,
>> 1106 .tuner_gpio = default_tuner_gpio,
>> 1107 .decoder = EM28XX_TVP5150,
>> 1108 .input = { {
>> 1109 .type = EM28XX_VMUX_TELEVISION,
>> 1110 .vmux = TVP5150_COMPOSITE0,
>> 1111 .amux = EM28XX_AMUX_VIDEO,
>> 1112 .gpio = em2880_msi_digivox_ad_analog,
>> 1113 }, {
>> 1114 .type = EM28XX_VMUX_COMPOSITE1,
>> 1115 .vmux = TVP5150_COMPOSITE1,
>> 1116 .amux = EM28XX_AMUX_LINE_IN,
>> 1117 .gpio = em2880_msi_digivox_ad_analog,
>> 1118 }, {
>> 1119 .type = EM28XX_VMUX_SVIDEO,
>> 1120 .vmux = TVP5150_SVIDEO,
>> 1121 .amux = EM28XX_AMUX_LINE_IN,
>> 1122 .gpio = em2880_msi_digivox_ad_analog,
>> 1123 } },
>> 1124 },
>> 1125 [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
>> 1126 .name = "MSI DigiVox A/D II",
>> 1127 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 1128 .tuner_type = TUNER_XC2028,
>> 1129 .tuner_gpio = default_tuner_gpio,
>> 1130 .decoder = EM28XX_TVP5150,
>> 1131 .input = { {
>> 1132 .type = EM28XX_VMUX_TELEVISION,
>> 1133 .vmux = TVP5150_COMPOSITE0,
>> 1134 .amux = EM28XX_AMUX_VIDEO,
>> 1135 .gpio = em2880_msi_digivox_ad_analog,
>> 1136 }, {
>> 1137 .type = EM28XX_VMUX_COMPOSITE1,
>> 1138 .vmux = TVP5150_COMPOSITE1,
>> 1139 .amux = EM28XX_AMUX_LINE_IN,
>> 1140 .gpio = em2880_msi_digivox_ad_analog,
>> 1141 }, {
>> 1142 .type = EM28XX_VMUX_SVIDEO,
>> 1143 .vmux = TVP5150_SVIDEO,
>> 1144 .amux = EM28XX_AMUX_LINE_IN,
>> 1145 .gpio = em2880_msi_digivox_ad_analog,
>> 1146 } },
>> 1147 },
>> 1148 [EM2880_BOARD_KWORLD_DVB_305U] = {
>> 1149 .name = "KWorld DVB-T 305U",
>> 1150 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 1151 .tuner_type = TUNER_XC2028,
>> 1152 .tuner_gpio = default_tuner_gpio,
>> 1153 .decoder = EM28XX_TVP5150,
>> 1154 .input = { {
>> 1155 .type = EM28XX_VMUX_TELEVISION,
>> 1156 .vmux = TVP5150_COMPOSITE0,
>> 1157 .amux = EM28XX_AMUX_VIDEO,
>> 1158 }, {
>> 1159 .type = EM28XX_VMUX_COMPOSITE1,
>> 1160 .vmux = TVP5150_COMPOSITE1,
>> 1161 .amux = EM28XX_AMUX_LINE_IN,
>> 1162 }, {
>> 1163 .type = EM28XX_VMUX_SVIDEO,
>> 1164 .vmux = TVP5150_SVIDEO,
>> 1165 .amux = EM28XX_AMUX_LINE_IN,
>> 1166 } },
>> 1167 },
>> 1168 [EM2880_BOARD_KWORLD_DVB_310U] = {
>> 1169 .name = "KWorld DVB-T 310U",
>> 1170 .tuner_type = TUNER_XC2028,
>> 1171 .tuner_gpio = default_tuner_gpio,
>> 1172 .has_dvb = 1,
>> 1173 .dvb_gpio = default_digital,
>> 1174 .mts_firmware = 1,
>> 1175 .decoder = EM28XX_TVP5150,
>> 1176 .input = { {
>> 1177 .type = EM28XX_VMUX_TELEVISION,
>> 1178 .vmux = TVP5150_COMPOSITE0,
>> 1179 .amux = EM28XX_AMUX_VIDEO,
>> 1180 .gpio = default_analog,
>> 1181 }, {
>> 1182 .type = EM28XX_VMUX_COMPOSITE1,
>> 1183 .vmux = TVP5150_COMPOSITE1,
>> 1184 .amux = EM28XX_AMUX_LINE_IN,
>> 1185 .gpio = default_analog,
>> 1186 }, { /* S-video has not been tested yet */
>> 1187 .type = EM28XX_VMUX_SVIDEO,
>> 1188 .vmux = TVP5150_SVIDEO,
>> 1189 .amux = EM28XX_AMUX_LINE_IN,
>> 1190 .gpio = default_analog,
>> 1191 } },
>> 1192 },
>> 1193 [EM2882_BOARD_KWORLD_ATSC_315U] = {
>> 1194 .name = "KWorld ATSC 315U HDTV TV Box",
>> 1195 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 1196 .tuner_type = TUNER_THOMSON_DTT761X,
>> 1197 .tuner_gpio = em2882_kworld_315u_tuner_gpio,
>> 1198 .tda9887_conf = TDA9887_PRESENT,
>> 1199 .decoder = EM28XX_SAA711X,
>> 1200 .has_dvb = 1,
>> 1201 .dvb_gpio = em2882_kworld_315u_digital,
>> 1202 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
>> 1203 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
>> 1204 /* Analog mode - still not ready */
>> 1205 /*.input = { {
>> 1206 .type = EM28XX_VMUX_TELEVISION,
>> 1207 .vmux = SAA7115_COMPOSITE2,
>> 1208 .amux = EM28XX_AMUX_VIDEO,
>> 1209 .gpio = em2882_kworld_315u_analog,
>> 1210 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
>> 1211 }, {
>> 1212 .type = EM28XX_VMUX_COMPOSITE1,
>> 1213 .vmux = SAA7115_COMPOSITE0,
>> 1214 .amux = EM28XX_AMUX_LINE_IN,
>> 1215 .gpio = em2882_kworld_315u_analog1,
>> 1216 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
>> 1217 }, {
>> 1218 .type = EM28XX_VMUX_SVIDEO,
>> 1219 .vmux = SAA7115_SVIDEO3,
>> 1220 .amux = EM28XX_AMUX_LINE_IN,
>> 1221 .gpio = em2882_kworld_315u_analog1,
>> 1222 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
>> 1223 } }, */
>> 1224 },
>> 1225 [EM2880_BOARD_EMPIRE_DUAL_TV] = {
>> 1226 .name = "Empire dual TV",
>> 1227 .tuner_type = TUNER_XC2028,
>> 1228 .tuner_gpio = default_tuner_gpio,
>> 1229 .has_dvb = 1,
>> 1230 .dvb_gpio = default_digital,
>> 1231 .mts_firmware = 1,
>> 1232 .decoder = EM28XX_TVP5150,
>> 1233 .input = { {
>> 1234 .type = EM28XX_VMUX_TELEVISION,
>> 1235 .vmux = TVP5150_COMPOSITE0,
>> 1236 .amux = EM28XX_AMUX_VIDEO,
>> 1237 .gpio = default_analog,
>> 1238 }, {
>> 1239 .type = EM28XX_VMUX_COMPOSITE1,
>> 1240 .vmux = TVP5150_COMPOSITE1,
>> 1241 .amux = EM28XX_AMUX_LINE_IN,
>> 1242 .gpio = default_analog,
>> 1243 }, {
>> 1244 .type = EM28XX_VMUX_SVIDEO,
>> 1245 .vmux = TVP5150_SVIDEO,
>> 1246 .amux = EM28XX_AMUX_LINE_IN,
>> 1247 .gpio = default_analog,
>> 1248 } },
>> 1249 },
>> 1250 [EM2881_BOARD_DNT_DA2_HYBRID] = {
>> 1251 .name = "DNT DA2 Hybrid",
>> 1252 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 1253 .tuner_type = TUNER_XC2028,
>> 1254 .tuner_gpio = default_tuner_gpio,
>> 1255 .decoder = EM28XX_TVP5150,
>> 1256 .input = { {
>> 1257 .type = EM28XX_VMUX_TELEVISION,
>> 1258 .vmux = TVP5150_COMPOSITE0,
>> 1259 .amux = EM28XX_AMUX_VIDEO,
>> 1260 .gpio = default_analog,
>> 1261 }, {
>> 1262 .type = EM28XX_VMUX_COMPOSITE1,
>> 1263 .vmux = TVP5150_COMPOSITE1,
>> 1264 .amux = EM28XX_AMUX_LINE_IN,
>> 1265 .gpio = default_analog,
>> 1266 }, {
>> 1267 .type = EM28XX_VMUX_SVIDEO,
>> 1268 .vmux = TVP5150_SVIDEO,
>> 1269 .amux = EM28XX_AMUX_LINE_IN,
>> 1270 .gpio = default_analog,
>> 1271 } },
>> 1272 },
>> 1273 [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
>> 1274 .name = "Pinnacle Hybrid Pro",
>> 1275 .tuner_type = TUNER_XC2028,
>> 1276 .tuner_gpio = default_tuner_gpio,
>> 1277 .decoder = EM28XX_TVP5150,
>> 1278 .has_dvb = 1,
>> 1279 .dvb_gpio = pinnacle_hybrid_pro_digital,
>> 1280 .input = { {
>> 1281 .type = EM28XX_VMUX_TELEVISION,
>> 1282 .vmux = TVP5150_COMPOSITE0,
>> 1283 .amux = EM28XX_AMUX_VIDEO,
>> 1284 .gpio = pinnacle_hybrid_pro_analog,
>> 1285 }, {
>> 1286 .type = EM28XX_VMUX_COMPOSITE1,
>> 1287 .vmux = TVP5150_COMPOSITE1,
>> 1288 .amux = EM28XX_AMUX_LINE_IN,
>> 1289 .gpio = pinnacle_hybrid_pro_analog,
>> 1290 }, {
>> 1291 .type = EM28XX_VMUX_SVIDEO,
>> 1292 .vmux = TVP5150_SVIDEO,
>> 1293 .amux = EM28XX_AMUX_LINE_IN,
>> 1294 .gpio = pinnacle_hybrid_pro_analog,
>> 1295 } },
>> 1296 },
>> 1297 [EM2882_BOARD_PINNACLE_HYBRID_PRO] = {
>> 1298 .name = "Pinnacle Hybrid Pro (2)",
>> 1299 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 1300 .tuner_type = TUNER_XC2028,
>> 1301 .tuner_gpio = default_tuner_gpio,
>> 1302 .mts_firmware = 1,
>> 1303 .decoder = EM28XX_TVP5150,
>> 1304 .input = { {
>> 1305 .type = EM28XX_VMUX_TELEVISION,
>> 1306 .vmux = TVP5150_COMPOSITE0,
>> 1307 .amux = EM28XX_AMUX_VIDEO,
>> 1308 .gpio = hauppauge_wintv_hvr_900_analog,
>> 1309 }, {
>> 1310 .type = EM28XX_VMUX_COMPOSITE1,
>> 1311 .vmux = TVP5150_COMPOSITE1,
>> 1312 .amux = EM28XX_AMUX_LINE_IN,
>> 1313 .gpio = hauppauge_wintv_hvr_900_analog,
>> 1314 }, {
>> 1315 .type = EM28XX_VMUX_SVIDEO,
>> 1316 .vmux = TVP5150_SVIDEO,
>> 1317 .amux = EM28XX_AMUX_LINE_IN,
>> 1318 .gpio = hauppauge_wintv_hvr_900_analog,
>> 1319 } },
>> 1320 },
>> 1321 [EM2882_BOARD_KWORLD_VS_DVBT] = {
>> 1322 .name = "Kworld VS-DVB-T 323UR",
>> 1323 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 1324 .tuner_type = TUNER_XC2028,
>> 1325 .tuner_gpio = default_tuner_gpio,
>> 1326 .decoder = EM28XX_TVP5150,
>> 1327 .input = { {
>> 1328 .type = EM28XX_VMUX_TELEVISION,
>> 1329 .vmux = TVP5150_COMPOSITE0,
>> 1330 .amux = EM28XX_AMUX_VIDEO,
>> 1331 }, {
>> 1332 .type = EM28XX_VMUX_COMPOSITE1,
>> 1333 .vmux = TVP5150_COMPOSITE1,
>> 1334 .amux = EM28XX_AMUX_LINE_IN,
>> 1335 }, {
>> 1336 .type = EM28XX_VMUX_SVIDEO,
>> 1337 .vmux = TVP5150_SVIDEO,
>> 1338 .amux = EM28XX_AMUX_LINE_IN,
>> 1339 } },
>> 1340 },
>> 1341 [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
>> 1342 .name = "Terratec Hybrid XS (em2882)",
>> 1343 .valid = EM28XX_BOARD_NOT_VALIDATED,
>> 1344 .tuner_type = TUNER_XC2028,
>> 1345 .tuner_gpio = default_tuner_gpio,
>> 1346 .decoder = EM28XX_TVP5150,
>> 1347 .input = { {
>> 1348 .type = EM28XX_VMUX_TELEVISION,
>> 1349 .vmux = TVP5150_COMPOSITE0,
>> 1350 .amux = EM28XX_AMUX_VIDEO,
>> 1351 .gpio = hauppauge_wintv_hvr_900_analog,
>> 1352 }, {
>> 1353 .type = EM28XX_VMUX_COMPOSITE1,
>> 1354 .vmux = TVP5150_COMPOSITE1,
>> 1355 .amux = EM28XX_AMUX_LINE_IN,
>> 1356 .gpio = hauppauge_wintv_hvr_900_analog,
>> 1357 }, {
>> 1358 .type = EM28XX_VMUX_SVIDEO,
>> 1359 .vmux = TVP5150_SVIDEO,
>> 1360 .amux = EM28XX_AMUX_LINE_IN,
>> 1361 .gpio = hauppauge_wintv_hvr_900_analog,
>> 1362 } },
>> 1363 },
>> 1364 [EM2883_BOARD_KWORLD_HYBRID_330U] = {
>> 1365 .name = "Kworld PlusTV HD Hybrid 330",
>> 1366 .tuner_type = TUNER_XC2028,
>> 1367 .tuner_gpio = default_tuner_gpio,
>> 1368 .decoder = EM28XX_TVP5150,
>> 1369 .mts_firmware = 1,
>> 1370 .has_dvb = 1,
>> 1371 .dvb_gpio = kworld_330u_digital,
>> 1372 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
>> 1373 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
>> 1374 EM28XX_I2C_EEPROM_ON_BOARD |
>> 1375 EM28XX_I2C_EEPROM_KEY_VALID,
>> 1376 .input = { {
>> 1377 .type = EM28XX_VMUX_TELEVISION,
>> 1378 .vmux = TVP5150_COMPOSITE0,
>> 1379 .amux = EM28XX_AMUX_VIDEO,
>> 1380 .gpio = kworld_330u_analog,
>> 1381 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
>> 1382 }, {
>> 1383 .type = EM28XX_VMUX_COMPOSITE1,
>> 1384 .vmux = TVP5150_COMPOSITE1,
>> 1385 .amux = EM28XX_AMUX_LINE_IN,
>> 1386 .gpio = kworld_330u_analog,
>> 1387 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
>> 1388 }, {
>> 1389 .type = EM28XX_VMUX_SVIDEO,
>> 1390 .vmux = TVP5150_SVIDEO,
>> 1391 .amux = EM28XX_AMUX_LINE_IN,
>> 1392 .gpio = kworld_330u_analog,
>> 1393 } },
>> 1394 },
>> 1395 [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
>> 1396 .name = "Compro VideoMate ForYou/Stereo",
>> 1397 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
>> 1398 .tvaudio_addr = 0xb0,
>> 1399 .tda9887_conf = TDA9887_PRESENT,
>> 1400 .decoder = EM28XX_TVP5150,
>> 1401 .adecoder = EM28XX_TVAUDIO,
>> 1402 .mute_gpio = compro_mute_gpio,
>> 1403 .input = { {
>> 1404 .type = EM28XX_VMUX_TELEVISION,
>> 1405 .vmux = TVP5150_COMPOSITE0,
>> 1406 .amux = EM28XX_AMUX_VIDEO,
>> 1407 .gpio = compro_unmute_tv_gpio,
>> 1408 }, {
>> 1409 .type = EM28XX_VMUX_SVIDEO,
>> 1410 .vmux = TVP5150_SVIDEO,
>> 1411 .amux = EM28XX_AMUX_LINE_IN,
>> 1412 .gpio = compro_unmute_svid_gpio,
>> 1413 } },
>> 1414 },
>> 1415 [EM2860_BOARD_KAIOMY_TVNPC_U2] = {
>> 1416 .name = "Kaiomy TVnPC U2",
>> 1417 .vchannels = 3,
>> 1418 .tuner_type = TUNER_XC2028,
>> 1419 .tuner_addr = 0x61,
>> 1420 .mts_firmware = 1,
>> 1421 .decoder = EM28XX_TVP5150,
>> 1422 .tuner_gpio = default_tuner_gpio,
>> 1423 .ir_codes = ir_codes_kaiomy,
>> 1424 .input = { {
>> 1425 .type = EM28XX_VMUX_TELEVISION,
>> 1426 .vmux = TVP5150_COMPOSITE0,
>> 1427 .amux = EM28XX_AMUX_VIDEO,
>> 1428
>> 1429 }, {
>> 1430 .type = EM28XX_VMUX_COMPOSITE1,
>> 1431 .vmux = TVP5150_COMPOSITE1,
>> 1432 .amux = EM28XX_AMUX_LINE_IN,
>> 1433 }, {
>> 1434 .type = EM28XX_VMUX_SVIDEO,
>> 1435 .vmux = TVP5150_SVIDEO,
>> 1436 .amux = EM28XX_AMUX_LINE_IN,
>> 1437 } },
>> 1438 .radio = {
>> 1439 .type = EM28XX_RADIO,
>> 1440 .amux = EM28XX_AMUX_LINE_IN,
>> 1441 }
>> 1442 },
>> 1443 [EM2860_BOARD_EASYCAP] = {
>> 1444 .name = "Easy Cap Capture DC-60",
>> 1445 .vchannels = 2,
>> 1446 .tuner_type = TUNER_ABSENT,
>> 1447 .decoder = EM28XX_SAA711X,
>> 1448 .input = { {
>> 1449 .type = EM28XX_VMUX_COMPOSITE1,
>> 1450 .vmux = SAA7115_COMPOSITE0,
>> 1451 .amux = EM28XX_AMUX_LINE_IN,
>> 1452 }, {
>> 1453 .type = EM28XX_VMUX_SVIDEO,
>> 1454 .vmux = SAA7115_SVIDEO3,
>> 1455 .amux = EM28XX_AMUX_LINE_IN,
>> 1456 } },
>> 1457 },
>> 1458 [EM2820_BOARD_IODATA_GVMVP_SZ] = {
>> 1459 .name = "IO-DATA GV-MVP/SZ",
>> 1460 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
>> 1461 .tuner_gpio = default_tuner_gpio,
>> 1462 .tda9887_conf = TDA9887_PRESENT,
>> 1463 .decoder = EM28XX_TVP5150,
>> 1464 .input = { {
>> 1465 .type = EM28XX_VMUX_TELEVISION,
>> 1466 .vmux = TVP5150_COMPOSITE0,
>> 1467 .amux = EM28XX_AMUX_VIDEO,
>> 1468 }, { /* Composite has not been tested yet */
>> 1469 .type = EM28XX_VMUX_COMPOSITE1,
>> 1470 .vmux = TVP5150_COMPOSITE1,
>> 1471 .amux = EM28XX_AMUX_VIDEO,
>> 1472 }, { /* S-video has not been tested yet */
>> 1473 .type = EM28XX_VMUX_SVIDEO,
>> 1474 .vmux = TVP5150_SVIDEO,
>> 1475 .amux = EM28XX_AMUX_VIDEO,
>> 1476 } },
>> 1477 },
>> 1478 [EM2860_BOARD_TERRATEC_GRABBY] = {
>> 1479 .name = "Terratec Grabby",
>> 1480 .vchannels = 2,
>> 1481 .tuner_type = TUNER_ABSENT,
>> 1482 .decoder = EM28XX_SAA711X,
>> 1483 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
>> 1484 .input = { {
>> 1485 .type = EM28XX_VMUX_COMPOSITE1,
>> 1486 .vmux = SAA7115_COMPOSITE0,
>> 1487 .amux = EM28XX_AMUX_VIDEO2,
>> 1488 }, {
>> 1489 .type = EM28XX_VMUX_SVIDEO,
>> 1490 .vmux = SAA7115_SVIDEO3,
>> 1491 .amux = EM28XX_AMUX_VIDEO2,
>> 1492 } },
>> 1493 },
>> 1494 [EM2860_BOARD_TERRATEC_AV350] = {
>> 1495 .name = "Terratec AV350",
>> 1496 .vchannels = 2,
>> 1497 .tuner_type = TUNER_ABSENT,
>> 1498 .decoder = EM28XX_TVP5150,
>> 1499 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
>> 1500 .mute_gpio = terratec_av350_mute_gpio,
>> 1501 .input = { {
>> 1502 .type = EM28XX_VMUX_COMPOSITE1,
>> 1503 .vmux = TVP5150_COMPOSITE1,
>> 1504 .amux = EM28XX_AUDIO_SRC_LINE,
>> 1505 .gpio = terratec_av350_unmute_gpio,
>> 1506
>> 1507 }, {
>> 1508 .type = EM28XX_VMUX_SVIDEO,
>> 1509 .vmux = TVP5150_SVIDEO,
>> 1510 .amux = EM28XX_AUDIO_SRC_LINE,
>> 1511 .gpio = terratec_av350_unmute_gpio,
>> 1512 } },
>> 1513 },
>> 1514 [EM2882_BOARD_EVGA_INDTUBE] = {
>> 1515 .name = "Evga inDtube",
>> 1516 .tuner_type = TUNER_XC2028,
>> 1517 .tuner_gpio = default_tuner_gpio,
>> 1518 .decoder = EM28XX_TVP5150,
>> 1519 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
>> 1520 .mts_firmware = 1,
>> 1521 .has_dvb = 1,
>> 1522 .dvb_gpio = evga_indtube_digital,
>> 1523 .ir_codes = ir_codes_evga_indtube,
>> 1524 .input = { {
>> 1525 .type = EM28XX_VMUX_TELEVISION,
>> 1526 .vmux = TVP5150_COMPOSITE0,
>> 1527 .amux = EM28XX_AMUX_VIDEO,
>> 1528 .gpio = evga_indtube_analog,
>> 1529 }, {
>> 1530 .type = EM28XX_VMUX_COMPOSITE1,
>> 1531 .vmux = TVP5150_COMPOSITE1,
>> 1532 .amux = EM28XX_AMUX_LINE_IN,
>> 1533 .gpio = evga_indtube_analog,
>> 1534 }, {
>> 1535 .type = EM28XX_VMUX_SVIDEO,
>> 1536 .vmux = TVP5150_SVIDEO,
>> 1537 .amux = EM28XX_AMUX_LINE_IN,
>> 1538 .gpio = evga_indtube_analog,
>> 1539 } },
>> 1540 },
>> 1541 };
>> 1542 const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
>> 1543
>> 1544 /* table of devices that work with this driver */
>> 1545 struct usb_device_id em28xx_id_table[] = {
>> 1546 { USB_DEVICE(0xeb1a, 0x2750),
>> 1547 .driver_info = EM2750_BOARD_UNKNOWN },
>> 1548 { USB_DEVICE(0xeb1a, 0x2751),
>> 1549 .driver_info = EM2750_BOARD_UNKNOWN },
>> 1550 { USB_DEVICE(0xeb1a, 0x2800),
>> 1551 .driver_info = EM2800_BOARD_UNKNOWN },
>> 1552 { USB_DEVICE(0xeb1a, 0x2710),
>> 1553 .driver_info = EM2820_BOARD_UNKNOWN },
>> 1554 { USB_DEVICE(0xeb1a, 0x2820),
417 .driver_info = EM2820_ 1555 .driver_info = EM2820_BOARD_UNKNOWN },
418 { USB_DEVICE(0xeb1a, 0x2821), 1556 { USB_DEVICE(0xeb1a, 0x2821),
419 .driver_info = EM2820_ 1557 .driver_info = EM2820_BOARD_UNKNOWN },
420 { USB_DEVICE(0xeb1a, 0x2860), 1558 { USB_DEVICE(0xeb1a, 0x2860),
421 .driver_info = EM2820_ 1559 .driver_info = EM2820_BOARD_UNKNOWN },
422 { USB_DEVICE(0xeb1a, 0x2861), 1560 { USB_DEVICE(0xeb1a, 0x2861),
423 .driver_info = EM2820_ 1561 .driver_info = EM2820_BOARD_UNKNOWN },
424 { USB_DEVICE(0xeb1a, 0x2870), 1562 { USB_DEVICE(0xeb1a, 0x2870),
425 .driver_info = EM2820_ 1563 .driver_info = EM2820_BOARD_UNKNOWN },
426 { USB_DEVICE(0xeb1a, 0x2881), 1564 { USB_DEVICE(0xeb1a, 0x2881),
427 .driver_info = EM2820_ 1565 .driver_info = EM2820_BOARD_UNKNOWN },
428 { USB_DEVICE(0xeb1a, 0x2883), 1566 { USB_DEVICE(0xeb1a, 0x2883),
429 .driver_info = EM2820_ 1567 .driver_info = EM2820_BOARD_UNKNOWN },
>> 1568 { USB_DEVICE(0xeb1a, 0xe300),
>> 1569 .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
>> 1570 { USB_DEVICE(0xeb1a, 0xe303),
>> 1571 .driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
>> 1572 { USB_DEVICE(0xeb1a, 0xe305),
>> 1573 .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
>> 1574 { USB_DEVICE(0xeb1a, 0xe310),
>> 1575 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
>> 1576 { USB_DEVICE(0xeb1a, 0xa313),
>> 1577 .driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
>> 1578 { USB_DEVICE(0xeb1a, 0xa316),
>> 1579 .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
>> 1580 { USB_DEVICE(0xeb1a, 0xe320),
>> 1581 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
>> 1582 { USB_DEVICE(0xeb1a, 0xe323),
>> 1583 .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
>> 1584 { USB_DEVICE(0xeb1a, 0xe350),
>> 1585 .driver_info = EM2870_BOARD_KWORLD_350U },
>> 1586 { USB_DEVICE(0xeb1a, 0xe355),
>> 1587 .driver_info = EM2870_BOARD_KWORLD_355U },
>> 1588 { USB_DEVICE(0xeb1a, 0x2801),
>> 1589 .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
>> 1590 { USB_DEVICE(0xeb1a, 0xe357),
>> 1591 .driver_info = EM2870_BOARD_KWORLD_355U },
>> 1592 { USB_DEVICE(0x1b80, 0xe302),
>> 1593 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */
430 { USB_DEVICE(0x0ccd, 0x0036), 1594 { USB_DEVICE(0x0ccd, 0x0036),
431 .driver_info = EM2820_ 1595 .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
432 { USB_DEVICE(0x2304, 0x0208), !! 1596 { USB_DEVICE(0x0ccd, 0x004c),
433 .driver_info = EM2820_ !! 1597 .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
>> 1598 { USB_DEVICE(0x0ccd, 0x004f),
>> 1599 .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
>> 1600 { USB_DEVICE(0x0ccd, 0x005e),
>> 1601 .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
>> 1602 { USB_DEVICE(0x0ccd, 0x0042),
>> 1603 .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS },
>> 1604 { USB_DEVICE(0x0ccd, 0x0043),
>> 1605 .driver_info = EM2870_BOARD_TERRATEC_XS },
>> 1606 { USB_DEVICE(0x0ccd, 0x0047),
>> 1607 .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
>> 1608 { USB_DEVICE(0x0ccd, 0x0084),
>> 1609 .driver_info = EM2860_BOARD_TERRATEC_AV350 },
>> 1610 { USB_DEVICE(0x0ccd, 0x0096),
>> 1611 .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
>> 1612 { USB_DEVICE(0x185b, 0x2870),
>> 1613 .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
>> 1614 { USB_DEVICE(0x185b, 0x2041),
>> 1615 .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
434 { USB_DEVICE(0x2040, 0x4200), 1616 { USB_DEVICE(0x2040, 0x4200),
435 .driver_info = EM2820_ 1617 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
436 { USB_DEVICE(0x2040, 0x4201), 1618 { USB_DEVICE(0x2040, 0x4201),
437 .driver_info = EM2820_ 1619 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
>> 1620 { USB_DEVICE(0x2040, 0x6500),
>> 1621 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
>> 1622 { USB_DEVICE(0x2040, 0x6502),
>> 1623 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
>> 1624 { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
>> 1625 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
>> 1626 { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */
>> 1627 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
>> 1628 { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */
>> 1629 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
>> 1630 { USB_DEVICE(0x2040, 0x651f),
>> 1631 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
>> 1632 { USB_DEVICE(0x0438, 0xb002),
>> 1633 .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
>> 1634 { USB_DEVICE(0x2001, 0xf112),
>> 1635 .driver_info = EM2820_BOARD_DLINK_USB_TV },
438 { USB_DEVICE(0x2304, 0x0207), 1636 { USB_DEVICE(0x2304, 0x0207),
439 .driver_info = EM2820_ 1637 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
>> 1638 { USB_DEVICE(0x2304, 0x0208),
>> 1639 .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
440 { USB_DEVICE(0x2304, 0x021a), 1640 { USB_DEVICE(0x2304, 0x021a),
441 .driver_info = EM2820_ 1641 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
442 { USB_DEVICE(0x2040, 0x6500), !! 1642 { USB_DEVICE(0x2304, 0x0226),
443 .driver_info = EM2880_ !! 1643 .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO },
444 { USB_DEVICE(0x2040, 0x6502), !! 1644 { USB_DEVICE(0x2304, 0x0227),
445 .driver_info = EM2880_ !! 1645 .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
446 { USB_DEVICE(0x2040, 0x6513), !! 1646 { USB_DEVICE(0x0413, 0x6023),
447 .driver_info = EM2880_ !! 1647 .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
448 { USB_DEVICE(0x0ccd, 0x0042), !! 1648 { USB_DEVICE(0x093b, 0xa005),
449 .driver_info = EM2880_ !! 1649 .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
450 { USB_DEVICE(0x0ccd, 0x0047), !! 1650 { USB_DEVICE(0x04bb, 0x0515),
451 .driver_info = EM2880_ !! 1651 .driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
452 { }, 1652 { },
453 }; 1653 };
454 MODULE_DEVICE_TABLE(usb, em28xx_id_table); 1654 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
455 1655
456 /* EEPROM hash table for devices with generic !! 1656 /*
457 static struct em28xx_hash_table em28xx_eeprom_ !! 1657 * EEPROM hash table for devices with generic USB IDs
>> 1658 */
>> 1659 static struct em28xx_hash_table em28xx_eeprom_hash[] = {
458 /* P/N: SA 60002070465 Tuner: TVF7533- 1660 /* P/N: SA 60002070465 Tuner: TVF7533-MF */
459 {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAY 1661 {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
>> 1662 {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
>> 1663 {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
>> 1664 {0x9567eb1a, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
>> 1665 {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
>> 1666 {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
>> 1667 };
>> 1668
>> 1669 /* I2C devicelist hash table for devices with generic USB IDs */
>> 1670 static struct em28xx_hash_table em28xx_i2c_hash[] = {
>> 1671 {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
>> 1672 {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
>> 1673 {0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
>> 1674 {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
>> 1675 };
>> 1676
>> 1677 /* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */
>> 1678 static unsigned short saa711x_addrs[] = {
>> 1679 0x4a >> 1, 0x48 >> 1, /* SAA7111, SAA7111A and SAA7113 */
>> 1680 0x42 >> 1, 0x40 >> 1, /* SAA7114, SAA7115 and SAA7118 */
>> 1681 I2C_CLIENT_END };
>> 1682
>> 1683 static unsigned short tvp5150_addrs[] = {
>> 1684 0xb8 >> 1,
>> 1685 0xba >> 1,
>> 1686 I2C_CLIENT_END
>> 1687 };
>> 1688
>> 1689 static unsigned short mt9v011_addrs[] = {
>> 1690 0xba >> 1,
>> 1691 I2C_CLIENT_END
460 }; 1692 };
461 1693
462 /* I2C devicelist hash table for devices with !! 1694 static unsigned short msp3400_addrs[] = {
463 static struct em28xx_hash_table em28xx_i2c_has !! 1695 0x80 >> 1,
464 {0xb06a32c3, EM2800_BOARD_TERRATEC_CIN !! 1696 0x88 >> 1,
465 {0xf51200e3, EM2800_BOARD_VGEAR_POCKET !! 1697 I2C_CLIENT_END
466 }; 1698 };
467 1699
>> 1700 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
>> 1701 {
>> 1702 int rc = 0;
>> 1703 struct em28xx *dev = ptr;
>> 1704
>> 1705 if (dev->tuner_type != TUNER_XC2028)
>> 1706 return 0;
>> 1707
>> 1708 if (command != XC2028_TUNER_RESET)
>> 1709 return 0;
>> 1710
>> 1711 rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
>> 1712
>> 1713 return rc;
>> 1714 }
>> 1715 EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
>> 1716
>> 1717 static inline void em28xx_set_model(struct em28xx *dev)
>> 1718 {
>> 1719 memcpy(&dev->board, &em28xx_boards[dev->model], sizeof(dev->board));
>> 1720
>> 1721 /* Those are the default values for the majority of boards
>> 1722 Use those values if not specified otherwise at boards entry
>> 1723 */
>> 1724 if (!dev->board.xclk)
>> 1725 dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE |
>> 1726 EM28XX_XCLK_FREQUENCY_12MHZ;
>> 1727
>> 1728 if (!dev->board.i2c_speed)
>> 1729 dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
>> 1730 EM28XX_I2C_FREQ_100_KHZ;
>> 1731 }
>> 1732
>> 1733
>> 1734 /* FIXME: Should be replaced by a proper mt9m111 driver */
>> 1735 static int em28xx_initialize_mt9m111(struct em28xx *dev)
>> 1736 {
>> 1737 int i;
>> 1738 unsigned char regs[][3] = {
>> 1739 { 0x0d, 0x00, 0x01, }, /* reset and use defaults */
>> 1740 { 0x0d, 0x00, 0x00, },
>> 1741 { 0x0a, 0x00, 0x21, },
>> 1742 { 0x21, 0x04, 0x00, }, /* full readout speed, no row/col skipping */
>> 1743 };
>> 1744
>> 1745 for (i = 0; i < ARRAY_SIZE(regs); i++)
>> 1746 i2c_master_send(&dev->i2c_client, ®s[i][0], 3);
>> 1747
>> 1748 return 0;
>> 1749 }
>> 1750
>> 1751
>> 1752 /* FIXME: Should be replaced by a proper mt9m001 driver */
>> 1753 static int em28xx_initialize_mt9m001(struct em28xx *dev)
>> 1754 {
>> 1755 int i;
>> 1756 unsigned char regs[][3] = {
>> 1757 { 0x0d, 0x00, 0x01, },
>> 1758 { 0x0d, 0x00, 0x00, },
>> 1759 { 0x04, 0x05, 0x00, }, /* hres = 1280 */
>> 1760 { 0x03, 0x04, 0x00, }, /* vres = 1024 */
>> 1761 { 0x20, 0x11, 0x00, },
>> 1762 { 0x06, 0x00, 0x10, },
>> 1763 { 0x2b, 0x00, 0x24, },
>> 1764 { 0x2e, 0x00, 0x24, },
>> 1765 { 0x35, 0x00, 0x24, },
>> 1766 { 0x2d, 0x00, 0x20, },
>> 1767 { 0x2c, 0x00, 0x20, },
>> 1768 { 0x09, 0x0a, 0xd4, },
>> 1769 { 0x35, 0x00, 0x57, },
>> 1770 };
>> 1771
>> 1772 for (i = 0; i < ARRAY_SIZE(regs); i++)
>> 1773 i2c_master_send(&dev->i2c_client, ®s[i][0], 3);
>> 1774
>> 1775 return 0;
>> 1776 }
>> 1777
>> 1778 /* HINT method: webcam I2C chips
>> 1779 *
>> 1780 * This method works for webcams with Micron sensors
>> 1781 */
>> 1782 static int em28xx_hint_sensor(struct em28xx *dev)
>> 1783 {
>> 1784 int rc;
>> 1785 char *sensor_name;
>> 1786 unsigned char cmd;
>> 1787 __be16 version_be;
>> 1788 u16 version;
>> 1789
>> 1790 /* Micron sensor detection */
>> 1791 dev->i2c_client.addr = 0xba >> 1;
>> 1792 cmd = 0;
>> 1793 i2c_master_send(&dev->i2c_client, &cmd, 1);
>> 1794 rc = i2c_master_recv(&dev->i2c_client, (char *)&version_be, 2);
>> 1795 if (rc != 2)
>> 1796 return -EINVAL;
>> 1797
>> 1798 version = be16_to_cpu(version_be);
>> 1799 switch (version) {
>> 1800 case 0x8232: /* mt9v011 640x480 1.3 Mpix sensor */
>> 1801 case 0x8243: /* mt9v011 rev B 640x480 1.3 Mpix sensor */
>> 1802 dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
>> 1803 em28xx_set_model(dev);
>> 1804
>> 1805 sensor_name = "mt9v011";
>> 1806 dev->em28xx_sensor = EM28XX_MT9V011;
>> 1807 dev->sensor_xres = 640;
>> 1808 dev->sensor_yres = 480;
>> 1809 /*
>> 1810 * FIXME: mt9v011 uses I2S speed as xtal clk - at least with
>> 1811 * the Silvercrest cam I have here for testing - for higher
>> 1812 * resolutions, a high clock cause horizontal artifacts, so we
>> 1813 * need to use a lower xclk frequency.
>> 1814 * Yet, it would be possible to adjust xclk depending on the
>> 1815 * desired resolution, since this affects directly the
>> 1816 * frame rate.
>> 1817 */
>> 1818 dev->board.xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ;
>> 1819 dev->sensor_xtal = 4300000;
>> 1820
>> 1821 /* probably means GRGB 16 bit bayer */
>> 1822 dev->vinmode = 0x0d;
>> 1823 dev->vinctl = 0x00;
>> 1824
>> 1825 break;
>> 1826
>> 1827 case 0x143a: /* MT9M111 as found in the ECS G200 */
>> 1828 dev->model = EM2750_BOARD_UNKNOWN;
>> 1829 em28xx_set_model(dev);
>> 1830
>> 1831 sensor_name = "mt9m111";
>> 1832 dev->board.xclk = EM28XX_XCLK_FREQUENCY_48MHZ;
>> 1833 dev->em28xx_sensor = EM28XX_MT9M111;
>> 1834 em28xx_initialize_mt9m111(dev);
>> 1835 dev->sensor_xres = 640;
>> 1836 dev->sensor_yres = 512;
>> 1837
>> 1838 dev->vinmode = 0x0a;
>> 1839 dev->vinctl = 0x00;
>> 1840
>> 1841 break;
>> 1842
>> 1843 case 0x8431:
>> 1844 dev->model = EM2750_BOARD_UNKNOWN;
>> 1845 em28xx_set_model(dev);
>> 1846
>> 1847 sensor_name = "mt9m001";
>> 1848 dev->em28xx_sensor = EM28XX_MT9M001;
>> 1849 em28xx_initialize_mt9m001(dev);
>> 1850 dev->sensor_xres = 1280;
>> 1851 dev->sensor_yres = 1024;
>> 1852
>> 1853 /* probably means BGGR 16 bit bayer */
>> 1854 dev->vinmode = 0x0c;
>> 1855 dev->vinctl = 0x00;
>> 1856
>> 1857 break;
>> 1858 default:
>> 1859 printk("Unknown Micron Sensor 0x%04x\n", version);
>> 1860 return -EINVAL;
>> 1861 }
>> 1862
>> 1863 /* Setup webcam defaults */
>> 1864 em28xx_pre_card_setup(dev);
>> 1865
>> 1866 em28xx_errdev("Sensor is %s, using model %s entry.\n",
>> 1867 sensor_name, em28xx_boards[dev->model].name);
>> 1868
>> 1869 return 0;
>> 1870 }
>> 1871
468 /* Since em28xx_pre_card_setup() requires a pr 1872 /* Since em28xx_pre_card_setup() requires a proper dev->model,
469 * this won't work for boards with generic PCI 1873 * this won't work for boards with generic PCI IDs
470 */ 1874 */
471 void em28xx_pre_card_setup(struct em28xx *dev) 1875 void em28xx_pre_card_setup(struct em28xx *dev)
472 { 1876 {
>> 1877 /* Set the initial XCLK and I2C clock values based on the board
>> 1878 definition */
>> 1879 em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
>> 1880 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
>> 1881 msleep(50);
>> 1882
473 /* request some modules */ 1883 /* request some modules */
474 switch (dev->model) { 1884 switch (dev->model) {
475 case EM2880_BOARD_TERRATEC_PRODIGY_XS: !! 1885 case EM2861_BOARD_PLEXTOR_PX_TV100U:
476 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_ !! 1886 /* Sets the msp34xx I2S speed */
477 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_ !! 1887 dev->i2s_speed = 2048000;
478 case EM2880_BOARD_TERRATEC_HYBRID_XS: !! 1888 break;
479 em28xx_write_regs(dev, XCLK_RE !! 1889 case EM2861_BOARD_KWORLD_PVRTV_300U:
480 em28xx_write_regs(dev, I2C_CLK !! 1890 case EM2880_BOARD_KWORLD_DVB_305U:
481 em28xx_write_regs(dev, 0x08, " !! 1891 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x6d);
482 em28xx_write_regs(dev, 0x04, " !! 1892 msleep(10);
483 msleep(100); !! 1893 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d);
484 em28xx_write_regs(dev, 0x04, " !! 1894 msleep(10);
485 msleep(100); !! 1895 break;
>> 1896 case EM2870_BOARD_COMPRO_VIDEOMATE:
>> 1897 /* TODO: someone can do some cleanup here...
>> 1898 not everything's needed */
>> 1899 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
>> 1900 msleep(10);
>> 1901 em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
>> 1902 msleep(10);
>> 1903 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
>> 1904 mdelay(70);
>> 1905 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
>> 1906 mdelay(70);
>> 1907 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xdc);
>> 1908 mdelay(70);
>> 1909 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
>> 1910 mdelay(70);
>> 1911 break;
>> 1912 case EM2870_BOARD_TERRATEC_XS_MT2060:
>> 1913 /* this device needs some gpio writes to get the DVB-T
>> 1914 demod work */
>> 1915 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
>> 1916 mdelay(70);
>> 1917 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
>> 1918 mdelay(70);
>> 1919 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
>> 1920 mdelay(70);
>> 1921 break;
>> 1922 case EM2870_BOARD_PINNACLE_PCTV_DVB:
>> 1923 /* this device needs some gpio writes to get the
>> 1924 DVB-T demod work */
>> 1925 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
>> 1926 mdelay(70);
>> 1927 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
>> 1928 mdelay(70);
>> 1929 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
>> 1930 mdelay(70);
>> 1931 break;
>> 1932 case EM2820_BOARD_GADMEI_UTV310:
>> 1933 case EM2820_BOARD_MSI_VOX_USB_2:
>> 1934 /* enables audio for that devices */
>> 1935 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
>> 1936 break;
>> 1937
>> 1938 case EM2882_BOARD_KWORLD_ATSC_315U:
>> 1939 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
>> 1940 msleep(10);
>> 1941 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
>> 1942 msleep(10);
>> 1943 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
>> 1944 msleep(10);
>> 1945 em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
>> 1946 msleep(10);
>> 1947 break;
>> 1948
>> 1949 case EM2860_BOARD_KAIOMY_TVNPC_U2:
>> 1950 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
>> 1951 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
>> 1952 em28xx_write_regs(dev, 0x0d, "\x42", 1);
>> 1953 em28xx_write_regs(dev, 0x08, "\xfd", 1);
>> 1954 msleep(10);
486 em28xx_write_regs(dev, 0x08, " 1955 em28xx_write_regs(dev, 0x08, "\xff", 1);
487 msleep(50); !! 1956 msleep(10);
488 em28xx_write_regs(dev, 0x08, " !! 1957 em28xx_write_regs(dev, 0x08, "\x7f", 1);
489 msleep(50); !! 1958 msleep(10);
490 em28xx_write_regs(dev, 0x08, " !! 1959 em28xx_write_regs(dev, 0x08, "\x6b", 1);
>> 1960
>> 1961 break;
>> 1962 case EM2860_BOARD_EASYCAP:
>> 1963 em28xx_write_regs(dev, 0x08, "\xf8", 1);
491 break; 1964 break;
492 } <<
493 } <<
494 1965
495 static int em28xx_tuner_callback(void *ptr, in !! 1966 case EM2820_BOARD_IODATA_GVMVP_SZ:
496 { !! 1967 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
497 int rc = 0; !! 1968 msleep(70);
498 struct em28xx *dev = ptr; !! 1969 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
>> 1970 msleep(10);
>> 1971 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
>> 1972 msleep(70);
>> 1973 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
>> 1974 msleep(70);
>> 1975 break;
>> 1976 }
499 1977
500 if (dev->tuner_type != TUNER_XC2028) !! 1978 em28xx_gpio_set(dev, dev->board.tuner_gpio);
501 return 0; !! 1979 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
502 1980
503 switch (command) { !! 1981 /* Unlock device */
504 case XC2028_TUNER_RESET: !! 1982 em28xx_set_mode(dev, EM28XX_SUSPEND);
505 { !! 1983 }
506 /* GPIO and initialization cod <<
507 This code should be complem <<
508 codes are different. <<
509 */ <<
510 1984
511 dev->em28xx_write_regs_req(dev !! 1985 static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
512 dev->em28xx_write_regs_req(dev !! 1986 {
>> 1987 memset(ctl, 0, sizeof(*ctl));
513 1988
514 if (dev->analog_gpio) { !! 1989 ctl->fname = XC2028_DEFAULT_FIRMWARE;
515 char gpio0 = dev->anal !! 1990 ctl->max_len = 64;
516 char gpio1 = (dev->ana !! 1991 ctl->mts = em28xx_boards[dev->model].mts_firmware;
517 char gpio4 = dev->anal <<
518 <<
519 if (gpio4) { <<
520 dev->em28xx_wr <<
521 msleep(140); <<
522 } <<
523 <<
524 msleep(6); <<
525 dev->em28xx_write_regs <<
526 msleep(10); <<
527 dev->em28xx_write_regs <<
528 msleep(5); <<
529 } <<
530 1992
>> 1993 switch (dev->model) {
>> 1994 case EM2880_BOARD_EMPIRE_DUAL_TV:
>> 1995 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
>> 1996 ctl->demod = XC3028_FE_ZARLINK456;
531 break; 1997 break;
>> 1998 case EM2880_BOARD_TERRATEC_HYBRID_XS:
>> 1999 case EM2881_BOARD_PINNACLE_HYBRID_PRO:
>> 2000 ctl->demod = XC3028_FE_ZARLINK456;
>> 2001 break;
>> 2002 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
>> 2003 /* djh - Not sure which demod we need here */
>> 2004 ctl->demod = XC3028_FE_DEFAULT;
>> 2005 break;
>> 2006 case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
>> 2007 ctl->demod = XC3028_FE_DEFAULT;
>> 2008 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
>> 2009 break;
>> 2010 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
>> 2011 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
>> 2012 case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
>> 2013 /* FIXME: Better to specify the needed IF */
>> 2014 ctl->demod = XC3028_FE_DEFAULT;
>> 2015 break;
>> 2016 case EM2883_BOARD_KWORLD_HYBRID_330U:
>> 2017 ctl->demod = XC3028_FE_CHINA;
>> 2018 ctl->fname = XC2028_DEFAULT_FIRMWARE;
>> 2019 break;
>> 2020 case EM2882_BOARD_EVGA_INDTUBE:
>> 2021 ctl->demod = XC3028_FE_CHINA;
>> 2022 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
>> 2023 break;
>> 2024 default:
>> 2025 ctl->demod = XC3028_FE_OREN538;
532 } 2026 }
533 } <<
534 return rc; <<
535 } 2027 }
536 2028
537 static void em28xx_config_tuner(struct em28xx !! 2029 static void em28xx_tuner_setup(struct em28xx *dev)
538 { 2030 {
539 struct v4l2_priv_tun_config xc2028_cf <<
540 struct xc2028_ctrl ctl; <<
541 struct tuner_setup tun_setup 2031 struct tuner_setup tun_setup;
542 struct v4l2_frequency f; 2032 struct v4l2_frequency f;
543 2033
544 if (dev->tuner_type == TUNER_ABSENT) 2034 if (dev->tuner_type == TUNER_ABSENT)
545 return; 2035 return;
546 2036
>> 2037 memset(&tun_setup, 0, sizeof(tun_setup));
>> 2038
547 tun_setup.mode_mask = T_ANALOG_TV | T_ 2039 tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
548 tun_setup.type = dev->tuner_type; <<
549 tun_setup.addr = dev->tuner_addr; <<
550 tun_setup.tuner_callback = em28xx_tune 2040 tun_setup.tuner_callback = em28xx_tuner_callback;
551 2041
552 em28xx_i2c_call_clients(dev, TUNER_SET !! 2042 if (dev->board.radio.type) {
>> 2043 tun_setup.type = dev->board.radio.type;
>> 2044 tun_setup.addr = dev->board.radio_addr;
>> 2045
>> 2046 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
>> 2047 }
>> 2048
>> 2049 if ((dev->tuner_type != TUNER_ABSENT) && (dev->tuner_type)) {
>> 2050 tun_setup.type = dev->tuner_type;
>> 2051 tun_setup.addr = dev->tuner_addr;
>> 2052
>> 2053 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
>> 2054 }
>> 2055
>> 2056 if (dev->tda9887_conf) {
>> 2057 struct v4l2_priv_tun_config tda9887_cfg;
>> 2058
>> 2059 tda9887_cfg.tuner = TUNER_TDA9887;
>> 2060 tda9887_cfg.priv = &dev->tda9887_conf;
>> 2061
>> 2062 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &tda9887_cfg);
>> 2063 }
553 2064
554 if (dev->tuner_type == TUNER_XC2028) { 2065 if (dev->tuner_type == TUNER_XC2028) {
>> 2066 struct v4l2_priv_tun_config xc2028_cfg;
>> 2067 struct xc2028_ctrl ctl;
>> 2068
>> 2069 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
555 memset(&ctl, 0, sizeof(ctl)); 2070 memset(&ctl, 0, sizeof(ctl));
556 2071
557 ctl.fname = XC2028_DEFAULT_F !! 2072 em28xx_setup_xc3028(dev, &ctl);
558 ctl.max_len = 64; <<
559 ctl.mts = em28xx_boards[dev->m <<
560 2073
561 xc2028_cfg.tuner = TUNER_XC202 2074 xc2028_cfg.tuner = TUNER_XC2028;
562 xc2028_cfg.priv = &ctl; 2075 xc2028_cfg.priv = &ctl;
563 2076
564 em28xx_i2c_call_clients(dev, T !! 2077 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &xc2028_cfg);
565 } 2078 }
566 2079
567 /* configure tuner */ 2080 /* configure tuner */
568 f.tuner = 0; 2081 f.tuner = 0;
569 f.type = V4L2_TUNER_ANALOG_TV; 2082 f.type = V4L2_TUNER_ANALOG_TV;
570 f.frequency = 9076; /* just a magi 2083 f.frequency = 9076; /* just a magic number */
571 dev->ctl_freq = f.frequency; 2084 dev->ctl_freq = f.frequency;
572 em28xx_i2c_call_clients(dev, VIDIOC_S_ !! 2085 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f);
573 } 2086 }
574 2087
575 static int em28xx_hint_board(struct em28xx *de 2088 static int em28xx_hint_board(struct em28xx *dev)
576 { 2089 {
577 int i; 2090 int i;
578 2091
579 /* HINT method: EEPROM 2092 /* HINT method: EEPROM
580 * 2093 *
581 * This method works only for boards w 2094 * This method works only for boards with eeprom.
582 * Uses a hash of all eeprom bytes. Th 2095 * Uses a hash of all eeprom bytes. The hash should be
583 * unique for a vendor/tuner pair. 2096 * unique for a vendor/tuner pair.
584 * There are a high chance that tuners 2097 * There are a high chance that tuners for different
585 * video standards produce different h 2098 * video standards produce different hashes.
586 */ 2099 */
587 for (i = 0; i < ARRAY_SIZE(em28xx_eepr 2100 for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
588 if (dev->hash == em28xx_eeprom 2101 if (dev->hash == em28xx_eeprom_hash[i].hash) {
589 dev->model = em28xx_ee 2102 dev->model = em28xx_eeprom_hash[i].model;
590 dev->tuner_type = em28 2103 dev->tuner_type = em28xx_eeprom_hash[i].tuner;
591 2104
592 em28xx_errdev("Your bo 2105 em28xx_errdev("Your board has no unique USB ID.\n");
593 em28xx_errdev("A hint 2106 em28xx_errdev("A hint were successfully done, "
594 "based o 2107 "based on eeprom hash.\n");
595 em28xx_errdev("This me 2108 em28xx_errdev("This method is not 100%% failproof.\n");
596 em28xx_errdev("If the 2109 em28xx_errdev("If the board were missdetected, "
597 "please 2110 "please email this log to:\n");
598 em28xx_errdev("\tV4L M 2111 em28xx_errdev("\tV4L Mailing List "
599 " <video !! 2112 " <linux-media@vger.kernel.org>\n");
600 em28xx_errdev("Board d 2113 em28xx_errdev("Board detected as %s\n",
601 em28xx_b 2114 em28xx_boards[dev->model].name);
602 2115
603 return 0; 2116 return 0;
604 } 2117 }
605 } 2118 }
606 2119
607 /* HINT method: I2C attached devices 2120 /* HINT method: I2C attached devices
608 * 2121 *
609 * This method works for all boards. 2122 * This method works for all boards.
610 * Uses a hash of i2c scanned devices. 2123 * Uses a hash of i2c scanned devices.
611 * Devices with the same i2c attached 2124 * Devices with the same i2c attached chips will
612 * be considered equal. 2125 * be considered equal.
613 * This method is less precise than th 2126 * This method is less precise than the eeprom one.
614 */ 2127 */
615 2128
616 /* user did not request i2c scanning = 2129 /* user did not request i2c scanning => do it now */
617 if (!dev->i2c_hash) 2130 if (!dev->i2c_hash)
618 em28xx_do_i2c_scan(dev); 2131 em28xx_do_i2c_scan(dev);
619 2132
620 for (i = 0; i < ARRAY_SIZE(em28xx_i2c_ 2133 for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
621 if (dev->i2c_hash == em28xx_i2 2134 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
622 dev->model = em28xx_i2 2135 dev->model = em28xx_i2c_hash[i].model;
623 dev->tuner_type = em28 2136 dev->tuner_type = em28xx_i2c_hash[i].tuner;
624 em28xx_errdev("Your bo 2137 em28xx_errdev("Your board has no unique USB ID.\n");
625 em28xx_errdev("A hint 2138 em28xx_errdev("A hint were successfully done, "
626 "based o 2139 "based on i2c devicelist hash.\n");
627 em28xx_errdev("This me 2140 em28xx_errdev("This method is not 100%% failproof.\n");
628 em28xx_errdev("If the 2141 em28xx_errdev("If the board were missdetected, "
629 "please 2142 "please email this log to:\n");
630 em28xx_errdev("\tV4L M 2143 em28xx_errdev("\tV4L Mailing List "
631 " <video !! 2144 " <linux-media@vger.kernel.org>\n");
632 em28xx_errdev("Board d 2145 em28xx_errdev("Board detected as %s\n",
633 em28xx_b 2146 em28xx_boards[dev->model].name);
634 2147
635 return 0; 2148 return 0;
636 } 2149 }
637 } 2150 }
638 2151
639 em28xx_errdev("Your board has no uniqu 2152 em28xx_errdev("Your board has no unique USB ID and thus need a "
640 "hint to be detected.\n" 2153 "hint to be detected.\n");
641 em28xx_errdev("You may try to use card 2154 em28xx_errdev("You may try to use card=<n> insmod option to "
642 "workaround that.\n"); 2155 "workaround that.\n");
643 em28xx_errdev("Please send an email wi 2156 em28xx_errdev("Please send an email with this log to:\n");
644 em28xx_errdev("\tV4L Mailing List <vid !! 2157 em28xx_errdev("\tV4L Mailing List <linux-media@vger.kernel.org>\n");
645 em28xx_errdev("Board eeprom hash is 0x 2158 em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
646 em28xx_errdev("Board i2c devicelist ha 2159 em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
647 2160
648 em28xx_errdev("Here is a list of valid 2161 em28xx_errdev("Here is a list of valid choices for the card=<n>"
649 " insmod option:\n"); 2162 " insmod option:\n");
650 for (i = 0; i < em28xx_bcount; i++) { 2163 for (i = 0; i < em28xx_bcount; i++) {
651 em28xx_errdev(" card=%d -> 2164 em28xx_errdev(" card=%d -> %s\n",
652 i, em28xx_boar 2165 i, em28xx_boards[i].name);
653 } 2166 }
654 return -1; 2167 return -1;
655 } 2168 }
656 2169
657 <<
658 static void em28xx_set_model(struct em28xx *de <<
659 { <<
660 dev->is_em2800 = em28xx_boards[dev->mo <<
661 dev->has_msp34xx = em28xx_boards[dev-> <<
662 dev->tda9887_conf = em28xx_boards[dev- <<
663 dev->decoder = em28xx_boards[dev->mode <<
664 dev->video_inputs = em28xx_boards[dev- <<
665 dev->analog_gpio = em28xx_boards[dev-> <<
666 dev->has_12mhz_i2s = em28xx_boards[dev <<
667 dev->max_range_640_480 = em28xx_boards <<
668 } <<
669 <<
670 /* ------------------------------------------- 2170 /* ----------------------------------------------------------------------- */
671 void em28xx_set_ir(struct em28xx *dev, struct !! 2171 void em28xx_register_i2c_ir(struct em28xx *dev)
672 { 2172 {
673 if (disable_ir) { !! 2173 const unsigned short addr_list[] = {
674 ir->get_key = NULL; !! 2174 0x30, 0x47, I2C_CLIENT_END
675 return ; !! 2175 };
676 } !! 2176
>> 2177 if (disable_ir)
>> 2178 return;
>> 2179
>> 2180 memset(&dev->info, 0, sizeof(&dev->info));
>> 2181 memset(&dev->init_data, 0, sizeof(dev->init_data));
>> 2182 strlcpy(dev->info.type, "ir_video", I2C_NAME_SIZE);
677 2183
678 /* detect & configure */ 2184 /* detect & configure */
679 switch (dev->model) { 2185 switch (dev->model) {
680 case (EM2800_BOARD_UNKNOWN): 2186 case (EM2800_BOARD_UNKNOWN):
681 break; 2187 break;
682 case (EM2820_BOARD_UNKNOWN): 2188 case (EM2820_BOARD_UNKNOWN):
683 break; 2189 break;
684 case (EM2800_BOARD_TERRATEC_CINERGY_20 2190 case (EM2800_BOARD_TERRATEC_CINERGY_200):
685 case (EM2820_BOARD_TERRATEC_CINERGY_25 2191 case (EM2820_BOARD_TERRATEC_CINERGY_250):
686 ir->ir_codes = ir_codes_em_ter !! 2192 dev->init_data.ir_codes = ir_codes_em_terratec;
687 ir->get_key = em28xx_get_key_t !! 2193 dev->init_data.get_key = em28xx_get_key_terratec;
688 snprintf(ir->c.name, sizeof(ir !! 2194 dev->init_data.name = "i2c IR (EM28XX Terratec)";
689 "i2c IR (EM28XX Terra <<
690 break; 2195 break;
691 case (EM2820_BOARD_PINNACLE_USB_2): 2196 case (EM2820_BOARD_PINNACLE_USB_2):
692 ir->ir_codes = ir_codes_pinnac !! 2197 dev->init_data.ir_codes = ir_codes_pinnacle_grey;
693 ir->get_key = em28xx_get_key_p !! 2198 dev->init_data.get_key = em28xx_get_key_pinnacle_usb_grey;
694 snprintf(ir->c.name, sizeof(ir !! 2199 dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)";
695 "i2c IR (EM28XX Pinna <<
696 break; 2200 break;
697 case (EM2820_BOARD_HAUPPAUGE_WINTV_USB 2201 case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
698 ir->ir_codes = ir_codes_hauppa !! 2202 dev->init_data.ir_codes = ir_codes_hauppauge_new;
699 ir->get_key = em28xx_get_key_e !! 2203 dev->init_data.get_key = em28xx_get_key_em_haup;
700 snprintf(ir->c.name, sizeof(ir !! 2204 dev->init_data.name = "i2c IR (EM2840 Hauppauge)";
701 "i2c IR (EM2840 Haupp <<
702 break; 2205 break;
703 case (EM2820_BOARD_MSI_VOX_USB_2): 2206 case (EM2820_BOARD_MSI_VOX_USB_2):
704 break; 2207 break;
705 case (EM2800_BOARD_LEADTEK_WINFAST_USB 2208 case (EM2800_BOARD_LEADTEK_WINFAST_USBII):
706 break; 2209 break;
707 case (EM2800_BOARD_KWORLD_USB2800): 2210 case (EM2800_BOARD_KWORLD_USB2800):
708 break; 2211 break;
>> 2212 case (EM2800_BOARD_GRABBEEX_USB2800):
>> 2213 break;
709 } 2214 }
>> 2215
>> 2216 if (dev->init_data.name)
>> 2217 dev->info.platform_data = &dev->init_data;
>> 2218 i2c_new_probed_device(&dev->i2c_adap, &dev->info, addr_list);
710 } 2219 }
711 2220
712 void em28xx_card_setup(struct em28xx *dev) 2221 void em28xx_card_setup(struct em28xx *dev)
713 { 2222 {
714 em28xx_set_model(dev); !! 2223 /*
>> 2224 * If the device can be a webcam, seek for a sensor.
>> 2225 * If sensor is not found, then it isn't a webcam.
>> 2226 */
>> 2227 if (dev->board.is_webcam) {
>> 2228 if (em28xx_hint_sensor(dev) < 0)
>> 2229 dev->board.is_webcam = 0;
>> 2230 else
>> 2231 dev->progressive = 1;
>> 2232 } else
>> 2233 em28xx_set_model(dev);
>> 2234
>> 2235 em28xx_info("Identified as %s (card=%d)\n",
>> 2236 dev->board.name, dev->model);
715 2237
716 dev->tuner_type = em28xx_boards[dev->m 2238 dev->tuner_type = em28xx_boards[dev->model].tuner_type;
>> 2239 if (em28xx_boards[dev->model].tuner_addr)
>> 2240 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr;
>> 2241
>> 2242 if (em28xx_boards[dev->model].tda9887_conf)
>> 2243 dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf;
717 2244
718 /* request some modules */ 2245 /* request some modules */
719 switch (dev->model) { 2246 switch (dev->model) {
720 case EM2820_BOARD_HAUPPAUGE_WINTV_USB_ 2247 case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
721 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_ 2248 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
722 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_ !! 2249 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
>> 2250 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
>> 2251 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
723 { 2252 {
724 struct tveeprom tv; 2253 struct tveeprom tv;
725 #ifdef CONFIG_MODULES 2254 #ifdef CONFIG_MODULES
726 request_module("tveeprom"); 2255 request_module("tveeprom");
727 #endif 2256 #endif
728 /* Call first TVeeprom */ 2257 /* Call first TVeeprom */
729 2258
730 dev->i2c_client.addr = 0xa0 >> 2259 dev->i2c_client.addr = 0xa0 >> 1;
731 tveeprom_hauppauge_analog(&dev 2260 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
732 2261
733 dev->tuner_type = tv.tuner_typ 2262 dev->tuner_type = tv.tuner_type;
734 2263
735 if (tv.audio_processor == AUDI !! 2264 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) {
736 dev->i2s_speed = 20480 2265 dev->i2s_speed = 2048000;
737 dev->has_msp34xx = 1; !! 2266 dev->board.has_msp34xx = 1;
738 } 2267 }
739 #ifdef CONFIG_MODULES 2268 #ifdef CONFIG_MODULES
740 if (tv.has_ir) 2269 if (tv.has_ir)
741 request_module("ir-kbd 2270 request_module("ir-kbd-i2c");
742 #endif 2271 #endif
743 break; 2272 break;
744 } 2273 }
>> 2274 case EM2882_BOARD_KWORLD_ATSC_315U:
>> 2275 em28xx_write_reg(dev, 0x0d, 0x42);
>> 2276 msleep(10);
>> 2277 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
>> 2278 msleep(10);
>> 2279 break;
745 case EM2820_BOARD_KWORLD_PVRTV2800RF: 2280 case EM2820_BOARD_KWORLD_PVRTV2800RF:
746 /* GPIO enables sound on KWORL 2281 /* GPIO enables sound on KWORLD PVR TV 2800RF */
747 em28xx_write_regs_req(dev, 0x0 !! 2282 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9);
748 break; 2283 break;
749 case EM2820_BOARD_UNKNOWN: 2284 case EM2820_BOARD_UNKNOWN:
750 case EM2800_BOARD_UNKNOWN: 2285 case EM2800_BOARD_UNKNOWN:
>> 2286 /*
>> 2287 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
>> 2288 *
>> 2289 * This occurs because they share identical USB vendor and
>> 2290 * product IDs.
>> 2291 *
>> 2292 * What we do here is look up the EEPROM hash of the K-WORLD
>> 2293 * and if it is found then we decide that we do not have
>> 2294 * a DIGIVOX and reset the device to the K-WORLD instead.
>> 2295 *
>> 2296 * This solution is only valid if they do not share eeprom
>> 2297 * hash identities which has not been determined as yet.
>> 2298 */
>> 2299 case EM2880_BOARD_MSI_DIGIVOX_AD:
751 if (!em28xx_hint_board(dev)) 2300 if (!em28xx_hint_board(dev))
752 em28xx_set_model(dev); 2301 em28xx_set_model(dev);
>> 2302
>> 2303 /* In cases where we had to use a board hint, the call to
>> 2304 em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
>> 2305 so make the call now so the analog GPIOs are set properly
>> 2306 before probing the i2c bus. */
>> 2307 em28xx_gpio_set(dev, dev->board.tuner_gpio);
>> 2308 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
>> 2309 break;
>> 2310 }
>> 2311
>> 2312 if (dev->board.has_snapshot_button)
>> 2313 em28xx_register_snapshot_button(dev);
>> 2314
>> 2315 if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
>> 2316 em28xx_errdev("\n\n");
>> 2317 em28xx_errdev("The support for this board weren't "
>> 2318 "valid yet.\n");
>> 2319 em28xx_errdev("Please send a report of having this working\n");
>> 2320 em28xx_errdev("not to V4L mailing list (and/or to other "
>> 2321 "addresses)\n\n");
753 } 2322 }
754 2323
755 /* Allow override tuner type by a modu 2324 /* Allow override tuner type by a module parameter */
756 if (tuner >= 0) 2325 if (tuner >= 0)
757 dev->tuner_type = tuner; 2326 dev->tuner_type = tuner;
758 2327
759 #ifdef CONFIG_MODULES <<
760 /* request some modules */ 2328 /* request some modules */
761 if (dev->has_msp34xx) !! 2329 if (dev->board.has_msp34xx)
762 request_module("msp3400"); !! 2330 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
763 if (dev->decoder == EM28XX_SAA7113 || !! 2331 "msp3400", "msp3400", msp3400_addrs);
764 request_module("saa7115"); !! 2332
765 if (dev->decoder == EM28XX_TVP5150) !! 2333 if (dev->board.decoder == EM28XX_SAA711X)
766 request_module("tvp5150"); !! 2334 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
767 if (dev->tuner_type != TUNER_ABSENT) !! 2335 "saa7115", "saa7115_auto", saa711x_addrs);
768 request_module("tuner"); !! 2336
769 #endif !! 2337 if (dev->board.decoder == EM28XX_TVP5150)
>> 2338 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
>> 2339 "tvp5150", "tvp5150", tvp5150_addrs);
>> 2340
>> 2341 if (dev->em28xx_sensor == EM28XX_MT9V011) {
>> 2342 struct v4l2_subdev *sd;
>> 2343
>> 2344 sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
>> 2345 &dev->i2c_adap, "mt9v011", "mt9v011", mt9v011_addrs);
>> 2346 v4l2_subdev_call(sd, core, s_config, 0, &dev->sensor_xtal);
>> 2347 }
>> 2348
>> 2349
>> 2350 if (dev->board.adecoder == EM28XX_TVAUDIO)
>> 2351 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
>> 2352 "tvaudio", "tvaudio", dev->board.tvaudio_addr);
>> 2353
>> 2354 if (dev->board.tuner_type != TUNER_ABSENT) {
>> 2355 int has_demod = (dev->tda9887_conf & TDA9887_PRESENT);
>> 2356
>> 2357 if (dev->board.radio.type)
>> 2358 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
>> 2359 "tuner", "tuner", dev->board.radio_addr);
>> 2360
>> 2361 if (has_demod)
>> 2362 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
>> 2363 &dev->i2c_adap, "tuner", "tuner",
>> 2364 v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
>> 2365 if (dev->tuner_addr == 0) {
>> 2366 enum v4l2_i2c_tuner_type type =
>> 2367 has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
>> 2368 struct v4l2_subdev *sd;
>> 2369
>> 2370 sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
>> 2371 &dev->i2c_adap, "tuner", "tuner",
>> 2372 v4l2_i2c_tuner_addrs(type));
>> 2373
>> 2374 if (sd)
>> 2375 dev->tuner_addr = v4l2_i2c_subdev_addr(sd);
>> 2376 } else {
>> 2377 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
>> 2378 "tuner", "tuner", dev->tuner_addr);
>> 2379 }
>> 2380 }
>> 2381
>> 2382 em28xx_tuner_setup(dev);
>> 2383
>> 2384 if(!disable_ir)
>> 2385 em28xx_ir_init(dev);
>> 2386 }
>> 2387
>> 2388
>> 2389 #if defined(CONFIG_MODULES) && defined(MODULE)
>> 2390 static void request_module_async(struct work_struct *work)
>> 2391 {
>> 2392 struct em28xx *dev = container_of(work,
>> 2393 struct em28xx, request_module_wk);
>> 2394
>> 2395 if (dev->has_audio_class)
>> 2396 request_module("snd-usb-audio");
>> 2397 else if (dev->has_alsa_audio)
>> 2398 request_module("em28xx-alsa");
>> 2399
>> 2400 if (dev->board.has_dvb)
>> 2401 request_module("em28xx-dvb");
>> 2402 }
>> 2403
>> 2404 static void request_modules(struct em28xx *dev)
>> 2405 {
>> 2406 INIT_WORK(&dev->request_module_wk, request_module_async);
>> 2407 schedule_work(&dev->request_module_wk);
>> 2408 }
>> 2409 #else
>> 2410 #define request_modules(dev)
>> 2411 #endif /* CONFIG_MODULES */
>> 2412
>> 2413 /*
>> 2414 * em28xx_realease_resources()
>> 2415 * unregisters the v4l2,i2c and usb devices
>> 2416 * called when the device gets disconected or at module unload
>> 2417 */
>> 2418 void em28xx_release_resources(struct em28xx *dev)
>> 2419 {
>> 2420 if (dev->sbutton_input_dev)
>> 2421 em28xx_deregister_snapshot_button(dev);
>> 2422
>> 2423 if (dev->ir)
>> 2424 em28xx_ir_fini(dev);
>> 2425
>> 2426 /*FIXME: I2C IR should be disconnected */
>> 2427
>> 2428 em28xx_release_analog_resources(dev);
>> 2429
>> 2430 em28xx_remove_from_devlist(dev);
>> 2431
>> 2432 em28xx_i2c_unregister(dev);
>> 2433
>> 2434 v4l2_device_unregister(&dev->v4l2_dev);
>> 2435
>> 2436 usb_put_dev(dev->udev);
>> 2437
>> 2438 /* Mark device as unused */
>> 2439 em28xx_devused &= ~(1 << dev->devno);
>> 2440 };
>> 2441
>> 2442 /*
>> 2443 * em28xx_init_dev()
>> 2444 * allocates and inits the device structs, registers i2c bus and v4l device
>> 2445 */
>> 2446 static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
>> 2447 struct usb_interface *interface,
>> 2448 int minor)
>> 2449 {
>> 2450 struct em28xx *dev = *devhandle;
>> 2451 int retval;
>> 2452 int errCode;
>> 2453
>> 2454 dev->udev = udev;
>> 2455 mutex_init(&dev->ctrl_urb_lock);
>> 2456 spin_lock_init(&dev->slock);
>> 2457 init_waitqueue_head(&dev->open);
>> 2458 init_waitqueue_head(&dev->wait_frame);
>> 2459 init_waitqueue_head(&dev->wait_stream);
>> 2460
>> 2461 dev->em28xx_write_regs = em28xx_write_regs;
>> 2462 dev->em28xx_read_reg = em28xx_read_reg;
>> 2463 dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
>> 2464 dev->em28xx_write_regs_req = em28xx_write_regs_req;
>> 2465 dev->em28xx_read_reg_req = em28xx_read_reg_req;
>> 2466 dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
>> 2467
>> 2468 em28xx_set_model(dev);
>> 2469
>> 2470 /* Set the default GPO/GPIO for legacy devices */
>> 2471 dev->reg_gpo_num = EM2880_R04_GPO;
>> 2472 dev->reg_gpio_num = EM28XX_R08_GPIO;
>> 2473
>> 2474 dev->wait_after_write = 5;
>> 2475
>> 2476 /* Based on the Chip ID, set the device configuration */
>> 2477 retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
>> 2478 if (retval > 0) {
>> 2479 dev->chip_id = retval;
>> 2480
>> 2481 switch (dev->chip_id) {
>> 2482 case CHIP_ID_EM2710:
>> 2483 em28xx_info("chip ID is em2710\n");
>> 2484 break;
>> 2485 case CHIP_ID_EM2750:
>> 2486 em28xx_info("chip ID is em2750\n");
>> 2487 break;
>> 2488 case CHIP_ID_EM2820:
>> 2489 em28xx_info("chip ID is em2820 (or em2710)\n");
>> 2490 break;
>> 2491 case CHIP_ID_EM2840:
>> 2492 em28xx_info("chip ID is em2840\n");
>> 2493 break;
>> 2494 case CHIP_ID_EM2860:
>> 2495 em28xx_info("chip ID is em2860\n");
>> 2496 break;
>> 2497 case CHIP_ID_EM2870:
>> 2498 em28xx_info("chip ID is em2870\n");
>> 2499 dev->wait_after_write = 0;
>> 2500 break;
>> 2501 case CHIP_ID_EM2874:
>> 2502 em28xx_info("chip ID is em2874\n");
>> 2503 dev->reg_gpio_num = EM2874_R80_GPIO;
>> 2504 dev->wait_after_write = 0;
>> 2505 break;
>> 2506 case CHIP_ID_EM2883:
>> 2507 em28xx_info("chip ID is em2882/em2883\n");
>> 2508 dev->wait_after_write = 0;
>> 2509 break;
>> 2510 default:
>> 2511 em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
>> 2512 }
>> 2513 }
>> 2514
>> 2515 /* Prepopulate cached GPO register content */
>> 2516 retval = em28xx_read_reg(dev, dev->reg_gpo_num);
>> 2517 if (retval >= 0)
>> 2518 dev->reg_gpo = retval;
>> 2519
>> 2520 em28xx_pre_card_setup(dev);
>> 2521
>> 2522 if (!dev->board.is_em2800) {
>> 2523 /* Sets I2C speed to 100 KHz */
>> 2524 retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
>> 2525 if (retval < 0) {
>> 2526 em28xx_errdev("%s: em28xx_write_regs_req failed!"
>> 2527 " retval [%d]\n",
>> 2528 __func__, retval);
>> 2529 return retval;
>> 2530 }
>> 2531 }
>> 2532
>> 2533 retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
>> 2534 if (retval < 0) {
>> 2535 em28xx_errdev("Call to v4l2_device_register() failed!\n");
>> 2536 return retval;
>> 2537 }
>> 2538
>> 2539 /* register i2c bus */
>> 2540 errCode = em28xx_i2c_register(dev);
>> 2541 if (errCode < 0) {
>> 2542 v4l2_device_unregister(&dev->v4l2_dev);
>> 2543 em28xx_errdev("%s: em28xx_i2c_register - errCode [%d]!\n",
>> 2544 __func__, errCode);
>> 2545 return errCode;
>> 2546 }
>> 2547
>> 2548 /*
>> 2549 * Default format, used for tvp5150 or saa711x output formats
>> 2550 */
>> 2551 dev->vinmode = 0x10;
>> 2552 dev->vinctl = 0x11;
>> 2553
>> 2554 /* Do board specific init and eeprom reading */
>> 2555 em28xx_card_setup(dev);
>> 2556
>> 2557 /* Configure audio */
>> 2558 errCode = em28xx_audio_setup(dev);
>> 2559 if (errCode < 0) {
>> 2560 v4l2_device_unregister(&dev->v4l2_dev);
>> 2561 em28xx_errdev("%s: Error while setting audio - errCode [%d]!\n",
>> 2562 __func__, errCode);
>> 2563 }
>> 2564
>> 2565 /* wake i2c devices */
>> 2566 em28xx_wake_i2c(dev);
>> 2567
>> 2568 /* init video dma queues */
>> 2569 INIT_LIST_HEAD(&dev->vidq.active);
>> 2570 INIT_LIST_HEAD(&dev->vidq.queued);
>> 2571
>> 2572
>> 2573 if (dev->board.has_msp34xx) {
>> 2574 /* Send a reset to other chips via gpio */
>> 2575 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
>> 2576 if (errCode < 0) {
>> 2577 em28xx_errdev("%s: em28xx_write_regs_req - "
>> 2578 "msp34xx(1) failed! errCode [%d]\n",
>> 2579 __func__, errCode);
>> 2580 return errCode;
>> 2581 }
>> 2582 msleep(3);
>> 2583
>> 2584 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
>> 2585 if (errCode < 0) {
>> 2586 em28xx_errdev("%s: em28xx_write_regs_req - "
>> 2587 "msp34xx(2) failed! errCode [%d]\n",
>> 2588 __func__, errCode);
>> 2589 return errCode;
>> 2590 }
>> 2591 msleep(3);
>> 2592 }
>> 2593
>> 2594 em28xx_add_into_devlist(dev);
>> 2595
>> 2596 retval = em28xx_register_analog_devices(dev);
>> 2597 if (retval < 0) {
>> 2598 em28xx_release_resources(dev);
>> 2599 goto fail_reg_devices;
>> 2600 }
>> 2601
>> 2602 em28xx_init_extension(dev);
>> 2603
>> 2604 /* Save some power by putting tuner to sleep */
>> 2605 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_standby);
>> 2606
>> 2607 return 0;
>> 2608
>> 2609 fail_reg_devices:
>> 2610 return retval;
>> 2611 }
>> 2612
>> 2613 /*
>> 2614 * em28xx_usb_probe()
>> 2615 * checks for supported devices
>> 2616 */
>> 2617 static int em28xx_usb_probe(struct usb_interface *interface,
>> 2618 const struct usb_device_id *id)
>> 2619 {
>> 2620 const struct usb_endpoint_descriptor *endpoint;
>> 2621 struct usb_device *udev;
>> 2622 struct usb_interface *uif;
>> 2623 struct em28xx *dev = NULL;
>> 2624 int retval;
>> 2625 int i, nr, ifnum, isoc_pipe;
>> 2626 char *speed;
>> 2627 char descr[255] = "";
>> 2628
>> 2629 udev = usb_get_dev(interface_to_usbdev(interface));
>> 2630 ifnum = interface->altsetting[0].desc.bInterfaceNumber;
>> 2631
>> 2632 /* Check to see next free device and mark as used */
>> 2633 nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS);
>> 2634 em28xx_devused |= 1<<nr;
>> 2635
>> 2636 /* Don't register audio interfaces */
>> 2637 if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
>> 2638 em28xx_err(DRIVER_NAME " audio device (%04x:%04x): "
>> 2639 "interface %i, class %i\n",
>> 2640 le16_to_cpu(udev->descriptor.idVendor),
>> 2641 le16_to_cpu(udev->descriptor.idProduct),
>> 2642 ifnum,
>> 2643 interface->altsetting[0].desc.bInterfaceClass);
>> 2644
>> 2645 em28xx_devused &= ~(1<<nr);
>> 2646 retval = -ENODEV;
>> 2647 goto err;
>> 2648 }
>> 2649
>> 2650 endpoint = &interface->cur_altsetting->endpoint[0].desc;
>> 2651
>> 2652 /* check if the device has the iso in endpoint at the correct place */
>> 2653 if (usb_endpoint_xfer_isoc(endpoint)
>> 2654 &&
>> 2655 (interface->altsetting[1].endpoint[0].desc.wMaxPacketSize == 940)) {
>> 2656 /* It's a newer em2874/em2875 device */
>> 2657 isoc_pipe = 0;
>> 2658 } else {
>> 2659 int check_interface = 1;
>> 2660 isoc_pipe = 1;
>> 2661 endpoint = &interface->cur_altsetting->endpoint[1].desc;
>> 2662 if (!usb_endpoint_xfer_isoc(endpoint))
>> 2663 check_interface = 0;
>> 2664
>> 2665 if (usb_endpoint_dir_out(endpoint))
>> 2666 check_interface = 0;
>> 2667
>> 2668 if (!check_interface) {
>> 2669 em28xx_err(DRIVER_NAME " video device (%04x:%04x): "
>> 2670 "interface %i, class %i found.\n",
>> 2671 le16_to_cpu(udev->descriptor.idVendor),
>> 2672 le16_to_cpu(udev->descriptor.idProduct),
>> 2673 ifnum,
>> 2674 interface->altsetting[0].desc.bInterfaceClass);
>> 2675
>> 2676 em28xx_err(DRIVER_NAME " This is an anciliary "
>> 2677 "interface not used by the driver\n");
>> 2678
>> 2679 em28xx_devused &= ~(1<<nr);
>> 2680 retval = -ENODEV;
>> 2681 goto err;
>> 2682 }
>> 2683 }
>> 2684
>> 2685 switch (udev->speed) {
>> 2686 case USB_SPEED_LOW:
>> 2687 speed = "1.5";
>> 2688 break;
>> 2689 case USB_SPEED_UNKNOWN:
>> 2690 case USB_SPEED_FULL:
>> 2691 speed = "12";
>> 2692 break;
>> 2693 case USB_SPEED_HIGH:
>> 2694 speed = "480";
>> 2695 break;
>> 2696 default:
>> 2697 speed = "unknown";
>> 2698 }
>> 2699
>> 2700 if (udev->manufacturer)
>> 2701 strlcpy(descr, udev->manufacturer, sizeof(descr));
>> 2702
>> 2703 if (udev->product) {
>> 2704 if (*descr)
>> 2705 strlcat(descr, " ", sizeof(descr));
>> 2706 strlcat(descr, udev->product, sizeof(descr));
>> 2707 }
>> 2708 if (*descr)
>> 2709 strlcat(descr, " ", sizeof(descr));
>> 2710
>> 2711 printk(DRIVER_NAME ": New device %s@ %s Mbps "
>> 2712 "(%04x:%04x, interface %d, class %d)\n",
>> 2713 descr,
>> 2714 speed,
>> 2715 le16_to_cpu(udev->descriptor.idVendor),
>> 2716 le16_to_cpu(udev->descriptor.idProduct),
>> 2717 ifnum,
>> 2718 interface->altsetting->desc.bInterfaceNumber);
>> 2719
>> 2720 /*
>> 2721 * Make sure we have 480 Mbps of bandwidth, otherwise things like
>> 2722 * video stream wouldn't likely work, since 12 Mbps is generally
>> 2723 * not enough even for most Digital TV streams.
>> 2724 */
>> 2725 if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
>> 2726 printk(DRIVER_NAME ": Device initialization failed.\n");
>> 2727 printk(DRIVER_NAME ": Device must be connected to a high-speed"
>> 2728 " USB 2.0 port.\n");
>> 2729 em28xx_devused &= ~(1<<nr);
>> 2730 retval = -ENODEV;
>> 2731 goto err;
>> 2732 }
>> 2733
>> 2734 if (nr >= EM28XX_MAXBOARDS) {
>> 2735 printk(DRIVER_NAME ": Supports only %i em28xx boards.\n",
>> 2736 EM28XX_MAXBOARDS);
>> 2737 em28xx_devused &= ~(1<<nr);
>> 2738 retval = -ENOMEM;
>> 2739 goto err;
>> 2740 }
>> 2741
>> 2742 /* allocate memory for our device state and initialize it */
>> 2743 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
>> 2744 if (dev == NULL) {
>> 2745 em28xx_err(DRIVER_NAME ": out of memory!\n");
>> 2746 em28xx_devused &= ~(1<<nr);
>> 2747 retval = -ENOMEM;
>> 2748 goto err;
>> 2749 }
>> 2750
>> 2751 snprintf(dev->name, 29, "em28xx #%d", nr);
>> 2752 dev->devno = nr;
>> 2753 dev->model = id->driver_info;
>> 2754 dev->alt = -1;
>> 2755
>> 2756 /* Checks if audio is provided by some interface */
>> 2757 for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
>> 2758 uif = udev->config->interface[i];
>> 2759 if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
>> 2760 dev->has_audio_class = 1;
>> 2761 break;
>> 2762 }
>> 2763 }
>> 2764
>> 2765 /* compute alternate max packet sizes */
>> 2766 uif = udev->actconfig->interface[0];
>> 2767
>> 2768 dev->num_alt = uif->num_altsetting;
>> 2769 dev->alt_max_pkt_size = kmalloc(32 * dev->num_alt, GFP_KERNEL);
>> 2770
>> 2771 if (dev->alt_max_pkt_size == NULL) {
>> 2772 em28xx_errdev("out of memory!\n");
>> 2773 em28xx_devused &= ~(1<<nr);
>> 2774 kfree(dev);
>> 2775 retval = -ENOMEM;
>> 2776 goto err;
>> 2777 }
>> 2778
>> 2779 for (i = 0; i < dev->num_alt ; i++) {
>> 2780 u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
>> 2781 dev->alt_max_pkt_size[i] =
>> 2782 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
>> 2783 }
>> 2784
>> 2785 if ((card[nr] >= 0) && (card[nr] < em28xx_bcount))
>> 2786 dev->model = card[nr];
>> 2787
>> 2788 /* allocate device struct */
>> 2789 mutex_init(&dev->lock);
>> 2790 mutex_lock(&dev->lock);
>> 2791 retval = em28xx_init_dev(&dev, udev, interface, nr);
>> 2792 if (retval) {
>> 2793 em28xx_devused &= ~(1<<dev->devno);
>> 2794 mutex_unlock(&dev->lock);
>> 2795 kfree(dev);
>> 2796 goto err;
>> 2797 }
>> 2798
>> 2799 /* save our data pointer in this interface device */
>> 2800 usb_set_intfdata(interface, dev);
>> 2801
>> 2802 request_modules(dev);
>> 2803
>> 2804 /* Should be the last thing to do, to avoid newer udev's to
>> 2805 open the device before fully initializing it
>> 2806 */
>> 2807 mutex_unlock(&dev->lock);
>> 2808
>> 2809 return 0;
>> 2810
>> 2811 err:
>> 2812 return retval;
>> 2813 }
>> 2814
>> 2815 /*
>> 2816 * em28xx_usb_disconnect()
>> 2817 * called when the device gets diconencted
>> 2818 * video device will be unregistered on v4l2_close in case it is still open
>> 2819 */
>> 2820 static void em28xx_usb_disconnect(struct usb_interface *interface)
>> 2821 {
>> 2822 struct em28xx *dev;
>> 2823
>> 2824 dev = usb_get_intfdata(interface);
>> 2825 usb_set_intfdata(interface, NULL);
>> 2826
>> 2827 if (!dev)
>> 2828 return;
>> 2829
>> 2830 em28xx_info("disconnecting %s\n", dev->vdev->name);
>> 2831
>> 2832 /* wait until all current v4l2 io is finished then deallocate
>> 2833 resources */
>> 2834 mutex_lock(&dev->lock);
>> 2835
>> 2836 wake_up_interruptible_all(&dev->open);
>> 2837
>> 2838 v4l2_device_disconnect(&dev->v4l2_dev);
>> 2839
>> 2840 if (dev->users) {
>> 2841 em28xx_warn
>> 2842 ("device /dev/video%d is open! Deregistration and memory "
>> 2843 "deallocation are deferred on close.\n",
>> 2844 dev->vdev->num);
>> 2845
>> 2846 dev->state |= DEV_MISCONFIGURED;
>> 2847 em28xx_uninit_isoc(dev);
>> 2848 dev->state |= DEV_DISCONNECTED;
>> 2849 wake_up_interruptible(&dev->wait_frame);
>> 2850 wake_up_interruptible(&dev->wait_stream);
>> 2851 } else {
>> 2852 dev->state |= DEV_DISCONNECTED;
>> 2853 em28xx_release_resources(dev);
>> 2854 }
>> 2855
>> 2856 em28xx_close_extension(dev);
>> 2857
>> 2858 mutex_unlock(&dev->lock);
>> 2859
>> 2860 if (!dev->users) {
>> 2861 kfree(dev->alt_max_pkt_size);
>> 2862 kfree(dev);
>> 2863 }
>> 2864 }
>> 2865
>> 2866 static struct usb_driver em28xx_usb_driver = {
>> 2867 .name = "em28xx",
>> 2868 .probe = em28xx_usb_probe,
>> 2869 .disconnect = em28xx_usb_disconnect,
>> 2870 .id_table = em28xx_id_table,
>> 2871 };
770 2872
771 em28xx_config_tuner(dev); !! 2873 static int __init em28xx_module_init(void)
>> 2874 {
>> 2875 int result;
>> 2876
>> 2877 /* register this driver with the USB subsystem */
>> 2878 result = usb_register(&em28xx_usb_driver);
>> 2879 if (result)
>> 2880 em28xx_err(DRIVER_NAME
>> 2881 " usb_register failed. Error number %d.\n", result);
>> 2882
>> 2883 printk(KERN_INFO DRIVER_NAME " driver loaded\n");
>> 2884
>> 2885 return result;
772 } 2886 }
>> 2887
>> 2888 static void __exit em28xx_module_exit(void)
>> 2889 {
>> 2890 /* deregister this driver with the USB subsystem */
>> 2891 usb_deregister(&em28xx_usb_driver);
>> 2892 }
>> 2893
>> 2894 module_init(em28xx_module_init);
>> 2895 module_exit(em28xx_module_exit);
773 2896
| This page was automatically generated by the LXR engine. |