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