]>
Commit | Line | Data |
---|---|---|
a6c2ba28 | 1 | /* |
f7abcd38 | 2 | em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB video capture devices |
a6c2ba28 | 3 | |
f7abcd38 MCC |
4 | Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it> |
5 | Markus Rechberger <mrechberger@gmail.com> | |
4ac97914 | 6 | Mauro Carvalho Chehab <mchehab@brturbo.com.br> |
f7abcd38 | 7 | Sascha Sommer <saschasommer@freenet.de> |
a6c2ba28 AM |
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/pci.h> | |
27 | #include <linux/delay.h> | |
28 | #include <linux/i2c.h> | |
29 | #include <linux/usb.h> | |
30 | #include <media/tuner.h> | |
1f6173ed MCC |
31 | #include <media/audiochip.h> |
32 | #include <media/tveeprom.h> | |
9bb13a6d | 33 | #include <media/v4l2-common.h> |
a6c2ba28 | 34 | |
f7abcd38 | 35 | #include "em28xx.h" |
a6c2ba28 | 36 | |
3acf2809 | 37 | struct em28xx_board em28xx_boards[] = { |
596d92d5 MCC |
38 | [EM2800_BOARD_UNKNOWN] = { |
39 | .name = "Unknown EM2800 video grabber", | |
40 | .is_em2800 = 1, | |
41 | .vchannels = 2, | |
42 | .norm = VIDEO_MODE_PAL, | |
43 | .tda9887_conf = TDA9887_PRESENT, | |
44 | .has_tuner = 1, | |
3acf2809 | 45 | .decoder = EM28XX_SAA7113, |
596d92d5 | 46 | .input = {{ |
3acf2809 | 47 | .type = EM28XX_VMUX_COMPOSITE1, |
596d92d5 MCC |
48 | .vmux = 0, |
49 | .amux = 1, | |
50 | },{ | |
3acf2809 | 51 | .type = EM28XX_VMUX_SVIDEO, |
596d92d5 MCC |
52 | .vmux = 9, |
53 | .amux = 1, | |
54 | }}, | |
55 | }, | |
56 | [EM2820_BOARD_UNKNOWN] = { | |
57 | .name = "Unknown EM2820/2840 video grabber", | |
58 | .is_em2800 = 0, | |
59 | .vchannels = 2, | |
60 | .norm = VIDEO_MODE_PAL, | |
61 | .tda9887_conf = TDA9887_PRESENT, | |
62 | .has_tuner = 1, | |
3acf2809 | 63 | .decoder = EM28XX_SAA7113, |
596d92d5 | 64 | .input = {{ |
3acf2809 | 65 | .type = EM28XX_VMUX_COMPOSITE1, |
596d92d5 MCC |
66 | .vmux = 0, |
67 | .amux = 1, | |
68 | },{ | |
3acf2809 | 69 | .type = EM28XX_VMUX_SVIDEO, |
596d92d5 MCC |
70 | .vmux = 9, |
71 | .amux = 1, | |
72 | }}, | |
73 | }, | |
4d17d083 | 74 | [EM2820_BOARD_KWORLD_PVRTV2800RF] = { |
33ccaa3f | 75 | .name = "Kworld PVR TV 2800 RF", |
4d17d083 MR |
76 | .is_em2800 = 0, |
77 | .vchannels = 2, | |
78 | .norm = VIDEO_MODE_PAL, | |
79 | .tda9887_conf = TDA9887_PRESENT, | |
80 | .has_tuner = 1, | |
81 | .decoder = EM28XX_SAA7113, | |
82 | .input = {{ | |
83 | .type = EM28XX_VMUX_COMPOSITE1, | |
84 | .vmux = 0, | |
85 | .amux = 1, | |
86 | },{ | |
87 | .type = EM28XX_VMUX_SVIDEO, | |
88 | .vmux = 9, | |
89 | .amux = 1, | |
90 | }}, | |
91 | }, | |
a6c2ba28 AM |
92 | [EM2820_BOARD_TERRATEC_CINERGY_250] = { |
93 | .name = "Terratec Cinergy 250 USB", | |
94 | .vchannels = 3, | |
95 | .norm = VIDEO_MODE_PAL, | |
96 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | |
97 | .tda9887_conf = TDA9887_PRESENT, | |
98 | .has_tuner = 1, | |
3acf2809 | 99 | .decoder = EM28XX_SAA7113, |
a6c2ba28 | 100 | .input = {{ |
3acf2809 | 101 | .type = EM28XX_VMUX_TELEVISION, |
a6c2ba28 | 102 | .vmux = 2, |
9475fb1c | 103 | .amux = 1, |
a6c2ba28 | 104 | },{ |
3acf2809 | 105 | .type = EM28XX_VMUX_COMPOSITE1, |
a6c2ba28 AM |
106 | .vmux = 0, |
107 | .amux = 1, | |
108 | },{ | |
3acf2809 | 109 | .type = EM28XX_VMUX_SVIDEO, |
a6c2ba28 AM |
110 | .vmux = 9, |
111 | .amux = 1, | |
112 | }}, | |
113 | }, | |
114 | [EM2820_BOARD_PINNACLE_USB_2] = { | |
115 | .name = "Pinnacle PCTV USB 2", | |
116 | .vchannels = 3, | |
117 | .norm = VIDEO_MODE_PAL, | |
118 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | |
119 | .tda9887_conf = TDA9887_PRESENT, | |
120 | .has_tuner = 1, | |
3acf2809 | 121 | .decoder = EM28XX_SAA7113, |
a6c2ba28 | 122 | .input = {{ |
3acf2809 | 123 | .type = EM28XX_VMUX_TELEVISION, |
a6c2ba28 AM |
124 | .vmux = 2, |
125 | .amux = 0, | |
126 | },{ | |
3acf2809 | 127 | .type = EM28XX_VMUX_COMPOSITE1, |
a6c2ba28 AM |
128 | .vmux = 0, |
129 | .amux = 1, | |
130 | },{ | |
3acf2809 | 131 | .type = EM28XX_VMUX_SVIDEO, |
a6c2ba28 AM |
132 | .vmux = 9, |
133 | .amux = 1, | |
134 | }}, | |
135 | }, | |
136 | [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = { | |
137 | .name = "Hauppauge WinTV USB 2", | |
138 | .vchannels = 3, | |
139 | .norm = VIDEO_MODE_NTSC, | |
140 | .tuner_type = TUNER_PHILIPS_FM1236_MK3, | |
141 | .tda9887_conf = TDA9887_PRESENT|TDA9887_PORT1_ACTIVE|TDA9887_PORT2_ACTIVE, | |
142 | .has_tuner = 1, | |
3acf2809 | 143 | .decoder = EM28XX_TVP5150, |
a6c2ba28 AM |
144 | .has_msp34xx = 1, |
145 | /*FIXME: S-Video not tested */ | |
146 | .input = {{ | |
3acf2809 | 147 | .type = EM28XX_VMUX_TELEVISION, |
a6c2ba28 | 148 | .vmux = 0, |
eac94356 | 149 | .amux = 6, |
a6c2ba28 | 150 | },{ |
3acf2809 | 151 | .type = EM28XX_VMUX_SVIDEO, |
a6c2ba28 AM |
152 | .vmux = 2, |
153 | .amux = 1, | |
154 | }}, | |
155 | }, | |
156 | [EM2820_BOARD_MSI_VOX_USB_2] = { | |
157 | .name = "MSI VOX USB 2.0", | |
158 | .vchannels = 3, | |
159 | .norm = VIDEO_MODE_PAL, | |
08eca13d | 160 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
a6c2ba28 AM |
161 | .tda9887_conf = TDA9887_PRESENT|TDA9887_PORT1_ACTIVE|TDA9887_PORT2_ACTIVE, |
162 | .has_tuner = 1, | |
3acf2809 | 163 | .decoder = EM28XX_SAA7114, |
a6c2ba28 | 164 | .input = {{ |
3acf2809 | 165 | .type = EM28XX_VMUX_TELEVISION, |
30556b23 | 166 | .vmux = 4, |
a6c2ba28 AM |
167 | .amux = 0, |
168 | },{ | |
3acf2809 | 169 | .type = EM28XX_VMUX_COMPOSITE1, |
a6c2ba28 AM |
170 | .vmux = 0, |
171 | .amux = 1, | |
172 | },{ | |
3acf2809 | 173 | .type = EM28XX_VMUX_SVIDEO, |
a6c2ba28 AM |
174 | .vmux = 9, |
175 | .amux = 1, | |
176 | }}, | |
177 | }, | |
596d92d5 MCC |
178 | [EM2800_BOARD_TERRATEC_CINERGY_200] = { |
179 | .name = "Terratec Cinergy 200 USB", | |
596d92d5 MCC |
180 | .is_em2800 = 1, |
181 | .vchannels = 3, | |
182 | .norm = VIDEO_MODE_PAL, | |
183 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | |
184 | .tda9887_conf = TDA9887_PRESENT, | |
185 | .has_tuner = 1, | |
3acf2809 | 186 | .decoder = EM28XX_SAA7113, |
596d92d5 | 187 | .input = {{ |
3acf2809 | 188 | .type = EM28XX_VMUX_TELEVISION, |
596d92d5 MCC |
189 | .vmux = 2, |
190 | .amux = 0, | |
191 | },{ | |
3acf2809 | 192 | .type = EM28XX_VMUX_COMPOSITE1, |
596d92d5 MCC |
193 | .vmux = 0, |
194 | .amux = 1, | |
195 | },{ | |
3acf2809 | 196 | .type = EM28XX_VMUX_SVIDEO, |
596d92d5 MCC |
197 | .vmux = 9, |
198 | .amux = 1, | |
199 | }}, | |
200 | }, | |
201 | [EM2800_BOARD_LEADTEK_WINFAST_USBII] = { | |
202 | .name = "Leadtek Winfast USB II", | |
596d92d5 MCC |
203 | .is_em2800 = 1, |
204 | .vchannels = 3, | |
205 | .norm = VIDEO_MODE_PAL, | |
206 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | |
207 | .tda9887_conf = TDA9887_PRESENT, | |
208 | .has_tuner = 1, | |
3acf2809 | 209 | .decoder = EM28XX_SAA7113, |
596d92d5 | 210 | .input = {{ |
3acf2809 | 211 | .type = EM28XX_VMUX_TELEVISION, |
596d92d5 MCC |
212 | .vmux = 2, |
213 | .amux = 0, | |
214 | },{ | |
3acf2809 | 215 | .type = EM28XX_VMUX_COMPOSITE1, |
596d92d5 MCC |
216 | .vmux = 0, |
217 | .amux = 1, | |
218 | },{ | |
3acf2809 | 219 | .type = EM28XX_VMUX_SVIDEO, |
596d92d5 MCC |
220 | .vmux = 9, |
221 | .amux = 1, | |
222 | }}, | |
223 | }, | |
224 | [EM2800_BOARD_KWORLD_USB2800] = { | |
225 | .name = "Kworld USB2800", | |
596d92d5 MCC |
226 | .is_em2800 = 1, |
227 | .vchannels = 3, | |
228 | .norm = VIDEO_MODE_PAL, | |
229 | .tuner_type = TUNER_PHILIPS_ATSC, | |
230 | .tda9887_conf = TDA9887_PRESENT, | |
231 | .has_tuner = 1, | |
3acf2809 | 232 | .decoder = EM28XX_SAA7113, |
596d92d5 | 233 | .input = {{ |
3acf2809 | 234 | .type = EM28XX_VMUX_TELEVISION, |
596d92d5 MCC |
235 | .vmux = 2, |
236 | .amux = 0, | |
237 | },{ | |
3acf2809 | 238 | .type = EM28XX_VMUX_COMPOSITE1, |
596d92d5 MCC |
239 | .vmux = 0, |
240 | .amux = 1, | |
241 | },{ | |
3acf2809 | 242 | .type = EM28XX_VMUX_SVIDEO, |
596d92d5 MCC |
243 | .vmux = 9, |
244 | .amux = 1, | |
245 | }}, | |
246 | }, | |
45632c4f MCC |
247 | [EM2820_BOARD_PINNACLE_DVC_90] = { |
248 | .name = "Pinnacle Dazzle DVC 90", | |
249 | .vchannels = 3, | |
250 | .norm = VIDEO_MODE_PAL, | |
251 | .has_tuner = 0, | |
3acf2809 | 252 | .decoder = EM28XX_SAA7113, |
45632c4f | 253 | .input = {{ |
3acf2809 | 254 | .type = EM28XX_VMUX_COMPOSITE1, |
45632c4f MCC |
255 | .vmux = 0, |
256 | .amux = 1, | |
257 | },{ | |
3acf2809 | 258 | .type = EM28XX_VMUX_SVIDEO, |
45632c4f MCC |
259 | .vmux = 9, |
260 | .amux = 1, | |
261 | }}, | |
262 | }, | |
a6c2ba28 | 263 | }; |
3acf2809 | 264 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); |
a6c2ba28 AM |
265 | |
266 | /* table of devices that work with this driver */ | |
3acf2809 | 267 | struct usb_device_id em28xx_id_table [] = { |
596d92d5 | 268 | { USB_DEVICE(0xeb1a, 0x2800), .driver_info = EM2800_BOARD_UNKNOWN }, |
08eca13d | 269 | { USB_DEVICE(0xeb1a, 0x2820), .driver_info = EM2820_BOARD_MSI_VOX_USB_2 }, |
a6c2ba28 AM |
270 | { USB_DEVICE(0x0ccd, 0x0036), .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 }, |
271 | { USB_DEVICE(0x2304, 0x0208), .driver_info = EM2820_BOARD_PINNACLE_USB_2 }, | |
272 | { USB_DEVICE(0x2040, 0x4200), .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, | |
45632c4f | 273 | { USB_DEVICE(0x2304, 0x0207), .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, |
a6c2ba28 AM |
274 | { }, |
275 | }; | |
276 | ||
a94e95b4 MR |
277 | void em28xx_pre_card_setup(struct em28xx *dev) |
278 | { | |
279 | /* request some modules */ | |
280 | switch(dev->model){ | |
282b7cb3 | 281 | case EM2880_BOARD_TERRATEC_PRODIGY_XS: |
4d17d083 MR |
282 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
283 | case EM2880_BOARD_TERRATEC_HYBRID_XS: | |
a94e95b4 MR |
284 | { |
285 | em28xx_write_regs_req(dev, 0x00, 0x08, "\x7d", 1); // reset through GPIO? | |
286 | break; | |
287 | } | |
288 | } | |
289 | } | |
290 | ||
3acf2809 | 291 | void em28xx_card_setup(struct em28xx *dev) |
a6c2ba28 AM |
292 | { |
293 | /* request some modules */ | |
a94e95b4 MR |
294 | switch(dev->model){ |
295 | case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: | |
296 | { | |
297 | struct tveeprom tv; | |
a6c2ba28 | 298 | #ifdef CONFIG_MODULES |
a94e95b4 MR |
299 | request_module("tveeprom"); |
300 | request_module("ir-kbd-i2c"); | |
301 | request_module("msp3400"); | |
a6c2ba28 | 302 | #endif |
a94e95b4 | 303 | /* Call first TVeeprom */ |
a6c2ba28 | 304 | |
a94e95b4 MR |
305 | dev->i2c_client.addr = 0xa0 >> 1; |
306 | tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata); | |
a6c2ba28 | 307 | |
a94e95b4 MR |
308 | dev->tuner_type= tv.tuner_type; |
309 | if (tv.audio_processor == AUDIO_CHIP_MSP34XX) { | |
310 | dev->i2s_speed=2048000; | |
311 | dev->has_msp34xx=1; | |
312 | } else | |
313 | dev->has_msp34xx=0; | |
314 | break; | |
315 | } | |
4d17d083 MR |
316 | case EM2820_BOARD_KWORLD_PVRTV2800RF: |
317 | { | |
318 | em28xx_write_regs_req(dev,0x00,0x08, "\xf9", 1); // GPIO enables sound on KWORLD PVR TV 2800RF | |
319 | break; | |
320 | } | |
321 | ||
a6c2ba28 AM |
322 | } |
323 | } | |
324 | ||
3acf2809 MCC |
325 | EXPORT_SYMBOL(em28xx_boards); |
326 | EXPORT_SYMBOL(em28xx_bcount); | |
327 | EXPORT_SYMBOL(em28xx_id_table); | |
a6c2ba28 | 328 | |
3acf2809 | 329 | MODULE_DEVICE_TABLE (usb, em28xx_id_table); |