blob: 05264c655b5e20e9ab0d1cd051226bef3418af3f [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 Chehab2e7c6dc2006-04-03 07:53:40 -03006 Mauro Carvalho Chehab <mchehab@infradead.org>
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>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080026#include <linux/delay.h>
27#include <linux/i2c.h>
28#include <linux/usb.h>
29#include <media/tuner.h>
Hans Verkuil2474ed42006-03-19 12:35:57 -030030#include <media/msp3400.h>
Hans Verkuilc7c0b342006-04-02 13:35:00 -030031#include <media/saa7115.h>
32#include <media/tvp5150.h>
Mauro Carvalho Chehab1f6173e2005-11-08 21:37:16 -080033#include <media/tveeprom.h>
Hans Verkuil2474ed42006-03-19 12:35:57 -030034#include <media/audiochip.h>
Mauro Carvalho Chehab9bb13a62006-01-09 15:25:37 -020035#include <media/v4l2-common.h>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080036
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -080037#include "em28xx.h"
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -030038#include "tuner-xc2028.h"
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080039
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080040struct em28xx_board em28xx_boards[] = {
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080041 [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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080048 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080049 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080050 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -030051 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080052 .amux = 1,
53 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080054 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -030055 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080056 .amux = 1,
57 }},
58 },
59 [EM2820_BOARD_UNKNOWN] = {
Mauro Carvalho Chehab3dbd85b2007-11-03 08:07:07 -030060 .name = "Unknown EM2750/28xx video grabber",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080061 .is_em2800 = 0,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080062 },
Markus Rechberger4d17d082006-02-07 06:25:39 -020063 [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
Markus Rechberger33ccaa32006-02-07 06:25:41 -020064 .name = "Kworld PVR TV 2800 RF",
Markus Rechberger4d17d082006-02-07 06:25:39 -020065 .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,
Hans Verkuilc7c0b342006-04-02 13:35:00 -030073 .vmux = SAA7115_COMPOSITE0,
Markus Rechberger4d17d082006-02-07 06:25:39 -020074 .amux = 1,
75 },{
76 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -030077 .vmux = SAA7115_SVIDEO3,
Markus Rechberger4d17d082006-02-07 06:25:39 -020078 .amux = 1,
79 }},
80 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080081 [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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080088 .decoder = EM28XX_SAA7113,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080089 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080090 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -030091 .vmux = SAA7115_COMPOSITE2,
Markus Rechberger9475fb12006-02-27 00:07:34 -030092 .amux = 1,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080093 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080094 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -030095 .vmux = SAA7115_COMPOSITE0,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080096 .amux = 1,
97 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -080098 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -030099 .vmux = SAA7115_SVIDEO3,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800100 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800110 .decoder = EM28XX_SAA7113,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800111 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800112 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300113 .vmux = SAA7115_COMPOSITE2,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800114 .amux = 0,
115 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800116 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300117 .vmux = SAA7115_COMPOSITE0,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800118 .amux = 1,
119 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800120 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300121 .vmux = SAA7115_SVIDEO3,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800122 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800132 .decoder = EM28XX_TVP5150,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800133 .has_msp34xx = 1,
134 /*FIXME: S-Video not tested */
135 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800136 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300137 .vmux = TVP5150_COMPOSITE0,
Hans Verkuil2474ed42006-03-19 12:35:57 -0300138 .amux = MSP_INPUT_DEFAULT,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800139 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800140 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300141 .vmux = TVP5150_SVIDEO,
Hans Verkuil07151722006-04-01 18:03:23 -0300142 .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
143 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800144 }},
145 },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300146 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
Mauro Carvalho Chehab7d070e22007-11-01 21:52:58 -0300147 .name = "Hauppauge WinTV HVR 900/950",
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300148 .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 = {{
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300155 .type = EM28XX_VMUX_TELEVISION,
156 .vmux = TVP5150_COMPOSITE0,
157 .amux = 0,
158 },{
Mauro Carvalho Chehab7d070e22007-11-01 21:52:58 -0300159 .type = EM28XX_VMUX_COMPOSITE1,
160 .vmux = TVP5150_COMPOSITE1,
161 .amux = 1,
162 },{
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300163 .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 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800214 [EM2820_BOARD_MSI_VOX_USB_2] = {
215 .name = "MSI VOX USB 2.0",
216 .vchannels = 3,
217 .norm = VIDEO_MODE_PAL,
Markus Rechberger08eca132005-11-08 21:38:05 -0800218 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800219 .tda9887_conf = TDA9887_PRESENT|TDA9887_PORT1_ACTIVE|TDA9887_PORT2_ACTIVE,
220 .has_tuner = 1,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800221 .decoder = EM28XX_SAA7114,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800222 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800223 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300224 .vmux = SAA7115_COMPOSITE4,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800225 .amux = 0,
226 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800227 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300228 .vmux = SAA7115_COMPOSITE0,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800229 .amux = 1,
230 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800231 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300232 .vmux = SAA7115_SVIDEO3,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800233 .amux = 1,
234 }},
235 },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800236 [EM2800_BOARD_TERRATEC_CINERGY_200] = {
237 .name = "Terratec Cinergy 200 USB",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800238 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800244 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800245 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800246 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300247 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800248 .amux = 0,
249 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800250 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300251 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800252 .amux = 1,
253 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800254 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300255 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800256 .amux = 1,
257 }},
258 },
259 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
260 .name = "Leadtek Winfast USB II",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800261 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800267 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800268 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800269 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300270 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800271 .amux = 0,
272 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800273 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300274 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800275 .amux = 1,
276 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800277 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300278 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800279 .amux = 1,
280 }},
281 },
282 [EM2800_BOARD_KWORLD_USB2800] = {
283 .name = "Kworld USB2800",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800284 .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,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800290 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800291 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800292 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300293 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800294 .amux = 0,
295 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800296 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300297 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800298 .amux = 1,
299 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800300 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300301 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800302 .amux = 1,
303 }},
304 },
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800305 [EM2820_BOARD_PINNACLE_DVC_90] = {
306 .name = "Pinnacle Dazzle DVC 90",
307 .vchannels = 3,
308 .norm = VIDEO_MODE_PAL,
309 .has_tuner = 0,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800310 .decoder = EM28XX_SAA7113,
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800311 .input = {{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800312 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300313 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800314 .amux = 1,
315 },{
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800316 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300317 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800318 .amux = 1,
319 }},
320 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800321};
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800322const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800323
324/* table of devices that work with this driver */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800325struct usb_device_id em28xx_id_table [] = {
Mauro Carvalho Chehab3dbd85b2007-11-03 08:07:07 -0300326 { USB_DEVICE(0xeb1a, 0x2750), .driver_info = EM2820_BOARD_UNKNOWN },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800327 { USB_DEVICE(0xeb1a, 0x2800), .driver_info = EM2800_BOARD_UNKNOWN },
Mauro Carvalho Chehab3dbd85b2007-11-03 08:07:07 -0300328 { 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 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800335 { 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 },
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800338 { USB_DEVICE(0x2304, 0x0207), .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300339 { USB_DEVICE(0x2040, 0x6500), .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
Mauro Carvalho Chehab6c362c82007-10-29 23:36:12 -0300340 { USB_DEVICE(0x2040, 0x6513), .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300341 { USB_DEVICE(0x0ccd, 0x0042), .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS },
342 { USB_DEVICE(0x0ccd, 0x0047), .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800343 { },
344};
345
Markus Rechbergera94e95b2006-01-23 17:11:10 -0200346void em28xx_pre_card_setup(struct em28xx *dev)
347{
348 /* request some modules */
349 switch(dev->model){
Markus Rechberger282b7cb2006-02-07 06:14:16 +0100350 case EM2880_BOARD_TERRATEC_PRODIGY_XS:
Markus Rechberger4d17d082006-02-07 06:25:39 -0200351 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
352 case EM2880_BOARD_TERRATEC_HYBRID_XS:
Markus Rechbergera94e95b2006-01-23 17:11:10 -0200353 {
354 em28xx_write_regs_req(dev, 0x00, 0x08, "\x7d", 1); // reset through GPIO?
355 break;
356 }
357 }
358}
359
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -0300360static 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
Mauro Carvalho Chehab352fae12007-11-01 16:56:26 -0300367 ctl.fname = XC2028_DEFAULT_FIRMWARE;
368 ctl.max_len = 64;
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -0300369
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
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800376void em28xx_card_setup(struct em28xx *dev)
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800377{
378 /* request some modules */
Markus Rechbergera94e95b2006-01-23 17:11:10 -0200379 switch(dev->model){
380 case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
381 {
382 struct tveeprom tv;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800383#ifdef CONFIG_MODULES
Markus Rechbergera94e95b2006-01-23 17:11:10 -0200384 request_module("tveeprom");
385 request_module("ir-kbd-i2c");
386 request_module("msp3400");
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800387#endif
Markus Rechbergera94e95b2006-01-23 17:11:10 -0200388 /* Call first TVeeprom */
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800389
Markus Rechbergera94e95b2006-01-23 17:11:10 -0200390 dev->i2c_client.addr = 0xa0 >> 1;
391 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800392
Markus Rechbergera94e95b2006-01-23 17:11:10 -0200393 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 }
Markus Rechberger4d17d082006-02-07 06:25:39 -0200401 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
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800407 }
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -0300408 em28xx_config_tuner (dev);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800409}
410
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800411MODULE_DEVICE_TABLE (usb, em28xx_id_table);