4bb2fe8bce0b9bc175192a32b518be6e9ca65072
[linux-2.6.git] / drivers / media / video / ivtv / ivtv-cards.c
1 /*
2     Functions to query card hardware
3     Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
4     Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
5
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "ivtv-driver.h"
22 #include "ivtv-cards.h"
23 #include "ivtv-i2c.h"
24
25 #include <media/msp3400.h>
26 #include <media/m52790.h>
27 #include <media/wm8775.h>
28 #include <media/cs53l32a.h>
29 #include <media/cx25840.h>
30 #include <media/upd64031a.h>
31
32 #define MSP_TUNER  MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, \
33                                 MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER)
34 #define MSP_SCART1 MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, \
35                                 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
36 #define MSP_SCART2 MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1, \
37                                 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
38 #define MSP_SCART3 MSP_INPUT(MSP_IN_SCART3, MSP_IN_TUNER1, \
39                                 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
40 #define MSP_MONO   MSP_INPUT(MSP_IN_MONO, MSP_IN_TUNER1, \
41                                 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
42
43 /********************** card configuration *******************************/
44
45 /* Please add new PCI IDs to: http://pci-ids.ucw.cz/iii
46    This keeps the PCI ID database up to date. Note that the entries
47    must be added under vendor 0x4444 (Conexant) as subsystem IDs.
48    New vendor IDs should still be added to the vendor ID list. */
49
50 /* Hauppauge PVR-250 cards */
51
52 /* Note: for Hauppauge cards the tveeprom information is used instead of PCI IDs */
53 static const struct ivtv_card ivtv_card_pvr250 = {
54         .type = IVTV_CARD_PVR_250,
55         .name = "Hauppauge WinTV PVR-250",
56         .v4l2_capabilities = IVTV_CAP_ENCODER,
57         .hw_video = IVTV_HW_SAA7115,
58         .hw_audio = IVTV_HW_MSP34XX,
59         .hw_audio_ctrl = IVTV_HW_MSP34XX,
60         .hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7115 |
61                   IVTV_HW_TVEEPROM | IVTV_HW_TUNER,
62         .video_inputs = {
63                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
64                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
65                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
66                 { IVTV_CARD_INPUT_SVIDEO2,    2, IVTV_SAA71XX_SVIDEO1    },
67                 { IVTV_CARD_INPUT_COMPOSITE2, 2, IVTV_SAA71XX_COMPOSITE1 },
68                 { IVTV_CARD_INPUT_COMPOSITE3, 1, IVTV_SAA71XX_COMPOSITE5 },
69         },
70         .audio_inputs = {
71                 { IVTV_CARD_INPUT_AUD_TUNER,  MSP_TUNER  },
72                 { IVTV_CARD_INPUT_LINE_IN1,   MSP_SCART1 },
73                 { IVTV_CARD_INPUT_LINE_IN2,   MSP_SCART3 },
74         },
75         .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
76 };
77
78 /* ------------------------------------------------------------------------- */
79
80 /* Hauppauge PVR-350 cards */
81
82 /* Outputs for Hauppauge PVR350 cards */
83 static struct ivtv_card_output ivtv_pvr350_outputs[] = {
84         {
85                 .name = "S-Video + Composite",
86                 .video_output = 0,
87         }, {
88                 .name = "Composite",
89                 .video_output = 1,
90         }, {
91                 .name = "S-Video",
92                 .video_output = 2,
93         }, {
94                 .name = "RGB",
95                 .video_output = 3,
96         }, {
97                 .name = "YUV C",
98                 .video_output = 4,
99         }, {
100                 .name = "YUV V",
101                 .video_output = 5,
102         }
103 };
104
105 static const struct ivtv_card ivtv_card_pvr350 = {
106         .type = IVTV_CARD_PVR_350,
107         .name = "Hauppauge WinTV PVR-350",
108         .v4l2_capabilities = IVTV_CAP_ENCODER | IVTV_CAP_DECODER,
109         .video_outputs = ivtv_pvr350_outputs,
110         .nof_outputs = ARRAY_SIZE(ivtv_pvr350_outputs),
111         .hw_video = IVTV_HW_SAA7115,
112         .hw_audio = IVTV_HW_MSP34XX,
113         .hw_audio_ctrl = IVTV_HW_MSP34XX,
114         .hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7115 |
115                   IVTV_HW_SAA7127 | IVTV_HW_TVEEPROM | IVTV_HW_TUNER,
116         .video_inputs = {
117                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
118                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
119                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
120                 { IVTV_CARD_INPUT_SVIDEO2,    2, IVTV_SAA71XX_SVIDEO1    },
121                 { IVTV_CARD_INPUT_COMPOSITE2, 2, IVTV_SAA71XX_COMPOSITE1 },
122                 { IVTV_CARD_INPUT_COMPOSITE3, 1, IVTV_SAA71XX_COMPOSITE5 },
123         },
124         .audio_inputs = {
125                 { IVTV_CARD_INPUT_AUD_TUNER,  MSP_TUNER  },
126                 { IVTV_CARD_INPUT_LINE_IN1,   MSP_SCART1 },
127                 { IVTV_CARD_INPUT_LINE_IN2,   MSP_SCART3 },
128         },
129         .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
130 };
131
132 /* PVR-350 V1 boards have a different audio tuner input and use a
133    saa7114 instead of a saa7115.
134    Note that the info below comes from a pre-production model so it may
135    not be correct. Especially the audio behaves strangely (mono only it seems) */
136 static const struct ivtv_card ivtv_card_pvr350_v1 = {
137         .type = IVTV_CARD_PVR_350_V1,
138         .name = "Hauppauge WinTV PVR-350 (V1)",
139         .v4l2_capabilities = IVTV_CAP_ENCODER | IVTV_CAP_DECODER,
140         .video_outputs = ivtv_pvr350_outputs,
141         .nof_outputs = ARRAY_SIZE(ivtv_pvr350_outputs),
142         .hw_video = IVTV_HW_SAA7114,
143         .hw_audio = IVTV_HW_MSP34XX,
144         .hw_audio_ctrl = IVTV_HW_MSP34XX,
145         .hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7114 |
146                   IVTV_HW_SAA7127 | IVTV_HW_TVEEPROM | IVTV_HW_TUNER,
147         .video_inputs = {
148                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
149                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
150                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
151                 { IVTV_CARD_INPUT_SVIDEO2,    2, IVTV_SAA71XX_SVIDEO1    },
152                 { IVTV_CARD_INPUT_COMPOSITE2, 2, IVTV_SAA71XX_COMPOSITE1 },
153                 { IVTV_CARD_INPUT_COMPOSITE3, 1, IVTV_SAA71XX_COMPOSITE5 },
154         },
155         .audio_inputs = {
156                 { IVTV_CARD_INPUT_AUD_TUNER,  MSP_MONO   },
157                 { IVTV_CARD_INPUT_LINE_IN1,   MSP_SCART1 },
158                 { IVTV_CARD_INPUT_LINE_IN2,   MSP_SCART3 },
159         },
160         .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
161 };
162
163 /* ------------------------------------------------------------------------- */
164
165 /* Hauppauge PVR-150/PVR-500 cards */
166
167 static const struct ivtv_card ivtv_card_pvr150 = {
168         .type = IVTV_CARD_PVR_150,
169         .name = "Hauppauge WinTV PVR-150",
170         .v4l2_capabilities = IVTV_CAP_ENCODER,
171         .hw_video = IVTV_HW_CX25840,
172         .hw_audio = IVTV_HW_CX25840,
173         .hw_audio_ctrl = IVTV_HW_CX25840,
174         .hw_muxer = IVTV_HW_WM8775,
175         .hw_all = IVTV_HW_WM8775 | IVTV_HW_CX25840 |
176                   IVTV_HW_TVEEPROM | IVTV_HW_TUNER,
177         .video_inputs = {
178                 { IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE7 },
179                 { IVTV_CARD_INPUT_SVIDEO1,    1, CX25840_SVIDEO1    },
180                 { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE3 },
181                 { IVTV_CARD_INPUT_SVIDEO2,    2, CX25840_SVIDEO2    },
182                 { IVTV_CARD_INPUT_COMPOSITE2, 2, CX25840_COMPOSITE4 },
183         },
184         .audio_inputs = {
185                 { IVTV_CARD_INPUT_AUD_TUNER,
186                   CX25840_AUDIO8, WM8775_AIN2 },
187                 { IVTV_CARD_INPUT_LINE_IN1,
188                   CX25840_AUDIO_SERIAL, WM8775_AIN2 },
189                 { IVTV_CARD_INPUT_LINE_IN2,
190                   CX25840_AUDIO_SERIAL, WM8775_AIN3 },
191         },
192         .radio_input = { IVTV_CARD_INPUT_AUD_TUNER,
193                          CX25840_AUDIO_SERIAL, WM8775_AIN4 },
194         /* apparently needed for the IR blaster */
195         .gpio_init = { .direction = 0x1f01, .initial_value = 0x26f3 },
196 };
197
198 /* ------------------------------------------------------------------------- */
199
200 /* AVerMedia M179 cards */
201
202 static const struct ivtv_card_pci_info ivtv_pci_m179[] = {
203         { PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_AVERMEDIA, 0xa3cf },
204         { PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_AVERMEDIA, 0xa3ce },
205         { 0, 0, 0 }
206 };
207
208 static const struct ivtv_card ivtv_card_m179 = {
209         .type = IVTV_CARD_M179,
210         .name = "AVerMedia M179",
211         .v4l2_capabilities = IVTV_CAP_ENCODER,
212         .hw_video = IVTV_HW_SAA7114,
213         .hw_audio = IVTV_HW_GPIO,
214         .hw_audio_ctrl = IVTV_HW_GPIO,
215         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7114 | IVTV_HW_TUNER,
216         .video_inputs = {
217                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
218                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
219                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
220         },
221         .audio_inputs = {
222                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
223                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
224         },
225         .gpio_init = { .direction = 0xe380, .initial_value = 0x8290 },
226         .gpio_audio_input  = { .mask = 0x8040, .tuner  = 0x8000, .linein = 0x0000 },
227         .gpio_audio_mute   = { .mask = 0x2000, .mute   = 0x2000 },
228         .gpio_audio_mode   = { .mask = 0x4300, .mono   = 0x4000, .stereo = 0x0200,
229                               .lang1 = 0x0200, .lang2  = 0x0100, .both   = 0x0000 },
230         .gpio_audio_freq   = { .mask = 0x0018, .f32000 = 0x0000,
231                              .f44100 = 0x0008, .f48000 = 0x0010 },
232         .gpio_audio_detect = { .mask = 0x4000, .stereo = 0x0000 },
233         .tuners = {
234                 /* As far as we know all M179 cards use this tuner */
235                 { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_NTSC },
236         },
237         .pci_list = ivtv_pci_m179,
238 };
239
240 /* ------------------------------------------------------------------------- */
241
242 /* Yuan MPG600/Kuroutoshikou ITVC16-STVLP cards */
243
244 static const struct ivtv_card_pci_info ivtv_pci_mpg600[] = {
245         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0xfff3 },
246         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0xffff },
247         { 0, 0, 0 }
248 };
249
250 static const struct ivtv_card ivtv_card_mpg600 = {
251         .type = IVTV_CARD_MPG600,
252         .name = "Yuan MPG600, Kuroutoshikou ITVC16-STVLP",
253         .v4l2_capabilities = IVTV_CAP_ENCODER,
254         .hw_video = IVTV_HW_SAA7115,
255         .hw_audio = IVTV_HW_GPIO,
256         .hw_audio_ctrl = IVTV_HW_GPIO,
257         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER,
258         .video_inputs = {
259                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
260                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
261                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
262         },
263         .audio_inputs = {
264                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
265                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
266         },
267         .gpio_init = { .direction = 0x3080, .initial_value = 0x0004 },
268         .gpio_audio_input  = { .mask = 0x3000, .tuner  = 0x0000, .linein = 0x2000 },
269         .gpio_audio_mute   = { .mask = 0x0001, .mute   = 0x0001 },
270         .gpio_audio_mode   = { .mask = 0x000e, .mono   = 0x0006, .stereo = 0x0004,
271                               .lang1 = 0x0004, .lang2  = 0x0000, .both   = 0x0008 },
272         .gpio_audio_detect = { .mask = 0x0900, .stereo = 0x0100 },
273         .tuners = {
274                 /* The PAL tuner is confirmed */
275                 { .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FQ1216ME },
276                 { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
277         },
278         .pci_list = ivtv_pci_mpg600,
279 };
280
281 /* ------------------------------------------------------------------------- */
282
283 /* Yuan MPG160/Kuroutoshikou ITVC15-STVLP cards */
284
285 static const struct ivtv_card_pci_info ivtv_pci_mpg160[] = {
286         { PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_YUAN1, 0 },
287         { PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_IODATA, 0x40a0 },
288         { 0, 0, 0 }
289 };
290
291 static const struct ivtv_card ivtv_card_mpg160 = {
292         .type = IVTV_CARD_MPG160,
293         .name = "YUAN MPG160, Kuroutoshikou ITVC15-STVLP, I/O Data GV-M2TV/PCI",
294         .v4l2_capabilities = IVTV_CAP_ENCODER,
295         .hw_video = IVTV_HW_SAA7114,
296         .hw_audio = IVTV_HW_GPIO,
297         .hw_audio_ctrl = IVTV_HW_GPIO,
298         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7114 | IVTV_HW_TUNER,
299         .video_inputs = {
300                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
301                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
302                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
303         },
304         .audio_inputs = {
305                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
306                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
307         },
308         .gpio_init = { .direction = 0x7080, .initial_value = 0x400c },
309         .gpio_audio_input  = { .mask = 0x3000, .tuner  = 0x0000, .linein = 0x2000 },
310         .gpio_audio_mute   = { .mask = 0x0001, .mute   = 0x0001 },
311         .gpio_audio_mode   = { .mask = 0x000e, .mono   = 0x0006, .stereo = 0x0004,
312                               .lang1 = 0x0004, .lang2  = 0x0000, .both   = 0x0008 },
313         .gpio_audio_detect = { .mask = 0x0900, .stereo = 0x0100 },
314         .tuners = {
315                 { .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FQ1216ME },
316                 { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
317         },
318         .pci_list = ivtv_pci_mpg160,
319 };
320
321 /* ------------------------------------------------------------------------- */
322
323 /* Yuan PG600/Diamond PVR-550 cards */
324
325 static const struct ivtv_card_pci_info ivtv_pci_pg600[] = {
326         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_DIAMONDMM, 0x0070 },
327         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN3,     0x0600 },
328         { 0, 0, 0 }
329 };
330
331 static const struct ivtv_card ivtv_card_pg600 = {
332         .type = IVTV_CARD_PG600,
333         .name = "Yuan PG600, Diamond PVR-550",
334         .v4l2_capabilities = IVTV_CAP_ENCODER,
335         .hw_video = IVTV_HW_CX25840,
336         .hw_audio = IVTV_HW_CX25840,
337         .hw_audio_ctrl = IVTV_HW_CX25840,
338         .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
339         .video_inputs = {
340                 { IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
341                 { IVTV_CARD_INPUT_SVIDEO1,    1,
342                   CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
343                 { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
344         },
345         .audio_inputs = {
346                 { IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5       },
347                 { IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL },
348         },
349         .tuners = {
350                 { .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FQ1216ME },
351                 { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
352         },
353         .pci_list = ivtv_pci_pg600,
354 };
355
356 /* ------------------------------------------------------------------------- */
357
358 /* Adaptec VideOh! AVC-2410 card */
359
360 static const struct ivtv_card_pci_info ivtv_pci_avc2410[] = {
361         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ADAPTEC, 0x0093 },
362         { 0, 0, 0 }
363 };
364
365 static const struct ivtv_card ivtv_card_avc2410 = {
366         .type = IVTV_CARD_AVC2410,
367         .name = "Adaptec VideOh! AVC-2410",
368         .v4l2_capabilities = IVTV_CAP_ENCODER,
369         .hw_video = IVTV_HW_SAA7115,
370         .hw_audio = IVTV_HW_MSP34XX,
371         .hw_audio_ctrl = IVTV_HW_MSP34XX,
372         .hw_muxer = IVTV_HW_CS53L32A,
373         .hw_all = IVTV_HW_MSP34XX | IVTV_HW_CS53L32A |
374                   IVTV_HW_SAA7115 | IVTV_HW_TUNER,
375         .video_inputs = {
376                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
377                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
378                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
379         },
380         .audio_inputs = {
381                 { IVTV_CARD_INPUT_AUD_TUNER,
382                   MSP_TUNER, CS53L32A_IN0 },
383                 { IVTV_CARD_INPUT_LINE_IN1,
384                   MSP_SCART1, CS53L32A_IN2 },
385         },
386         /* This card has no eeprom and in fact the Windows driver relies
387            on the country/region setting of the user to decide which tuner
388            is available. */
389         .tuners = {
390                 /* This tuner has been verified for the AVC2410 */
391                 { .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
392                 /* This is a good guess, but I'm not totally sure this is
393                    the correct tuner for NTSC. */
394                 { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
395         },
396         .pci_list = ivtv_pci_avc2410,
397 };
398
399 /* ------------------------------------------------------------------------- */
400
401 /* Adaptec VideOh! AVC-2010 card */
402
403 static const struct ivtv_card_pci_info ivtv_pci_avc2010[] = {
404         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ADAPTEC, 0x0092 },
405         { 0, 0, 0 }
406 };
407
408 static const struct ivtv_card ivtv_card_avc2010 = {
409         .type = IVTV_CARD_AVC2010,
410         .name = "Adaptec VideOh! AVC-2010",
411         .v4l2_capabilities = IVTV_CAP_ENCODER,
412         .hw_video = IVTV_HW_SAA7115,
413         .hw_audio = IVTV_HW_CS53L32A,
414         .hw_audio_ctrl = IVTV_HW_CS53L32A,
415         .hw_all = IVTV_HW_CS53L32A | IVTV_HW_SAA7115,
416         .video_inputs = {
417                 { IVTV_CARD_INPUT_SVIDEO1,    0, IVTV_SAA71XX_SVIDEO0    },
418                 { IVTV_CARD_INPUT_COMPOSITE1, 0, IVTV_SAA71XX_COMPOSITE3 },
419         },
420         .audio_inputs = {
421                 { IVTV_CARD_INPUT_LINE_IN1,   CS53L32A_IN2 },
422         },
423         /* Does not have a tuner */
424         .pci_list = ivtv_pci_avc2010,
425 };
426
427 /* ------------------------------------------------------------------------- */
428
429 /* Nagase Transgear 5000TV card */
430
431 static const struct ivtv_card_pci_info ivtv_pci_tg5000tv[] = {
432         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xbfff },
433         { 0, 0, 0 }
434 };
435
436 static const struct ivtv_card ivtv_card_tg5000tv = {
437         .type = IVTV_CARD_TG5000TV,
438         .name = "Nagase Transgear 5000TV",
439         .v4l2_capabilities = IVTV_CAP_ENCODER,
440         .hw_video = IVTV_HW_SAA7114 | IVTV_HW_UPD64031A | IVTV_HW_UPD6408X |
441         IVTV_HW_GPIO,
442         .hw_audio = IVTV_HW_GPIO,
443         .hw_audio_ctrl = IVTV_HW_GPIO,
444         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7114 | IVTV_HW_TUNER |
445                   IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
446         .video_inputs = {
447                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_SVIDEO0 },
448                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO2 },
449                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO2 },
450         },
451         .audio_inputs = {
452                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
453                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
454         },
455         .gr_config = UPD64031A_VERTICAL_EXTERNAL,
456         .gpio_init = { .direction = 0xe080, .initial_value = 0x8000 },
457         .gpio_audio_input  = { .mask = 0x8080, .tuner  = 0x8000, .linein = 0x0080 },
458         .gpio_audio_mute   = { .mask = 0x6000, .mute   = 0x6000 },
459         .gpio_audio_mode   = { .mask = 0x4300, .mono   = 0x4000, .stereo = 0x0200,
460                               .lang1 = 0x0300, .lang2  = 0x0000, .both   = 0x0200 },
461         .gpio_video_input  = { .mask = 0x0030, .tuner  = 0x0000,
462                           .composite = 0x0010, .svideo = 0x0020 },
463         .tuners = {
464                 { .std = V4L2_STD_525_60, .tuner = TUNER_PHILIPS_FQ1286 },
465         },
466         .pci_list = ivtv_pci_tg5000tv,
467 };
468
469 /* ------------------------------------------------------------------------- */
470
471 /* AOpen VA2000MAX-SNT6 card */
472
473 static const struct ivtv_card_pci_info ivtv_pci_va2000[] = {
474         { PCI_DEVICE_ID_IVTV16, 0, 0xff5f },
475         { 0, 0, 0 }
476 };
477
478 static const struct ivtv_card ivtv_card_va2000 = {
479         .type = IVTV_CARD_VA2000MAX_SNT6,
480         .name = "AOpen VA2000MAX-SNT6",
481         .v4l2_capabilities = IVTV_CAP_ENCODER,
482         .hw_video = IVTV_HW_SAA7115 | IVTV_HW_UPD6408X,
483         .hw_audio = IVTV_HW_MSP34XX,
484         .hw_audio_ctrl = IVTV_HW_MSP34XX,
485         .hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7115 |
486                   IVTV_HW_UPD6408X | IVTV_HW_TUNER,
487         .video_inputs = {
488                 { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_SVIDEO0 },
489         },
490         .audio_inputs = {
491                 { IVTV_CARD_INPUT_AUD_TUNER, MSP_TUNER },
492         },
493         .tuners = {
494                 { .std = V4L2_STD_525_60, .tuner = TUNER_PHILIPS_FQ1286 },
495         },
496         .pci_list = ivtv_pci_va2000,
497 };
498
499 /* ------------------------------------------------------------------------- */
500
501 /* Yuan MPG600GR/Kuroutoshikou CX23416GYC-STVLP cards */
502
503 static const struct ivtv_card_pci_info ivtv_pci_cx23416gyc[] = {
504         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0x0600 },
505         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN4, 0x0600 },
506         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_MELCO, 0x0523 },
507         { 0, 0, 0 }
508 };
509
510 static const struct ivtv_card ivtv_card_cx23416gyc = {
511         .type = IVTV_CARD_CX23416GYC,
512         .name = "Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP",
513         .v4l2_capabilities = IVTV_CAP_ENCODER,
514         .hw_video = IVTV_HW_SAA717X | IVTV_HW_GPIO |
515                 IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
516         .hw_audio = IVTV_HW_SAA717X,
517         .hw_audio_ctrl = IVTV_HW_SAA717X,
518         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA717X | IVTV_HW_TUNER |
519                   IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
520         .video_inputs = {
521                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_SVIDEO3 |
522                                                  IVTV_SAA717X_TUNER_FLAG },
523                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0 },
524                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO3 },
525         },
526         .audio_inputs = {
527                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_SAA717X_IN2 },
528                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_SAA717X_IN0 },
529         },
530         .gr_config = UPD64031A_VERTICAL_EXTERNAL,
531         .gpio_init = { .direction = 0xf880, .initial_value = 0x8800 },
532         .gpio_video_input  = { .mask = 0x0020, .tuner  = 0x0000,
533                                .composite = 0x0020, .svideo = 0x0020 },
534         .gpio_audio_freq   = { .mask = 0xc000, .f32000 = 0x0000,
535                              .f44100 = 0x4000, .f48000 = 0x8000 },
536         .tuners = {
537                 { .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
538                 { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
539         },
540         .pci_list = ivtv_pci_cx23416gyc,
541 };
542
543 static const struct ivtv_card ivtv_card_cx23416gyc_nogr = {
544         .type = IVTV_CARD_CX23416GYC_NOGR,
545         .name = "Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR)",
546         .v4l2_capabilities = IVTV_CAP_ENCODER,
547         .hw_video = IVTV_HW_SAA717X | IVTV_HW_GPIO | IVTV_HW_UPD6408X,
548         .hw_audio = IVTV_HW_SAA717X,
549         .hw_audio_ctrl = IVTV_HW_SAA717X,
550         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA717X | IVTV_HW_TUNER |
551                   IVTV_HW_UPD6408X,
552         .video_inputs = {
553                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 |
554                                                  IVTV_SAA717X_TUNER_FLAG },
555                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
556                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
557         },
558         .audio_inputs = {
559                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_SAA717X_IN2 },
560                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_SAA717X_IN0 },
561         },
562         .gpio_init = { .direction = 0xf880, .initial_value = 0x8800 },
563         .gpio_video_input  = { .mask = 0x0020, .tuner  = 0x0000,
564                                .composite = 0x0020, .svideo = 0x0020 },
565         .gpio_audio_freq   = { .mask = 0xc000, .f32000 = 0x0000,
566                              .f44100 = 0x4000, .f48000 = 0x8000 },
567         .tuners = {
568                 { .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
569                 { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
570         },
571 };
572
573 static const struct ivtv_card ivtv_card_cx23416gyc_nogrycs = {
574         .type = IVTV_CARD_CX23416GYC_NOGRYCS,
575         .name = "Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR/YCS)",
576         .v4l2_capabilities = IVTV_CAP_ENCODER,
577         .hw_video = IVTV_HW_SAA717X | IVTV_HW_GPIO,
578         .hw_audio = IVTV_HW_SAA717X,
579         .hw_audio_ctrl = IVTV_HW_SAA717X,
580         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA717X | IVTV_HW_TUNER,
581         .video_inputs = {
582                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 |
583                                                  IVTV_SAA717X_TUNER_FLAG },
584                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
585                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
586         },
587         .audio_inputs = {
588                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_SAA717X_IN2 },
589                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_SAA717X_IN0 },
590         },
591         .gpio_init = { .direction = 0xf880, .initial_value = 0x8800 },
592         .gpio_video_input  = { .mask = 0x0020, .tuner  = 0x0000,
593                                .composite = 0x0020, .svideo = 0x0020 },
594         .gpio_audio_freq   = { .mask = 0xc000, .f32000 = 0x0000,
595                              .f44100 = 0x4000, .f48000 = 0x8000 },
596         .tuners = {
597                 { .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
598                 { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
599         },
600 };
601
602 /* ------------------------------------------------------------------------- */
603
604 /* I/O Data GV-MVP/RX & GV-MVP/RX2W (dual tuner) cards */
605
606 static const struct ivtv_card_pci_info ivtv_pci_gv_mvprx[] = {
607         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd01e },
608         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd038 }, /* 2W unit #1 */
609         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd039 }, /* 2W unit #2 */
610         { 0, 0, 0 }
611 };
612
613 static const struct ivtv_card ivtv_card_gv_mvprx = {
614         .type = IVTV_CARD_GV_MVPRX,
615         .name = "I/O Data GV-MVP/RX, GV-MVP/RX2W (dual tuner)",
616         .v4l2_capabilities = IVTV_CAP_ENCODER,
617         .hw_video = IVTV_HW_SAA7115 | IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
618         .hw_audio = IVTV_HW_GPIO,
619         .hw_audio_ctrl = IVTV_HW_WM8739,
620         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_VP27SMPX |
621                   IVTV_HW_TUNER | IVTV_HW_WM8739 |
622                   IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
623         .video_inputs = {
624                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_SVIDEO0    },
625                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO1    },
626                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO2    },
627         },
628         .audio_inputs = {
629                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
630                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
631         },
632         .gpio_init = { .direction = 0xc301, .initial_value = 0x0200 },
633         .gpio_audio_input  = { .mask = 0xffff, .tuner  = 0x0200, .linein = 0x0300 },
634         .tuners = {
635                 /* This card has the Panasonic VP27 tuner */
636                 { .std = V4L2_STD_525_60, .tuner = TUNER_PANASONIC_VP27 },
637         },
638         .pci_list = ivtv_pci_gv_mvprx,
639 };
640
641 /* ------------------------------------------------------------------------- */
642
643 /* I/O Data GV-MVP/RX2E card */
644
645 static const struct ivtv_card_pci_info ivtv_pci_gv_mvprx2e[] = {
646         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd025 },
647         {0, 0, 0}
648 };
649
650 static const struct ivtv_card ivtv_card_gv_mvprx2e = {
651         .type = IVTV_CARD_GV_MVPRX2E,
652         .name = "I/O Data GV-MVP/RX2E",
653         .v4l2_capabilities = IVTV_CAP_ENCODER,
654         .hw_video = IVTV_HW_SAA7115,
655         .hw_audio = IVTV_HW_GPIO,
656         .hw_audio_ctrl = IVTV_HW_WM8739,
657         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER |
658                   IVTV_HW_VP27SMPX | IVTV_HW_WM8739,
659         .video_inputs = {
660                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE4 },
661                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0    },
662                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
663         },
664         .audio_inputs = {
665                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
666                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
667         },
668         .gpio_init = { .direction = 0xc301, .initial_value = 0x0200 },
669         .gpio_audio_input  = { .mask = 0xffff, .tuner  = 0x0200, .linein = 0x0300 },
670         .tuners = {
671                 /* This card has the Panasonic VP27 tuner */
672                 { .std = V4L2_STD_525_60, .tuner = TUNER_PANASONIC_VP27 },
673         },
674         .pci_list = ivtv_pci_gv_mvprx2e,
675 };
676
677 /* ------------------------------------------------------------------------- */
678
679 /* GotVIEW PCI DVD card */
680
681 static const struct ivtv_card_pci_info ivtv_pci_gotview_pci_dvd[] = {
682         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0x0600 },
683         { 0, 0, 0 }
684 };
685
686 static const struct ivtv_card ivtv_card_gotview_pci_dvd = {
687         .type = IVTV_CARD_GOTVIEW_PCI_DVD,
688         .name = "GotView PCI DVD",
689         .v4l2_capabilities = IVTV_CAP_ENCODER,
690         .hw_video = IVTV_HW_SAA717X,
691         .hw_audio = IVTV_HW_SAA717X,
692         .hw_audio_ctrl = IVTV_HW_SAA717X,
693         .hw_all = IVTV_HW_SAA717X | IVTV_HW_TUNER,
694         .video_inputs = {
695                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_COMPOSITE1 },  /* pin 116 */
696                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO0 },     /* pin 114/109 */
697                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },  /* pin 118 */
698         },
699         .audio_inputs = {
700                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_SAA717X_IN0 },
701                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_SAA717X_IN2 },
702         },
703         .gpio_init = { .direction = 0xf000, .initial_value = 0xA000 },
704         .tuners = {
705                 /* This card has a Philips FQ1216ME MK3 tuner */
706                 { .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
707         },
708         .pci_list = ivtv_pci_gotview_pci_dvd,
709 };
710
711 /* ------------------------------------------------------------------------- */
712
713 /* GotVIEW PCI DVD2 Deluxe card */
714
715 static const struct ivtv_card_pci_info ivtv_pci_gotview_pci_dvd2[] = {
716         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_GOTVIEW1, 0x0600 },
717         { 0, 0, 0 }
718 };
719
720 static const struct ivtv_card ivtv_card_gotview_pci_dvd2 = {
721         .type = IVTV_CARD_GOTVIEW_PCI_DVD2,
722         .name = "GotView PCI DVD2 Deluxe",
723         .v4l2_capabilities = IVTV_CAP_ENCODER,
724         .hw_video = IVTV_HW_CX25840,
725         .hw_audio = IVTV_HW_CX25840,
726         .hw_audio_ctrl = IVTV_HW_CX25840,
727         .hw_muxer = IVTV_HW_GPIO,
728         .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
729         .video_inputs = {
730                 { IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
731                 { IVTV_CARD_INPUT_SVIDEO1,    1,
732                   CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
733                 { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
734         },
735         .audio_inputs = {
736                 { IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5,       0 },
737                 { IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL, 1 },
738         },
739         .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
740         .gpio_init = { .direction = 0x0800, .initial_value = 0 },
741         .gpio_audio_input  = { .mask = 0x0800, .tuner = 0, .linein = 0, .radio = 0x0800 },
742         .tuners = {
743                 /* This card has a Philips FQ1216ME MK5 tuner */
744                 { .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
745         },
746         .pci_list = ivtv_pci_gotview_pci_dvd2,
747 };
748
749 /* ------------------------------------------------------------------------- */
750
751 /* Yuan MPC622 miniPCI card */
752
753 static const struct ivtv_card_pci_info ivtv_pci_yuan_mpc622[] = {
754         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN2, 0xd998 },
755         { 0, 0, 0 }
756 };
757
758 static const struct ivtv_card ivtv_card_yuan_mpc622 = {
759         .type = IVTV_CARD_YUAN_MPC622,
760         .name = "Yuan MPC622",
761         .v4l2_capabilities = IVTV_CAP_ENCODER,
762         .hw_video = IVTV_HW_CX25840,
763         .hw_audio = IVTV_HW_CX25840,
764         .hw_audio_ctrl = IVTV_HW_CX25840,
765         .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
766         .video_inputs = {
767                 { IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
768                 { IVTV_CARD_INPUT_SVIDEO1,    1,
769                   CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
770                 { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
771         },
772         .audio_inputs = {
773                 { IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5       },
774                 { IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL },
775         },
776         .gpio_init = { .direction = 0x00ff, .initial_value = 0x0002 },
777         .tuners = {
778                 /* This card has the TDA8290/TDA8275 tuner chips */
779                 { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_TDA8290 },
780         },
781         .pci_list = ivtv_pci_yuan_mpc622,
782 };
783
784 /* ------------------------------------------------------------------------- */
785
786 /* DIGITAL COWBOY DCT-MTVP1 card */
787
788 static const struct ivtv_card_pci_info ivtv_pci_dctmvtvp1[] = {
789         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xbfff },
790         { 0, 0, 0 }
791 };
792
793 static const struct ivtv_card ivtv_card_dctmvtvp1 = {
794         .type = IVTV_CARD_DCTMTVP1,
795         .name = "Digital Cowboy DCT-MTVP1",
796         .v4l2_capabilities = IVTV_CAP_ENCODER,
797         .hw_video = IVTV_HW_SAA7115 | IVTV_HW_UPD64031A | IVTV_HW_UPD6408X |
798                 IVTV_HW_GPIO,
799         .hw_audio = IVTV_HW_GPIO,
800         .hw_audio_ctrl = IVTV_HW_GPIO,
801         .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER |
802                 IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
803         .video_inputs = {
804                 { IVTV_CARD_INPUT_VID_TUNER,  0, IVTV_SAA71XX_SVIDEO0    },
805                 { IVTV_CARD_INPUT_SVIDEO1,    1, IVTV_SAA71XX_SVIDEO2    },
806                 { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO2 },
807         },
808         .audio_inputs = {
809                 { IVTV_CARD_INPUT_AUD_TUNER,  IVTV_GPIO_TUNER   },
810                 { IVTV_CARD_INPUT_LINE_IN1,   IVTV_GPIO_LINE_IN },
811         },
812         .gpio_init = { .direction = 0xe080, .initial_value = 0x8000 },
813         .gpio_audio_input  = { .mask = 0x8080, .tuner  = 0x8000, .linein = 0x0080 },
814         .gpio_audio_mute   = { .mask = 0x6000, .mute   = 0x6000 },
815         .gpio_audio_mode   = { .mask = 0x4300, .mono   = 0x4000, .stereo = 0x0200,
816                               .lang1 = 0x0300, .lang2  = 0x0000, .both   = 0x0200 },
817         .gpio_video_input  = { .mask = 0x0030, .tuner  = 0x0000,
818                                .composite = 0x0010, .svideo = 0x0020},
819         .tuners = {
820                 { .std = V4L2_STD_525_60, .tuner = TUNER_PHILIPS_FQ1286 },
821         },
822         .pci_list = ivtv_pci_dctmvtvp1,
823 };
824
825 /* ------------------------------------------------------------------------- */
826
827 /* Yuan PG600-2/GotView PCI DVD Lite cards */
828
829 static const struct ivtv_card_pci_info ivtv_pci_pg600v2[] = {
830         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN3,     0x0600 },
831         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_GOTVIEW2,  0x0600 },
832         { 0, 0, 0 }
833 };
834
835 static const struct ivtv_card ivtv_card_pg600v2 = {
836         .type = IVTV_CARD_PG600V2,
837         .name = "Yuan PG600-2, GotView PCI DVD Lite",
838         .v4l2_capabilities = IVTV_CAP_ENCODER,
839         .hw_video = IVTV_HW_CX25840,
840         .hw_audio = IVTV_HW_CX25840,
841         .hw_audio_ctrl = IVTV_HW_CX25840,
842         .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
843         .video_inputs = {
844                 { IVTV_CARD_INPUT_SVIDEO1,    0,
845                   CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
846                 { IVTV_CARD_INPUT_COMPOSITE1, 0, CX25840_COMPOSITE1 },
847         },
848         .audio_inputs = {
849                 { IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL },
850         },
851         .tuners = {
852                 { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
853         },
854         .pci_list = ivtv_pci_pg600v2,
855 };
856
857 /* ------------------------------------------------------------------------- */
858
859 /* Club3D ZAP-TV1x01 cards */
860
861 static const struct ivtv_card_pci_info ivtv_pci_club3d[] = {
862         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN3,     0x0600 },
863         { 0, 0, 0 }
864 };
865
866 static const struct ivtv_card ivtv_card_club3d = {
867         .type = IVTV_CARD_CLUB3D,
868         .name = "Club3D ZAP-TV1x01",
869         .v4l2_capabilities = IVTV_CAP_ENCODER,
870         .hw_video = IVTV_HW_CX25840,
871         .hw_audio = IVTV_HW_CX25840,
872         .hw_audio_ctrl = IVTV_HW_CX25840,
873         .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
874         .video_inputs = {
875                 { IVTV_CARD_INPUT_SVIDEO1,    0,
876                   CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
877                 { IVTV_CARD_INPUT_COMPOSITE1, 0, CX25840_COMPOSITE3 },
878         },
879         .audio_inputs = {
880                 { IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL },
881         },
882         .tuners = {
883                 { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
884         },
885         .pci_list = ivtv_pci_club3d,
886 };
887
888 /* ------------------------------------------------------------------------- */
889
890 /* AVerTV MCE 116 Plus (M116) card */
891
892 static const struct ivtv_card_pci_info ivtv_pci_avertv_mce116[] = {
893         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc439 },
894         { 0, 0, 0 }
895 };
896
897 static const struct ivtv_card ivtv_card_avertv_mce116 = {
898         .type = IVTV_CARD_AVERTV_MCE116,
899         .name = "AVerTV MCE 116 Plus",
900         .v4l2_capabilities = IVTV_CAP_ENCODER,
901         .hw_video = IVTV_HW_CX25840,
902         .hw_audio = IVTV_HW_CX25840,
903         .hw_audio_ctrl = IVTV_HW_CX25840,
904         .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER | IVTV_HW_WM8739,
905         .video_inputs = {
906                 { IVTV_CARD_INPUT_SVIDEO1,    0, CX25840_SVIDEO3    },
907                 { IVTV_CARD_INPUT_COMPOSITE1, 0, CX25840_COMPOSITE1 },
908         },
909         .audio_inputs = {
910                 { IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL, 1 },
911         },
912         .gpio_init = { .direction = 0xe000, .initial_value = 0x4000 }, /* enable line-in */
913         .tuners = {
914                 { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
915         },
916         .pci_list = ivtv_pci_avertv_mce116,
917 };
918
919 /* ------------------------------------------------------------------------- */
920
921 /* AVerMedia PVR-150 Plus (M113) card */
922
923 static const struct ivtv_card_pci_info ivtv_pci_aver_pvr150[] = {
924         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc035 },
925         { 0, 0, 0 }
926 };
927
928 static const struct ivtv_card ivtv_card_aver_pvr150 = {
929         .type = IVTV_CARD_AVER_PVR150PLUS,
930         .name = "AVerMedia PVR-150 Plus",
931         .v4l2_capabilities = IVTV_CAP_ENCODER,
932         .hw_video = IVTV_HW_CX25840,
933         .hw_audio = IVTV_HW_CX25840,
934         .hw_audio_ctrl = IVTV_HW_CX25840,
935         .hw_muxer = IVTV_HW_GPIO,
936         .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
937         .video_inputs = {
938                 { IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
939                 { IVTV_CARD_INPUT_SVIDEO1,    1,
940                   CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
941                 { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
942         },
943         .audio_inputs = {
944                 { IVTV_CARD_INPUT_AUD_TUNER,  CX25840_AUDIO5,       0 },
945                 { IVTV_CARD_INPUT_LINE_IN1,   CX25840_AUDIO_SERIAL, 1 },
946         },
947         .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
948         .gpio_init = { .direction = 0x0800, .initial_value = 0 },
949         .gpio_audio_input  = { .mask = 0x0800, .tuner = 0, .linein = 0, .radio = 0x0800 },
950         .tuners = {
951                 /* This card has a Partsnic PTI-5NF05 tuner */
952                 { .std = V4L2_STD_525_60, .tuner = TUNER_TCL_2002N },
953         },
954         .pci_list = ivtv_pci_aver_pvr150,
955 };
956
957 /* ------------------------------------------------------------------------- */
958
959 /* ASUS Falcon2 */
960
961 static const struct ivtv_card_pci_info ivtv_pci_asus_falcon2[] = {
962         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ASUSTEK, 0x4b66 },
963         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ASUSTEK, 0x462e },
964         { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ASUSTEK, 0x4b2e },
965         { 0, 0, 0 }
966 };
967
968 static const struct ivtv_card ivtv_card_asus_falcon2 = {
969         .type = IVTV_CARD_ASUS_FALCON2,
970         .name = "ASUS Falcon2",
971         .v4l2_capabilities = IVTV_CAP_ENCODER,
972         .hw_video = IVTV_HW_CX25840,
973         .hw_audio = IVTV_HW_CX25840,
974         .hw_audio_ctrl = IVTV_HW_CX25840,
975         .hw_muxer = IVTV_HW_M52790,
976         .hw_all = IVTV_HW_CX25840 | IVTV_HW_M52790 | IVTV_HW_TUNER,
977         .video_inputs = {
978                 { IVTV_CARD_INPUT_VID_TUNER,  0, CX25840_COMPOSITE2 },
979                 { IVTV_CARD_INPUT_SVIDEO1,    1, CX25840_SVIDEO3    },
980                 { IVTV_CARD_INPUT_COMPOSITE1, 2, CX25840_COMPOSITE2 },
981         },
982         .audio_inputs = {
983                 { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5, M52790_IN_TUNER },
984                 { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL,
985                         M52790_IN_V2 | M52790_SW1_YCMIX | M52790_SW2_YCMIX },
986                 { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, M52790_IN_V2 },
987         },
988         .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, M52790_IN_TUNER },
989         .tuners = {
990                 { .std = V4L2_STD_525_60, .tuner = TUNER_PHILIPS_FM1236_MK3 },
991         },
992         .pci_list = ivtv_pci_asus_falcon2,
993 };
994
995 static const struct ivtv_card *ivtv_card_list[] = {
996         &ivtv_card_pvr250,
997         &ivtv_card_pvr350,
998         &ivtv_card_pvr150,
999         &ivtv_card_m179,
1000         &ivtv_card_mpg600,
1001         &ivtv_card_mpg160,
1002         &ivtv_card_pg600,
1003         &ivtv_card_avc2410,
1004         &ivtv_card_avc2010,
1005         &ivtv_card_tg5000tv,
1006         &ivtv_card_va2000,
1007         &ivtv_card_cx23416gyc,
1008         &ivtv_card_gv_mvprx,
1009         &ivtv_card_gv_mvprx2e,
1010         &ivtv_card_gotview_pci_dvd,
1011         &ivtv_card_gotview_pci_dvd2,
1012         &ivtv_card_yuan_mpc622,
1013         &ivtv_card_dctmvtvp1,
1014         &ivtv_card_pg600v2,
1015         &ivtv_card_club3d,
1016         &ivtv_card_avertv_mce116,
1017         &ivtv_card_asus_falcon2,
1018         &ivtv_card_aver_pvr150,
1019
1020         /* Variations of standard cards but with the same PCI IDs.
1021            These cards must come last in this list. */
1022         &ivtv_card_pvr350_v1,
1023         &ivtv_card_cx23416gyc_nogr,
1024         &ivtv_card_cx23416gyc_nogrycs,
1025 };
1026
1027 const struct ivtv_card *ivtv_get_card(u16 index)
1028 {
1029         if (index >= ARRAY_SIZE(ivtv_card_list))
1030                 return NULL;
1031         return ivtv_card_list[index];
1032 }
1033
1034 int ivtv_get_input(struct ivtv *itv, u16 index, struct v4l2_input *input)
1035 {
1036         const struct ivtv_card_video_input *card_input = itv->card->video_inputs + index;
1037         static const char * const input_strs[] = {
1038                 "Tuner 1",
1039                 "S-Video 1",
1040                 "S-Video 2",
1041                 "Composite 1",
1042                 "Composite 2",
1043                 "Composite 3"
1044         };
1045
1046         memset(input, 0, sizeof(*input));
1047         if (index >= itv->nof_inputs)
1048                 return -EINVAL;
1049         input->index = index;
1050         strcpy(input->name, input_strs[card_input->video_type - 1]);
1051         input->type = (card_input->video_type == IVTV_CARD_INPUT_VID_TUNER ?
1052                         V4L2_INPUT_TYPE_TUNER : V4L2_INPUT_TYPE_CAMERA);
1053         input->audioset = (1 << itv->nof_audio_inputs) - 1;
1054         input->std = (input->type == V4L2_INPUT_TYPE_TUNER) ?
1055                                 itv->tuner_std : V4L2_STD_ALL;
1056         return 0;
1057 }
1058
1059 int ivtv_get_output(struct ivtv *itv, u16 index, struct v4l2_output *output)
1060 {
1061         const struct ivtv_card_output *card_output = itv->card->video_outputs + index;
1062
1063         memset(output, 0, sizeof(*output));
1064         if (index >= itv->card->nof_outputs)
1065                 return -EINVAL;
1066         output->index = index;
1067         strcpy(output->name, card_output->name);
1068         output->type = V4L2_OUTPUT_TYPE_ANALOG;
1069         output->audioset = 1;
1070         output->std = V4L2_STD_ALL;
1071         return 0;
1072 }
1073
1074 int ivtv_get_audio_input(struct ivtv *itv, u16 index, struct v4l2_audio *audio)
1075 {
1076         const struct ivtv_card_audio_input *aud_input = itv->card->audio_inputs + index;
1077         static const char * const input_strs[] = {
1078                 "Tuner 1",
1079                 "Line In 1",
1080                 "Line In 2"
1081         };
1082
1083         memset(audio, 0, sizeof(*audio));
1084         if (index >= itv->nof_audio_inputs)
1085                 return -EINVAL;
1086         strcpy(audio->name, input_strs[aud_input->audio_type - 1]);
1087         audio->index = index;
1088         audio->capability = V4L2_AUDCAP_STEREO;
1089         return 0;
1090 }
1091
1092 int ivtv_get_audio_output(struct ivtv *itv, u16 index, struct v4l2_audioout *aud_output)
1093 {
1094         memset(aud_output, 0, sizeof(*aud_output));
1095         if (itv->card->video_outputs == NULL || index != 0)
1096                 return -EINVAL;
1097         strcpy(aud_output->name, "A/V Audio Out");
1098         return 0;
1099 }