blob: 58f7b4194a0d51a6359475923c93c84e6583dad5 [file] [log] [blame]
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001/*
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -08002 em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB video capture devices
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08003
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -08004 Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
5 Markus Rechberger <mrechberger@gmail.com>
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08006 Mauro Carvalho Chehab <mchehab@brturbo.com.br>
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -08007 Sascha Sommer <saschasommer@freenet.de>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08008
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>
Mauro Carvalho Chehab1f6173e2005-11-08 21:37:16 -080031#include <media/audiochip.h>
32#include <media/tveeprom.h>
Mauro Carvalho Chehab9bb13a62006-01-09 15:25:37 -020033#include <media/v4l2-common.h>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080034#include "msp3400.h"
35
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -080036#include "em28xx.h"
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080037
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080038struct em28xx_board em28xx_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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080046 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080047 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080048 .type = EM28XX_VMUX_COMPOSITE1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080049 .vmux = 0,
50 .amux = 1,
51 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080052 .type = EM28XX_VMUX_SVIDEO,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080053 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080064 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080065 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080066 .type = EM28XX_VMUX_COMPOSITE1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080067 .vmux = 0,
68 .amux = 1,
69 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080070 .type = EM28XX_VMUX_SVIDEO,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080071 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080082 .decoder = EM28XX_SAA7113,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080083 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080084 .type = EM28XX_VMUX_TELEVISION,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080085 .vmux = 2,
86 .amux = 0,
87 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080088 .type = EM28XX_VMUX_COMPOSITE1,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080089 .vmux = 0,
90 .amux = 1,
91 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080092 .type = EM28XX_VMUX_SVIDEO,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080093 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800104 .decoder = EM28XX_SAA7113,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800105 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800106 .type = EM28XX_VMUX_TELEVISION,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800107 .vmux = 2,
108 .amux = 0,
109 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800110 .type = EM28XX_VMUX_COMPOSITE1,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800111 .vmux = 0,
112 .amux = 1,
113 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800114 .type = EM28XX_VMUX_SVIDEO,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800115 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800126 .decoder = EM28XX_TVP5150,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800127 .has_msp34xx = 1,
128 /*FIXME: S-Video not tested */
129 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800130 .type = EM28XX_VMUX_TELEVISION,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800131 .vmux = 0,
Mauro Carvalho Chehabeac94352005-11-08 21:38:43 -0800132 .amux = 6,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800133 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800134 .type = EM28XX_VMUX_SVIDEO,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800135 .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 Chehab3acf2802005-11-08 21:38:27 -0800146 .decoder = EM28XX_SAA7114,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800147 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800148 .type = EM28XX_VMUX_TELEVISION,
Markus Rechberger30556b22005-11-08 21:38:05 -0800149 .vmux = 4,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800150 .amux = 0,
151 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800152 .type = EM28XX_VMUX_COMPOSITE1,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800153 .vmux = 0,
154 .amux = 1,
155 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800156 .type = EM28XX_VMUX_SVIDEO,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800157 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800169 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800170 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800171 .type = EM28XX_VMUX_TELEVISION,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800172 .vmux = 2,
173 .amux = 0,
174 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800175 .type = EM28XX_VMUX_COMPOSITE1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800176 .vmux = 0,
177 .amux = 1,
178 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800179 .type = EM28XX_VMUX_SVIDEO,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800180 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800192 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800193 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800194 .type = EM28XX_VMUX_TELEVISION,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800195 .vmux = 2,
196 .amux = 0,
197 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800198 .type = EM28XX_VMUX_COMPOSITE1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800199 .vmux = 0,
200 .amux = 1,
201 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800202 .type = EM28XX_VMUX_SVIDEO,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800203 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800215 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800216 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800217 .type = EM28XX_VMUX_TELEVISION,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800218 .vmux = 2,
219 .amux = 0,
220 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800221 .type = EM28XX_VMUX_COMPOSITE1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800222 .vmux = 0,
223 .amux = 1,
224 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800225 .type = EM28XX_VMUX_SVIDEO,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800226 .vmux = 9,
227 .amux = 1,
228 }},
229 },
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800230 [EM2820_BOARD_PINNACLE_DVC_90] = {
231 .name = "Pinnacle Dazzle DVC 90",
232 .vchannels = 3,
233 .norm = VIDEO_MODE_PAL,
234 .has_tuner = 0,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800235 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800236 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800237 .type = EM28XX_VMUX_COMPOSITE1,
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800238 .vmux = 0,
239 .amux = 1,
240 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800241 .type = EM28XX_VMUX_SVIDEO,
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800242 .vmux = 9,
243 .amux = 1,
244 }},
245 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800246};
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800247const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800248
249/* table of devices that work with this driver */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800250struct usb_device_id em28xx_id_table [] = {
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800251 { USB_DEVICE(0xeb1a, 0x2800), .driver_info = EM2800_BOARD_UNKNOWN },
Markus Rechberger08eca132005-11-08 21:38:05 -0800252 { USB_DEVICE(0xeb1a, 0x2820), .driver_info = EM2820_BOARD_MSI_VOX_USB_2 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800253 { USB_DEVICE(0x0ccd, 0x0036), .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
254 { USB_DEVICE(0x2304, 0x0208), .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
255 { USB_DEVICE(0x2040, 0x4200), .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800256 { USB_DEVICE(0x2304, 0x0207), .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800257 { },
258};
259
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800260void em28xx_card_setup(struct em28xx *dev)
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800261{
262 /* request some modules */
263 if (dev->model == EM2820_BOARD_HAUPPAUGE_WINTV_USB_2) {
264 struct tveeprom tv;
265#ifdef CONFIG_MODULES
266 request_module("tveeprom");
Mauro Carvalho Chehabd5e52652005-11-08 21:37:32 -0800267 request_module("ir-kbd-i2c");
Mauro Carvalho Chehabeac94352005-11-08 21:38:43 -0800268 request_module("msp3400");
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800269#endif
270 /* Call first TVeeprom */
271
Mauro Carvalho Chehabf59ab272005-11-08 21:37:58 -0800272 dev->i2c_client.addr = 0xa0 >> 1;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800273 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
274
275 dev->tuner_type= tv.tuner_type;
276 if (tv.audio_processor == AUDIO_CHIP_MSP34XX) {
Mauro Carvalho Chehab9bb13a62006-01-09 15:25:37 -0200277 dev->i2s_speed=2048000;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800278 dev->has_msp34xx=1;
Mauro Carvalho Chehabeac94352005-11-08 21:38:43 -0800279 } else
280 dev->has_msp34xx=0;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800281 }
282}
283
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800284EXPORT_SYMBOL(em28xx_boards);
285EXPORT_SYMBOL(em28xx_bcount);
286EXPORT_SYMBOL(em28xx_id_table);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800287
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800288MODULE_DEVICE_TABLE (usb, em28xx_id_table);