05264c655b5e20e9ab0d1cd051226bef3418af3f
[deliverable/linux.git] / drivers / media / video / em28xx / em28xx-cards.c
1 /*
2 em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB video capture devices
3
4 Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
5 Markus Rechberger <mrechberger@gmail.com>
6 Mauro Carvalho Chehab <mchehab@infradead.org>
7 Sascha Sommer <saschasommer@freenet.de>
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24 #include <linux/init.h>
25 #include <linux/module.h>
26 #include <linux/delay.h>
27 #include <linux/i2c.h>
28 #include <linux/usb.h>
29 #include <media/tuner.h>
30 #include <media/msp3400.h>
31 #include <media/saa7115.h>
32 #include <media/tvp5150.h>
33 #include <media/tveeprom.h>
34 #include <media/audiochip.h>
35 #include <media/v4l2-common.h>
36
37 #include "em28xx.h"
38 #include "tuner-xc2028.h"
39
40 struct em28xx_board em28xx_boards[] = {
41 [EM2800_BOARD_UNKNOWN] = {
42 .name = "Unknown EM2800 video grabber",
43 .is_em2800 = 1,
44 .vchannels = 2,
45 .norm = VIDEO_MODE_PAL,
46 .tda9887_conf = TDA9887_PRESENT,
47 .has_tuner = 1,
48 .decoder = EM28XX_SAA7113,
49 .input = {{
50 .type = EM28XX_VMUX_COMPOSITE1,
51 .vmux = SAA7115_COMPOSITE0,
52 .amux = 1,
53 },{
54 .type = EM28XX_VMUX_SVIDEO,
55 .vmux = SAA7115_SVIDEO3,
56 .amux = 1,
57 }},
58 },
59 [EM2820_BOARD_UNKNOWN] = {
60 .name = "Unknown EM2750/28xx video grabber",
61 .is_em2800 = 0,
62 },
63 [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
64 .name = "Kworld PVR TV 2800 RF",
65 .is_em2800 = 0,
66 .vchannels = 2,
67 .norm = VIDEO_MODE_PAL,
68 .tda9887_conf = TDA9887_PRESENT,
69 .has_tuner = 1,
70 .decoder = EM28XX_SAA7113,
71 .input = {{
72 .type = EM28XX_VMUX_COMPOSITE1,
73 .vmux = SAA7115_COMPOSITE0,
74 .amux = 1,
75 },{
76 .type = EM28XX_VMUX_SVIDEO,
77 .vmux = SAA7115_SVIDEO3,
78 .amux = 1,
79 }},
80 },
81 [EM2820_BOARD_TERRATEC_CINERGY_250] = {
82 .name = "Terratec Cinergy 250 USB",
83 .vchannels = 3,
84 .norm = VIDEO_MODE_PAL,
85 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
86 .tda9887_conf = TDA9887_PRESENT,
87 .has_tuner = 1,
88 .decoder = EM28XX_SAA7113,
89 .input = {{
90 .type = EM28XX_VMUX_TELEVISION,
91 .vmux = SAA7115_COMPOSITE2,
92 .amux = 1,
93 },{
94 .type = EM28XX_VMUX_COMPOSITE1,
95 .vmux = SAA7115_COMPOSITE0,
96 .amux = 1,
97 },{
98 .type = EM28XX_VMUX_SVIDEO,
99 .vmux = SAA7115_SVIDEO3,
100 .amux = 1,
101 }},
102 },
103 [EM2820_BOARD_PINNACLE_USB_2] = {
104 .name = "Pinnacle PCTV USB 2",
105 .vchannels = 3,
106 .norm = VIDEO_MODE_PAL,
107 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
108 .tda9887_conf = TDA9887_PRESENT,
109 .has_tuner = 1,
110 .decoder = EM28XX_SAA7113,
111 .input = {{
112 .type = EM28XX_VMUX_TELEVISION,
113 .vmux = SAA7115_COMPOSITE2,
114 .amux = 0,
115 },{
116 .type = EM28XX_VMUX_COMPOSITE1,
117 .vmux = SAA7115_COMPOSITE0,
118 .amux = 1,
119 },{
120 .type = EM28XX_VMUX_SVIDEO,
121 .vmux = SAA7115_SVIDEO3,
122 .amux = 1,
123 }},
124 },
125 [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
126 .name = "Hauppauge WinTV USB 2",
127 .vchannels = 3,
128 .norm = VIDEO_MODE_NTSC,
129 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
130 .tda9887_conf = TDA9887_PRESENT|TDA9887_PORT1_ACTIVE|TDA9887_PORT2_ACTIVE,
131 .has_tuner = 1,
132 .decoder = EM28XX_TVP5150,
133 .has_msp34xx = 1,
134 /*FIXME: S-Video not tested */
135 .input = {{
136 .type = EM28XX_VMUX_TELEVISION,
137 .vmux = TVP5150_COMPOSITE0,
138 .amux = MSP_INPUT_DEFAULT,
139 },{
140 .type = EM28XX_VMUX_SVIDEO,
141 .vmux = TVP5150_SVIDEO,
142 .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
143 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
144 }},
145 },
146 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
147 .name = "Hauppauge WinTV HVR 900/950",
148 .vchannels = 3,
149 .norm = VIDEO_MODE_PAL,
150 .tda9887_conf = TDA9887_PRESENT,
151 .tuner_type = TUNER_XC2028,
152 .has_tuner = 1,
153 .decoder = EM28XX_TVP5150,
154 .input = {{
155 .type = EM28XX_VMUX_TELEVISION,
156 .vmux = TVP5150_COMPOSITE0,
157 .amux = 0,
158 },{
159 .type = EM28XX_VMUX_COMPOSITE1,
160 .vmux = TVP5150_COMPOSITE1,
161 .amux = 1,
162 },{
163 .type = EM28XX_VMUX_SVIDEO,
164 .vmux = TVP5150_SVIDEO,
165 .amux = 1,
166 }},
167 },
168 [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
169 .name = "Terratec Hybrid XS",
170 .vchannels = 3,
171 .norm = VIDEO_MODE_PAL,
172 .tda9887_conf = TDA9887_PRESENT,
173 .has_tuner = 1,
174 .tuner_type = TUNER_XC2028,
175 .decoder = EM28XX_TVP5150,
176 .input = {{
177 .type = EM28XX_VMUX_TELEVISION,
178 .vmux = TVP5150_COMPOSITE0,
179 .amux = 0,
180 },{
181 .type = EM28XX_VMUX_COMPOSITE1,
182 .vmux = TVP5150_COMPOSITE1,
183 .amux = 1,
184 },{
185 .type = EM28XX_VMUX_SVIDEO,
186 .vmux = TVP5150_SVIDEO,
187 .amux = 1,
188 }},
189 },
190 /* maybe there's a reason behind it why Terratec sells the Hybrid XS as Prodigy XS with a
191 * different PID, let's keep it separated for now maybe we'll need it lateron */
192 [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
193 .name = "Terratec Prodigy XS",
194 .vchannels = 3,
195 .norm = VIDEO_MODE_PAL,
196 .tda9887_conf = TDA9887_PRESENT,
197 .has_tuner = 1,
198 .tuner_type = TUNER_XC2028,
199 .decoder = EM28XX_TVP5150,
200 .input = {{
201 .type = EM28XX_VMUX_TELEVISION,
202 .vmux = TVP5150_COMPOSITE0,
203 .amux = 0,
204 },{
205 .type = EM28XX_VMUX_COMPOSITE1,
206 .vmux = TVP5150_COMPOSITE1,
207 .amux = 1,
208 },{
209 .type = EM28XX_VMUX_SVIDEO,
210 .vmux = TVP5150_SVIDEO,
211 .amux = 1,
212 }},
213 },
214 [EM2820_BOARD_MSI_VOX_USB_2] = {
215 .name = "MSI VOX USB 2.0",
216 .vchannels = 3,
217 .norm = VIDEO_MODE_PAL,
218 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
219 .tda9887_conf = TDA9887_PRESENT|TDA9887_PORT1_ACTIVE|TDA9887_PORT2_ACTIVE,
220 .has_tuner = 1,
221 .decoder = EM28XX_SAA7114,
222 .input = {{
223 .type = EM28XX_VMUX_TELEVISION,
224 .vmux = SAA7115_COMPOSITE4,
225 .amux = 0,
226 },{
227 .type = EM28XX_VMUX_COMPOSITE1,
228 .vmux = SAA7115_COMPOSITE0,
229 .amux = 1,
230 },{
231 .type = EM28XX_VMUX_SVIDEO,
232 .vmux = SAA7115_SVIDEO3,
233 .amux = 1,
234 }},
235 },
236 [EM2800_BOARD_TERRATEC_CINERGY_200] = {
237 .name = "Terratec Cinergy 200 USB",
238 .is_em2800 = 1,
239 .vchannels = 3,
240 .norm = VIDEO_MODE_PAL,
241 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
242 .tda9887_conf = TDA9887_PRESENT,
243 .has_tuner = 1,
244 .decoder = EM28XX_SAA7113,
245 .input = {{
246 .type = EM28XX_VMUX_TELEVISION,
247 .vmux = SAA7115_COMPOSITE2,
248 .amux = 0,
249 },{
250 .type = EM28XX_VMUX_COMPOSITE1,
251 .vmux = SAA7115_COMPOSITE0,
252 .amux = 1,
253 },{
254 .type = EM28XX_VMUX_SVIDEO,
255 .vmux = SAA7115_SVIDEO3,
256 .amux = 1,
257 }},
258 },
259 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
260 .name = "Leadtek Winfast USB II",
261 .is_em2800 = 1,
262 .vchannels = 3,
263 .norm = VIDEO_MODE_PAL,
264 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
265 .tda9887_conf = TDA9887_PRESENT,
266 .has_tuner = 1,
267 .decoder = EM28XX_SAA7113,
268 .input = {{
269 .type = EM28XX_VMUX_TELEVISION,
270 .vmux = SAA7115_COMPOSITE2,
271 .amux = 0,
272 },{
273 .type = EM28XX_VMUX_COMPOSITE1,
274 .vmux = SAA7115_COMPOSITE0,
275 .amux = 1,
276 },{
277 .type = EM28XX_VMUX_SVIDEO,
278 .vmux = SAA7115_SVIDEO3,
279 .amux = 1,
280 }},
281 },
282 [EM2800_BOARD_KWORLD_USB2800] = {
283 .name = "Kworld USB2800",
284 .is_em2800 = 1,
285 .vchannels = 3,
286 .norm = VIDEO_MODE_PAL,
287 .tuner_type = TUNER_PHILIPS_ATSC,
288 .tda9887_conf = TDA9887_PRESENT,
289 .has_tuner = 1,
290 .decoder = EM28XX_SAA7113,
291 .input = {{
292 .type = EM28XX_VMUX_TELEVISION,
293 .vmux = SAA7115_COMPOSITE2,
294 .amux = 0,
295 },{
296 .type = EM28XX_VMUX_COMPOSITE1,
297 .vmux = SAA7115_COMPOSITE0,
298 .amux = 1,
299 },{
300 .type = EM28XX_VMUX_SVIDEO,
301 .vmux = SAA7115_SVIDEO3,
302 .amux = 1,
303 }},
304 },
305 [EM2820_BOARD_PINNACLE_DVC_90] = {
306 .name = "Pinnacle Dazzle DVC 90",
307 .vchannels = 3,
308 .norm = VIDEO_MODE_PAL,
309 .has_tuner = 0,
310 .decoder = EM28XX_SAA7113,
311 .input = {{
312 .type = EM28XX_VMUX_COMPOSITE1,
313 .vmux = SAA7115_COMPOSITE0,
314 .amux = 1,
315 },{
316 .type = EM28XX_VMUX_SVIDEO,
317 .vmux = SAA7115_SVIDEO3,
318 .amux = 1,
319 }},
320 },
321 };
322 const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
323
324 /* table of devices that work with this driver */
325 struct usb_device_id em28xx_id_table [] = {
326 { USB_DEVICE(0xeb1a, 0x2750), .driver_info = EM2820_BOARD_UNKNOWN },
327 { USB_DEVICE(0xeb1a, 0x2800), .driver_info = EM2800_BOARD_UNKNOWN },
328 { USB_DEVICE(0xeb1a, 0x2820), .driver_info = EM2820_BOARD_UNKNOWN },
329 { USB_DEVICE(0xeb1a, 0x2821), .driver_info = EM2820_BOARD_UNKNOWN },
330 { USB_DEVICE(0xeb1a, 0x2860), .driver_info = EM2820_BOARD_UNKNOWN },
331 { USB_DEVICE(0xeb1a, 0x2861), .driver_info = EM2820_BOARD_UNKNOWN },
332 { USB_DEVICE(0xeb1a, 0x2870), .driver_info = EM2820_BOARD_UNKNOWN },
333 { USB_DEVICE(0xeb1a, 0x2881), .driver_info = EM2820_BOARD_UNKNOWN },
334 { USB_DEVICE(0xeb1a, 0x2883), .driver_info = EM2820_BOARD_UNKNOWN },
335 { USB_DEVICE(0x0ccd, 0x0036), .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
336 { USB_DEVICE(0x2304, 0x0208), .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
337 { USB_DEVICE(0x2040, 0x4200), .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
338 { USB_DEVICE(0x2304, 0x0207), .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
339 { USB_DEVICE(0x2040, 0x6500), .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
340 { USB_DEVICE(0x2040, 0x6513), .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
341 { USB_DEVICE(0x0ccd, 0x0042), .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS },
342 { USB_DEVICE(0x0ccd, 0x0047), .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
343 { },
344 };
345
346 void em28xx_pre_card_setup(struct em28xx *dev)
347 {
348 /* request some modules */
349 switch(dev->model){
350 case EM2880_BOARD_TERRATEC_PRODIGY_XS:
351 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
352 case EM2880_BOARD_TERRATEC_HYBRID_XS:
353 {
354 em28xx_write_regs_req(dev, 0x00, 0x08, "\x7d", 1); // reset through GPIO?
355 break;
356 }
357 }
358 }
359
360 static void em28xx_config_tuner (struct em28xx *dev)
361 {
362 struct v4l2_priv_tun_config xc2028_cfg;
363 struct xc2028_ctrl ctl;
364
365 memset (&ctl,0,sizeof(ctl));
366
367 ctl.fname = XC2028_DEFAULT_FIRMWARE;
368 ctl.max_len = 64;
369
370 xc2028_cfg.tuner = TUNER_XC2028;
371 xc2028_cfg.priv = &ctl;
372
373 em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg);
374 }
375
376 void em28xx_card_setup(struct em28xx *dev)
377 {
378 /* request some modules */
379 switch(dev->model){
380 case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
381 {
382 struct tveeprom tv;
383 #ifdef CONFIG_MODULES
384 request_module("tveeprom");
385 request_module("ir-kbd-i2c");
386 request_module("msp3400");
387 #endif
388 /* Call first TVeeprom */
389
390 dev->i2c_client.addr = 0xa0 >> 1;
391 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
392
393 dev->tuner_type= tv.tuner_type;
394 if (tv.audio_processor == AUDIO_CHIP_MSP34XX) {
395 dev->i2s_speed=2048000;
396 dev->has_msp34xx=1;
397 } else
398 dev->has_msp34xx=0;
399 break;
400 }
401 case EM2820_BOARD_KWORLD_PVRTV2800RF:
402 {
403 em28xx_write_regs_req(dev,0x00,0x08, "\xf9", 1); // GPIO enables sound on KWORLD PVR TV 2800RF
404 break;
405 }
406
407 }
408 em28xx_config_tuner (dev);
409 }
410
411 MODULE_DEVICE_TABLE (usb, em28xx_id_table);
This page took 0.037691 seconds and 4 git commands to generate.