blob: 27db6d956c3f64aeb10094ef767958ac8cc03bc8 [file] [log] [blame]
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001/*
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08002 em2820-cards.c - driver for Empia EM2800/EM2820/2840 USB video capture devices
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08003
4 Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com>
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08005 Ludovico Cavedon <cavedon@sssup.it>
6 Mauro Carvalho Chehab <mchehab@brturbo.com.br>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08007
8 Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de>
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */
24
25#include <linux/init.h>
26#include <linux/module.h>
27#include <linux/pci.h>
28#include <linux/delay.h>
29#include <linux/i2c.h>
30#include <linux/usb.h>
31#include <media/tuner.h>
Mauro Carvalho Chehab1f6173e2005-11-08 21:37:16 -080032#include <media/audiochip.h>
33#include <media/tveeprom.h>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080034#include "msp3400.h"
35
36#include "em2820.h"
37
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080038struct em2820_board em2820_boards[] = {
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080039 [EM2800_BOARD_UNKNOWN] = {
40 .name = "Unknown EM2800 video grabber",
41 .is_em2800 = 1,
42 .vchannels = 2,
43 .norm = VIDEO_MODE_PAL,
44 .tda9887_conf = TDA9887_PRESENT,
45 .has_tuner = 1,
46 .decoder = EM2820_SAA7113,
47 .input = {{
48 .type = EM2820_VMUX_COMPOSITE1,
49 .vmux = 0,
50 .amux = 1,
51 },{
52 .type = EM2820_VMUX_SVIDEO,
53 .vmux = 9,
54 .amux = 1,
55 }},
56 },
57 [EM2820_BOARD_UNKNOWN] = {
58 .name = "Unknown EM2820/2840 video grabber",
59 .is_em2800 = 0,
60 .vchannels = 2,
61 .norm = VIDEO_MODE_PAL,
62 .tda9887_conf = TDA9887_PRESENT,
63 .has_tuner = 1,
64 .decoder = EM2820_SAA7113,
65 .input = {{
66 .type = EM2820_VMUX_COMPOSITE1,
67 .vmux = 0,
68 .amux = 1,
69 },{
70 .type = EM2820_VMUX_SVIDEO,
71 .vmux = 9,
72 .amux = 1,
73 }},
74 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080075 [EM2820_BOARD_TERRATEC_CINERGY_250] = {
76 .name = "Terratec Cinergy 250 USB",
77 .vchannels = 3,
78 .norm = VIDEO_MODE_PAL,
79 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
80 .tda9887_conf = TDA9887_PRESENT,
81 .has_tuner = 1,
82 .decoder = EM2820_SAA7113,
83 .input = {{
84 .type = EM2820_VMUX_TELEVISION,
85 .vmux = 2,
86 .amux = 0,
87 },{
88 .type = EM2820_VMUX_COMPOSITE1,
89 .vmux = 0,
90 .amux = 1,
91 },{
92 .type = EM2820_VMUX_SVIDEO,
93 .vmux = 9,
94 .amux = 1,
95 }},
96 },
97 [EM2820_BOARD_PINNACLE_USB_2] = {
98 .name = "Pinnacle PCTV USB 2",
99 .vchannels = 3,
100 .norm = VIDEO_MODE_PAL,
101 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
102 .tda9887_conf = TDA9887_PRESENT,
103 .has_tuner = 1,
104 .decoder = EM2820_SAA7113,
105 .input = {{
106 .type = EM2820_VMUX_TELEVISION,
107 .vmux = 2,
108 .amux = 0,
109 },{
110 .type = EM2820_VMUX_COMPOSITE1,
111 .vmux = 0,
112 .amux = 1,
113 },{
114 .type = EM2820_VMUX_SVIDEO,
115 .vmux = 9,
116 .amux = 1,
117 }},
118 },
119 [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
120 .name = "Hauppauge WinTV USB 2",
121 .vchannels = 3,
122 .norm = VIDEO_MODE_NTSC,
123 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
124 .tda9887_conf = TDA9887_PRESENT|TDA9887_PORT1_ACTIVE|TDA9887_PORT2_ACTIVE,
125 .has_tuner = 1,
126 .decoder = EM2820_TVP5150,
127 .has_msp34xx = 1,
128 /*FIXME: S-Video not tested */
129 .input = {{
130 .type = EM2820_VMUX_TELEVISION,
131 .vmux = 0,
132 .amux = 0,
133 },{
134 .type = EM2820_VMUX_SVIDEO,
135 .vmux = 2,
136 .amux = 1,
137 }},
138 },
139 [EM2820_BOARD_MSI_VOX_USB_2] = {
140 .name = "MSI VOX USB 2.0",
141 .vchannels = 3,
142 .norm = VIDEO_MODE_PAL,
Markus Rechberger08eca132005-11-08 21:38:05 -0800143 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800144 .tda9887_conf = TDA9887_PRESENT|TDA9887_PORT1_ACTIVE|TDA9887_PORT2_ACTIVE,
145 .has_tuner = 1,
Mauro Carvalho Chehabd5e52652005-11-08 21:37:32 -0800146 .decoder = EM2820_SAA7114,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800147 .input = {{
148 .type = EM2820_VMUX_TELEVISION,
149 .vmux = 2,
150 .amux = 0,
151 },{
152 .type = EM2820_VMUX_COMPOSITE1,
153 .vmux = 0,
154 .amux = 1,
155 },{
156 .type = EM2820_VMUX_SVIDEO,
157 .vmux = 9,
158 .amux = 1,
159 }},
160 },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800161 [EM2800_BOARD_TERRATEC_CINERGY_200] = {
162 .name = "Terratec Cinergy 200 USB",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800163 .is_em2800 = 1,
164 .vchannels = 3,
165 .norm = VIDEO_MODE_PAL,
166 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
167 .tda9887_conf = TDA9887_PRESENT,
168 .has_tuner = 1,
169 .decoder = EM2820_SAA7113,
170 .input = {{
171 .type = EM2820_VMUX_TELEVISION,
172 .vmux = 2,
173 .amux = 0,
174 },{
175 .type = EM2820_VMUX_COMPOSITE1,
176 .vmux = 0,
177 .amux = 1,
178 },{
179 .type = EM2820_VMUX_SVIDEO,
180 .vmux = 9,
181 .amux = 1,
182 }},
183 },
184 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
185 .name = "Leadtek Winfast USB II",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800186 .is_em2800 = 1,
187 .vchannels = 3,
188 .norm = VIDEO_MODE_PAL,
189 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
190 .tda9887_conf = TDA9887_PRESENT,
191 .has_tuner = 1,
192 .decoder = EM2820_SAA7113,
193 .input = {{
194 .type = EM2820_VMUX_TELEVISION,
195 .vmux = 2,
196 .amux = 0,
197 },{
198 .type = EM2820_VMUX_COMPOSITE1,
199 .vmux = 0,
200 .amux = 1,
201 },{
202 .type = EM2820_VMUX_SVIDEO,
203 .vmux = 9,
204 .amux = 1,
205 }},
206 },
207 [EM2800_BOARD_KWORLD_USB2800] = {
208 .name = "Kworld USB2800",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800209 .is_em2800 = 1,
210 .vchannels = 3,
211 .norm = VIDEO_MODE_PAL,
212 .tuner_type = TUNER_PHILIPS_ATSC,
213 .tda9887_conf = TDA9887_PRESENT,
214 .has_tuner = 1,
215 .decoder = EM2820_SAA7113,
216 .input = {{
217 .type = EM2820_VMUX_TELEVISION,
218 .vmux = 2,
219 .amux = 0,
220 },{
221 .type = EM2820_VMUX_COMPOSITE1,
222 .vmux = 0,
223 .amux = 1,
224 },{
225 .type = EM2820_VMUX_SVIDEO,
226 .vmux = 9,
227 .amux = 1,
228 }},
229 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800230};
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800231const unsigned int em2820_bcount = ARRAY_SIZE(em2820_boards);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800232
233/* table of devices that work with this driver */
234struct usb_device_id em2820_id_table [] = {
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800235 { USB_DEVICE(0xeb1a, 0x2800), .driver_info = EM2800_BOARD_UNKNOWN },
Markus Rechberger08eca132005-11-08 21:38:05 -0800236 { USB_DEVICE(0xeb1a, 0x2820), .driver_info = EM2820_BOARD_MSI_VOX_USB_2 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800237 { USB_DEVICE(0x0ccd, 0x0036), .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
238 { USB_DEVICE(0x2304, 0x0208), .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
239 { USB_DEVICE(0x2040, 0x4200), .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800240 { },
241};
242
243void em2820_card_setup(struct em2820 *dev)
244{
245 /* request some modules */
246 if (dev->model == EM2820_BOARD_HAUPPAUGE_WINTV_USB_2) {
247 struct tveeprom tv;
248#ifdef CONFIG_MODULES
249 request_module("tveeprom");
Mauro Carvalho Chehabd5e52652005-11-08 21:37:32 -0800250 request_module("ir-kbd-i2c");
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800251#endif
252 /* Call first TVeeprom */
253
Mauro Carvalho Chehabf59ab272005-11-08 21:37:58 -0800254 dev->i2c_client.addr = 0xa0 >> 1;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800255 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
256
257 dev->tuner_type= tv.tuner_type;
258 if (tv.audio_processor == AUDIO_CHIP_MSP34XX) {
259 dev->has_msp34xx=1;
260 } else dev->has_msp34xx=0;
261 }
262}
263
264EXPORT_SYMBOL(em2820_boards);
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800265EXPORT_SYMBOL(em2820_bcount);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800266EXPORT_SYMBOL(em2820_id_table);
267
268MODULE_DEVICE_TABLE (usb, em2820_id_table);