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