1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun Functions to query card hardware
4*4882a593Smuzhiyun Copyright (C) 2003-2004 Kevin Thayer <nufan_wfk at yahoo.com>
5*4882a593Smuzhiyun Copyright (C) 2005-2007 Hans Verkuil <hverkuil@xs4all.nl>
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include "ivtv-driver.h"
10*4882a593Smuzhiyun #include "ivtv-cards.h"
11*4882a593Smuzhiyun #include "ivtv-i2c.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include <media/drv-intf/msp3400.h>
14*4882a593Smuzhiyun #include <media/i2c/m52790.h>
15*4882a593Smuzhiyun #include <media/i2c/wm8775.h>
16*4882a593Smuzhiyun #include <media/i2c/cs53l32a.h>
17*4882a593Smuzhiyun #include <media/drv-intf/cx25840.h>
18*4882a593Smuzhiyun #include <media/i2c/upd64031a.h>
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #define MSP_TUNER MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, \
21*4882a593Smuzhiyun MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER)
22*4882a593Smuzhiyun #define MSP_SCART1 MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, \
23*4882a593Smuzhiyun MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
24*4882a593Smuzhiyun #define MSP_SCART2 MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1, \
25*4882a593Smuzhiyun MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
26*4882a593Smuzhiyun #define MSP_SCART3 MSP_INPUT(MSP_IN_SCART3, MSP_IN_TUNER1, \
27*4882a593Smuzhiyun MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
28*4882a593Smuzhiyun #define MSP_MONO MSP_INPUT(MSP_IN_MONO, MSP_IN_TUNER1, \
29*4882a593Smuzhiyun MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun #define V4L2_STD_PAL_SECAM (V4L2_STD_PAL|V4L2_STD_SECAM)
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /* usual i2c tuner addresses to probe */
34*4882a593Smuzhiyun static struct ivtv_card_tuner_i2c ivtv_i2c_std = {
35*4882a593Smuzhiyun .radio = { I2C_CLIENT_END },
36*4882a593Smuzhiyun .demod = { 0x43, I2C_CLIENT_END },
37*4882a593Smuzhiyun .tv = { 0x61, 0x60, I2C_CLIENT_END },
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun /* as above, but with possible radio tuner */
41*4882a593Smuzhiyun static struct ivtv_card_tuner_i2c ivtv_i2c_radio = {
42*4882a593Smuzhiyun .radio = { 0x60, I2C_CLIENT_END },
43*4882a593Smuzhiyun .demod = { 0x43, I2C_CLIENT_END },
44*4882a593Smuzhiyun .tv = { 0x61, I2C_CLIENT_END },
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun /* using the tda8290+75a combo */
48*4882a593Smuzhiyun static struct ivtv_card_tuner_i2c ivtv_i2c_tda8290 = {
49*4882a593Smuzhiyun .radio = { I2C_CLIENT_END },
50*4882a593Smuzhiyun .demod = { I2C_CLIENT_END },
51*4882a593Smuzhiyun .tv = { 0x4b, I2C_CLIENT_END },
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun /********************** card configuration *******************************/
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun /* Please add new PCI IDs to: https://pci-ids.ucw.cz/
57*4882a593Smuzhiyun This keeps the PCI ID database up to date. Note that the entries
58*4882a593Smuzhiyun must be added under vendor 0x4444 (Conexant) as subsystem IDs.
59*4882a593Smuzhiyun New vendor IDs should still be added to the vendor ID list. */
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun /* Hauppauge PVR-250 cards */
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun /* Note: for Hauppauge cards the tveeprom information is used instead of PCI IDs */
64*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_pvr250 = {
65*4882a593Smuzhiyun .type = IVTV_CARD_PVR_250,
66*4882a593Smuzhiyun .name = "Hauppauge WinTV PVR-250",
67*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
68*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115,
69*4882a593Smuzhiyun .hw_audio = IVTV_HW_MSP34XX,
70*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_MSP34XX,
71*4882a593Smuzhiyun .hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7115 |
72*4882a593Smuzhiyun IVTV_HW_TVEEPROM | IVTV_HW_TUNER,
73*4882a593Smuzhiyun .video_inputs = {
74*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 },
75*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
76*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
77*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO2, 2, IVTV_SAA71XX_SVIDEO1 },
78*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE2, 2, IVTV_SAA71XX_COMPOSITE1 },
79*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE3, 1, IVTV_SAA71XX_COMPOSITE5 },
80*4882a593Smuzhiyun },
81*4882a593Smuzhiyun .audio_inputs = {
82*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, MSP_TUNER },
83*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, MSP_SCART1 },
84*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN2, MSP_SCART3 },
85*4882a593Smuzhiyun },
86*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
87*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun /* Hauppauge PVR-350 cards */
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun /* Outputs for Hauppauge PVR350 cards */
95*4882a593Smuzhiyun static struct ivtv_card_output ivtv_pvr350_outputs[] = {
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun .name = "S-Video + Composite",
98*4882a593Smuzhiyun .video_output = 0,
99*4882a593Smuzhiyun }, {
100*4882a593Smuzhiyun .name = "Composite",
101*4882a593Smuzhiyun .video_output = 1,
102*4882a593Smuzhiyun }, {
103*4882a593Smuzhiyun .name = "S-Video",
104*4882a593Smuzhiyun .video_output = 2,
105*4882a593Smuzhiyun }, {
106*4882a593Smuzhiyun .name = "RGB",
107*4882a593Smuzhiyun .video_output = 3,
108*4882a593Smuzhiyun }, {
109*4882a593Smuzhiyun .name = "YUV C",
110*4882a593Smuzhiyun .video_output = 4,
111*4882a593Smuzhiyun }, {
112*4882a593Smuzhiyun .name = "YUV V",
113*4882a593Smuzhiyun .video_output = 5,
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_pvr350 = {
118*4882a593Smuzhiyun .type = IVTV_CARD_PVR_350,
119*4882a593Smuzhiyun .name = "Hauppauge WinTV PVR-350",
120*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER | IVTV_CAP_DECODER,
121*4882a593Smuzhiyun .video_outputs = ivtv_pvr350_outputs,
122*4882a593Smuzhiyun .nof_outputs = ARRAY_SIZE(ivtv_pvr350_outputs),
123*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115,
124*4882a593Smuzhiyun .hw_audio = IVTV_HW_MSP34XX,
125*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_MSP34XX,
126*4882a593Smuzhiyun .hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7115 |
127*4882a593Smuzhiyun IVTV_HW_SAA7127 | IVTV_HW_TVEEPROM | IVTV_HW_TUNER |
128*4882a593Smuzhiyun IVTV_HW_I2C_IR_RX_HAUP_EXT | IVTV_HW_I2C_IR_RX_HAUP_INT,
129*4882a593Smuzhiyun .video_inputs = {
130*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 },
131*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
132*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
133*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO2, 2, IVTV_SAA71XX_SVIDEO1 },
134*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE2, 2, IVTV_SAA71XX_COMPOSITE1 },
135*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE3, 1, IVTV_SAA71XX_COMPOSITE5 },
136*4882a593Smuzhiyun },
137*4882a593Smuzhiyun .audio_inputs = {
138*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, MSP_TUNER },
139*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, MSP_SCART1 },
140*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN2, MSP_SCART3 },
141*4882a593Smuzhiyun },
142*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
143*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun /* PVR-350 V1 boards have a different audio tuner input and use a
147*4882a593Smuzhiyun saa7114 instead of a saa7115.
148*4882a593Smuzhiyun Note that the info below comes from a pre-production model so it may
149*4882a593Smuzhiyun not be correct. Especially the audio behaves strangely (mono only it seems) */
150*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_pvr350_v1 = {
151*4882a593Smuzhiyun .type = IVTV_CARD_PVR_350_V1,
152*4882a593Smuzhiyun .name = "Hauppauge WinTV PVR-350 (V1)",
153*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER | IVTV_CAP_DECODER,
154*4882a593Smuzhiyun .video_outputs = ivtv_pvr350_outputs,
155*4882a593Smuzhiyun .nof_outputs = ARRAY_SIZE(ivtv_pvr350_outputs),
156*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7114,
157*4882a593Smuzhiyun .hw_audio = IVTV_HW_MSP34XX,
158*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_MSP34XX,
159*4882a593Smuzhiyun .hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7114 |
160*4882a593Smuzhiyun IVTV_HW_SAA7127 | IVTV_HW_TVEEPROM | IVTV_HW_TUNER,
161*4882a593Smuzhiyun .video_inputs = {
162*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 },
163*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
164*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
165*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO2, 2, IVTV_SAA71XX_SVIDEO1 },
166*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE2, 2, IVTV_SAA71XX_COMPOSITE1 },
167*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE3, 1, IVTV_SAA71XX_COMPOSITE5 },
168*4882a593Smuzhiyun },
169*4882a593Smuzhiyun .audio_inputs = {
170*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, MSP_MONO },
171*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, MSP_SCART1 },
172*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN2, MSP_SCART3 },
173*4882a593Smuzhiyun },
174*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
175*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun /* Hauppauge PVR-150/PVR-500 cards */
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_pvr150 = {
183*4882a593Smuzhiyun .type = IVTV_CARD_PVR_150,
184*4882a593Smuzhiyun .name = "Hauppauge WinTV PVR-150",
185*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
186*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
187*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
188*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
189*4882a593Smuzhiyun .hw_muxer = IVTV_HW_WM8775,
190*4882a593Smuzhiyun .hw_all = IVTV_HW_WM8775 | IVTV_HW_CX25840 |
191*4882a593Smuzhiyun IVTV_HW_TVEEPROM | IVTV_HW_TUNER |
192*4882a593Smuzhiyun IVTV_HW_I2C_IR_RX_HAUP_EXT | IVTV_HW_I2C_IR_RX_HAUP_INT |
193*4882a593Smuzhiyun IVTV_HW_Z8F0811_IR_HAUP,
194*4882a593Smuzhiyun .video_inputs = {
195*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE7 },
196*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, CX25840_SVIDEO1 },
197*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE3 },
198*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO2, 2, CX25840_SVIDEO2 },
199*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE2, 2, CX25840_COMPOSITE4 },
200*4882a593Smuzhiyun },
201*4882a593Smuzhiyun .audio_inputs = {
202*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER,
203*4882a593Smuzhiyun CX25840_AUDIO8, WM8775_AIN2 },
204*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1,
205*4882a593Smuzhiyun CX25840_AUDIO_SERIAL, WM8775_AIN2 },
206*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN2,
207*4882a593Smuzhiyun CX25840_AUDIO_SERIAL, WM8775_AIN3 },
208*4882a593Smuzhiyun },
209*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER,
210*4882a593Smuzhiyun CX25840_AUDIO_SERIAL, WM8775_AIN4 },
211*4882a593Smuzhiyun /* apparently needed for the IR blaster */
212*4882a593Smuzhiyun .gpio_init = { .direction = 0x1f01, .initial_value = 0x26f3 },
213*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun /* AVerMedia M179 cards */
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_m179[] = {
221*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_AVERMEDIA, 0xa3cf },
222*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_AVERMEDIA, 0xa3ce },
223*4882a593Smuzhiyun { 0, 0, 0 }
224*4882a593Smuzhiyun };
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_m179 = {
227*4882a593Smuzhiyun .type = IVTV_CARD_M179,
228*4882a593Smuzhiyun .name = "AVerMedia M179",
229*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
230*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7114,
231*4882a593Smuzhiyun .hw_audio = IVTV_HW_GPIO,
232*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_GPIO,
233*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7114 | IVTV_HW_TUNER,
234*4882a593Smuzhiyun .video_inputs = {
235*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 },
236*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
237*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
238*4882a593Smuzhiyun },
239*4882a593Smuzhiyun .audio_inputs = {
240*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_GPIO_TUNER },
241*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_GPIO_LINE_IN },
242*4882a593Smuzhiyun },
243*4882a593Smuzhiyun .gpio_init = { .direction = 0xe380, .initial_value = 0x8290 },
244*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0x8040, .tuner = 0x8000, .linein = 0x0000 },
245*4882a593Smuzhiyun .gpio_audio_mute = { .mask = 0x2000, .mute = 0x2000 },
246*4882a593Smuzhiyun .gpio_audio_mode = { .mask = 0x4300, .mono = 0x4000, .stereo = 0x0200,
247*4882a593Smuzhiyun .lang1 = 0x0200, .lang2 = 0x0100, .both = 0x0000 },
248*4882a593Smuzhiyun .gpio_audio_freq = { .mask = 0x0018, .f32000 = 0x0000,
249*4882a593Smuzhiyun .f44100 = 0x0008, .f48000 = 0x0010 },
250*4882a593Smuzhiyun .gpio_audio_detect = { .mask = 0x4000, .stereo = 0x0000 },
251*4882a593Smuzhiyun .tuners = {
252*4882a593Smuzhiyun /* As far as we know all M179 cards use this tuner */
253*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_NTSC },
254*4882a593Smuzhiyun },
255*4882a593Smuzhiyun .pci_list = ivtv_pci_m179,
256*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun /* Yuan MPG600/Kuroutoshikou ITVC16-STVLP cards */
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_mpg600[] = {
264*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0xfff3 },
265*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0xffff },
266*4882a593Smuzhiyun { 0, 0, 0 }
267*4882a593Smuzhiyun };
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_mpg600 = {
270*4882a593Smuzhiyun .type = IVTV_CARD_MPG600,
271*4882a593Smuzhiyun .name = "Yuan MPG600, Kuroutoshikou ITVC16-STVLP",
272*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
273*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115,
274*4882a593Smuzhiyun .hw_audio = IVTV_HW_GPIO,
275*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_GPIO,
276*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER,
277*4882a593Smuzhiyun .video_inputs = {
278*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 },
279*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
280*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
281*4882a593Smuzhiyun },
282*4882a593Smuzhiyun .audio_inputs = {
283*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_GPIO_TUNER },
284*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_GPIO_LINE_IN },
285*4882a593Smuzhiyun },
286*4882a593Smuzhiyun .gpio_init = { .direction = 0x3080, .initial_value = 0x0004 },
287*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0x3000, .tuner = 0x0000, .linein = 0x2000 },
288*4882a593Smuzhiyun .gpio_audio_mute = { .mask = 0x0001, .mute = 0x0001 },
289*4882a593Smuzhiyun .gpio_audio_mode = { .mask = 0x000e, .mono = 0x0006, .stereo = 0x0004,
290*4882a593Smuzhiyun .lang1 = 0x0004, .lang2 = 0x0000, .both = 0x0008 },
291*4882a593Smuzhiyun .gpio_audio_detect = { .mask = 0x0900, .stereo = 0x0100 },
292*4882a593Smuzhiyun .tuners = {
293*4882a593Smuzhiyun /* The PAL tuner is confirmed */
294*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FQ1216ME },
295*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
296*4882a593Smuzhiyun },
297*4882a593Smuzhiyun .pci_list = ivtv_pci_mpg600,
298*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
299*4882a593Smuzhiyun };
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun /* Yuan MPG160/Kuroutoshikou ITVC15-STVLP cards */
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_mpg160[] = {
306*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_YUAN1, 0 },
307*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV15, IVTV_PCI_ID_IODATA, 0x40a0 },
308*4882a593Smuzhiyun { 0, 0, 0 }
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_mpg160 = {
312*4882a593Smuzhiyun .type = IVTV_CARD_MPG160,
313*4882a593Smuzhiyun .name = "YUAN MPG160, Kuroutoshikou ITVC15-STVLP, I/O Data GV-M2TV/PCI",
314*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
315*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7114,
316*4882a593Smuzhiyun .hw_audio = IVTV_HW_GPIO,
317*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_GPIO,
318*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7114 | IVTV_HW_TUNER,
319*4882a593Smuzhiyun .video_inputs = {
320*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 },
321*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
322*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
323*4882a593Smuzhiyun },
324*4882a593Smuzhiyun .audio_inputs = {
325*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_GPIO_TUNER },
326*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_GPIO_LINE_IN },
327*4882a593Smuzhiyun },
328*4882a593Smuzhiyun .gpio_init = { .direction = 0x7080, .initial_value = 0x400c },
329*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0x3000, .tuner = 0x0000, .linein = 0x2000 },
330*4882a593Smuzhiyun .gpio_audio_mute = { .mask = 0x0001, .mute = 0x0001 },
331*4882a593Smuzhiyun .gpio_audio_mode = { .mask = 0x000e, .mono = 0x0006, .stereo = 0x0004,
332*4882a593Smuzhiyun .lang1 = 0x0004, .lang2 = 0x0000, .both = 0x0008 },
333*4882a593Smuzhiyun .gpio_audio_detect = { .mask = 0x0900, .stereo = 0x0100 },
334*4882a593Smuzhiyun .tuners = {
335*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FQ1216ME },
336*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
337*4882a593Smuzhiyun },
338*4882a593Smuzhiyun .pci_list = ivtv_pci_mpg160,
339*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
340*4882a593Smuzhiyun };
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun /* Yuan PG600/Diamond PVR-550 cards */
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_pg600[] = {
347*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_DIAMONDMM, 0x0070 },
348*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN3, 0x0600 },
349*4882a593Smuzhiyun { 0, 0, 0 }
350*4882a593Smuzhiyun };
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_pg600 = {
353*4882a593Smuzhiyun .type = IVTV_CARD_PG600,
354*4882a593Smuzhiyun .name = "Yuan PG600, Diamond PVR-550",
355*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
356*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
357*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
358*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
359*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
360*4882a593Smuzhiyun .video_inputs = {
361*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
362*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1,
363*4882a593Smuzhiyun CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
364*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
365*4882a593Smuzhiyun },
366*4882a593Smuzhiyun .audio_inputs = {
367*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
368*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL },
369*4882a593Smuzhiyun },
370*4882a593Smuzhiyun .tuners = {
371*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FQ1216ME },
372*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
373*4882a593Smuzhiyun },
374*4882a593Smuzhiyun .pci_list = ivtv_pci_pg600,
375*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun /* Adaptec VideOh! AVC-2410 card */
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_avc2410[] = {
383*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ADAPTEC, 0x0093 },
384*4882a593Smuzhiyun { 0, 0, 0 }
385*4882a593Smuzhiyun };
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_avc2410 = {
388*4882a593Smuzhiyun .type = IVTV_CARD_AVC2410,
389*4882a593Smuzhiyun .name = "Adaptec VideOh! AVC-2410",
390*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
391*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115,
392*4882a593Smuzhiyun .hw_audio = IVTV_HW_MSP34XX,
393*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_MSP34XX,
394*4882a593Smuzhiyun .hw_muxer = IVTV_HW_CS53L32A,
395*4882a593Smuzhiyun .hw_all = IVTV_HW_MSP34XX | IVTV_HW_CS53L32A |
396*4882a593Smuzhiyun IVTV_HW_SAA7115 | IVTV_HW_TUNER |
397*4882a593Smuzhiyun IVTV_HW_I2C_IR_RX_ADAPTEC,
398*4882a593Smuzhiyun .video_inputs = {
399*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 },
400*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
401*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
402*4882a593Smuzhiyun },
403*4882a593Smuzhiyun .audio_inputs = {
404*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER,
405*4882a593Smuzhiyun MSP_TUNER, CS53L32A_IN0 },
406*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1,
407*4882a593Smuzhiyun MSP_SCART1, CS53L32A_IN2 },
408*4882a593Smuzhiyun },
409*4882a593Smuzhiyun /* This card has no eeprom and in fact the Windows driver relies
410*4882a593Smuzhiyun on the country/region setting of the user to decide which tuner
411*4882a593Smuzhiyun is available. */
412*4882a593Smuzhiyun .tuners = {
413*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
414*4882a593Smuzhiyun { .std = V4L2_STD_ALL - V4L2_STD_NTSC_M_JP,
415*4882a593Smuzhiyun .tuner = TUNER_PHILIPS_FM1236_MK3 },
416*4882a593Smuzhiyun { .std = V4L2_STD_NTSC_M_JP, .tuner = TUNER_PHILIPS_FQ1286 },
417*4882a593Smuzhiyun },
418*4882a593Smuzhiyun .pci_list = ivtv_pci_avc2410,
419*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
420*4882a593Smuzhiyun };
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun /* Adaptec VideOh! AVC-2010 card */
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_avc2010[] = {
427*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ADAPTEC, 0x0092 },
428*4882a593Smuzhiyun { 0, 0, 0 }
429*4882a593Smuzhiyun };
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_avc2010 = {
432*4882a593Smuzhiyun .type = IVTV_CARD_AVC2010,
433*4882a593Smuzhiyun .name = "Adaptec VideOh! AVC-2010",
434*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
435*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115,
436*4882a593Smuzhiyun .hw_audio = IVTV_HW_CS53L32A,
437*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CS53L32A,
438*4882a593Smuzhiyun .hw_all = IVTV_HW_CS53L32A | IVTV_HW_SAA7115,
439*4882a593Smuzhiyun .video_inputs = {
440*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 0, IVTV_SAA71XX_SVIDEO0 },
441*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 0, IVTV_SAA71XX_COMPOSITE3 },
442*4882a593Smuzhiyun },
443*4882a593Smuzhiyun .audio_inputs = {
444*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CS53L32A_IN2 },
445*4882a593Smuzhiyun },
446*4882a593Smuzhiyun /* Does not have a tuner */
447*4882a593Smuzhiyun .pci_list = ivtv_pci_avc2010,
448*4882a593Smuzhiyun };
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun /* Nagase Transgear 5000TV card */
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_tg5000tv[] = {
455*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xbfff },
456*4882a593Smuzhiyun { 0, 0, 0 }
457*4882a593Smuzhiyun };
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_tg5000tv = {
460*4882a593Smuzhiyun .type = IVTV_CARD_TG5000TV,
461*4882a593Smuzhiyun .name = "Nagase Transgear 5000TV",
462*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
463*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7114 | IVTV_HW_UPD64031A | IVTV_HW_UPD6408X |
464*4882a593Smuzhiyun IVTV_HW_GPIO,
465*4882a593Smuzhiyun .hw_audio = IVTV_HW_GPIO,
466*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_GPIO,
467*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7114 | IVTV_HW_TUNER |
468*4882a593Smuzhiyun IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
469*4882a593Smuzhiyun .video_inputs = {
470*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_SVIDEO0 },
471*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO2 },
472*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO2 },
473*4882a593Smuzhiyun },
474*4882a593Smuzhiyun .audio_inputs = {
475*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_GPIO_TUNER },
476*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_GPIO_LINE_IN },
477*4882a593Smuzhiyun },
478*4882a593Smuzhiyun .gr_config = UPD64031A_VERTICAL_EXTERNAL,
479*4882a593Smuzhiyun .gpio_init = { .direction = 0xe080, .initial_value = 0x8000 },
480*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0x8080, .tuner = 0x8000, .linein = 0x0080 },
481*4882a593Smuzhiyun .gpio_audio_mute = { .mask = 0x6000, .mute = 0x6000 },
482*4882a593Smuzhiyun .gpio_audio_mode = { .mask = 0x4300, .mono = 0x4000, .stereo = 0x0200,
483*4882a593Smuzhiyun .lang1 = 0x0300, .lang2 = 0x0000, .both = 0x0200 },
484*4882a593Smuzhiyun .gpio_video_input = { .mask = 0x0030, .tuner = 0x0000,
485*4882a593Smuzhiyun .composite = 0x0010, .svideo = 0x0020 },
486*4882a593Smuzhiyun .tuners = {
487*4882a593Smuzhiyun { .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FQ1286 },
488*4882a593Smuzhiyun },
489*4882a593Smuzhiyun .pci_list = ivtv_pci_tg5000tv,
490*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
491*4882a593Smuzhiyun };
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun /* AOpen VA2000MAX-SNT6 card */
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_va2000[] = {
498*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, 0, 0xff5f },
499*4882a593Smuzhiyun { 0, 0, 0 }
500*4882a593Smuzhiyun };
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_va2000 = {
503*4882a593Smuzhiyun .type = IVTV_CARD_VA2000MAX_SNT6,
504*4882a593Smuzhiyun .name = "AOpen VA2000MAX-SNT6",
505*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
506*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115 | IVTV_HW_UPD6408X,
507*4882a593Smuzhiyun .hw_audio = IVTV_HW_MSP34XX,
508*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_MSP34XX,
509*4882a593Smuzhiyun .hw_all = IVTV_HW_MSP34XX | IVTV_HW_SAA7115 |
510*4882a593Smuzhiyun IVTV_HW_UPD6408X | IVTV_HW_TUNER,
511*4882a593Smuzhiyun .video_inputs = {
512*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_SVIDEO0 },
513*4882a593Smuzhiyun },
514*4882a593Smuzhiyun .audio_inputs = {
515*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, MSP_TUNER },
516*4882a593Smuzhiyun },
517*4882a593Smuzhiyun .tuners = {
518*4882a593Smuzhiyun { .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FQ1286 },
519*4882a593Smuzhiyun },
520*4882a593Smuzhiyun .pci_list = ivtv_pci_va2000,
521*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
522*4882a593Smuzhiyun };
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun /* Yuan MPG600GR/Kuroutoshikou CX23416GYC-STVLP cards */
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_cx23416gyc[] = {
529*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0x0600 },
530*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN4, 0x0600 },
531*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_MELCO, 0x0523 },
532*4882a593Smuzhiyun { 0, 0, 0 }
533*4882a593Smuzhiyun };
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_cx23416gyc = {
536*4882a593Smuzhiyun .type = IVTV_CARD_CX23416GYC,
537*4882a593Smuzhiyun .name = "Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP",
538*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
539*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA717X | IVTV_HW_GPIO |
540*4882a593Smuzhiyun IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
541*4882a593Smuzhiyun .hw_audio = IVTV_HW_SAA717X,
542*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_SAA717X,
543*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA717X | IVTV_HW_TUNER |
544*4882a593Smuzhiyun IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
545*4882a593Smuzhiyun .video_inputs = {
546*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_SVIDEO3 |
547*4882a593Smuzhiyun IVTV_SAA717X_TUNER_FLAG },
548*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
549*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO3 },
550*4882a593Smuzhiyun },
551*4882a593Smuzhiyun .audio_inputs = {
552*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_SAA717X_IN2 },
553*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_SAA717X_IN0 },
554*4882a593Smuzhiyun },
555*4882a593Smuzhiyun .gr_config = UPD64031A_VERTICAL_EXTERNAL,
556*4882a593Smuzhiyun .gpio_init = { .direction = 0xf880, .initial_value = 0x8800 },
557*4882a593Smuzhiyun .gpio_video_input = { .mask = 0x0020, .tuner = 0x0000,
558*4882a593Smuzhiyun .composite = 0x0020, .svideo = 0x0020 },
559*4882a593Smuzhiyun .gpio_audio_freq = { .mask = 0xc000, .f32000 = 0x0000,
560*4882a593Smuzhiyun .f44100 = 0x4000, .f48000 = 0x8000 },
561*4882a593Smuzhiyun .tuners = {
562*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
563*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
564*4882a593Smuzhiyun },
565*4882a593Smuzhiyun .pci_list = ivtv_pci_cx23416gyc,
566*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
567*4882a593Smuzhiyun };
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_cx23416gyc_nogr = {
570*4882a593Smuzhiyun .type = IVTV_CARD_CX23416GYC_NOGR,
571*4882a593Smuzhiyun .name = "Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR)",
572*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
573*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA717X | IVTV_HW_GPIO | IVTV_HW_UPD6408X,
574*4882a593Smuzhiyun .hw_audio = IVTV_HW_SAA717X,
575*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_SAA717X,
576*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA717X | IVTV_HW_TUNER |
577*4882a593Smuzhiyun IVTV_HW_UPD6408X,
578*4882a593Smuzhiyun .video_inputs = {
579*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 |
580*4882a593Smuzhiyun IVTV_SAA717X_TUNER_FLAG },
581*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
582*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
583*4882a593Smuzhiyun },
584*4882a593Smuzhiyun .audio_inputs = {
585*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_SAA717X_IN2 },
586*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_SAA717X_IN0 },
587*4882a593Smuzhiyun },
588*4882a593Smuzhiyun .gpio_init = { .direction = 0xf880, .initial_value = 0x8800 },
589*4882a593Smuzhiyun .gpio_video_input = { .mask = 0x0020, .tuner = 0x0000,
590*4882a593Smuzhiyun .composite = 0x0020, .svideo = 0x0020 },
591*4882a593Smuzhiyun .gpio_audio_freq = { .mask = 0xc000, .f32000 = 0x0000,
592*4882a593Smuzhiyun .f44100 = 0x4000, .f48000 = 0x8000 },
593*4882a593Smuzhiyun .tuners = {
594*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
595*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
596*4882a593Smuzhiyun },
597*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
598*4882a593Smuzhiyun };
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_cx23416gyc_nogrycs = {
601*4882a593Smuzhiyun .type = IVTV_CARD_CX23416GYC_NOGRYCS,
602*4882a593Smuzhiyun .name = "Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR/YCS)",
603*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
604*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA717X | IVTV_HW_GPIO,
605*4882a593Smuzhiyun .hw_audio = IVTV_HW_SAA717X,
606*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_SAA717X,
607*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA717X | IVTV_HW_TUNER,
608*4882a593Smuzhiyun .video_inputs = {
609*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 |
610*4882a593Smuzhiyun IVTV_SAA717X_TUNER_FLAG },
611*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
612*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE0 },
613*4882a593Smuzhiyun },
614*4882a593Smuzhiyun .audio_inputs = {
615*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_SAA717X_IN2 },
616*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_SAA717X_IN0 },
617*4882a593Smuzhiyun },
618*4882a593Smuzhiyun .gpio_init = { .direction = 0xf880, .initial_value = 0x8800 },
619*4882a593Smuzhiyun .gpio_video_input = { .mask = 0x0020, .tuner = 0x0000,
620*4882a593Smuzhiyun .composite = 0x0020, .svideo = 0x0020 },
621*4882a593Smuzhiyun .gpio_audio_freq = { .mask = 0xc000, .f32000 = 0x0000,
622*4882a593Smuzhiyun .f44100 = 0x4000, .f48000 = 0x8000 },
623*4882a593Smuzhiyun .tuners = {
624*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
625*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
626*4882a593Smuzhiyun },
627*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
628*4882a593Smuzhiyun };
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun /* I/O Data GV-MVP/RX & GV-MVP/RX2W (dual tuner) cards */
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_gv_mvprx[] = {
635*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd01e },
636*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd038 }, /* 2W unit #1 */
637*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd039 }, /* 2W unit #2 */
638*4882a593Smuzhiyun { 0, 0, 0 }
639*4882a593Smuzhiyun };
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_gv_mvprx = {
642*4882a593Smuzhiyun .type = IVTV_CARD_GV_MVPRX,
643*4882a593Smuzhiyun .name = "I/O Data GV-MVP/RX, GV-MVP/RX2W (dual tuner)",
644*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
645*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115 | IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
646*4882a593Smuzhiyun .hw_audio = IVTV_HW_GPIO,
647*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_WM8739,
648*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_VP27SMPX |
649*4882a593Smuzhiyun IVTV_HW_TUNER | IVTV_HW_WM8739 |
650*4882a593Smuzhiyun IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
651*4882a593Smuzhiyun .video_inputs = {
652*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_SVIDEO0 },
653*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO1 },
654*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO2 },
655*4882a593Smuzhiyun },
656*4882a593Smuzhiyun .audio_inputs = {
657*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_GPIO_TUNER },
658*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_GPIO_LINE_IN },
659*4882a593Smuzhiyun },
660*4882a593Smuzhiyun .gpio_init = { .direction = 0xc301, .initial_value = 0x0200 },
661*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0xffff, .tuner = 0x0200, .linein = 0x0300 },
662*4882a593Smuzhiyun .tuners = {
663*4882a593Smuzhiyun /* This card has the Panasonic VP27 tuner */
664*4882a593Smuzhiyun { .std = V4L2_STD_MN, .tuner = TUNER_PANASONIC_VP27 },
665*4882a593Smuzhiyun },
666*4882a593Smuzhiyun .pci_list = ivtv_pci_gv_mvprx,
667*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
668*4882a593Smuzhiyun };
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun /* I/O Data GV-MVP/RX2E card */
673*4882a593Smuzhiyun
674*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_gv_mvprx2e[] = {
675*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_IODATA, 0xd025 },
676*4882a593Smuzhiyun {0, 0, 0}
677*4882a593Smuzhiyun };
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_gv_mvprx2e = {
680*4882a593Smuzhiyun .type = IVTV_CARD_GV_MVPRX2E,
681*4882a593Smuzhiyun .name = "I/O Data GV-MVP/RX2E",
682*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
683*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115,
684*4882a593Smuzhiyun .hw_audio = IVTV_HW_GPIO,
685*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_WM8739,
686*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER |
687*4882a593Smuzhiyun IVTV_HW_VP27SMPX | IVTV_HW_WM8739,
688*4882a593Smuzhiyun .video_inputs = {
689*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE4 },
690*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 },
691*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 },
692*4882a593Smuzhiyun },
693*4882a593Smuzhiyun .audio_inputs = {
694*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_GPIO_TUNER },
695*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_GPIO_LINE_IN },
696*4882a593Smuzhiyun },
697*4882a593Smuzhiyun .gpio_init = { .direction = 0xc301, .initial_value = 0x0200 },
698*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0xffff, .tuner = 0x0200, .linein = 0x0300 },
699*4882a593Smuzhiyun .tuners = {
700*4882a593Smuzhiyun /* This card has the Panasonic VP27 tuner */
701*4882a593Smuzhiyun { .std = V4L2_STD_MN, .tuner = TUNER_PANASONIC_VP27 },
702*4882a593Smuzhiyun },
703*4882a593Smuzhiyun .pci_list = ivtv_pci_gv_mvprx2e,
704*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
705*4882a593Smuzhiyun };
706*4882a593Smuzhiyun
707*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun /* GotVIEW PCI DVD card */
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_gotview_pci_dvd[] = {
712*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN1, 0x0600 },
713*4882a593Smuzhiyun { 0, 0, 0 }
714*4882a593Smuzhiyun };
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_gotview_pci_dvd = {
717*4882a593Smuzhiyun .type = IVTV_CARD_GOTVIEW_PCI_DVD,
718*4882a593Smuzhiyun .name = "GotView PCI DVD",
719*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
720*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA717X,
721*4882a593Smuzhiyun .hw_audio = IVTV_HW_SAA717X,
722*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_SAA717X,
723*4882a593Smuzhiyun .hw_all = IVTV_HW_SAA717X | IVTV_HW_TUNER,
724*4882a593Smuzhiyun .video_inputs = {
725*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE1 }, /* pin 116 */
726*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO0 }, /* pin 114/109 */
727*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE3 }, /* pin 118 */
728*4882a593Smuzhiyun },
729*4882a593Smuzhiyun .audio_inputs = {
730*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_SAA717X_IN0 },
731*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_SAA717X_IN2 },
732*4882a593Smuzhiyun },
733*4882a593Smuzhiyun .gpio_init = { .direction = 0xf000, .initial_value = 0xA000 },
734*4882a593Smuzhiyun .tuners = {
735*4882a593Smuzhiyun /* This card has a Philips FQ1216ME MK3 tuner */
736*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
737*4882a593Smuzhiyun },
738*4882a593Smuzhiyun .pci_list = ivtv_pci_gotview_pci_dvd,
739*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
740*4882a593Smuzhiyun };
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun /* GotVIEW PCI DVD2 Deluxe card */
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_gotview_pci_dvd2[] = {
747*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_GOTVIEW1, 0x0600 },
748*4882a593Smuzhiyun { 0, 0, 0 }
749*4882a593Smuzhiyun };
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_gotview_pci_dvd2 = {
752*4882a593Smuzhiyun .type = IVTV_CARD_GOTVIEW_PCI_DVD2,
753*4882a593Smuzhiyun .name = "GotView PCI DVD2 Deluxe",
754*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
755*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
756*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
757*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
758*4882a593Smuzhiyun .hw_muxer = IVTV_HW_GPIO,
759*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
760*4882a593Smuzhiyun .video_inputs = {
761*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
762*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1,
763*4882a593Smuzhiyun CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
764*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
765*4882a593Smuzhiyun },
766*4882a593Smuzhiyun .audio_inputs = {
767*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5, 0 },
768*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, 1 },
769*4882a593Smuzhiyun },
770*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
771*4882a593Smuzhiyun .gpio_init = { .direction = 0x0800, .initial_value = 0 },
772*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0x0800, .tuner = 0, .linein = 0, .radio = 0x0800 },
773*4882a593Smuzhiyun .tuners = {
774*4882a593Smuzhiyun /* This card has a Philips FQ1216ME MK5 tuner */
775*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
776*4882a593Smuzhiyun },
777*4882a593Smuzhiyun .pci_list = ivtv_pci_gotview_pci_dvd2,
778*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
779*4882a593Smuzhiyun };
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
782*4882a593Smuzhiyun
783*4882a593Smuzhiyun /* Yuan MPC622 miniPCI card */
784*4882a593Smuzhiyun
785*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_yuan_mpc622[] = {
786*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN2, 0xd998 },
787*4882a593Smuzhiyun { 0, 0, 0 }
788*4882a593Smuzhiyun };
789*4882a593Smuzhiyun
790*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_yuan_mpc622 = {
791*4882a593Smuzhiyun .type = IVTV_CARD_YUAN_MPC622,
792*4882a593Smuzhiyun .name = "Yuan MPC622",
793*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
794*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
795*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
796*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
797*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
798*4882a593Smuzhiyun .video_inputs = {
799*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
800*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1,
801*4882a593Smuzhiyun CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
802*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
803*4882a593Smuzhiyun },
804*4882a593Smuzhiyun .audio_inputs = {
805*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
806*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL },
807*4882a593Smuzhiyun },
808*4882a593Smuzhiyun .gpio_init = { .direction = 0x00ff, .initial_value = 0x0002 },
809*4882a593Smuzhiyun .tuners = {
810*4882a593Smuzhiyun /* This card has the TDA8290/TDA8275 tuner chips */
811*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_TDA8290 },
812*4882a593Smuzhiyun },
813*4882a593Smuzhiyun .pci_list = ivtv_pci_yuan_mpc622,
814*4882a593Smuzhiyun .i2c = &ivtv_i2c_tda8290,
815*4882a593Smuzhiyun };
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun /* DIGITAL COWBOY DCT-MTVP1 card */
820*4882a593Smuzhiyun
821*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_dctmvtvp1[] = {
822*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xbfff },
823*4882a593Smuzhiyun { 0, 0, 0 }
824*4882a593Smuzhiyun };
825*4882a593Smuzhiyun
826*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_dctmvtvp1 = {
827*4882a593Smuzhiyun .type = IVTV_CARD_DCTMTVP1,
828*4882a593Smuzhiyun .name = "Digital Cowboy DCT-MTVP1",
829*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
830*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115 | IVTV_HW_UPD64031A | IVTV_HW_UPD6408X |
831*4882a593Smuzhiyun IVTV_HW_GPIO,
832*4882a593Smuzhiyun .hw_audio = IVTV_HW_GPIO,
833*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_GPIO,
834*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER |
835*4882a593Smuzhiyun IVTV_HW_UPD64031A | IVTV_HW_UPD6408X,
836*4882a593Smuzhiyun .video_inputs = {
837*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_SVIDEO0 },
838*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO2 },
839*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_SVIDEO2 },
840*4882a593Smuzhiyun },
841*4882a593Smuzhiyun .audio_inputs = {
842*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_GPIO_TUNER },
843*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_GPIO_LINE_IN },
844*4882a593Smuzhiyun },
845*4882a593Smuzhiyun .gpio_init = { .direction = 0xe080, .initial_value = 0x8000 },
846*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0x8080, .tuner = 0x8000, .linein = 0x0080 },
847*4882a593Smuzhiyun .gpio_audio_mute = { .mask = 0x6000, .mute = 0x6000 },
848*4882a593Smuzhiyun .gpio_audio_mode = { .mask = 0x4300, .mono = 0x4000, .stereo = 0x0200,
849*4882a593Smuzhiyun .lang1 = 0x0300, .lang2 = 0x0000, .both = 0x0200 },
850*4882a593Smuzhiyun .gpio_video_input = { .mask = 0x0030, .tuner = 0x0000,
851*4882a593Smuzhiyun .composite = 0x0010, .svideo = 0x0020},
852*4882a593Smuzhiyun .tuners = {
853*4882a593Smuzhiyun { .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FQ1286 },
854*4882a593Smuzhiyun },
855*4882a593Smuzhiyun .pci_list = ivtv_pci_dctmvtvp1,
856*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
857*4882a593Smuzhiyun };
858*4882a593Smuzhiyun
859*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
860*4882a593Smuzhiyun
861*4882a593Smuzhiyun /* Yuan PG600-2/GotView PCI DVD Lite cards */
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_pg600v2[] = {
864*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN3, 0x0600 },
865*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_GOTVIEW2, 0x0600 },
866*4882a593Smuzhiyun { 0, 0, 0 }
867*4882a593Smuzhiyun };
868*4882a593Smuzhiyun
869*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_pg600v2 = {
870*4882a593Smuzhiyun .type = IVTV_CARD_PG600V2,
871*4882a593Smuzhiyun .name = "Yuan PG600-2, GotView PCI DVD Lite",
872*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
873*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
874*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
875*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
876*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
877*4882a593Smuzhiyun /* XC2028 support apparently works for the Yuan, it's still
878*4882a593Smuzhiyun uncertain whether it also works with the GotView. */
879*4882a593Smuzhiyun .video_inputs = {
880*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
881*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1,
882*4882a593Smuzhiyun CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
883*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
884*4882a593Smuzhiyun },
885*4882a593Smuzhiyun .audio_inputs = {
886*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
887*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL },
888*4882a593Smuzhiyun },
889*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
890*4882a593Smuzhiyun .xceive_pin = 12,
891*4882a593Smuzhiyun .tuners = {
892*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
893*4882a593Smuzhiyun },
894*4882a593Smuzhiyun .pci_list = ivtv_pci_pg600v2,
895*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
896*4882a593Smuzhiyun };
897*4882a593Smuzhiyun
898*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
899*4882a593Smuzhiyun
900*4882a593Smuzhiyun /* Club3D ZAP-TV1x01 cards */
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_club3d[] = {
903*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_YUAN3, 0x0600 },
904*4882a593Smuzhiyun { 0, 0, 0 }
905*4882a593Smuzhiyun };
906*4882a593Smuzhiyun
907*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_club3d = {
908*4882a593Smuzhiyun .type = IVTV_CARD_CLUB3D,
909*4882a593Smuzhiyun .name = "Club3D ZAP-TV1x01",
910*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
911*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
912*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
913*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
914*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
915*4882a593Smuzhiyun .video_inputs = {
916*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
917*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1,
918*4882a593Smuzhiyun CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
919*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE3 },
920*4882a593Smuzhiyun },
921*4882a593Smuzhiyun .audio_inputs = {
922*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
923*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL },
924*4882a593Smuzhiyun },
925*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
926*4882a593Smuzhiyun .xceive_pin = 12,
927*4882a593Smuzhiyun .tuners = {
928*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
929*4882a593Smuzhiyun },
930*4882a593Smuzhiyun .pci_list = ivtv_pci_club3d,
931*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
932*4882a593Smuzhiyun };
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun /* AVerTV MCE 116 Plus (M116) card */
937*4882a593Smuzhiyun
938*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_avertv_mce116[] = {
939*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc439 },
940*4882a593Smuzhiyun { 0, 0, 0 }
941*4882a593Smuzhiyun };
942*4882a593Smuzhiyun
943*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_avertv_mce116 = {
944*4882a593Smuzhiyun .type = IVTV_CARD_AVERTV_MCE116,
945*4882a593Smuzhiyun .name = "AVerTV MCE 116 Plus",
946*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
947*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
948*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
949*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
950*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER | IVTV_HW_WM8739 |
951*4882a593Smuzhiyun IVTV_HW_I2C_IR_RX_AVER,
952*4882a593Smuzhiyun .video_inputs = {
953*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
954*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, CX25840_SVIDEO3 },
955*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
956*4882a593Smuzhiyun },
957*4882a593Smuzhiyun .audio_inputs = {
958*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
959*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, 1 },
960*4882a593Smuzhiyun },
961*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
962*4882a593Smuzhiyun /* enable line-in */
963*4882a593Smuzhiyun .gpio_init = { .direction = 0xe000, .initial_value = 0x4000 },
964*4882a593Smuzhiyun .xceive_pin = 10,
965*4882a593Smuzhiyun .tuners = {
966*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
967*4882a593Smuzhiyun },
968*4882a593Smuzhiyun .pci_list = ivtv_pci_avertv_mce116,
969*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
970*4882a593Smuzhiyun };
971*4882a593Smuzhiyun
972*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
973*4882a593Smuzhiyun
974*4882a593Smuzhiyun /* AVerMedia PVR-150 Plus / AVerTV M113 cards with a Daewoo/Partsnic Tuner */
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_aver_pvr150[] = {
977*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc034 }, /* NTSC */
978*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc035 }, /* NTSC FM */
979*4882a593Smuzhiyun { 0, 0, 0 }
980*4882a593Smuzhiyun };
981*4882a593Smuzhiyun
982*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_aver_pvr150 = {
983*4882a593Smuzhiyun .type = IVTV_CARD_AVER_PVR150PLUS,
984*4882a593Smuzhiyun .name = "AVerMedia PVR-150 Plus / AVerTV M113 Partsnic (Daewoo) Tuner",
985*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
986*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
987*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
988*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
989*4882a593Smuzhiyun .hw_muxer = IVTV_HW_GPIO,
990*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER |
991*4882a593Smuzhiyun IVTV_HW_WM8739 | IVTV_HW_GPIO,
992*4882a593Smuzhiyun .video_inputs = {
993*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
994*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, CX25840_SVIDEO3 },
995*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
996*4882a593Smuzhiyun },
997*4882a593Smuzhiyun .audio_inputs = {
998*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5, 0 },
999*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, 1 },
1000*4882a593Smuzhiyun },
1001*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
1002*4882a593Smuzhiyun /* The 74HC4052 Dual 4:1 multiplexer is controlled by 2 GPIO lines */
1003*4882a593Smuzhiyun .gpio_init = { .direction = 0xc000, .initial_value = 0 },
1004*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0xc000,
1005*4882a593Smuzhiyun .tuner = 0x0000,
1006*4882a593Smuzhiyun .linein = 0x4000,
1007*4882a593Smuzhiyun .radio = 0x8000 },
1008*4882a593Smuzhiyun .tuners = {
1009*4882a593Smuzhiyun /* Subsystem ID's 0xc03[45] have a Partsnic PTI-5NF05 tuner */
1010*4882a593Smuzhiyun { .std = V4L2_STD_MN, .tuner = TUNER_PARTSNIC_PTI_5NF05 },
1011*4882a593Smuzhiyun },
1012*4882a593Smuzhiyun .pci_list = ivtv_pci_aver_pvr150,
1013*4882a593Smuzhiyun /* Subsystem ID 0xc035 has a TEA5767(?) FM tuner, 0xc034 does not */
1014*4882a593Smuzhiyun .i2c = &ivtv_i2c_radio,
1015*4882a593Smuzhiyun };
1016*4882a593Smuzhiyun
1017*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
1018*4882a593Smuzhiyun
1019*4882a593Smuzhiyun /* AVerMedia UltraTV 1500 MCE (newer non-cx88 version, M113 variant) card */
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_aver_ultra1500mce[] = {
1022*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc019 }, /* NTSC */
1023*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc01b }, /* PAL/SECAM */
1024*4882a593Smuzhiyun { 0, 0, 0 }
1025*4882a593Smuzhiyun };
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_aver_ultra1500mce = {
1028*4882a593Smuzhiyun .type = IVTV_CARD_AVER_ULTRA1500MCE,
1029*4882a593Smuzhiyun .name = "AVerMedia UltraTV 1500 MCE / AVerTV M113 Philips Tuner",
1030*4882a593Smuzhiyun .comment = "For non-NTSC tuners, use the pal= or secam= module options",
1031*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
1032*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
1033*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
1034*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
1035*4882a593Smuzhiyun .hw_muxer = IVTV_HW_GPIO,
1036*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER |
1037*4882a593Smuzhiyun IVTV_HW_WM8739 | IVTV_HW_GPIO,
1038*4882a593Smuzhiyun .video_inputs = {
1039*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
1040*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, CX25840_SVIDEO3 },
1041*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
1042*4882a593Smuzhiyun },
1043*4882a593Smuzhiyun .audio_inputs = {
1044*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5, 0 },
1045*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, 1 },
1046*4882a593Smuzhiyun },
1047*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
1048*4882a593Smuzhiyun /* The 74HC4052 Dual 4:1 multiplexer is controlled by 2 GPIO lines */
1049*4882a593Smuzhiyun .gpio_init = { .direction = 0xc000, .initial_value = 0 },
1050*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0xc000,
1051*4882a593Smuzhiyun .tuner = 0x0000,
1052*4882a593Smuzhiyun .linein = 0x4000,
1053*4882a593Smuzhiyun .radio = 0x8000 },
1054*4882a593Smuzhiyun .tuners = {
1055*4882a593Smuzhiyun /* The UltraTV 1500 MCE has a Philips FM1236 MK5 TV/FM tuner */
1056*4882a593Smuzhiyun { .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FM1236_MK3 },
1057*4882a593Smuzhiyun { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216MK5 },
1058*4882a593Smuzhiyun },
1059*4882a593Smuzhiyun .pci_list = ivtv_pci_aver_ultra1500mce,
1060*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
1061*4882a593Smuzhiyun };
1062*4882a593Smuzhiyun
1063*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
1064*4882a593Smuzhiyun
1065*4882a593Smuzhiyun /* AVerMedia EZMaker PCI Deluxe card */
1066*4882a593Smuzhiyun
1067*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_aver_ezmaker[] = {
1068*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc03f },
1069*4882a593Smuzhiyun { 0, 0, 0 }
1070*4882a593Smuzhiyun };
1071*4882a593Smuzhiyun
1072*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_aver_ezmaker = {
1073*4882a593Smuzhiyun .type = IVTV_CARD_AVER_EZMAKER,
1074*4882a593Smuzhiyun .name = "AVerMedia EZMaker PCI Deluxe",
1075*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
1076*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
1077*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
1078*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
1079*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_WM8739,
1080*4882a593Smuzhiyun .video_inputs = {
1081*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 0, CX25840_SVIDEO3 },
1082*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 0, CX25840_COMPOSITE1 },
1083*4882a593Smuzhiyun },
1084*4882a593Smuzhiyun .audio_inputs = {
1085*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, 0 },
1086*4882a593Smuzhiyun },
1087*4882a593Smuzhiyun .gpio_init = { .direction = 0x4000, .initial_value = 0x4000 },
1088*4882a593Smuzhiyun /* Does not have a tuner */
1089*4882a593Smuzhiyun .pci_list = ivtv_pci_aver_ezmaker,
1090*4882a593Smuzhiyun };
1091*4882a593Smuzhiyun
1092*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun /* ASUS Falcon2 */
1095*4882a593Smuzhiyun
1096*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_asus_falcon2[] = {
1097*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ASUSTEK, 0x4b66 },
1098*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ASUSTEK, 0x462e },
1099*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_ASUSTEK, 0x4b2e },
1100*4882a593Smuzhiyun { 0, 0, 0 }
1101*4882a593Smuzhiyun };
1102*4882a593Smuzhiyun
1103*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_asus_falcon2 = {
1104*4882a593Smuzhiyun .type = IVTV_CARD_ASUS_FALCON2,
1105*4882a593Smuzhiyun .name = "ASUS Falcon2",
1106*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
1107*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
1108*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
1109*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
1110*4882a593Smuzhiyun .hw_muxer = IVTV_HW_M52790,
1111*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_M52790 | IVTV_HW_TUNER,
1112*4882a593Smuzhiyun .video_inputs = {
1113*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
1114*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, CX25840_SVIDEO3 },
1115*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 2, CX25840_COMPOSITE2 },
1116*4882a593Smuzhiyun },
1117*4882a593Smuzhiyun .audio_inputs = {
1118*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5, M52790_IN_TUNER },
1119*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL,
1120*4882a593Smuzhiyun M52790_IN_V2 | M52790_SW1_YCMIX | M52790_SW2_YCMIX },
1121*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, M52790_IN_V2 },
1122*4882a593Smuzhiyun },
1123*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, M52790_IN_TUNER },
1124*4882a593Smuzhiyun .tuners = {
1125*4882a593Smuzhiyun { .std = V4L2_STD_MN, .tuner = TUNER_PHILIPS_FM1236_MK3 },
1126*4882a593Smuzhiyun },
1127*4882a593Smuzhiyun .pci_list = ivtv_pci_asus_falcon2,
1128*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
1129*4882a593Smuzhiyun };
1130*4882a593Smuzhiyun
1131*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun /* AVerMedia M104 miniPCI card */
1134*4882a593Smuzhiyun
1135*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_aver_m104[] = {
1136*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc136 },
1137*4882a593Smuzhiyun { 0, 0, 0 }
1138*4882a593Smuzhiyun };
1139*4882a593Smuzhiyun
1140*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_aver_m104 = {
1141*4882a593Smuzhiyun .type = IVTV_CARD_AVER_M104,
1142*4882a593Smuzhiyun .name = "AVerMedia M104",
1143*4882a593Smuzhiyun .comment = "Not yet supported!\n",
1144*4882a593Smuzhiyun .v4l2_capabilities = 0, /*IVTV_CAP_ENCODER,*/
1145*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
1146*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
1147*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
1148*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER | IVTV_HW_WM8739,
1149*4882a593Smuzhiyun .video_inputs = {
1150*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 0, CX25840_SVIDEO3 },
1151*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 0, CX25840_COMPOSITE1 },
1152*4882a593Smuzhiyun },
1153*4882a593Smuzhiyun .audio_inputs = {
1154*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, 1 },
1155*4882a593Smuzhiyun },
1156*4882a593Smuzhiyun .radio_input = { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO_SERIAL, 2 },
1157*4882a593Smuzhiyun /* enable line-in + reset tuner */
1158*4882a593Smuzhiyun .gpio_init = { .direction = 0xe000, .initial_value = 0x4000 },
1159*4882a593Smuzhiyun .xceive_pin = 10,
1160*4882a593Smuzhiyun .tuners = {
1161*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
1162*4882a593Smuzhiyun },
1163*4882a593Smuzhiyun .pci_list = ivtv_pci_aver_m104,
1164*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
1165*4882a593Smuzhiyun };
1166*4882a593Smuzhiyun
1167*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun /* Buffalo PC-MV5L/PCI cards */
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_buffalo[] = {
1172*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_MELCO, 0x052b },
1173*4882a593Smuzhiyun { 0, 0, 0 }
1174*4882a593Smuzhiyun };
1175*4882a593Smuzhiyun
1176*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_buffalo = {
1177*4882a593Smuzhiyun .type = IVTV_CARD_BUFFALO_MV5L,
1178*4882a593Smuzhiyun .name = "Buffalo PC-MV5L/PCI",
1179*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
1180*4882a593Smuzhiyun .hw_video = IVTV_HW_CX25840,
1181*4882a593Smuzhiyun .hw_audio = IVTV_HW_CX25840,
1182*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_CX25840,
1183*4882a593Smuzhiyun .hw_all = IVTV_HW_CX25840 | IVTV_HW_TUNER,
1184*4882a593Smuzhiyun .video_inputs = {
1185*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, CX25840_COMPOSITE2 },
1186*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1,
1187*4882a593Smuzhiyun CX25840_SVIDEO_LUMA3 | CX25840_SVIDEO_CHROMA4 },
1188*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, CX25840_COMPOSITE1 },
1189*4882a593Smuzhiyun },
1190*4882a593Smuzhiyun .audio_inputs = {
1191*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, CX25840_AUDIO5 },
1192*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL },
1193*4882a593Smuzhiyun },
1194*4882a593Smuzhiyun .xceive_pin = 12,
1195*4882a593Smuzhiyun .tuners = {
1196*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
1197*4882a593Smuzhiyun },
1198*4882a593Smuzhiyun .pci_list = ivtv_pci_buffalo,
1199*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
1200*4882a593Smuzhiyun };
1201*4882a593Smuzhiyun
1202*4882a593Smuzhiyun /* ------------------------------------------------------------------------- */
1203*4882a593Smuzhiyun /* Sony Kikyou */
1204*4882a593Smuzhiyun
1205*4882a593Smuzhiyun static const struct ivtv_card_pci_info ivtv_pci_kikyou[] = {
1206*4882a593Smuzhiyun { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_SONY, 0x813d },
1207*4882a593Smuzhiyun { 0, 0, 0 }
1208*4882a593Smuzhiyun };
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun static const struct ivtv_card ivtv_card_kikyou = {
1211*4882a593Smuzhiyun .type = IVTV_CARD_KIKYOU,
1212*4882a593Smuzhiyun .name = "Sony VAIO Giga Pocket (ENX Kikyou)",
1213*4882a593Smuzhiyun .v4l2_capabilities = IVTV_CAP_ENCODER,
1214*4882a593Smuzhiyun .hw_video = IVTV_HW_SAA7115,
1215*4882a593Smuzhiyun .hw_audio = IVTV_HW_GPIO,
1216*4882a593Smuzhiyun .hw_audio_ctrl = IVTV_HW_GPIO,
1217*4882a593Smuzhiyun .hw_all = IVTV_HW_GPIO | IVTV_HW_SAA7115 | IVTV_HW_TUNER,
1218*4882a593Smuzhiyun .video_inputs = {
1219*4882a593Smuzhiyun { IVTV_CARD_INPUT_VID_TUNER, 0, IVTV_SAA71XX_COMPOSITE1 },
1220*4882a593Smuzhiyun { IVTV_CARD_INPUT_COMPOSITE1, 1, IVTV_SAA71XX_COMPOSITE1 },
1221*4882a593Smuzhiyun { IVTV_CARD_INPUT_SVIDEO1, 1, IVTV_SAA71XX_SVIDEO1 },
1222*4882a593Smuzhiyun },
1223*4882a593Smuzhiyun .audio_inputs = {
1224*4882a593Smuzhiyun { IVTV_CARD_INPUT_AUD_TUNER, IVTV_GPIO_TUNER },
1225*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN1, IVTV_GPIO_LINE_IN },
1226*4882a593Smuzhiyun { IVTV_CARD_INPUT_LINE_IN2, IVTV_GPIO_LINE_IN },
1227*4882a593Smuzhiyun },
1228*4882a593Smuzhiyun .gpio_init = { .direction = 0x03e1, .initial_value = 0x0320 },
1229*4882a593Smuzhiyun .gpio_audio_input = { .mask = 0x0060,
1230*4882a593Smuzhiyun .tuner = 0x0020,
1231*4882a593Smuzhiyun .linein = 0x0000,
1232*4882a593Smuzhiyun .radio = 0x0060 },
1233*4882a593Smuzhiyun .gpio_audio_mute = { .mask = 0x0000,
1234*4882a593Smuzhiyun .mute = 0x0000 }, /* 0x200? Disable for now. */
1235*4882a593Smuzhiyun .gpio_audio_mode = { .mask = 0x0080,
1236*4882a593Smuzhiyun .mono = 0x0000,
1237*4882a593Smuzhiyun .stereo = 0x0000, /* SAP */
1238*4882a593Smuzhiyun .lang1 = 0x0080,
1239*4882a593Smuzhiyun .lang2 = 0x0000,
1240*4882a593Smuzhiyun .both = 0x0080 },
1241*4882a593Smuzhiyun .tuners = {
1242*4882a593Smuzhiyun { .std = V4L2_STD_ALL, .tuner = TUNER_SONY_BTF_PXN01Z },
1243*4882a593Smuzhiyun },
1244*4882a593Smuzhiyun .pci_list = ivtv_pci_kikyou,
1245*4882a593Smuzhiyun .i2c = &ivtv_i2c_std,
1246*4882a593Smuzhiyun };
1247*4882a593Smuzhiyun
1248*4882a593Smuzhiyun
1249*4882a593Smuzhiyun static const struct ivtv_card *ivtv_card_list[] = {
1250*4882a593Smuzhiyun &ivtv_card_pvr250,
1251*4882a593Smuzhiyun &ivtv_card_pvr350,
1252*4882a593Smuzhiyun &ivtv_card_pvr150,
1253*4882a593Smuzhiyun &ivtv_card_m179,
1254*4882a593Smuzhiyun &ivtv_card_mpg600,
1255*4882a593Smuzhiyun &ivtv_card_mpg160,
1256*4882a593Smuzhiyun &ivtv_card_pg600,
1257*4882a593Smuzhiyun &ivtv_card_avc2410,
1258*4882a593Smuzhiyun &ivtv_card_avc2010,
1259*4882a593Smuzhiyun &ivtv_card_tg5000tv,
1260*4882a593Smuzhiyun &ivtv_card_va2000,
1261*4882a593Smuzhiyun &ivtv_card_cx23416gyc,
1262*4882a593Smuzhiyun &ivtv_card_gv_mvprx,
1263*4882a593Smuzhiyun &ivtv_card_gv_mvprx2e,
1264*4882a593Smuzhiyun &ivtv_card_gotview_pci_dvd,
1265*4882a593Smuzhiyun &ivtv_card_gotview_pci_dvd2,
1266*4882a593Smuzhiyun &ivtv_card_yuan_mpc622,
1267*4882a593Smuzhiyun &ivtv_card_dctmvtvp1,
1268*4882a593Smuzhiyun &ivtv_card_pg600v2,
1269*4882a593Smuzhiyun &ivtv_card_club3d,
1270*4882a593Smuzhiyun &ivtv_card_avertv_mce116,
1271*4882a593Smuzhiyun &ivtv_card_asus_falcon2,
1272*4882a593Smuzhiyun &ivtv_card_aver_pvr150,
1273*4882a593Smuzhiyun &ivtv_card_aver_ezmaker,
1274*4882a593Smuzhiyun &ivtv_card_aver_m104,
1275*4882a593Smuzhiyun &ivtv_card_buffalo,
1276*4882a593Smuzhiyun &ivtv_card_aver_ultra1500mce,
1277*4882a593Smuzhiyun &ivtv_card_kikyou,
1278*4882a593Smuzhiyun
1279*4882a593Smuzhiyun /* Variations of standard cards but with the same PCI IDs.
1280*4882a593Smuzhiyun These cards must come last in this list. */
1281*4882a593Smuzhiyun &ivtv_card_pvr350_v1,
1282*4882a593Smuzhiyun &ivtv_card_cx23416gyc_nogr,
1283*4882a593Smuzhiyun &ivtv_card_cx23416gyc_nogrycs,
1284*4882a593Smuzhiyun };
1285*4882a593Smuzhiyun
ivtv_get_card(u16 index)1286*4882a593Smuzhiyun const struct ivtv_card *ivtv_get_card(u16 index)
1287*4882a593Smuzhiyun {
1288*4882a593Smuzhiyun if (index >= ARRAY_SIZE(ivtv_card_list))
1289*4882a593Smuzhiyun return NULL;
1290*4882a593Smuzhiyun return ivtv_card_list[index];
1291*4882a593Smuzhiyun }
1292*4882a593Smuzhiyun
ivtv_get_input(struct ivtv * itv,u16 index,struct v4l2_input * input)1293*4882a593Smuzhiyun int ivtv_get_input(struct ivtv *itv, u16 index, struct v4l2_input *input)
1294*4882a593Smuzhiyun {
1295*4882a593Smuzhiyun const struct ivtv_card_video_input *card_input = itv->card->video_inputs + index;
1296*4882a593Smuzhiyun static const char * const input_strs[] = {
1297*4882a593Smuzhiyun "Tuner 1",
1298*4882a593Smuzhiyun "S-Video 1",
1299*4882a593Smuzhiyun "S-Video 2",
1300*4882a593Smuzhiyun "Composite 1",
1301*4882a593Smuzhiyun "Composite 2",
1302*4882a593Smuzhiyun "Composite 3"
1303*4882a593Smuzhiyun };
1304*4882a593Smuzhiyun
1305*4882a593Smuzhiyun if (index >= itv->nof_inputs)
1306*4882a593Smuzhiyun return -EINVAL;
1307*4882a593Smuzhiyun input->index = index;
1308*4882a593Smuzhiyun strscpy(input->name, input_strs[card_input->video_type - 1],
1309*4882a593Smuzhiyun sizeof(input->name));
1310*4882a593Smuzhiyun input->type = (card_input->video_type == IVTV_CARD_INPUT_VID_TUNER ?
1311*4882a593Smuzhiyun V4L2_INPUT_TYPE_TUNER : V4L2_INPUT_TYPE_CAMERA);
1312*4882a593Smuzhiyun input->audioset = (1 << itv->nof_audio_inputs) - 1;
1313*4882a593Smuzhiyun input->std = (input->type == V4L2_INPUT_TYPE_TUNER) ?
1314*4882a593Smuzhiyun itv->tuner_std : V4L2_STD_ALL;
1315*4882a593Smuzhiyun return 0;
1316*4882a593Smuzhiyun }
1317*4882a593Smuzhiyun
ivtv_get_output(struct ivtv * itv,u16 index,struct v4l2_output * output)1318*4882a593Smuzhiyun int ivtv_get_output(struct ivtv *itv, u16 index, struct v4l2_output *output)
1319*4882a593Smuzhiyun {
1320*4882a593Smuzhiyun const struct ivtv_card_output *card_output = itv->card->video_outputs + index;
1321*4882a593Smuzhiyun
1322*4882a593Smuzhiyun if (index >= itv->card->nof_outputs)
1323*4882a593Smuzhiyun return -EINVAL;
1324*4882a593Smuzhiyun output->index = index;
1325*4882a593Smuzhiyun strscpy(output->name, card_output->name, sizeof(output->name));
1326*4882a593Smuzhiyun output->type = V4L2_OUTPUT_TYPE_ANALOG;
1327*4882a593Smuzhiyun output->audioset = 1;
1328*4882a593Smuzhiyun output->std = V4L2_STD_ALL;
1329*4882a593Smuzhiyun return 0;
1330*4882a593Smuzhiyun }
1331*4882a593Smuzhiyun
ivtv_get_audio_input(struct ivtv * itv,u16 index,struct v4l2_audio * audio)1332*4882a593Smuzhiyun int ivtv_get_audio_input(struct ivtv *itv, u16 index, struct v4l2_audio *audio)
1333*4882a593Smuzhiyun {
1334*4882a593Smuzhiyun const struct ivtv_card_audio_input *aud_input = itv->card->audio_inputs + index;
1335*4882a593Smuzhiyun static const char * const input_strs[] = {
1336*4882a593Smuzhiyun "Tuner 1",
1337*4882a593Smuzhiyun "Line In 1",
1338*4882a593Smuzhiyun "Line In 2"
1339*4882a593Smuzhiyun };
1340*4882a593Smuzhiyun
1341*4882a593Smuzhiyun memset(audio, 0, sizeof(*audio));
1342*4882a593Smuzhiyun if (index >= itv->nof_audio_inputs)
1343*4882a593Smuzhiyun return -EINVAL;
1344*4882a593Smuzhiyun strscpy(audio->name, input_strs[aud_input->audio_type - 1],
1345*4882a593Smuzhiyun sizeof(audio->name));
1346*4882a593Smuzhiyun audio->index = index;
1347*4882a593Smuzhiyun audio->capability = V4L2_AUDCAP_STEREO;
1348*4882a593Smuzhiyun return 0;
1349*4882a593Smuzhiyun }
1350*4882a593Smuzhiyun
ivtv_get_audio_output(struct ivtv * itv,u16 index,struct v4l2_audioout * aud_output)1351*4882a593Smuzhiyun int ivtv_get_audio_output(struct ivtv *itv, u16 index, struct v4l2_audioout *aud_output)
1352*4882a593Smuzhiyun {
1353*4882a593Smuzhiyun memset(aud_output, 0, sizeof(*aud_output));
1354*4882a593Smuzhiyun if (itv->card->video_outputs == NULL || index != 0)
1355*4882a593Smuzhiyun return -EINVAL;
1356*4882a593Smuzhiyun strscpy(aud_output->name, "A/V Audio Out", sizeof(aud_output->name));
1357*4882a593Smuzhiyun return 0;
1358*4882a593Smuzhiyun }
1359