blob: 3b3ca3f46d52e1f78e67a94dc831d0565be92dd4 [file] [log] [blame]
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001/*
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03002 em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
3 video capture devices
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08004
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -08005 Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
6 Markus Rechberger <mrechberger@gmail.com>
Mauro Carvalho Chehab2e7c6dc2006-04-03 07:53:40 -03007 Mauro Carvalho Chehab <mchehab@infradead.org>
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -08008 Sascha Sommer <saschasommer@freenet.de>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08009
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>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080027#include <linux/delay.h>
28#include <linux/i2c.h>
29#include <linux/usb.h>
30#include <media/tuner.h>
Hans Verkuil2474ed42006-03-19 12:35:57 -030031#include <media/msp3400.h>
Hans Verkuilc7c0b342006-04-02 13:35:00 -030032#include <media/saa7115.h>
33#include <media/tvp5150.h>
Mauro Carvalho Chehab1f6173e2005-11-08 21:37:16 -080034#include <media/tveeprom.h>
Mauro Carvalho Chehab9bb13a62006-01-09 15:25:37 -020035#include <media/v4l2-common.h>
Hans Verkuil38f9d302008-07-23 05:09:15 -030036#include <media/v4l2-chip-ident.h>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080037
Mauro Carvalho Chehabf7abcd32005-11-08 21:38:25 -080038#include "em28xx.h"
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080039
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -030040#define DRIVER_NAME "em28xx"
41
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -030042static int tuner = -1;
43module_param(tuner, int, 0444);
44MODULE_PARM_DESC(tuner, "tuner type");
45
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -030046static unsigned int disable_ir;
47module_param(disable_ir, int, 0444);
48MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
49
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -030050static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
51module_param_array(card, int, NULL, 0444);
52MODULE_PARM_DESC(card, "card type");
53
54/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */
55static unsigned long em28xx_devused;
56
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -030057struct em28xx_hash_table {
58 unsigned long hash;
59 unsigned int model;
60 unsigned int tuner;
61};
62
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -030063/*
64 * Reset sequences for analog/digital modes
65 */
66
67/* Reset for the most [analog] boards */
68static struct em28xx_reg_seq default_analog[] = {
69 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10},
70 { -1, -1, -1, -1},
71};
72
73/* Reset for the most [digital] boards */
74static struct em28xx_reg_seq default_digital[] = {
75 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10},
76 { -1, -1, -1, -1},
77};
78
79/* Board Hauppauge WinTV HVR 900 analog */
80static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
81 {EM28XX_R08_GPIO, 0x2d, ~EM_GPIO_4, 10},
82 {0x05, 0xff, 0x10, 10},
83 { -1, -1, -1, -1},
84};
85
86/* Board Hauppauge WinTV HVR 900 digital */
87static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
88 {EM28XX_R08_GPIO, 0x2e, ~EM_GPIO_4, 10},
89 {EM2880_R04_GPO, 0x04, 0x0f, 10},
90 {EM2880_R04_GPO, 0x0c, 0x0f, 10},
91 { -1, -1, -1, -1},
92};
93
94/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
95static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
96 {EM28XX_R08_GPIO, 0x69, ~EM_GPIO_4, 10},
97 { -1, -1, -1, -1},
98};
99
100/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300101
102/* Board - EM2870 Kworld 355u
103 Analog - No input analog */
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300104
Robert Krakora6e7b9ea2009-01-18 21:59:34 -0300105static struct em28xx_reg_seq kworld_330u_analog[] = {
106 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10},
107 {EM2880_R04_GPO, 0x00, 0xff, 10},
108 { -1, -1, -1, -1},
109};
110
111static struct em28xx_reg_seq kworld_330u_digital[] = {
112 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10},
113 {EM2880_R04_GPO, 0x08, 0xff, 10},
114 { -1, -1, -1, -1},
115};
116
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300117/* Callback for the most boards */
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300118static struct em28xx_reg_seq default_tuner_gpio[] = {
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300119 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10},
120 {EM28XX_R08_GPIO, 0, EM_GPIO_4, 10},
121 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10},
122 { -1, -1, -1, -1},
123};
124
Mauro Carvalho Chehab0ec202d2008-11-25 13:16:13 -0300125/*
126 * Board definitions
127 */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800128struct em28xx_board em28xx_boards[] = {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300129 [EM2750_BOARD_UNKNOWN] = {
130 .name = "Unknown EM2750/EM2751 webcam grabber",
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -0300131 .xclk = EM28XX_XCLK_FREQUENCY_48MHZ,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300132 .tuner_type = TUNER_ABSENT, /* This is a webcam */
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300133 .input = { {
134 .type = EM28XX_VMUX_COMPOSITE1,
135 .vmux = 0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300136 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300137 } },
138 },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800139 [EM2800_BOARD_UNKNOWN] = {
140 .name = "Unknown EM2800 video grabber",
141 .is_em2800 = 1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800142 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300143 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300144 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300145 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800146 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300147 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300148 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300149 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800150 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300151 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300152 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300153 } },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800154 },
155 [EM2820_BOARD_UNKNOWN] = {
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -0300156 .name = "Unknown EM2750/28xx video grabber",
157 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800158 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300159 [EM2750_BOARD_DLCW_130] = {
160 /* Beijing Huaqi Information Digital Technology Co., Ltd */
161 .name = "Huaqi DLCW-130",
162 .valid = EM28XX_BOARD_NOT_VALIDATED,
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -0300163 .xclk = EM28XX_XCLK_FREQUENCY_48MHZ,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300164 .tuner_type = TUNER_ABSENT, /* This is a webcam */
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300165 .input = { {
166 .type = EM28XX_VMUX_COMPOSITE1,
167 .vmux = 0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300168 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300169 } },
170 },
Markus Rechberger4d17d082006-02-07 06:25:39 -0200171 [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
Markus Rechberger33ccaa32006-02-07 06:25:41 -0200172 .name = "Kworld PVR TV 2800 RF",
Mauro Carvalho Chehabed086312008-01-24 06:59:20 -0300173 .tuner_type = TUNER_TEMIC_PAL,
Markus Rechberger4d17d082006-02-07 06:25:39 -0200174 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300175 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300176 .input = { {
Markus Rechberger4d17d082006-02-07 06:25:39 -0200177 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300178 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300179 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300180 }, {
Markus Rechberger4d17d082006-02-07 06:25:39 -0200181 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300182 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300183 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300184 } },
Markus Rechberger4d17d082006-02-07 06:25:39 -0200185 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800186 [EM2820_BOARD_TERRATEC_CINERGY_250] = {
187 .name = "Terratec Cinergy 250 USB",
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800188 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
189 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300190 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300191 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800192 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300193 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300194 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300195 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800196 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300197 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300198 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300199 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800200 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300201 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300202 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300203 } },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800204 },
205 [EM2820_BOARD_PINNACLE_USB_2] = {
206 .name = "Pinnacle PCTV USB 2",
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800207 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
208 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300209 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300210 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800211 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300212 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300213 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300214 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800215 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300216 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300217 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300218 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800219 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300220 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300221 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300222 } },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800223 },
224 [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
225 .name = "Hauppauge WinTV USB 2",
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800226 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300227 .tda9887_conf = TDA9887_PRESENT |
228 TDA9887_PORT1_ACTIVE|
229 TDA9887_PORT2_ACTIVE,
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800230 .decoder = EM28XX_TVP5150,
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800231 .has_msp34xx = 1,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300232 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800233 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300234 .vmux = TVP5150_COMPOSITE0,
Hans Verkuil2474ed42006-03-19 12:35:57 -0300235 .amux = MSP_INPUT_DEFAULT,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300236 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800237 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300238 .vmux = TVP5150_SVIDEO,
Hans Verkuil07151722006-04-01 18:03:23 -0300239 .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
240 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300241 } },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800242 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300243 [EM2820_BOARD_DLINK_USB_TV] = {
244 .name = "D-Link DUB-T210 TV Tuner",
245 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300246 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
247 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300248 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300249 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300250 .type = EM28XX_VMUX_TELEVISION,
251 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300252 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300253 }, {
254 .type = EM28XX_VMUX_COMPOSITE1,
255 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300256 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300257 }, {
258 .type = EM28XX_VMUX_SVIDEO,
259 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300260 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300261 } },
262 },
263 [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
264 .name = "Hercules Smart TV USB 2.0",
265 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300266 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
267 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300268 .decoder = EM28XX_SAA711X,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300269 .input = { {
270 .type = EM28XX_VMUX_TELEVISION,
271 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300272 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300273 }, {
274 .type = EM28XX_VMUX_COMPOSITE1,
275 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300276 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300277 }, {
278 .type = EM28XX_VMUX_SVIDEO,
279 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300280 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300281 } },
282 },
283 [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
284 .name = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
285 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300286 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
287 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300288 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300289 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300290 .type = EM28XX_VMUX_TELEVISION,
291 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300292 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300293 }, {
294 .type = EM28XX_VMUX_COMPOSITE1,
295 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300296 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300297 }, {
298 .type = EM28XX_VMUX_SVIDEO,
299 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300300 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300301 } },
302 },
303 [EM2820_BOARD_GADMEI_UTV310] = {
304 .name = "Gadmei UTV310",
305 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300306 .tuner_type = TUNER_TNF_5335MF,
307 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300308 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300309 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300310 .type = EM28XX_VMUX_TELEVISION,
311 .vmux = SAA7115_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300312 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300313 }, {
314 .type = EM28XX_VMUX_COMPOSITE1,
315 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300316 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300317 }, {
318 .type = EM28XX_VMUX_SVIDEO,
319 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300320 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300321 } },
322 },
323 [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
324 .name = "Leadtek Winfast USB II Deluxe",
325 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300326 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
327 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300328 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300329 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300330 .type = EM28XX_VMUX_TELEVISION,
Mauro Carvalho Chehaba5942b52008-11-27 07:44:00 -0300331 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300332 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300333 }, {
334 .type = EM28XX_VMUX_COMPOSITE1,
Mauro Carvalho Chehaba5942b52008-11-27 07:44:00 -0300335 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300336 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300337 }, {
338 .type = EM28XX_VMUX_SVIDEO,
Mauro Carvalho Chehaba5942b52008-11-27 07:44:00 -0300339 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300340 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300341 } },
342 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300343 [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300344 .name = "Videology 20K14XUSB USB2.0",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300345 .valid = EM28XX_BOARD_NOT_VALIDATED,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300346 .tuner_type = TUNER_ABSENT, /* This is a webcam */
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300347 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300348 .type = EM28XX_VMUX_COMPOSITE1,
349 .vmux = 0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300350 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300351 } },
352 },
353 [EM2821_BOARD_PROLINK_PLAYTV_USB2] = {
354 .name = "SIIG AVTuner-PVR/Prolink PlayTV USB 2.0",
355 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300356 .tuner_type = TUNER_LG_PAL_NEW_TAPC, /* unknown? */
357 .tda9887_conf = TDA9887_PRESENT, /* unknown? */
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300358 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300359 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300360 .type = EM28XX_VMUX_TELEVISION,
361 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300362 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300363 }, {
364 .type = EM28XX_VMUX_COMPOSITE1,
365 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300366 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300367 }, {
368 .type = EM28XX_VMUX_SVIDEO,
369 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300370 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300371 } },
372 },
373 [EM2821_BOARD_SUPERCOMP_USB_2] = {
374 .name = "Supercomp USB 2.0 TV",
375 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300376 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
377 .tda9887_conf = TDA9887_PRESENT |
378 TDA9887_PORT1_ACTIVE |
379 TDA9887_PORT2_ACTIVE,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300380 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300381 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300382 .type = EM28XX_VMUX_TELEVISION,
383 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300384 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300385 }, {
386 .type = EM28XX_VMUX_COMPOSITE1,
387 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300388 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300389 }, {
390 .type = EM28XX_VMUX_SVIDEO,
391 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300392 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300393 } },
394 },
395 [EM2821_BOARD_USBGEAR_VD204] = {
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300396 .name = "Usbgear VD204v9",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300397 .valid = EM28XX_BOARD_NOT_VALIDATED,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300398 .tuner_type = TUNER_ABSENT, /* Capture only device */
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300399 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300400 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300401 .type = EM28XX_VMUX_COMPOSITE1,
402 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300403 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300404 }, {
405 .type = EM28XX_VMUX_SVIDEO,
406 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300407 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300408 } },
409 },
410 [EM2860_BOARD_NETGMBH_CAM] = {
411 /* Beijing Huaqi Information Digital Technology Co., Ltd */
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300412 .name = "NetGMBH Cam",
413 .valid = EM28XX_BOARD_NOT_VALIDATED,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300414 .tuner_type = TUNER_ABSENT, /* This is a webcam */
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300415 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300416 .type = EM28XX_VMUX_COMPOSITE1,
417 .vmux = 0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300418 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300419 } },
420 },
421 [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300422 .name = "Typhoon DVD Maker",
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300423 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300424 .tuner_type = TUNER_ABSENT, /* Capture only device */
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300425 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300426 .type = EM28XX_VMUX_COMPOSITE1,
427 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300428 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300429 }, {
430 .type = EM28XX_VMUX_SVIDEO,
431 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300432 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300433 } },
434 },
435 [EM2860_BOARD_GADMEI_UTV330] = {
436 .name = "Gadmei UTV330",
437 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300438 .tuner_type = TUNER_TNF_5335MF,
439 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300440 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300441 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300442 .type = EM28XX_VMUX_TELEVISION,
443 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300444 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300445 }, {
446 .type = EM28XX_VMUX_COMPOSITE1,
447 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300448 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300449 }, {
450 .type = EM28XX_VMUX_SVIDEO,
451 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300452 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300453 } },
454 },
455 [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
456 .name = "Terratec Cinergy A Hybrid XS",
457 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300458 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300459 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300460 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300461
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300462 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300463 .type = EM28XX_VMUX_TELEVISION,
464 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300465 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300466 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300467 }, {
468 .type = EM28XX_VMUX_COMPOSITE1,
469 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300470 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300471 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300472 }, {
473 .type = EM28XX_VMUX_SVIDEO,
474 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300475 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300476 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300477 } },
478 },
479 [EM2861_BOARD_KWORLD_PVRTV_300U] = {
480 .name = "KWorld PVRTV 300U",
481 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300482 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300483 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300484 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300485 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300486 .type = EM28XX_VMUX_TELEVISION,
487 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300488 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300489 }, {
490 .type = EM28XX_VMUX_COMPOSITE1,
491 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300492 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300493 }, {
494 .type = EM28XX_VMUX_SVIDEO,
495 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300496 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300497 } },
498 },
499 [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
500 .name = "Yakumo MovieMixer",
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300501 .tuner_type = TUNER_ABSENT, /* Capture only device */
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300502 .decoder = EM28XX_TVP5150,
503 .input = { {
504 .type = EM28XX_VMUX_TELEVISION,
505 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300506 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300507 }, {
508 .type = EM28XX_VMUX_COMPOSITE1,
509 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300510 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300511 }, {
512 .type = EM28XX_VMUX_SVIDEO,
513 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300514 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300515 } },
516 },
517 [EM2861_BOARD_PLEXTOR_PX_TV100U] = {
518 .name = "Plextor ConvertX PX-TV100U",
519 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300520 .tuner_type = TUNER_TNF_5335MF,
521 .tda9887_conf = TDA9887_PRESENT,
522 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300523 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300524 .type = EM28XX_VMUX_TELEVISION,
525 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300526 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300527 }, {
528 .type = EM28XX_VMUX_COMPOSITE1,
529 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300530 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300531 }, {
532 .type = EM28XX_VMUX_SVIDEO,
533 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300534 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300535 } },
536 },
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300537
538 /* Those boards with em2870 are DVB Only*/
539
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300540 [EM2870_BOARD_TERRATEC_XS] = {
541 .name = "Terratec Cinergy T XS",
542 .valid = EM28XX_BOARD_NOT_VALIDATED,
543 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300544 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300545 },
546 [EM2870_BOARD_TERRATEC_XS_MT2060] = {
547 .name = "Terratec Cinergy T XS (MT2060)",
548 .valid = EM28XX_BOARD_NOT_VALIDATED,
549 .tuner_type = TUNER_ABSENT, /* MT2060 */
550 },
551 [EM2870_BOARD_KWORLD_350U] = {
552 .name = "Kworld 350 U DVB-T",
553 .valid = EM28XX_BOARD_NOT_VALIDATED,
554 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300555 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300556 },
557 [EM2870_BOARD_KWORLD_355U] = {
558 .name = "Kworld 355 U DVB-T",
559 .valid = EM28XX_BOARD_NOT_VALIDATED,
560 },
561 [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
562 .name = "Pinnacle PCTV DVB-T",
563 .valid = EM28XX_BOARD_NOT_VALIDATED,
564 .tuner_type = TUNER_ABSENT, /* MT2060 */
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -0300565 /* djh - I have serious doubts this is right... */
566 .xclk = EM28XX_XCLK_IR_RC5_MODE |
567 EM28XX_XCLK_FREQUENCY_10MHZ,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300568 },
569 [EM2870_BOARD_COMPRO_VIDEOMATE] = {
570 .name = "Compro, VideoMate U3",
571 .valid = EM28XX_BOARD_NOT_VALIDATED,
572 .tuner_type = TUNER_ABSENT, /* MT2060 */
573 },
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300574
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300575 [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
576 .name = "Terratec Hybrid XS Secam",
577 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300578 .has_msp34xx = 1,
579 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300580 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300581 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300582 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300583 .type = EM28XX_VMUX_TELEVISION,
584 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300585 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300586 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300587 }, {
588 .type = EM28XX_VMUX_COMPOSITE1,
589 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300590 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300591 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300592 }, {
593 .type = EM28XX_VMUX_SVIDEO,
594 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300595 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300596 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300597 } },
598 },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300599 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
Aidan Thornton122d1582007-11-20 15:25:08 -0300600 .name = "Hauppauge WinTV HVR 900",
Aidan Thornton122d1582007-11-20 15:25:08 -0300601 .tda9887_conf = TDA9887_PRESENT,
602 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300603 .tuner_gpio = default_tuner_gpio,
Mauro Carvalho Chehab5add9a62007-11-22 12:08:53 -0300604 .mts_firmware = 1,
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -0300605 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300606 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Aidan Thornton122d1582007-11-20 15:25:08 -0300607 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300608 .input = { {
Aidan Thornton122d1582007-11-20 15:25:08 -0300609 .type = EM28XX_VMUX_TELEVISION,
610 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300611 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300612 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300613 }, {
Aidan Thornton122d1582007-11-20 15:25:08 -0300614 .type = EM28XX_VMUX_COMPOSITE1,
615 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300616 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300617 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300618 }, {
Aidan Thornton122d1582007-11-20 15:25:08 -0300619 .type = EM28XX_VMUX_SVIDEO,
620 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300621 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300622 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300623 } },
Aidan Thornton122d1582007-11-20 15:25:08 -0300624 },
Devin Heitmueller17d9d552008-06-08 10:22:03 -0300625 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
626 .name = "Hauppauge WinTV HVR 900 (R2)",
Devin Heitmueller17d9d552008-06-08 10:22:03 -0300627 .tda9887_conf = TDA9887_PRESENT,
628 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300629 .tuner_gpio = default_tuner_gpio,
Devin Heitmueller17d9d552008-06-08 10:22:03 -0300630 .mts_firmware = 1,
631 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300632 .input = { {
Devin Heitmueller17d9d552008-06-08 10:22:03 -0300633 .type = EM28XX_VMUX_TELEVISION,
634 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300635 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300636 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller17d9d552008-06-08 10:22:03 -0300637 }, {
638 .type = EM28XX_VMUX_COMPOSITE1,
639 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehaba5942b52008-11-27 07:44:00 -0300640 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300641 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller17d9d552008-06-08 10:22:03 -0300642 }, {
643 .type = EM28XX_VMUX_SVIDEO,
644 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300645 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300646 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller17d9d552008-06-08 10:22:03 -0300647 } },
648 },
Douglas Schilling Landgraff89bc322008-12-01 21:01:04 -0300649 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
650 .name = "Hauppauge WinTV HVR 850",
651 .tuner_type = TUNER_XC2028,
652 .tuner_gpio = default_tuner_gpio,
653 .mts_firmware = 1,
654 .has_dvb = 1,
655 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
656 .ir_codes = ir_codes_hauppauge_new,
657 .decoder = EM28XX_TVP5150,
658 .input = { {
659 .type = EM28XX_VMUX_TELEVISION,
660 .vmux = TVP5150_COMPOSITE0,
661 .amux = EM28XX_AMUX_VIDEO,
662 .gpio = hauppauge_wintv_hvr_900_analog,
663 }, {
664 .type = EM28XX_VMUX_COMPOSITE1,
665 .vmux = TVP5150_COMPOSITE1,
666 .amux = EM28XX_AMUX_LINE_IN,
667 .gpio = hauppauge_wintv_hvr_900_analog,
668 }, {
669 .type = EM28XX_VMUX_SVIDEO,
670 .vmux = TVP5150_SVIDEO,
671 .amux = EM28XX_AMUX_LINE_IN,
672 .gpio = hauppauge_wintv_hvr_900_analog,
673 } },
674 },
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -0300675 [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
Mauro Carvalho Chehab3abee532008-01-05 17:01:41 -0300676 .name = "Hauppauge WinTV HVR 950",
Mauro Carvalho Chehab3abee532008-01-05 17:01:41 -0300677 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300678 .tuner_gpio = default_tuner_gpio,
Mauro Carvalho Chehab3abee532008-01-05 17:01:41 -0300679 .mts_firmware = 1,
Mauro Carvalho Chehab227ad4a2008-04-17 21:37:40 -0300680 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300681 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Devin Heitmueller4b922532008-11-13 03:15:55 -0300682 .ir_codes = ir_codes_hauppauge_new,
Mauro Carvalho Chehab3abee532008-01-05 17:01:41 -0300683 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300684 .input = { {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300685 .type = EM28XX_VMUX_TELEVISION,
686 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300687 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300688 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300689 }, {
Mauro Carvalho Chehab7d070e22007-11-01 21:52:58 -0300690 .type = EM28XX_VMUX_COMPOSITE1,
691 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300692 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300693 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300694 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300695 .type = EM28XX_VMUX_SVIDEO,
696 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300697 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300698 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300699 } },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300700 },
Devin Heitmueller4fd305b2008-06-04 13:43:46 -0300701 [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
702 .name = "Pinnacle PCTV HD Pro Stick",
Devin Heitmueller4fd305b2008-06-04 13:43:46 -0300703 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300704 .tuner_gpio = default_tuner_gpio,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -0300705 .mts_firmware = 1,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -0300706 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300707 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Devin Heitmueller4b922532008-11-13 03:15:55 -0300708 .ir_codes = ir_codes_pinnacle_pctv_hd,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -0300709 .decoder = EM28XX_TVP5150,
710 .input = { {
711 .type = EM28XX_VMUX_TELEVISION,
712 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300713 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300714 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -0300715 }, {
716 .type = EM28XX_VMUX_COMPOSITE1,
717 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300718 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300719 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -0300720 }, {
721 .type = EM28XX_VMUX_SVIDEO,
722 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300723 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300724 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmueller4fd305b2008-06-04 13:43:46 -0300725 } },
726 },
Devin Heitmuellere14b3652008-07-26 11:04:33 -0300727 [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
728 .name = "AMD ATI TV Wonder HD 600",
Devin Heitmuellere14b3652008-07-26 11:04:33 -0300729 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300730 .tuner_gpio = default_tuner_gpio,
Devin Heitmuellere14b3652008-07-26 11:04:33 -0300731 .mts_firmware = 1,
Devin Heitmuellere14b3652008-07-26 11:04:33 -0300732 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300733 .dvb_gpio = hauppauge_wintv_hvr_900_digital,
Devin Heitmueller60245e82008-11-16 08:03:53 -0300734 .ir_codes = ir_codes_ati_tv_wonder_hd_600,
Devin Heitmuellere14b3652008-07-26 11:04:33 -0300735 .decoder = EM28XX_TVP5150,
736 .input = { {
737 .type = EM28XX_VMUX_TELEVISION,
738 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300739 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300740 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmuellere14b3652008-07-26 11:04:33 -0300741 }, {
742 .type = EM28XX_VMUX_COMPOSITE1,
743 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300744 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300745 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmuellere14b3652008-07-26 11:04:33 -0300746 }, {
747 .type = EM28XX_VMUX_SVIDEO,
748 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300749 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300750 .gpio = hauppauge_wintv_hvr_900_analog,
Devin Heitmuellere14b3652008-07-26 11:04:33 -0300751 } },
752 },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300753 [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300754 .name = "Terratec Hybrid XS",
755 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300756 .tuner_gpio = default_tuner_gpio,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300757 .decoder = EM28XX_TVP5150,
reinhard schwab655b8402008-07-26 10:47:00 -0300758 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300759 .dvb_gpio = default_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300760 .input = { {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300761 .type = EM28XX_VMUX_TELEVISION,
762 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300763 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300764 .gpio = default_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300765 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300766 .type = EM28XX_VMUX_COMPOSITE1,
767 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300768 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300769 .gpio = default_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300770 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300771 .type = EM28XX_VMUX_SVIDEO,
772 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300773 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300774 .gpio = default_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300775 } },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300776 },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300777 /* maybe there's a reason behind it why Terratec sells the Hybrid XS
778 as Prodigy XS with a different PID, let's keep it separated for now
779 maybe we'll need it lateron */
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300780 [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
781 .name = "Terratec Prodigy XS",
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300782 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300783 .tuner_gpio = default_tuner_gpio,
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300784 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300785 .input = { {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300786 .type = EM28XX_VMUX_TELEVISION,
787 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300788 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300789 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300790 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300791 .type = EM28XX_VMUX_COMPOSITE1,
792 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300793 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300794 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300795 }, {
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300796 .type = EM28XX_VMUX_SVIDEO,
797 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300798 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300799 .gpio = hauppauge_wintv_hvr_900_analog,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300800 } },
Mauro Carvalho Chehab12466572007-10-24 11:08:20 -0300801 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800802 [EM2820_BOARD_MSI_VOX_USB_2] = {
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -0300803 .name = "MSI VOX USB 2.0",
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -0300804 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
805 .tda9887_conf = TDA9887_PRESENT |
806 TDA9887_PORT1_ACTIVE |
807 TDA9887_PORT2_ACTIVE,
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -0300808 .max_range_640_480 = 1,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300809 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -0300810 .input = { {
811 .type = EM28XX_VMUX_TELEVISION,
812 .vmux = SAA7115_COMPOSITE4,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300813 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300814 }, {
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -0300815 .type = EM28XX_VMUX_COMPOSITE1,
816 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300817 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300818 }, {
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -0300819 .type = EM28XX_VMUX_SVIDEO,
820 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300821 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300822 } },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800823 },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800824 [EM2800_BOARD_TERRATEC_CINERGY_200] = {
825 .name = "Terratec Cinergy 200 USB",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800826 .is_em2800 = 1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800827 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
828 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300829 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300830 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800831 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300832 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300833 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300834 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800835 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300836 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300837 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300838 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800839 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300840 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300841 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300842 } },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800843 },
Aron Szabo59d07f12008-07-27 13:47:52 -0300844 [EM2800_BOARD_GRABBEEX_USB2800] = {
845 .name = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
846 .is_em2800 = 1,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300847 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300848 .tuner_type = TUNER_ABSENT, /* capture only board */
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300849 .input = { {
Aron Szabo59d07f12008-07-27 13:47:52 -0300850 .type = EM28XX_VMUX_COMPOSITE1,
851 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300852 .amux = EM28XX_AMUX_LINE_IN,
Aron Szabo59d07f12008-07-27 13:47:52 -0300853 }, {
854 .type = EM28XX_VMUX_SVIDEO,
855 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300856 .amux = EM28XX_AMUX_LINE_IN,
Aron Szabo59d07f12008-07-27 13:47:52 -0300857 } },
858 },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800859 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
860 .name = "Leadtek Winfast USB II",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800861 .is_em2800 = 1,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800862 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
863 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300864 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300865 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800866 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300867 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300868 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300869 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800870 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300871 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300872 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300873 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800874 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300875 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300876 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300877 } },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800878 },
879 [EM2800_BOARD_KWORLD_USB2800] = {
880 .name = "Kworld USB2800",
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800881 .is_em2800 = 1,
Michael Krufkyab8b8702008-04-22 14:46:05 -0300882 .tuner_type = TUNER_PHILIPS_FCV1236D,
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800883 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300884 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300885 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800886 .type = EM28XX_VMUX_TELEVISION,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300887 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300888 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300889 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800890 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300891 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300892 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300893 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800894 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300895 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300896 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300897 } },
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800898 },
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800899 [EM2820_BOARD_PINNACLE_DVC_90] = {
Aurelien Jarnoaec2aef2007-12-17 13:49:17 -0300900 .name = "Pinnacle Dazzle DVC 90/DVC 100",
Mauro Carvalho Chehab1c67e762008-11-27 07:46:59 -0300901 .tuner_type = TUNER_ABSENT, /* capture only board */
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300902 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300903 .input = { {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800904 .type = EM28XX_VMUX_COMPOSITE1,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300905 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300906 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300907 }, {
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -0800908 .type = EM28XX_VMUX_SVIDEO,
Hans Verkuilc7c0b342006-04-02 13:35:00 -0300909 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300910 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300911 } },
Mauro Carvalho Chehab45632c42005-11-08 21:38:15 -0800912 },
Sascha Sommer43625592007-11-03 15:05:07 -0300913 [EM2800_BOARD_VGEAR_POCKETTV] = {
914 .name = "V-Gear PocketTV",
915 .is_em2800 = 1,
Sascha Sommer43625592007-11-03 15:05:07 -0300916 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
917 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300918 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300919 .input = { {
Sascha Sommer43625592007-11-03 15:05:07 -0300920 .type = EM28XX_VMUX_TELEVISION,
921 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300922 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300923 }, {
Sascha Sommer43625592007-11-03 15:05:07 -0300924 .type = EM28XX_VMUX_COMPOSITE1,
925 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300926 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300927 }, {
Sascha Sommer43625592007-11-03 15:05:07 -0300928 .type = EM28XX_VMUX_SVIDEO,
929 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300930 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300931 } },
Sascha Sommer43625592007-11-03 15:05:07 -0300932 },
Douglas Schilling Landgraf1e1addd2008-12-27 21:38:14 -0300933 [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
934 .name = "Pixelview PlayTV Box 4 USB 2.0",
935 .tda9887_conf = TDA9887_PRESENT,
936 .tuner_type = TUNER_YMEC_TVF_5533MF,
937 .decoder = EM28XX_SAA711X,
938 .input = { {
939 .type = EM28XX_VMUX_TELEVISION,
940 .vmux = SAA7115_COMPOSITE2,
941 .amux = EM28XX_AMUX_VIDEO,
942 .aout = EM28XX_AOUT_MONO | /* I2S */
943 EM28XX_AOUT_MASTER, /* Line out pin */
944 }, {
945 .type = EM28XX_VMUX_COMPOSITE1,
946 .vmux = SAA7115_COMPOSITE0,
947 .amux = EM28XX_AMUX_LINE_IN,
948 }, {
949 .type = EM28XX_VMUX_SVIDEO,
950 .vmux = SAA7115_SVIDEO3,
951 .amux = EM28XX_AMUX_LINE_IN,
952 } },
953 },
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -0300954 [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
955 .name = "Pixelview Prolink PlayTV USB 2.0",
Douglas Schilling Landgraf5609cfd2008-12-27 21:39:35 -0300956 .has_snapshot_button = 1,
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -0300957 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabed086312008-01-24 06:59:20 -0300958 .tuner_type = TUNER_YMEC_TVF_5533MF,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300959 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300960 .input = { {
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -0300961 .type = EM28XX_VMUX_TELEVISION,
962 .vmux = SAA7115_COMPOSITE2,
Mauro Carvalho Chehab30e4ac72008-11-20 13:43:05 -0300963 .amux = EM28XX_AMUX_VIDEO,
964 .aout = EM28XX_AOUT_MONO | /* I2S */
965 EM28XX_AOUT_MASTER, /* Line out pin */
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300966 }, {
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -0300967 .type = EM28XX_VMUX_COMPOSITE1,
968 .vmux = SAA7115_COMPOSITE0,
Mauro Carvalho Chehab7463dda2008-02-05 22:29:26 -0300969 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300970 }, {
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -0300971 .type = EM28XX_VMUX_SVIDEO,
972 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab7463dda2008-02-05 22:29:26 -0300973 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -0300974 } },
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -0300975 },
Devin Heitmuellera9fc52b2008-06-28 08:57:06 -0300976 [EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA] = {
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300977 .name = "PointNix Intra-Oral Camera",
Devin Heitmuellera9fc52b2008-06-28 08:57:06 -0300978 .has_snapshot_button = 1,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300979 .tda9887_conf = TDA9887_PRESENT,
980 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -0300981 .decoder = EM28XX_SAA711X,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300982 .input = { {
Devin Heitmuellera9fc52b2008-06-28 08:57:06 -0300983 .type = EM28XX_VMUX_SVIDEO,
984 .vmux = SAA7115_SVIDEO3,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300985 .amux = EM28XX_AMUX_VIDEO,
Devin Heitmuellera9fc52b2008-06-28 08:57:06 -0300986 } },
987 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300988 [EM2880_BOARD_MSI_DIGIVOX_AD] = {
989 .name = "MSI DigiVox A/D",
990 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300991 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -0300992 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300993 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -0300994 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300995 .type = EM28XX_VMUX_TELEVISION,
996 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -0300997 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -0300998 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -0300999 }, {
1000 .type = EM28XX_VMUX_COMPOSITE1,
1001 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001002 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001003 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001004 }, {
1005 .type = EM28XX_VMUX_SVIDEO,
1006 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001007 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001008 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001009 } },
1010 },
1011 [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
1012 .name = "MSI DigiVox A/D II",
1013 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001014 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001015 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001016 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001017 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001018 .type = EM28XX_VMUX_TELEVISION,
1019 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001020 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001021 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001022 }, {
1023 .type = EM28XX_VMUX_COMPOSITE1,
1024 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001025 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001026 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001027 }, {
1028 .type = EM28XX_VMUX_SVIDEO,
1029 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001030 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001031 .gpio = em2880_msi_digivox_ad_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001032 } },
1033 },
1034 [EM2880_BOARD_KWORLD_DVB_305U] = {
1035 .name = "KWorld DVB-T 305U",
1036 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001037 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001038 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001039 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001040 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001041 .type = EM28XX_VMUX_TELEVISION,
1042 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001043 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001044 }, {
1045 .type = EM28XX_VMUX_COMPOSITE1,
1046 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001047 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001048 }, {
1049 .type = EM28XX_VMUX_SVIDEO,
1050 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001051 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001052 } },
1053 },
1054 [EM2880_BOARD_KWORLD_DVB_310U] = {
1055 .name = "KWorld DVB-T 310U",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001056 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001057 .tuner_gpio = default_tuner_gpio,
Darron Broadda3808e2008-09-30 02:46:41 -03001058 .has_dvb = 1,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001059 .dvb_gpio = default_digital,
Darron Broadda3808e2008-09-30 02:46:41 -03001060 .mts_firmware = 1,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001061 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001062 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001063 .type = EM28XX_VMUX_TELEVISION,
1064 .vmux = TVP5150_COMPOSITE0,
Darron Broadda3808e2008-09-30 02:46:41 -03001065 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001066 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001067 }, {
1068 .type = EM28XX_VMUX_COMPOSITE1,
1069 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehaba42aa192008-11-19 11:08:53 -03001070 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001071 .gpio = default_analog,
Darron Broadda3808e2008-09-30 02:46:41 -03001072 }, { /* S-video has not been tested yet */
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001073 .type = EM28XX_VMUX_SVIDEO,
1074 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehaba42aa192008-11-19 11:08:53 -03001075 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001076 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001077 } },
1078 },
1079 [EM2881_BOARD_DNT_DA2_HYBRID] = {
1080 .name = "DNT DA2 Hybrid",
1081 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001082 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001083 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001084 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001085 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001086 .type = EM28XX_VMUX_TELEVISION,
1087 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001088 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001089 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001090 }, {
1091 .type = EM28XX_VMUX_COMPOSITE1,
1092 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001093 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001094 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001095 }, {
1096 .type = EM28XX_VMUX_SVIDEO,
1097 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001098 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001099 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001100 } },
1101 },
1102 [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
1103 .name = "Pinnacle Hybrid Pro",
1104 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001105 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001106 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001107 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001108 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001109 .type = EM28XX_VMUX_TELEVISION,
1110 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001111 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001112 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001113 }, {
1114 .type = EM28XX_VMUX_COMPOSITE1,
1115 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001116 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001117 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001118 }, {
1119 .type = EM28XX_VMUX_SVIDEO,
1120 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001121 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001122 .gpio = default_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001123 } },
1124 },
1125 [EM2882_BOARD_PINNACLE_HYBRID_PRO] = {
1126 .name = "Pinnacle Hybrid Pro (2)",
1127 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001128 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001129 .tuner_gpio = default_tuner_gpio,
Eugeniy Meshcheryakova674a3b2008-08-01 08:23:41 -03001130 .mts_firmware = 1,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001131 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001132 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001133 .type = EM28XX_VMUX_TELEVISION,
1134 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001135 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001136 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001137 }, {
1138 .type = EM28XX_VMUX_COMPOSITE1,
1139 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001140 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001141 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001142 }, {
1143 .type = EM28XX_VMUX_SVIDEO,
1144 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001145 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001146 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001147 } },
1148 },
1149 [EM2882_BOARD_KWORLD_VS_DVBT] = {
1150 .name = "Kworld VS-DVB-T 323UR",
1151 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001152 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001153 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001154 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001155 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001156 .type = EM28XX_VMUX_TELEVISION,
1157 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001158 .amux = EM28XX_AMUX_VIDEO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001159 }, {
1160 .type = EM28XX_VMUX_COMPOSITE1,
1161 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001162 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001163 }, {
1164 .type = EM28XX_VMUX_SVIDEO,
1165 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001166 .amux = EM28XX_AMUX_LINE_IN,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001167 } },
1168 },
1169 [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
1170 .name = "Terratec Hybrid XS (em2882)",
1171 .valid = EM28XX_BOARD_NOT_VALIDATED,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001172 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001173 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001174 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001175 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001176 .type = EM28XX_VMUX_TELEVISION,
1177 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001178 .amux = EM28XX_AMUX_VIDEO,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001179 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001180 }, {
1181 .type = EM28XX_VMUX_COMPOSITE1,
1182 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001183 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001184 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001185 }, {
1186 .type = EM28XX_VMUX_SVIDEO,
1187 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001188 .amux = EM28XX_AMUX_LINE_IN,
Mauro Carvalho Chehab122b77e2008-11-27 07:42:26 -03001189 .gpio = hauppauge_wintv_hvr_900_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001190 } },
1191 },
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001192 [EM2883_BOARD_KWORLD_HYBRID_330U] = {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001193 .name = "Kworld PlusTV HD Hybrid 330",
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001194 .tuner_type = TUNER_XC2028,
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001195 .tuner_gpio = default_tuner_gpio,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001196 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabbe2c6db2008-12-09 15:43:10 -03001197 .mts_firmware = 1,
1198 .has_dvb = 1,
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001199 .dvb_gpio = kworld_330u_digital,
1200 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
1201 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_EEPROM_ON_BOARD | EM28XX_I2C_EEPROM_KEY_VALID,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001202 .input = { {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001203 .type = EM28XX_VMUX_TELEVISION,
1204 .vmux = TVP5150_COMPOSITE0,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001205 .amux = EM28XX_AMUX_VIDEO,
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001206 .gpio = kworld_330u_analog,
1207 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001208 }, {
1209 .type = EM28XX_VMUX_COMPOSITE1,
1210 .vmux = TVP5150_COMPOSITE1,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001211 .amux = EM28XX_AMUX_LINE_IN,
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001212 .gpio = kworld_330u_analog,
1213 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001214 }, {
1215 .type = EM28XX_VMUX_SVIDEO,
1216 .vmux = TVP5150_SVIDEO,
Mauro Carvalho Chehab8a5caa62008-11-19 11:10:50 -03001217 .amux = EM28XX_AMUX_LINE_IN,
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001218 .gpio = kworld_330u_analog,
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001219 } },
1220 },
Mauro Carvalho Chehabee281b82008-07-27 16:58:04 -03001221 [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
Vitaly Woold3603342008-07-27 14:10:11 -03001222 .name = "Compro VideoMate ForYou/Stereo",
Vitaly Woold3603342008-07-27 14:10:11 -03001223 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
1224 .tda9887_conf = TDA9887_PRESENT,
1225 .decoder = EM28XX_TVP5150,
Mauro Carvalho Chehabd4d889e2008-11-25 09:10:25 -03001226 .input = { {
Vitaly Woold3603342008-07-27 14:10:11 -03001227 .type = EM28XX_VMUX_TELEVISION,
1228 .vmux = TVP5150_COMPOSITE0,
1229 .amux = EM28XX_AMUX_LINE_IN,
1230 }, {
1231 .type = EM28XX_VMUX_SVIDEO,
1232 .vmux = TVP5150_SVIDEO,
1233 .amux = EM28XX_AMUX_LINE_IN,
1234 } },
1235 },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001236};
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001237const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001238
1239/* table of devices that work with this driver */
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001240struct usb_device_id em28xx_id_table [] = {
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001241 { USB_DEVICE(0xeb1a, 0x2750),
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001242 .driver_info = EM2750_BOARD_UNKNOWN },
1243 { USB_DEVICE(0xeb1a, 0x2751),
1244 .driver_info = EM2750_BOARD_UNKNOWN },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001245 { USB_DEVICE(0xeb1a, 0x2800),
1246 .driver_info = EM2800_BOARD_UNKNOWN },
1247 { USB_DEVICE(0xeb1a, 0x2820),
1248 .driver_info = EM2820_BOARD_UNKNOWN },
1249 { USB_DEVICE(0xeb1a, 0x2821),
Devin Heitmuellerc665f4d2008-12-16 23:35:23 -03001250 .driver_info = EM2820_BOARD_UNKNOWN },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001251 { USB_DEVICE(0xeb1a, 0x2860),
1252 .driver_info = EM2820_BOARD_UNKNOWN },
1253 { USB_DEVICE(0xeb1a, 0x2861),
1254 .driver_info = EM2820_BOARD_UNKNOWN },
1255 { USB_DEVICE(0xeb1a, 0x2870),
1256 .driver_info = EM2820_BOARD_UNKNOWN },
1257 { USB_DEVICE(0xeb1a, 0x2881),
1258 .driver_info = EM2820_BOARD_UNKNOWN },
1259 { USB_DEVICE(0xeb1a, 0x2883),
1260 .driver_info = EM2820_BOARD_UNKNOWN },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001261 { USB_DEVICE(0xeb1a, 0xe300),
1262 .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
1263 { USB_DEVICE(0xeb1a, 0xe305),
1264 .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
1265 { USB_DEVICE(0xeb1a, 0xe310),
1266 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
1267 { USB_DEVICE(0xeb1a, 0xa316),
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001268 .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001269 { USB_DEVICE(0xeb1a, 0xe320),
1270 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
1271 { USB_DEVICE(0xeb1a, 0xe323),
1272 .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
1273 { USB_DEVICE(0xeb1a, 0xe350),
1274 .driver_info = EM2870_BOARD_KWORLD_350U },
1275 { USB_DEVICE(0xeb1a, 0xe355),
1276 .driver_info = EM2870_BOARD_KWORLD_355U },
1277 { USB_DEVICE(0xeb1a, 0x2801),
1278 .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
1279 { USB_DEVICE(0xeb1a, 0xe357),
1280 .driver_info = EM2870_BOARD_KWORLD_355U },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001281 { USB_DEVICE(0x0ccd, 0x0036),
1282 .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001283 { USB_DEVICE(0x0ccd, 0x004c),
1284 .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
1285 { USB_DEVICE(0x0ccd, 0x004f),
1286 .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
1287 { USB_DEVICE(0x0ccd, 0x005e),
1288 .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
1289 { USB_DEVICE(0x0ccd, 0x0042),
1290 .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS },
1291 { USB_DEVICE(0x0ccd, 0x0043),
1292 .driver_info = EM2870_BOARD_TERRATEC_XS },
1293 { USB_DEVICE(0x0ccd, 0x0047),
1294 .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
1295 { USB_DEVICE(0x185b, 0x2870),
1296 .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
Vitaly Woold3603342008-07-27 14:10:11 -03001297 { USB_DEVICE(0x185b, 0x2041),
Mauro Carvalho Chehabee281b82008-07-27 16:58:04 -03001298 .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001299 { USB_DEVICE(0x2040, 0x4200),
1300 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
Mauro Carvalho Chehab15b9bec2008-01-13 12:02:20 -03001301 { USB_DEVICE(0x2040, 0x4201),
1302 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001303 { USB_DEVICE(0x2040, 0x6500),
1304 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
Luc Saillard427d20c2008-01-30 17:23:00 -03001305 { USB_DEVICE(0x2040, 0x6502),
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001306 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
Michael Krufky74ee0512008-05-01 18:02:30 -03001307 { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03001308 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
Michael Krufky74ee0512008-05-01 18:02:30 -03001309 { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03001310 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
Michael Krufky74ee0512008-05-01 18:02:30 -03001311 { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03001312 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
Douglas Schilling Landgraff89bc322008-12-01 21:01:04 -03001313 { USB_DEVICE(0x2040, 0x651f),
1314 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
Devin Heitmuellere14b3652008-07-26 11:04:33 -03001315 { USB_DEVICE(0x0438, 0xb002),
1316 .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001317 { USB_DEVICE(0x2001, 0xf112),
1318 .driver_info = EM2820_BOARD_DLINK_USB_TV },
1319 { USB_DEVICE(0x2304, 0x0207),
1320 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1321 { USB_DEVICE(0x2304, 0x0208),
1322 .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
1323 { USB_DEVICE(0x2304, 0x021a),
1324 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1325 { USB_DEVICE(0x2304, 0x0226),
1326 .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO },
1327 { USB_DEVICE(0x2304, 0x0227),
1328 .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
1329 { USB_DEVICE(0x0413, 0x6023),
1330 .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
1331 { USB_DEVICE(0x093b, 0xa005),
1332 .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001333 { },
1334};
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001335MODULE_DEVICE_TABLE(usb, em28xx_id_table);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001336
Mauro Carvalho Chehab102a0b02008-04-17 21:40:45 -03001337/*
Mauro Carvalho Chehab102a0b02008-04-17 21:40:45 -03001338 * EEPROM hash table for devices with generic USB IDs
1339 */
Mauro Carvalho Chehabd2ba0552007-11-04 08:32:42 -03001340static struct em28xx_hash_table em28xx_eeprom_hash [] = {
Mauro Carvalho Chehabea4fd562007-11-03 21:21:57 -03001341 /* P/N: SA 60002070465 Tuner: TVF7533-MF */
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001342 {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
Douglas Schilling Landgraf1e1addd2008-12-27 21:38:14 -03001343 {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
Darron Broadda3808e2008-09-30 02:46:41 -03001344 {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001345};
1346
Mauro Carvalho Chehabd2ba0552007-11-04 08:32:42 -03001347/* I2C devicelist hash table for devices with generic USB IDs */
Sascha Sommerfad7b952007-11-04 08:06:48 -03001348static struct em28xx_hash_table em28xx_i2c_hash[] = {
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001349 {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
1350 {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
Devin Heitmuellera9fc52b2008-06-28 08:57:06 -03001351 {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT},
Sascha Sommerfad7b952007-11-04 08:06:48 -03001352};
1353
Michael Krufkyd7cba042008-09-12 13:31:45 -03001354int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03001355{
Mauro Carvalho Chehab102a0b02008-04-17 21:40:45 -03001356 int rc = 0;
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03001357 struct em28xx *dev = ptr;
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03001358
1359 if (dev->tuner_type != TUNER_XC2028)
1360 return 0;
1361
1362 if (command != XC2028_TUNER_RESET)
1363 return 0;
1364
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001365 rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03001366
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03001367 return rc;
1368}
1369EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
1370
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03001371static void inline em28xx_set_model(struct em28xx *dev)
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03001372{
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03001373 memcpy(&dev->board, &em28xx_boards[dev->model], sizeof(dev->board));
Devin Heitmuellered14e1c2008-12-29 22:27:30 -03001374
1375 /* Those are the default values for the majority of boards
1376 Use those values if not specified otherwise at boards entry
1377 */
1378 if (!dev->board.xclk)
1379 dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE |
1380 EM28XX_XCLK_FREQUENCY_12MHZ;
1381
1382 if (!dev->board.i2c_speed)
1383 dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
1384 EM28XX_I2C_FREQ_100_KHZ;
Mauro Carvalho Chehabee6e3a82008-04-17 21:37:31 -03001385}
1386
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001387/* Since em28xx_pre_card_setup() requires a proper dev->model,
1388 * this won't work for boards with generic PCI IDs
1389 */
Markus Rechbergera94e95b2006-01-23 17:11:10 -02001390void em28xx_pre_card_setup(struct em28xx *dev)
1391{
Mauro Carvalho Chehab89b329e2008-04-17 21:42:14 -03001392 int rc;
1393
Mauro Carvalho Chehab1bee0182008-11-25 10:06:21 -03001394 em28xx_set_model(dev);
1395
Mauro Carvalho Chehab8c239982008-11-28 23:46:43 -03001396 em28xx_info("Identified as %s (card=%d)\n",
1397 dev->board.name, dev->model);
Mauro Carvalho Chehab1bee0182008-11-25 10:06:21 -03001398
Devin Heitmueller6a1acc32008-11-12 02:05:06 -03001399 /* Set the default GPO/GPIO for legacy devices */
1400 dev->reg_gpo_num = EM2880_R04_GPO;
1401 dev->reg_gpio_num = EM28XX_R08_GPIO;
Mauro Carvalho Chehabc67ec532008-04-17 21:48:00 -03001402
Mauro Carvalho Chehab89b329e2008-04-17 21:42:14 -03001403 dev->wait_after_write = 5;
Devin Heitmueller6a1acc32008-11-12 02:05:06 -03001404
1405 /* Based on the Chip ID, set the device configuration */
Mauro Carvalho Chehab41facaa2008-04-17 21:44:58 -03001406 rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
Mauro Carvalho Chehab89b329e2008-04-17 21:42:14 -03001407 if (rc > 0) {
Devin Heitmueller600bd7f2008-11-12 02:05:02 -03001408 dev->chip_id = rc;
Mauro Carvalho Chehab1bee0182008-11-25 10:06:21 -03001409
1410 switch (dev->chip_id) {
Devin Heitmueller67c96f62008-11-18 05:05:46 -03001411 case CHIP_ID_EM2750:
1412 em28xx_info("chip ID is em2750\n");
1413 break;
Mauro Carvalho Chehabf09fb532008-11-16 10:40:21 -03001414 case CHIP_ID_EM2820:
1415 em28xx_info("chip ID is em2820\n");
1416 break;
1417 case CHIP_ID_EM2840:
1418 em28xx_info("chip ID is em2840\n");
1419 break;
Devin Heitmuellera8a1f8c2008-06-10 12:35:42 -03001420 case CHIP_ID_EM2860:
1421 em28xx_info("chip ID is em2860\n");
1422 break;
Devin Heitmuellerb1fa26c2008-12-16 23:15:33 -03001423 case CHIP_ID_EM2870:
1424 em28xx_info("chip ID is em2870\n");
1425 dev->wait_after_write = 0;
1426 break;
Devin Heitmueller5caeba02008-11-12 02:04:48 -03001427 case CHIP_ID_EM2874:
1428 em28xx_info("chip ID is em2874\n");
Devin Heitmueller6a1acc32008-11-12 02:05:06 -03001429 dev->reg_gpio_num = EM2874_R80_GPIO;
Devin Heitmueller5caeba02008-11-12 02:04:48 -03001430 dev->wait_after_write = 0;
1431 break;
Mauro Carvalho Chehab2ba890e2008-04-17 21:42:58 -03001432 case CHIP_ID_EM2883:
Mauro Carvalho Chehab89b329e2008-04-17 21:42:14 -03001433 em28xx_info("chip ID is em2882/em2883\n");
1434 dev->wait_after_write = 0;
1435 break;
1436 default:
Mauro Carvalho Chehab1bee0182008-11-25 10:06:21 -03001437 em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
Mauro Carvalho Chehab89b329e2008-04-17 21:42:14 -03001438 }
1439 }
Devin Heitmueller6a1acc32008-11-12 02:05:06 -03001440
1441 /* Prepopulate cached GPO register content */
1442 rc = em28xx_read_reg(dev, dev->reg_gpo_num);
1443 if (rc >= 0)
1444 dev->reg_gpo = rc;
1445
Devin Heitmuellered14e1c2008-12-29 22:27:30 -03001446 /* Set the initial XCLK and I2C clock values based on the board
1447 definition */
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03001448 em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
1449 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -03001450 msleep(50);
1451
Markus Rechbergera94e95b2006-01-23 17:11:10 -02001452 /* request some modules */
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001453 switch (dev->model) {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001454 case EM2861_BOARD_PLEXTOR_PX_TV100U:
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001455 /* FIXME guess */
1456 /* Turn on analog audio output */
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001457 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001458 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001459 case EM2861_BOARD_KWORLD_PVRTV_300U:
1460 case EM2880_BOARD_KWORLD_DVB_305U:
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001461 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x6d);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001462 msleep(10);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001463 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001464 msleep(10);
1465 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001466 case EM2870_BOARD_COMPRO_VIDEOMATE:
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001467 /* TODO: someone can do some cleanup here...
1468 not everything's needed */
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001469 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001470 msleep(10);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001471 em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001472 msleep(10);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001473 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001474 mdelay(70);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001475 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001476 mdelay(70);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001477 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xdc);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001478 mdelay(70);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001479 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001480 mdelay(70);
1481 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001482 case EM2870_BOARD_TERRATEC_XS_MT2060:
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001483 /* this device needs some gpio writes to get the DVB-T
1484 demod work */
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001485 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001486 mdelay(70);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001487 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001488 mdelay(70);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001489 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001490 mdelay(70);
1491 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001492 case EM2870_BOARD_PINNACLE_PCTV_DVB:
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001493 /* this device needs some gpio writes to get the
1494 DVB-T demod work */
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001495 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001496 mdelay(70);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001497 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001498 mdelay(70);
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001499 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001500 mdelay(70);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001501 break;
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001502 case EM2820_BOARD_GADMEI_UTV310:
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001503 case EM2820_BOARD_MSI_VOX_USB_2:
Mauro Carvalho Chehaba2070c62008-11-25 07:05:06 -03001504 /* enables audio for that devices */
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001505 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
Mauro Carvalho Chehab102a0b02008-04-17 21:40:45 -03001506 break;
1507 }
Mauro Carvalho Chehabc67ec532008-04-17 21:48:00 -03001508
Mauro Carvalho Chehab017ab4b2008-11-27 09:21:55 -03001509 em28xx_gpio_set(dev, dev->board.tuner_gpio);
Mauro Carvalho Chehabc67ec532008-04-17 21:48:00 -03001510 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
1511
1512 /* Unlock device */
Mauro Carvalho Chehab2fe3e2e2008-11-27 09:10:40 -03001513 em28xx_set_mode(dev, EM28XX_SUSPEND);
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001514}
1515
Mauro Carvalho Chehabe54318e2008-04-18 18:34:31 -03001516static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
Mauro Carvalho Chehab3ca9c092008-04-17 21:37:53 -03001517{
1518 memset(ctl, 0, sizeof(*ctl));
1519
1520 ctl->fname = XC2028_DEFAULT_FIRMWARE;
1521 ctl->max_len = 64;
1522 ctl->mts = em28xx_boards[dev->model].mts_firmware;
1523
1524 switch (dev->model) {
Mauro Carvalho Chehabe77ebda2008-04-18 18:37:25 -03001525 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1526 ctl->demod = XC3028_FE_ZARLINK456;
1527 break;
reinhard schwab655b8402008-07-26 10:47:00 -03001528 case EM2880_BOARD_TERRATEC_HYBRID_XS:
1529 ctl->demod = XC3028_FE_ZARLINK456;
1530 break;
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001531 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1532 /* djh - Not sure which demod we need here */
1533 ctl->demod = XC3028_FE_DEFAULT;
1534 break;
Devin Heitmueller5ea7fe42008-09-16 02:02:12 -03001535 case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
1536 ctl->demod = XC3028_FE_DEFAULT;
1537 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
1538 break;
Douglas Schilling Landgraff89bc322008-12-01 21:01:04 -03001539 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03001540 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
Devin Heitmueller4fd305b2008-06-04 13:43:46 -03001541 case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
Mauro Carvalho Chehabe77ebda2008-04-18 18:37:25 -03001542 /* FIXME: Better to specify the needed IF */
Devin Heitmuellerbdfbf952008-04-17 21:38:27 -03001543 ctl->demod = XC3028_FE_DEFAULT;
1544 break;
Robert Krakora6e7b9ea2009-01-18 21:59:34 -03001545 case EM2883_BOARD_KWORLD_HYBRID_330U:
1546 ctl->demod = XC3028_FE_CHINA;
1547 ctl->fname = XC2028_DEFAULT_FIRMWARE;
1548 break;
Mauro Carvalho Chehab3ca9c092008-04-17 21:37:53 -03001549 default:
1550 ctl->demod = XC3028_FE_OREN538;
1551 }
1552}
Mauro Carvalho Chehab3ca9c092008-04-17 21:37:53 -03001553
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001554static void em28xx_config_tuner(struct em28xx *dev)
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -03001555{
1556 struct v4l2_priv_tun_config xc2028_cfg;
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001557 struct tuner_setup tun_setup;
1558 struct v4l2_frequency f;
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -03001559
Mauro Carvalho Chehabed086312008-01-24 06:59:20 -03001560 if (dev->tuner_type == TUNER_ABSENT)
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001561 return;
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -03001562
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001563 tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
1564 tun_setup.type = dev->tuner_type;
1565 tun_setup.addr = dev->tuner_addr;
1566 tun_setup.tuner_callback = em28xx_tuner_callback;
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -03001567
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001568 em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup);
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -03001569
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001570 if (dev->tuner_type == TUNER_XC2028) {
Mauro Carvalho Chehab3ca9c092008-04-17 21:37:53 -03001571 struct xc2028_ctrl ctl;
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001572
Mauro Carvalho Chehab3ca9c092008-04-17 21:37:53 -03001573 em28xx_setup_xc3028(dev, &ctl);
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001574
1575 xc2028_cfg.tuner = TUNER_XC2028;
1576 xc2028_cfg.priv = &ctl;
1577
1578 em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg);
1579 }
1580
1581 /* configure tuner */
1582 f.tuner = 0;
1583 f.type = V4L2_TUNER_ANALOG_TV;
1584 f.frequency = 9076; /* just a magic number */
1585 dev->ctl_freq = f.frequency;
1586 em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f);
1587}
1588
1589static int em28xx_hint_board(struct em28xx *dev)
1590{
1591 int i;
1592
Mauro Carvalho Chehabd2ba0552007-11-04 08:32:42 -03001593 /* HINT method: EEPROM
1594 *
1595 * This method works only for boards with eeprom.
1596 * Uses a hash of all eeprom bytes. The hash should be
1597 * unique for a vendor/tuner pair.
1598 * There are a high chance that tuners for different
1599 * video standards produce different hashes.
1600 */
1601 for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
1602 if (dev->hash == em28xx_eeprom_hash[i].hash) {
1603 dev->model = em28xx_eeprom_hash[i].model;
1604 dev->tuner_type = em28xx_eeprom_hash[i].tuner;
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001605
1606 em28xx_errdev("Your board has no unique USB ID.\n");
1607 em28xx_errdev("A hint were successfully done, "
1608 "based on eeprom hash.\n");
1609 em28xx_errdev("This method is not 100%% failproof.\n");
1610 em28xx_errdev("If the board were missdetected, "
1611 "please email this log to:\n");
1612 em28xx_errdev("\tV4L Mailing List "
1613 " <video4linux-list@redhat.com>\n");
1614 em28xx_errdev("Board detected as %s\n",
1615 em28xx_boards[dev->model].name);
1616
1617 return 0;
1618 }
1619 }
Sascha Sommerfad7b952007-11-04 08:06:48 -03001620
Mauro Carvalho Chehabd2ba0552007-11-04 08:32:42 -03001621 /* HINT method: I2C attached devices
1622 *
1623 * This method works for all boards.
1624 * Uses a hash of i2c scanned devices.
1625 * Devices with the same i2c attached chips will
1626 * be considered equal.
1627 * This method is less precise than the eeprom one.
1628 */
1629
Sascha Sommerfad7b952007-11-04 08:06:48 -03001630 /* user did not request i2c scanning => do it now */
1631 if (!dev->i2c_hash)
1632 em28xx_do_i2c_scan(dev);
1633
1634 for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
1635 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
1636 dev->model = em28xx_i2c_hash[i].model;
1637 dev->tuner_type = em28xx_i2c_hash[i].tuner;
1638 em28xx_errdev("Your board has no unique USB ID.\n");
1639 em28xx_errdev("A hint were successfully done, "
1640 "based on i2c devicelist hash.\n");
1641 em28xx_errdev("This method is not 100%% failproof.\n");
1642 em28xx_errdev("If the board were missdetected, "
1643 "please email this log to:\n");
1644 em28xx_errdev("\tV4L Mailing List "
1645 " <video4linux-list@redhat.com>\n");
1646 em28xx_errdev("Board detected as %s\n",
1647 em28xx_boards[dev->model].name);
1648
1649 return 0;
1650 }
1651 }
1652
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001653 em28xx_errdev("Your board has no unique USB ID and thus need a "
1654 "hint to be detected.\n");
1655 em28xx_errdev("You may try to use card=<n> insmod option to "
1656 "workaround that.\n");
1657 em28xx_errdev("Please send an email with this log to:\n");
1658 em28xx_errdev("\tV4L Mailing List <video4linux-list@redhat.com>\n");
1659 em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
Sascha Sommerfad7b952007-11-04 08:06:48 -03001660 em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001661
1662 em28xx_errdev("Here is a list of valid choices for the card=<n>"
1663 " insmod option:\n");
1664 for (i = 0; i < em28xx_bcount; i++) {
1665 em28xx_errdev(" card=%d -> %s\n",
1666 i, em28xx_boards[i].name);
1667 }
1668 return -1;
Mauro Carvalho Chehab882876b2007-10-29 11:33:18 -03001669}
1670
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -03001671/* ----------------------------------------------------------------------- */
1672void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir)
1673{
1674 if (disable_ir) {
1675 ir->get_key = NULL;
1676 return ;
1677 }
1678
1679 /* detect & configure */
1680 switch (dev->model) {
1681 case (EM2800_BOARD_UNKNOWN):
1682 break;
1683 case (EM2820_BOARD_UNKNOWN):
1684 break;
1685 case (EM2800_BOARD_TERRATEC_CINERGY_200):
1686 case (EM2820_BOARD_TERRATEC_CINERGY_250):
1687 ir->ir_codes = ir_codes_em_terratec;
1688 ir->get_key = em28xx_get_key_terratec;
1689 snprintf(ir->c.name, sizeof(ir->c.name),
1690 "i2c IR (EM28XX Terratec)");
1691 break;
1692 case (EM2820_BOARD_PINNACLE_USB_2):
1693 ir->ir_codes = ir_codes_pinnacle_grey;
1694 ir->get_key = em28xx_get_key_pinnacle_usb_grey;
1695 snprintf(ir->c.name, sizeof(ir->c.name),
1696 "i2c IR (EM28XX Pinnacle PCTV)");
1697 break;
1698 case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
1699 ir->ir_codes = ir_codes_hauppauge_new;
1700 ir->get_key = em28xx_get_key_em_haup;
1701 snprintf(ir->c.name, sizeof(ir->c.name),
1702 "i2c IR (EM2840 Hauppauge)");
1703 break;
1704 case (EM2820_BOARD_MSI_VOX_USB_2):
1705 break;
1706 case (EM2800_BOARD_LEADTEK_WINFAST_USBII):
1707 break;
1708 case (EM2800_BOARD_KWORLD_USB2800):
1709 break;
Aron Szabo59d07f12008-07-27 13:47:52 -03001710 case (EM2800_BOARD_GRABBEEX_USB2800):
1711 break;
Mauro Carvalho Chehabc8793b02008-01-13 15:42:17 -03001712 }
1713}
1714
Mauro Carvalho Chehab3acf2802005-11-08 21:38:27 -08001715void em28xx_card_setup(struct em28xx *dev)
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001716{
Mauro Carvalho Chehabf8b60302007-11-05 08:42:55 -03001717 em28xx_set_model(dev);
1718
1719 dev->tuner_type = em28xx_boards[dev->model].tuner_type;
Mauro Carvalho Chehab31e05302008-11-20 18:47:37 -03001720 if (em28xx_boards[dev->model].tuner_addr)
1721 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr;
Mauro Carvalho Chehabf8b60302007-11-05 08:42:55 -03001722
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001723 /* request some modules */
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001724 switch (dev->model) {
1725 case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
Mauro Carvalho Chehab98ae1272007-11-05 09:30:39 -03001726 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
Devin Heitmueller17d9d552008-06-08 10:22:03 -03001727 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
Douglas Schilling Landgraff89bc322008-12-01 21:01:04 -03001728 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
Mauro Carvalho Chehab10ac6602008-07-27 14:58:58 -03001729 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001730 {
1731 struct tveeprom tv;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001732#ifdef CONFIG_MODULES
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001733 request_module("tveeprom");
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001734#endif
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001735 /* Call first TVeeprom */
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001736
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001737 dev->i2c_client.addr = 0xa0 >> 1;
1738 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001739
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001740 dev->tuner_type = tv.tuner_type;
Mauro Carvalho Chehabed086312008-01-24 06:59:20 -03001741
Hans Verkuil38f9d302008-07-23 05:09:15 -03001742 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) {
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001743 dev->i2s_speed = 2048000;
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03001744 dev->board.has_msp34xx = 1;
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001745 }
Mauro Carvalho Chehab98ae1272007-11-05 09:30:39 -03001746#ifdef CONFIG_MODULES
1747 if (tv.has_ir)
1748 request_module("ir-kbd-i2c");
1749#endif
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001750 break;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001751 }
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001752 case EM2820_BOARD_KWORLD_PVRTV2800RF:
1753 /* GPIO enables sound on KWORLD PVR TV 2800RF */
Devin Heitmueller6d676d82008-11-25 06:04:02 -03001754 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9);
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001755 break;
1756 case EM2820_BOARD_UNKNOWN:
1757 case EM2800_BOARD_UNKNOWN:
Darron Broadda3808e2008-09-30 02:46:41 -03001758 /*
1759 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
1760 *
1761 * This occurs because they share identical USB vendor and
1762 * product IDs.
1763 *
1764 * What we do here is look up the EEPROM hash of the K-WORLD
1765 * and if it is found then we decide that we do not have
1766 * a DIGIVOX and reset the device to the K-WORLD instead.
1767 *
1768 * This solution is only valid if they do not share eeprom
1769 * hash identities which has not been determined as yet.
1770 */
1771 case EM2880_BOARD_MSI_DIGIVOX_AD:
Mauro Carvalho Chehabf8b60302007-11-05 08:42:55 -03001772 if (!em28xx_hint_board(dev))
1773 em28xx_set_model(dev);
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001774 break;
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001775 }
1776
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03001777 if (dev->board.has_snapshot_button)
Devin Heitmuellera9fc52b2008-06-28 08:57:06 -03001778 em28xx_register_snapshot_button(dev);
1779
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03001780 if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
Douglas Schilling Landgraf95b86a92008-07-27 14:03:32 -03001781 em28xx_errdev("\n\n");
1782 em28xx_errdev("The support for this board weren't "
1783 "valid yet.\n");
1784 em28xx_errdev("Please send a report of having this working\n");
1785 em28xx_errdev("not to V4L mailing list (and/or to other "
1786 "addresses)\n\n");
1787 }
1788
Mauro Carvalho Chehabf8b60302007-11-05 08:42:55 -03001789 /* Allow override tuner type by a module parameter */
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001790 if (tuner >= 0)
1791 dev->tuner_type = tuner;
1792
1793#ifdef CONFIG_MODULES
1794 /* request some modules */
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03001795 if (dev->board.has_msp34xx)
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001796 request_module("msp3400");
Mauro Carvalho Chehabec5de992008-11-25 09:43:29 -03001797 if (dev->board.decoder == EM28XX_SAA711X)
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001798 request_module("saa7115");
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03001799 if (dev->board.decoder == EM28XX_TVP5150)
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001800 request_module("tvp5150");
Mauro Carvalho Chehab505b6d02008-11-25 09:39:50 -03001801 if (dev->board.tuner_type != TUNER_ABSENT)
Mauro Carvalho Chehab03910cc2007-11-03 21:20:59 -03001802 request_module("tuner");
1803#endif
1804
Mauro Carvalho Chehabc23f5942007-11-23 14:22:14 -03001805 em28xx_config_tuner(dev);
Mauro Carvalho Chehaba924a492008-11-12 08:41:29 -03001806
1807 em28xx_ir_init(dev);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001808}
Mauro Carvalho Chehabc8644052008-11-25 13:10:14 -03001809
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03001810
1811#if defined(CONFIG_MODULES) && defined(MODULE)
1812static void request_module_async(struct work_struct *work)
1813{
1814 struct em28xx *dev = container_of(work,
1815 struct em28xx, request_module_wk);
1816
1817 if (dev->has_audio_class)
1818 request_module("snd-usb-audio");
1819 else if (dev->has_alsa_audio)
1820 request_module("em28xx-alsa");
1821
1822 if (dev->board.has_dvb)
1823 request_module("em28xx-dvb");
1824}
1825
1826static void request_modules(struct em28xx *dev)
1827{
1828 INIT_WORK(&dev->request_module_wk, request_module_async);
1829 schedule_work(&dev->request_module_wk);
1830}
1831#else
1832#define request_modules(dev)
1833#endif /* CONFIG_MODULES */
1834
1835/*
1836 * em28xx_realease_resources()
1837 * unregisters the v4l2,i2c and usb devices
1838 * called when the device gets disconected or at module unload
1839*/
1840void em28xx_release_resources(struct em28xx *dev)
1841{
1842 if (dev->sbutton_input_dev)
1843 em28xx_deregister_snapshot_button(dev);
1844
1845 if (dev->ir)
1846 em28xx_ir_fini(dev);
1847
1848 /*FIXME: I2C IR should be disconnected */
1849
1850 em28xx_release_analog_resources(dev);
1851
1852 em28xx_remove_from_devlist(dev);
1853
1854 em28xx_i2c_unregister(dev);
1855 usb_put_dev(dev->udev);
1856
1857 /* Mark device as unused */
1858 em28xx_devused &= ~(1 << dev->devno);
1859};
1860
1861/*
1862 * em28xx_init_dev()
1863 * allocates and inits the device structs, registers i2c bus and v4l device
1864 */
Mauro Carvalho Chehab26cdc762009-01-05 01:00:40 -03001865static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03001866 int minor)
1867{
1868 struct em28xx *dev = *devhandle;
1869 int retval = -ENOMEM;
1870 int errCode;
1871
1872 dev->udev = udev;
1873 mutex_init(&dev->ctrl_urb_lock);
1874 spin_lock_init(&dev->slock);
1875 init_waitqueue_head(&dev->open);
1876 init_waitqueue_head(&dev->wait_frame);
1877 init_waitqueue_head(&dev->wait_stream);
1878
1879 dev->em28xx_write_regs = em28xx_write_regs;
1880 dev->em28xx_read_reg = em28xx_read_reg;
1881 dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
1882 dev->em28xx_write_regs_req = em28xx_write_regs_req;
1883 dev->em28xx_read_reg_req = em28xx_read_reg_req;
1884 dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
1885
1886 em28xx_pre_card_setup(dev);
1887
1888 if (!dev->board.is_em2800) {
1889 /* Sets I2C speed to 100 KHz */
1890 retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
1891 if (retval < 0) {
1892 em28xx_errdev("%s: em28xx_write_regs_req failed!"
1893 " retval [%d]\n",
1894 __func__, retval);
1895 return retval;
1896 }
1897 }
1898
1899 /* register i2c bus */
1900 errCode = em28xx_i2c_register(dev);
1901 if (errCode < 0) {
1902 em28xx_errdev("%s: em28xx_i2c_register - errCode [%d]!\n",
1903 __func__, errCode);
1904 return errCode;
1905 }
1906
1907 /* Do board specific init and eeprom reading */
1908 em28xx_card_setup(dev);
1909
1910 /* Configure audio */
1911 errCode = em28xx_audio_setup(dev);
1912 if (errCode < 0) {
1913 em28xx_errdev("%s: Error while setting audio - errCode [%d]!\n",
1914 __func__, errCode);
1915 }
1916
1917 /* wake i2c devices */
1918 em28xx_wake_i2c(dev);
1919
1920 /* init video dma queues */
1921 INIT_LIST_HEAD(&dev->vidq.active);
1922 INIT_LIST_HEAD(&dev->vidq.queued);
1923
1924
1925 if (dev->board.has_msp34xx) {
1926 /* Send a reset to other chips via gpio */
1927 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
1928 if (errCode < 0) {
1929 em28xx_errdev("%s: em28xx_write_regs_req - "
1930 "msp34xx(1) failed! errCode [%d]\n",
1931 __func__, errCode);
1932 return errCode;
1933 }
1934 msleep(3);
1935
1936 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
1937 if (errCode < 0) {
1938 em28xx_errdev("%s: em28xx_write_regs_req - "
1939 "msp34xx(2) failed! errCode [%d]\n",
1940 __func__, errCode);
1941 return errCode;
1942 }
1943 msleep(3);
1944 }
1945
1946 em28xx_add_into_devlist(dev);
1947
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03001948 retval = em28xx_register_analog_devices(dev);
1949 if (retval < 0) {
1950 em28xx_release_resources(dev);
1951 goto fail_reg_devices;
1952 }
1953
1954 em28xx_init_extension(dev);
1955
1956 /* Save some power by putting tuner to sleep */
1957 em28xx_i2c_call_clients(dev, TUNER_SET_STANDBY, NULL);
1958
1959 return 0;
1960
1961fail_reg_devices:
1962 return retval;
1963}
1964
1965/*
1966 * em28xx_usb_probe()
1967 * checks for supported devices
1968 */
1969static int em28xx_usb_probe(struct usb_interface *interface,
1970 const struct usb_device_id *id)
1971{
1972 const struct usb_endpoint_descriptor *endpoint;
1973 struct usb_device *udev;
1974 struct usb_interface *uif;
1975 struct em28xx *dev = NULL;
1976 int retval = -ENODEV;
1977 int i, nr, ifnum, isoc_pipe;
1978 char *speed;
1979 char descr[255] = "";
1980
1981 udev = usb_get_dev(interface_to_usbdev(interface));
1982 ifnum = interface->altsetting[0].desc.bInterfaceNumber;
1983
1984 /* Check to see next free device and mark as used */
1985 nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS);
1986 em28xx_devused |= 1<<nr;
1987
1988 /* Don't register audio interfaces */
1989 if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
1990 em28xx_err(DRIVER_NAME " audio device (%04x:%04x): "
1991 "interface %i, class %i\n",
1992 le16_to_cpu(udev->descriptor.idVendor),
1993 le16_to_cpu(udev->descriptor.idProduct),
1994 ifnum,
1995 interface->altsetting[0].desc.bInterfaceClass);
1996
1997 em28xx_devused &= ~(1<<nr);
1998 return -ENODEV;
1999 }
2000
2001 endpoint = &interface->cur_altsetting->endpoint[0].desc;
2002
2003 /* check if the device has the iso in endpoint at the correct place */
Julia Lawall13417982008-12-29 21:49:22 -03002004 if (usb_endpoint_xfer_isoc(endpoint)
2005 &&
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002006 (interface->altsetting[1].endpoint[0].desc.wMaxPacketSize == 940)) {
2007 /* It's a newer em2874/em2875 device */
2008 isoc_pipe = 0;
2009 } else {
2010 int check_interface = 1;
2011 isoc_pipe = 1;
2012 endpoint = &interface->cur_altsetting->endpoint[1].desc;
Julia Lawall2230c3c2009-01-03 16:53:10 -03002013 if (!usb_endpoint_xfer_isoc(endpoint))
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002014 check_interface = 0;
2015
Julia Lawall13417982008-12-29 21:49:22 -03002016 if (usb_endpoint_dir_out(endpoint))
Mauro Carvalho Chehab1a23f812008-12-28 22:18:14 -03002017 check_interface = 0;
2018
2019 if (!check_interface) {
2020 em28xx_err(DRIVER_NAME " video device (%04x:%04x): "
2021 "interface %i, class %i found.\n",
2022 le16_to_cpu(udev->descriptor.idVendor),
2023 le16_to_cpu(udev->descriptor.idProduct),
2024 ifnum,
2025 interface->altsetting[0].desc.bInterfaceClass);
2026
2027 em28xx_err(DRIVER_NAME " This is an anciliary "
2028 "interface not used by the driver\n");
2029
2030 em28xx_devused &= ~(1<<nr);
2031 return -ENODEV;
2032 }
2033 }
2034
2035 switch (udev->speed) {
2036 case USB_SPEED_LOW:
2037 speed = "1.5";
2038 break;
2039 case USB_SPEED_UNKNOWN:
2040 case USB_SPEED_FULL:
2041 speed = "12";
2042 break;
2043 case USB_SPEED_HIGH:
2044 speed = "480";
2045 break;
2046 default:
2047 speed = "unknown";
2048 }
2049
2050 if (udev->manufacturer)
2051 strlcpy(descr, udev->manufacturer, sizeof(descr));
2052
2053 if (udev->product) {
2054 if (*descr)
2055 strlcat(descr, " ", sizeof(descr));
2056 strlcat(descr, udev->product, sizeof(descr));
2057 }
2058 if (*descr)
2059 strlcat(descr, " ", sizeof(descr));
2060
2061 printk(DRIVER_NAME ": New device %s@ %s Mbps "
2062 "(%04x:%04x, interface %d, class %d)\n",
2063 descr,
2064 speed,
2065 le16_to_cpu(udev->descriptor.idVendor),
2066 le16_to_cpu(udev->descriptor.idProduct),
2067 ifnum,
2068 interface->altsetting->desc.bInterfaceNumber);
2069
2070 if (nr >= EM28XX_MAXBOARDS) {
2071 printk(DRIVER_NAME ": Supports only %i em28xx boards.\n",
2072 EM28XX_MAXBOARDS);
2073 em28xx_devused &= ~(1<<nr);
2074 return -ENOMEM;
2075 }
2076
2077 /* allocate memory for our device state and initialize it */
2078 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
2079 if (dev == NULL) {
2080 em28xx_err(DRIVER_NAME ": out of memory!\n");
2081 em28xx_devused &= ~(1<<nr);
2082 return -ENOMEM;
2083 }
2084
2085 snprintf(dev->name, 29, "em28xx #%d", nr);
2086 dev->devno = nr;
2087 dev->model = id->driver_info;
2088 dev->alt = -1;
2089
2090 /* Checks if audio is provided by some interface */
2091 for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
2092 uif = udev->config->interface[i];
2093 if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
2094 dev->has_audio_class = 1;
2095 break;
2096 }
2097 }
2098
2099 /* compute alternate max packet sizes */
2100 uif = udev->actconfig->interface[0];
2101
2102 dev->num_alt = uif->num_altsetting;
2103 dev->alt_max_pkt_size = kmalloc(32 * dev->num_alt, GFP_KERNEL);
2104
2105 if (dev->alt_max_pkt_size == NULL) {
2106 em28xx_errdev("out of memory!\n");
2107 em28xx_devused &= ~(1<<nr);
2108 kfree(dev);
2109 return -ENOMEM;
2110 }
2111
2112 for (i = 0; i < dev->num_alt ; i++) {
2113 u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
2114 dev->alt_max_pkt_size[i] =
2115 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
2116 }
2117
2118 if ((card[nr] >= 0) && (card[nr] < em28xx_bcount))
2119 dev->model = card[nr];
2120
2121 /* allocate device struct */
2122 mutex_init(&dev->lock);
2123 mutex_lock(&dev->lock);
2124 retval = em28xx_init_dev(&dev, udev, nr);
2125 if (retval) {
2126 em28xx_devused &= ~(1<<dev->devno);
2127 kfree(dev);
2128
2129 return retval;
2130 }
2131
2132 /* save our data pointer in this interface device */
2133 usb_set_intfdata(interface, dev);
2134
2135 request_modules(dev);
2136
2137 /* Should be the last thing to do, to avoid newer udev's to
2138 open the device before fully initializing it
2139 */
2140 mutex_unlock(&dev->lock);
2141
2142 return 0;
2143}
2144
2145/*
2146 * em28xx_usb_disconnect()
2147 * called when the device gets diconencted
2148 * video device will be unregistered on v4l2_close in case it is still open
2149 */
2150static void em28xx_usb_disconnect(struct usb_interface *interface)
2151{
2152 struct em28xx *dev;
2153
2154 dev = usb_get_intfdata(interface);
2155 usb_set_intfdata(interface, NULL);
2156
2157 if (!dev)
2158 return;
2159
2160 em28xx_info("disconnecting %s\n", dev->vdev->name);
2161
2162 /* wait until all current v4l2 io is finished then deallocate
2163 resources */
2164 mutex_lock(&dev->lock);
2165
2166 wake_up_interruptible_all(&dev->open);
2167
2168 if (dev->users) {
2169 em28xx_warn
2170 ("device /dev/video%d is open! Deregistration and memory "
2171 "deallocation are deferred on close.\n",
2172 dev->vdev->num);
2173
2174 dev->state |= DEV_MISCONFIGURED;
2175 em28xx_uninit_isoc(dev);
2176 dev->state |= DEV_DISCONNECTED;
2177 wake_up_interruptible(&dev->wait_frame);
2178 wake_up_interruptible(&dev->wait_stream);
2179 } else {
2180 dev->state |= DEV_DISCONNECTED;
2181 em28xx_release_resources(dev);
2182 }
2183
2184 em28xx_close_extension(dev);
2185
2186 mutex_unlock(&dev->lock);
2187
2188 if (!dev->users) {
2189 kfree(dev->alt_max_pkt_size);
2190 kfree(dev);
2191 }
2192}
2193
2194static struct usb_driver em28xx_usb_driver = {
2195 .name = "em28xx",
2196 .probe = em28xx_usb_probe,
2197 .disconnect = em28xx_usb_disconnect,
2198 .id_table = em28xx_id_table,
2199};
2200
2201static int __init em28xx_module_init(void)
2202{
2203 int result;
2204
2205 /* register this driver with the USB subsystem */
2206 result = usb_register(&em28xx_usb_driver);
2207 if (result)
2208 em28xx_err(DRIVER_NAME
2209 " usb_register failed. Error number %d.\n", result);
2210
2211 printk(KERN_INFO DRIVER_NAME " driver loaded\n");
2212
2213 return result;
2214}
2215
2216static void __exit em28xx_module_exit(void)
2217{
2218 /* deregister this driver with the USB subsystem */
2219 usb_deregister(&em28xx_usb_driver);
2220}
2221
2222module_init(em28xx_module_init);
2223module_exit(em28xx_module_exit);