1c942fddfSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2b285192aSMauro Carvalho Chehab /*
3b285192aSMauro Carvalho Chehab  *  cx18 functions to query card hardware
4b285192aSMauro Carvalho Chehab  *
5b285192aSMauro Carvalho Chehab  *  Derived from ivtv-cards.c
6b285192aSMauro Carvalho Chehab  *
7b285192aSMauro Carvalho Chehab  *  Copyright (C) 2007  Hans Verkuil <hverkuil@xs4all.nl>
8b285192aSMauro Carvalho Chehab  *  Copyright (C) 2008  Andy Walls <awalls@md.metrocast.net>
9b285192aSMauro Carvalho Chehab  */
10b285192aSMauro Carvalho Chehab 
11b285192aSMauro Carvalho Chehab #include "cx18-driver.h"
12b285192aSMauro Carvalho Chehab #include "cx18-cards.h"
13b285192aSMauro Carvalho Chehab #include "cx18-av-core.h"
14b285192aSMauro Carvalho Chehab #include "cx18-i2c.h"
15b5dcee22SMauro Carvalho Chehab #include <media/i2c/cs5345.h>
16b285192aSMauro Carvalho Chehab 
17b285192aSMauro Carvalho Chehab #define V4L2_STD_PAL_SECAM (V4L2_STD_PAL|V4L2_STD_SECAM)
18b285192aSMauro Carvalho Chehab 
19b285192aSMauro Carvalho Chehab /********************** card configuration *******************************/
20b285192aSMauro Carvalho Chehab 
21b285192aSMauro Carvalho Chehab /* usual i2c tuner addresses to probe */
22b285192aSMauro Carvalho Chehab static struct cx18_card_tuner_i2c cx18_i2c_std = {
23b285192aSMauro Carvalho Chehab 	.radio = { I2C_CLIENT_END },
24b285192aSMauro Carvalho Chehab 	.demod = { 0x43, I2C_CLIENT_END },
25b285192aSMauro Carvalho Chehab 	.tv    = { 0x61, 0x60, I2C_CLIENT_END },
26b285192aSMauro Carvalho Chehab };
27b285192aSMauro Carvalho Chehab 
28b285192aSMauro Carvalho Chehab /*
29b285192aSMauro Carvalho Chehab  * usual i2c tuner addresses to probe with additional demod address for
30b285192aSMauro Carvalho Chehab  * an NXP TDA8295 at 0x42 (N.B. it can possibly be at 0x4b or 0x4c too).
31b285192aSMauro Carvalho Chehab  */
32b285192aSMauro Carvalho Chehab static struct cx18_card_tuner_i2c cx18_i2c_nxp = {
33b285192aSMauro Carvalho Chehab 	.radio = { I2C_CLIENT_END },
34b285192aSMauro Carvalho Chehab 	.demod = { 0x42, 0x43, I2C_CLIENT_END },
35b285192aSMauro Carvalho Chehab 	.tv    = { 0x61, 0x60, I2C_CLIENT_END },
36b285192aSMauro Carvalho Chehab };
37b285192aSMauro Carvalho Chehab 
38c07fe5e0SAlexander A. Klimov /* Please add new PCI IDs to: https://pci-ids.ucw.cz/
39b285192aSMauro Carvalho Chehab    This keeps the PCI ID database up to date. Note that the entries
40b285192aSMauro Carvalho Chehab    must be added under vendor 0x4444 (Conexant) as subsystem IDs.
41b285192aSMauro Carvalho Chehab    New vendor IDs should still be added to the vendor ID list. */
42b285192aSMauro Carvalho Chehab 
43b285192aSMauro Carvalho Chehab /* Hauppauge HVR-1600 cards */
44b285192aSMauro Carvalho Chehab 
45b285192aSMauro Carvalho Chehab /* Note: for Hauppauge cards the tveeprom information is used instead
46b285192aSMauro Carvalho Chehab    of PCI IDs */
47b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_hvr1600_esmt = {
48b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_HVR_1600_ESMT,
49b285192aSMauro Carvalho Chehab 	.name = "Hauppauge HVR-1600",
50b285192aSMauro Carvalho Chehab 	.comment = "Simultaneous Digital and Analog TV capture supported\n",
51b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
52b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
53b285192aSMauro Carvalho Chehab 	.hw_muxer = CX18_HW_CS5345,
54b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER |
55b285192aSMauro Carvalho Chehab 		  CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL |
56b285192aSMauro Carvalho Chehab 		  CX18_HW_Z8F0811_IR_HAUP,
57b285192aSMauro Carvalho Chehab 	.video_inputs = {
58b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE7 },
59b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1, CX18_AV_SVIDEO1    },
60b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 },
61b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO2,    2, CX18_AV_SVIDEO2    },
62b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 },
63b285192aSMauro Carvalho Chehab 	},
64b285192aSMauro Carvalho Chehab 	.audio_inputs = {
65b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER,
66b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 },
67b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,
68b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 },
69b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN2,
70b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 },
71b285192aSMauro Carvalho Chehab 	},
72b285192aSMauro Carvalho Chehab 	.radio_input = { CX18_CARD_INPUT_AUD_TUNER,
73b285192aSMauro Carvalho Chehab 			 CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 },
74b285192aSMauro Carvalho Chehab 	.ddr = {
75b285192aSMauro Carvalho Chehab 		/* ESMT M13S128324A-5B memory */
76b285192aSMauro Carvalho Chehab 		.chip_config = 0x003,
77b285192aSMauro Carvalho Chehab 		.refresh = 0x30c,
78b285192aSMauro Carvalho Chehab 		.timing1 = 0x44220e82,
79b285192aSMauro Carvalho Chehab 		.timing2 = 0x08,
80b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
81b285192aSMauro Carvalho Chehab 		.initial_emrs = 0,
82b285192aSMauro Carvalho Chehab 	},
83b285192aSMauro Carvalho Chehab 	.gpio_init.initial_value = 0x3001,
84b285192aSMauro Carvalho Chehab 	.gpio_init.direction = 0x3001,
85b285192aSMauro Carvalho Chehab 	.gpio_i2c_slave_reset = {
86b285192aSMauro Carvalho Chehab 		.active_lo_mask = 0x3001,
87b285192aSMauro Carvalho Chehab 		.msecs_asserted = 10,
88b285192aSMauro Carvalho Chehab 		.msecs_recovery = 40,
89b285192aSMauro Carvalho Chehab 		.ir_reset_mask  = 0x0001,
90b285192aSMauro Carvalho Chehab 	},
91b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_std,
92b285192aSMauro Carvalho Chehab };
93b285192aSMauro Carvalho Chehab 
94b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_hvr1600_s5h1411 = {
95b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_HVR_1600_S5H1411,
96b285192aSMauro Carvalho Chehab 	.name = "Hauppauge HVR-1600",
97b285192aSMauro Carvalho Chehab 	.comment = "Simultaneous Digital and Analog TV capture supported\n",
98b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
99b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
100b285192aSMauro Carvalho Chehab 	.hw_muxer = CX18_HW_CS5345,
101b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER |
102b285192aSMauro Carvalho Chehab 		  CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL |
103b285192aSMauro Carvalho Chehab 		  CX18_HW_Z8F0811_IR_HAUP,
104b285192aSMauro Carvalho Chehab 	.video_inputs = {
105b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE7 },
106b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1, CX18_AV_SVIDEO1    },
107b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 },
108b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO2,    2, CX18_AV_SVIDEO2    },
109b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 },
110b285192aSMauro Carvalho Chehab 	},
111b285192aSMauro Carvalho Chehab 	.audio_inputs = {
112b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER,
113b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 },
114b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,
115b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 },
116b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN2,
117b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 },
118b285192aSMauro Carvalho Chehab 	},
119b285192aSMauro Carvalho Chehab 	.radio_input = { CX18_CARD_INPUT_AUD_TUNER,
120b285192aSMauro Carvalho Chehab 			 CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 },
121b285192aSMauro Carvalho Chehab 	.ddr = {
122b285192aSMauro Carvalho Chehab 		/* ESMT M13S128324A-5B memory */
123b285192aSMauro Carvalho Chehab 		.chip_config = 0x003,
124b285192aSMauro Carvalho Chehab 		.refresh = 0x30c,
125b285192aSMauro Carvalho Chehab 		.timing1 = 0x44220e82,
126b285192aSMauro Carvalho Chehab 		.timing2 = 0x08,
127b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
128b285192aSMauro Carvalho Chehab 		.initial_emrs = 0,
129b285192aSMauro Carvalho Chehab 	},
130b285192aSMauro Carvalho Chehab 	.gpio_init.initial_value = 0x3801,
131b285192aSMauro Carvalho Chehab 	.gpio_init.direction = 0x3801,
132b285192aSMauro Carvalho Chehab 	.gpio_i2c_slave_reset = {
133b285192aSMauro Carvalho Chehab 		.active_lo_mask = 0x3801,
134b285192aSMauro Carvalho Chehab 		.msecs_asserted = 10,
135b285192aSMauro Carvalho Chehab 		.msecs_recovery = 40,
136b285192aSMauro Carvalho Chehab 		.ir_reset_mask  = 0x0001,
137b285192aSMauro Carvalho Chehab 	},
138b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_nxp,
139b285192aSMauro Carvalho Chehab };
140b285192aSMauro Carvalho Chehab 
141b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_hvr1600_samsung = {
142b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_HVR_1600_SAMSUNG,
143b285192aSMauro Carvalho Chehab 	.name = "Hauppauge HVR-1600 (Preproduction)",
144b285192aSMauro Carvalho Chehab 	.comment = "Simultaneous Digital and Analog TV capture supported\n",
145b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
146b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
147b285192aSMauro Carvalho Chehab 	.hw_muxer = CX18_HW_CS5345,
148b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER |
149b285192aSMauro Carvalho Chehab 		  CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL |
150b285192aSMauro Carvalho Chehab 		  CX18_HW_Z8F0811_IR_HAUP,
151b285192aSMauro Carvalho Chehab 	.video_inputs = {
152b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE7 },
153b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1, CX18_AV_SVIDEO1    },
154b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 },
155b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO2,    2, CX18_AV_SVIDEO2    },
156b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 },
157b285192aSMauro Carvalho Chehab 	},
158b285192aSMauro Carvalho Chehab 	.audio_inputs = {
159b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER,
160b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 },
161b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,
162b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 },
163b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN2,
164b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 },
165b285192aSMauro Carvalho Chehab 	},
166b285192aSMauro Carvalho Chehab 	.radio_input = { CX18_CARD_INPUT_AUD_TUNER,
167b285192aSMauro Carvalho Chehab 			 CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 },
168b285192aSMauro Carvalho Chehab 	.ddr = {
169b285192aSMauro Carvalho Chehab 		/* Samsung K4D263238G-VC33 memory */
170b285192aSMauro Carvalho Chehab 		.chip_config = 0x003,
171b285192aSMauro Carvalho Chehab 		.refresh = 0x30c,
172b285192aSMauro Carvalho Chehab 		.timing1 = 0x23230b73,
173b285192aSMauro Carvalho Chehab 		.timing2 = 0x08,
174b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
175b285192aSMauro Carvalho Chehab 		.initial_emrs = 2,
176b285192aSMauro Carvalho Chehab 	},
177b285192aSMauro Carvalho Chehab 	.gpio_init.initial_value = 0x3001,
178b285192aSMauro Carvalho Chehab 	.gpio_init.direction = 0x3001,
179b285192aSMauro Carvalho Chehab 	.gpio_i2c_slave_reset = {
180b285192aSMauro Carvalho Chehab 		.active_lo_mask = 0x3001,
181b285192aSMauro Carvalho Chehab 		.msecs_asserted = 10,
182b285192aSMauro Carvalho Chehab 		.msecs_recovery = 40,
183b285192aSMauro Carvalho Chehab 		.ir_reset_mask  = 0x0001,
184b285192aSMauro Carvalho Chehab 	},
185b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_std,
186b285192aSMauro Carvalho Chehab };
187b285192aSMauro Carvalho Chehab 
188b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------------- */
189b285192aSMauro Carvalho Chehab 
190b285192aSMauro Carvalho Chehab /* Compro VideoMate H900: note that this card is analog only! */
191b285192aSMauro Carvalho Chehab 
192b285192aSMauro Carvalho Chehab static const struct cx18_card_pci_info cx18_pci_h900[] = {
193b285192aSMauro Carvalho Chehab 	{ PCI_DEVICE_ID_CX23418, CX18_PCI_ID_COMPRO, 0xe100 },
194b285192aSMauro Carvalho Chehab 	{ 0, 0, 0 }
195b285192aSMauro Carvalho Chehab };
196b285192aSMauro Carvalho Chehab 
197b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_h900 = {
198b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_COMPRO_H900,
199b285192aSMauro Carvalho Chehab 	.name = "Compro VideoMate H900",
200b285192aSMauro Carvalho Chehab 	.comment = "Analog TV capture supported\n",
201b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
202b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
203b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_RESET_CTRL,
204b285192aSMauro Carvalho Chehab 	.video_inputs = {
205b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE2 },
206b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1,
207b285192aSMauro Carvalho Chehab 			CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
208b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 },
209b285192aSMauro Carvalho Chehab 	},
210b285192aSMauro Carvalho Chehab 	.audio_inputs = {
211b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER,
212b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO5, 0 },
213b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,
214b285192aSMauro Carvalho Chehab 		  CX18_AV_AUDIO_SERIAL1, 0 },
215b285192aSMauro Carvalho Chehab 	},
216b285192aSMauro Carvalho Chehab 	.radio_input = { CX18_CARD_INPUT_AUD_TUNER,
217b285192aSMauro Carvalho Chehab 			 CX18_AV_AUDIO_SERIAL1, 0 },
218b285192aSMauro Carvalho Chehab 	.tuners = {
219b285192aSMauro Carvalho Chehab 		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
220b285192aSMauro Carvalho Chehab 	},
221b285192aSMauro Carvalho Chehab 	.ddr = {
222b285192aSMauro Carvalho Chehab 		/* EtronTech EM6A9160TS-5G memory */
223b285192aSMauro Carvalho Chehab 		.chip_config = 0x50003,
224b285192aSMauro Carvalho Chehab 		.refresh = 0x753,
225b285192aSMauro Carvalho Chehab 		.timing1 = 0x24330e84,
226b285192aSMauro Carvalho Chehab 		.timing2 = 0x1f,
227b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
228b285192aSMauro Carvalho Chehab 		.initial_emrs = 0,
229b285192aSMauro Carvalho Chehab 	},
230b285192aSMauro Carvalho Chehab 	.xceive_pin = 15,
231b285192aSMauro Carvalho Chehab 	.pci_list = cx18_pci_h900,
232b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_std,
233b285192aSMauro Carvalho Chehab };
234b285192aSMauro Carvalho Chehab 
235b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------------- */
236b285192aSMauro Carvalho Chehab 
237b285192aSMauro Carvalho Chehab /* Yuan MPC718: not working at the moment! */
238b285192aSMauro Carvalho Chehab 
239b285192aSMauro Carvalho Chehab static const struct cx18_card_pci_info cx18_pci_mpc718[] = {
240b285192aSMauro Carvalho Chehab 	{ PCI_DEVICE_ID_CX23418, CX18_PCI_ID_YUAN, 0x0718 },
241b285192aSMauro Carvalho Chehab 	{ 0, 0, 0 }
242b285192aSMauro Carvalho Chehab };
243b285192aSMauro Carvalho Chehab 
244b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_mpc718 = {
245b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_YUAN_MPC718,
246b285192aSMauro Carvalho Chehab 	.name = "Yuan MPC718 MiniPCI DVB-T/Analog",
247b285192aSMauro Carvalho Chehab 	.comment = "Experimenters needed for device to work well.\n"
24855f240a2SHans Verkuil 		  "\tTo help, mail the linux-media list (www.linuxtv.org).\n",
249b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
250b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
251b285192aSMauro Carvalho Chehab 	.hw_muxer = CX18_HW_GPIO_MUX,
252b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER |
253b285192aSMauro Carvalho Chehab 		  CX18_HW_GPIO_MUX | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL,
254b285192aSMauro Carvalho Chehab 	.video_inputs = {
255b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE2 },
256b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1,
257b285192aSMauro Carvalho Chehab 				CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
258b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 },
259b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO2,    2,
260b285192aSMauro Carvalho Chehab 				CX18_AV_SVIDEO_LUMA7 | CX18_AV_SVIDEO_CHROMA8 },
261b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 },
262b285192aSMauro Carvalho Chehab 	},
263b285192aSMauro Carvalho Chehab 	.audio_inputs = {
264b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5,        0 },
265b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,  CX18_AV_AUDIO_SERIAL1, 1 },
266b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN2,  CX18_AV_AUDIO_SERIAL2, 1 },
267b285192aSMauro Carvalho Chehab 	},
268b285192aSMauro Carvalho Chehab 	.tuners = {
269b285192aSMauro Carvalho Chehab 		/* XC3028 tuner */
270b285192aSMauro Carvalho Chehab 		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
271b285192aSMauro Carvalho Chehab 	},
272b285192aSMauro Carvalho Chehab 	/* FIXME - the FM radio is just a guess and driver doesn't use SIF */
273b285192aSMauro Carvalho Chehab 	.radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 2 },
274b285192aSMauro Carvalho Chehab 	.ddr = {
275b285192aSMauro Carvalho Chehab 		/* Hynix HY5DU283222B DDR RAM */
276b285192aSMauro Carvalho Chehab 		.chip_config = 0x303,
277b285192aSMauro Carvalho Chehab 		.refresh = 0x3bd,
278b285192aSMauro Carvalho Chehab 		.timing1 = 0x36320966,
279b285192aSMauro Carvalho Chehab 		.timing2 = 0x1f,
280b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
281b285192aSMauro Carvalho Chehab 		.initial_emrs = 2,
282b285192aSMauro Carvalho Chehab 	},
283b285192aSMauro Carvalho Chehab 	.gpio_init.initial_value = 0x1,
284b285192aSMauro Carvalho Chehab 	.gpio_init.direction = 0x3,
285b285192aSMauro Carvalho Chehab 	/* FIXME - these GPIO's are just guesses */
286b285192aSMauro Carvalho Chehab 	.gpio_audio_input = { .mask   = 0x3,
287b285192aSMauro Carvalho Chehab 			      .tuner  = 0x1,
288b285192aSMauro Carvalho Chehab 			      .linein = 0x3,
289b285192aSMauro Carvalho Chehab 			      .radio  = 0x1 },
290b285192aSMauro Carvalho Chehab 	.xceive_pin = 0,
291b285192aSMauro Carvalho Chehab 	.pci_list = cx18_pci_mpc718,
292b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_std,
293b285192aSMauro Carvalho Chehab };
294b285192aSMauro Carvalho Chehab 
295b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------------- */
296b285192aSMauro Carvalho Chehab 
297b285192aSMauro Carvalho Chehab /* GoTView PCI */
298b285192aSMauro Carvalho Chehab 
299b285192aSMauro Carvalho Chehab static const struct cx18_card_pci_info cx18_pci_gotview_dvd3[] = {
300b285192aSMauro Carvalho Chehab 	{ PCI_DEVICE_ID_CX23418, CX18_PCI_ID_GOTVIEW, 0x3343 },
301b285192aSMauro Carvalho Chehab 	{ 0, 0, 0 }
302b285192aSMauro Carvalho Chehab };
303b285192aSMauro Carvalho Chehab 
304b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_gotview_dvd3 = {
305b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_GOTVIEW_PCI_DVD3,
306b285192aSMauro Carvalho Chehab 	.name = "GoTView PCI DVD3 Hybrid",
307b285192aSMauro Carvalho Chehab 	.comment = "Experimenters needed for device to work well.\n"
30855f240a2SHans Verkuil 		  "\tTo help, mail the linux-media list (www.linuxtv.org).\n",
309b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
310b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
311b285192aSMauro Carvalho Chehab 	.hw_muxer = CX18_HW_GPIO_MUX,
312b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER |
313b285192aSMauro Carvalho Chehab 		  CX18_HW_GPIO_MUX | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL,
314b285192aSMauro Carvalho Chehab 	.video_inputs = {
315b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE2 },
316b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1,
317b285192aSMauro Carvalho Chehab 				CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
318b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 },
319b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO2,    2,
320b285192aSMauro Carvalho Chehab 				CX18_AV_SVIDEO_LUMA7 | CX18_AV_SVIDEO_CHROMA8 },
321b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 },
322b285192aSMauro Carvalho Chehab 	},
323b285192aSMauro Carvalho Chehab 	.audio_inputs = {
324b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5,        0 },
325b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,  CX18_AV_AUDIO_SERIAL1, 1 },
326b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN2,  CX18_AV_AUDIO_SERIAL2, 1 },
327b285192aSMauro Carvalho Chehab 	},
328b285192aSMauro Carvalho Chehab 	.tuners = {
329b285192aSMauro Carvalho Chehab 		/* XC3028 tuner */
330b285192aSMauro Carvalho Chehab 		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
331b285192aSMauro Carvalho Chehab 	},
332b285192aSMauro Carvalho Chehab 	/* FIXME - the FM radio is just a guess and driver doesn't use SIF */
333b285192aSMauro Carvalho Chehab 	.radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 2 },
334b285192aSMauro Carvalho Chehab 	.ddr = {
335b285192aSMauro Carvalho Chehab 		/* Hynix HY5DU283222B DDR RAM */
336b285192aSMauro Carvalho Chehab 		.chip_config = 0x303,
337b285192aSMauro Carvalho Chehab 		.refresh = 0x3bd,
338b285192aSMauro Carvalho Chehab 		.timing1 = 0x36320966,
339b285192aSMauro Carvalho Chehab 		.timing2 = 0x1f,
340b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
341b285192aSMauro Carvalho Chehab 		.initial_emrs = 2,
342b285192aSMauro Carvalho Chehab 	},
343b285192aSMauro Carvalho Chehab 	.gpio_init.initial_value = 0x1,
344b285192aSMauro Carvalho Chehab 	.gpio_init.direction = 0x3,
345b285192aSMauro Carvalho Chehab 
346b285192aSMauro Carvalho Chehab 	.gpio_audio_input = { .mask   = 0x3,
347b285192aSMauro Carvalho Chehab 			      .tuner  = 0x1,
348b285192aSMauro Carvalho Chehab 			      .linein = 0x2,
349b285192aSMauro Carvalho Chehab 			      .radio  = 0x1 },
350b285192aSMauro Carvalho Chehab 	.xceive_pin = 0,
351b285192aSMauro Carvalho Chehab 	.pci_list = cx18_pci_gotview_dvd3,
352b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_std,
353b285192aSMauro Carvalho Chehab };
354b285192aSMauro Carvalho Chehab 
355b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------------- */
356b285192aSMauro Carvalho Chehab 
357b285192aSMauro Carvalho Chehab /* Conexant Raptor PAL/SECAM: note that this card is analog only! */
358b285192aSMauro Carvalho Chehab 
359b285192aSMauro Carvalho Chehab static const struct cx18_card_pci_info cx18_pci_cnxt_raptor_pal[] = {
360b285192aSMauro Carvalho Chehab 	{ PCI_DEVICE_ID_CX23418, CX18_PCI_ID_CONEXANT, 0x0009 },
361b285192aSMauro Carvalho Chehab 	{ 0, 0, 0 }
362b285192aSMauro Carvalho Chehab };
363b285192aSMauro Carvalho Chehab 
364b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_cnxt_raptor_pal = {
365b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_CNXT_RAPTOR_PAL,
366b285192aSMauro Carvalho Chehab 	.name = "Conexant Raptor PAL/SECAM",
367b285192aSMauro Carvalho Chehab 	.comment = "Analog TV capture supported\n",
368b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
369b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
370b285192aSMauro Carvalho Chehab 	.hw_muxer = CX18_HW_GPIO_MUX,
371b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_MUX,
372b285192aSMauro Carvalho Chehab 	.video_inputs = {
373b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE2 },
374b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1,
375b285192aSMauro Carvalho Chehab 			CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
376b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 },
377b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO2,    2,
378b285192aSMauro Carvalho Chehab 			CX18_AV_SVIDEO_LUMA7 | CX18_AV_SVIDEO_CHROMA8 },
379b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 },
380b285192aSMauro Carvalho Chehab 	},
381b285192aSMauro Carvalho Chehab 	.audio_inputs = {
382b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5,	    0 },
383b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,  CX18_AV_AUDIO_SERIAL1, 1 },
384b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN2,  CX18_AV_AUDIO_SERIAL2, 1 },
385b285192aSMauro Carvalho Chehab 	},
386b285192aSMauro Carvalho Chehab 	.tuners = {
387b285192aSMauro Carvalho Chehab 		{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
388b285192aSMauro Carvalho Chehab 	},
389b285192aSMauro Carvalho Chehab 	.radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL1, 2 },
390b285192aSMauro Carvalho Chehab 	.ddr = {
391b285192aSMauro Carvalho Chehab 		/* MT 46V16M16 memory */
392b285192aSMauro Carvalho Chehab 		.chip_config = 0x50306,
393b285192aSMauro Carvalho Chehab 		.refresh = 0x753,
394b285192aSMauro Carvalho Chehab 		.timing1 = 0x33220953,
395b285192aSMauro Carvalho Chehab 		.timing2 = 0x09,
396b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
397b285192aSMauro Carvalho Chehab 		.initial_emrs = 0,
398b285192aSMauro Carvalho Chehab 	},
399b285192aSMauro Carvalho Chehab 	.gpio_init.initial_value = 0x1002,
400b285192aSMauro Carvalho Chehab 	.gpio_init.direction = 0xf002,
401b285192aSMauro Carvalho Chehab 	.gpio_audio_input = { .mask   = 0xf002,
402b285192aSMauro Carvalho Chehab 			      .tuner  = 0x1002,   /* LED D1  Tuner AF  */
403b285192aSMauro Carvalho Chehab 			      .linein = 0x2000,   /* LED D2  Line In 1 */
404b285192aSMauro Carvalho Chehab 			      .radio  = 0x4002 }, /* LED D3  Tuner AF  */
405b285192aSMauro Carvalho Chehab 	.pci_list = cx18_pci_cnxt_raptor_pal,
406b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_std,
407b285192aSMauro Carvalho Chehab };
408b285192aSMauro Carvalho Chehab 
409b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------------- */
410b285192aSMauro Carvalho Chehab 
411b285192aSMauro Carvalho Chehab /* Toshiba Qosmio laptop internal DVB-T/Analog Hybrid Tuner */
412b285192aSMauro Carvalho Chehab 
413b285192aSMauro Carvalho Chehab static const struct cx18_card_pci_info cx18_pci_toshiba_qosmio_dvbt[] = {
414b285192aSMauro Carvalho Chehab 	{ PCI_DEVICE_ID_CX23418, CX18_PCI_ID_TOSHIBA, 0x0110 },
415b285192aSMauro Carvalho Chehab 	{ 0, 0, 0 }
416b285192aSMauro Carvalho Chehab };
417b285192aSMauro Carvalho Chehab 
418b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_toshiba_qosmio_dvbt = {
419b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_TOSHIBA_QOSMIO_DVBT,
420b285192aSMauro Carvalho Chehab 	.name = "Toshiba Qosmio DVB-T/Analog",
421b285192aSMauro Carvalho Chehab 	.comment = "Experimenters and photos needed for device to work well.\n"
42255f240a2SHans Verkuil 		  "\tTo help, mail the linux-media list (www.linuxtv.org).\n",
423b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
424b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
425b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_RESET_CTRL,
426b285192aSMauro Carvalho Chehab 	.video_inputs = {
427b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE6 },
428b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1,
429b285192aSMauro Carvalho Chehab 			CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
430b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 },
431b285192aSMauro Carvalho Chehab 	},
432b285192aSMauro Carvalho Chehab 	.audio_inputs = {
433b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5,	    0 },
434b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,  CX18_AV_AUDIO_SERIAL1, 1 },
435b285192aSMauro Carvalho Chehab 	},
436b285192aSMauro Carvalho Chehab 	.tuners = {
437b285192aSMauro Carvalho Chehab 		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
438b285192aSMauro Carvalho Chehab 	},
439b285192aSMauro Carvalho Chehab 	.ddr = {
440b285192aSMauro Carvalho Chehab 		.chip_config = 0x202,
441b285192aSMauro Carvalho Chehab 		.refresh = 0x3bb,
442b285192aSMauro Carvalho Chehab 		.timing1 = 0x33320a63,
443b285192aSMauro Carvalho Chehab 		.timing2 = 0x0a,
444b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
445b285192aSMauro Carvalho Chehab 		.initial_emrs = 0x42,
446b285192aSMauro Carvalho Chehab 	},
447b285192aSMauro Carvalho Chehab 	.xceive_pin = 15,
448b285192aSMauro Carvalho Chehab 	.pci_list = cx18_pci_toshiba_qosmio_dvbt,
449b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_std,
450b285192aSMauro Carvalho Chehab };
451b285192aSMauro Carvalho Chehab 
452b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------------- */
453b285192aSMauro Carvalho Chehab 
454b285192aSMauro Carvalho Chehab /* Leadtek WinFast PVR2100 */
455b285192aSMauro Carvalho Chehab 
456b285192aSMauro Carvalho Chehab static const struct cx18_card_pci_info cx18_pci_leadtek_pvr2100[] = {
457b285192aSMauro Carvalho Chehab 	{ PCI_DEVICE_ID_CX23418, CX18_PCI_ID_LEADTEK, 0x6f27 }, /* PVR2100   */
458b285192aSMauro Carvalho Chehab 	{ 0, 0, 0 }
459b285192aSMauro Carvalho Chehab };
460b285192aSMauro Carvalho Chehab 
461b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_leadtek_pvr2100 = {
462b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_LEADTEK_PVR2100,
463b285192aSMauro Carvalho Chehab 	.name = "Leadtek WinFast PVR2100",
464b285192aSMauro Carvalho Chehab 	.comment = "Experimenters and photos needed for device to work well.\n"
46555f240a2SHans Verkuil 		  "\tTo help, mail the linux-media list (www.linuxtv.org).\n",
466b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
467b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
468b285192aSMauro Carvalho Chehab 	.hw_muxer = CX18_HW_GPIO_MUX,
469b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_MUX |
470b285192aSMauro Carvalho Chehab 		  CX18_HW_GPIO_RESET_CTRL,
471b285192aSMauro Carvalho Chehab 	.video_inputs = {
472b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE2 },
473b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1,
474b285192aSMauro Carvalho Chehab 			CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
475b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE7 },
476b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPONENT1, 1, CX18_AV_COMPONENT1 },
477b285192aSMauro Carvalho Chehab 	},
478b285192aSMauro Carvalho Chehab 	.audio_inputs = {
479b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5,	    0 },
480b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,  CX18_AV_AUDIO_SERIAL1, 1 },
481b285192aSMauro Carvalho Chehab 	},
482b285192aSMauro Carvalho Chehab 	.tuners = {
483b285192aSMauro Carvalho Chehab 		/* XC2028 tuner */
484b285192aSMauro Carvalho Chehab 		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
485b285192aSMauro Carvalho Chehab 	},
486b285192aSMauro Carvalho Chehab 	.radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 2 },
487b285192aSMauro Carvalho Chehab 	.ddr = {
488b285192aSMauro Carvalho Chehab 		/* Pointer to proper DDR config values provided by Terry Wu */
489b285192aSMauro Carvalho Chehab 		.chip_config = 0x303,
490b285192aSMauro Carvalho Chehab 		.refresh = 0x3bb,
491b285192aSMauro Carvalho Chehab 		.timing1 = 0x24220e83,
492b285192aSMauro Carvalho Chehab 		.timing2 = 0x1f,
493b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
494b285192aSMauro Carvalho Chehab 		.initial_emrs = 0x2,
495b285192aSMauro Carvalho Chehab 	},
496b285192aSMauro Carvalho Chehab 	.gpio_init.initial_value = 0x6,
497b285192aSMauro Carvalho Chehab 	.gpio_init.direction = 0x7,
498b285192aSMauro Carvalho Chehab 	.gpio_audio_input = { .mask   = 0x7,
499b285192aSMauro Carvalho Chehab 			      .tuner  = 0x6, .linein = 0x2, .radio  = 0x2 },
500b285192aSMauro Carvalho Chehab 	.xceive_pin = 1,
501b285192aSMauro Carvalho Chehab 	.pci_list = cx18_pci_leadtek_pvr2100,
502b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_std,
503b285192aSMauro Carvalho Chehab };
504b285192aSMauro Carvalho Chehab 
505b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------------- */
506b285192aSMauro Carvalho Chehab 
507b285192aSMauro Carvalho Chehab /* Leadtek WinFast DVR3100 H */
508b285192aSMauro Carvalho Chehab 
509b285192aSMauro Carvalho Chehab static const struct cx18_card_pci_info cx18_pci_leadtek_dvr3100h[] = {
510b285192aSMauro Carvalho Chehab 	{ PCI_DEVICE_ID_CX23418, CX18_PCI_ID_LEADTEK, 0x6690 }, /* DVR3100 H */
511b285192aSMauro Carvalho Chehab 	{ 0, 0, 0 }
512b285192aSMauro Carvalho Chehab };
513b285192aSMauro Carvalho Chehab 
514b285192aSMauro Carvalho Chehab static const struct cx18_card cx18_card_leadtek_dvr3100h = {
515b285192aSMauro Carvalho Chehab 	.type = CX18_CARD_LEADTEK_DVR3100H,
516b285192aSMauro Carvalho Chehab 	.name = "Leadtek WinFast DVR3100 H",
517b285192aSMauro Carvalho Chehab 	.comment = "Simultaneous DVB-T and Analog capture supported,\n"
518b285192aSMauro Carvalho Chehab 		  "\texcept when capturing Analog from the antenna input.\n",
519b285192aSMauro Carvalho Chehab 	.v4l2_capabilities = CX18_CAP_ENCODER,
520b285192aSMauro Carvalho Chehab 	.hw_audio_ctrl = CX18_HW_418_AV,
521b285192aSMauro Carvalho Chehab 	.hw_muxer = CX18_HW_GPIO_MUX,
522b285192aSMauro Carvalho Chehab 	.hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_MUX |
523b285192aSMauro Carvalho Chehab 		  CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL,
524b285192aSMauro Carvalho Chehab 	.video_inputs = {
525b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE2 },
526b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_SVIDEO1,    1,
527b285192aSMauro Carvalho Chehab 			CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
528b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE7 },
529b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_COMPONENT1, 1, CX18_AV_COMPONENT1 },
530b285192aSMauro Carvalho Chehab 	},
531b285192aSMauro Carvalho Chehab 	.audio_inputs = {
532b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5,	    0 },
533b285192aSMauro Carvalho Chehab 		{ CX18_CARD_INPUT_LINE_IN1,  CX18_AV_AUDIO_SERIAL1, 1 },
534b285192aSMauro Carvalho Chehab 	},
535b285192aSMauro Carvalho Chehab 	.tuners = {
536b285192aSMauro Carvalho Chehab 		/* XC3028 tuner */
537b285192aSMauro Carvalho Chehab 		{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
538b285192aSMauro Carvalho Chehab 	},
539b285192aSMauro Carvalho Chehab 	.radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 2 },
540b285192aSMauro Carvalho Chehab 	.ddr = {
541b285192aSMauro Carvalho Chehab 		/* Pointer to proper DDR config values provided by Terry Wu */
542b285192aSMauro Carvalho Chehab 		.chip_config = 0x303,
543b285192aSMauro Carvalho Chehab 		.refresh = 0x3bb,
544b285192aSMauro Carvalho Chehab 		.timing1 = 0x24220e83,
545b285192aSMauro Carvalho Chehab 		.timing2 = 0x1f,
546b285192aSMauro Carvalho Chehab 		.tune_lane = 0,
547b285192aSMauro Carvalho Chehab 		.initial_emrs = 0x2,
548b285192aSMauro Carvalho Chehab 	},
549b285192aSMauro Carvalho Chehab 	.gpio_init.initial_value = 0x6,
550b285192aSMauro Carvalho Chehab 	.gpio_init.direction = 0x7,
551b285192aSMauro Carvalho Chehab 	.gpio_audio_input = { .mask   = 0x7,
552b285192aSMauro Carvalho Chehab 			      .tuner  = 0x6, .linein = 0x2, .radio  = 0x2 },
553b285192aSMauro Carvalho Chehab 	.xceive_pin = 1,
554b285192aSMauro Carvalho Chehab 	.pci_list = cx18_pci_leadtek_dvr3100h,
555b285192aSMauro Carvalho Chehab 	.i2c = &cx18_i2c_std,
556b285192aSMauro Carvalho Chehab };
557b285192aSMauro Carvalho Chehab 
558b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------------- */
559b285192aSMauro Carvalho Chehab 
560b285192aSMauro Carvalho Chehab static const struct cx18_card *cx18_card_list[] = {
561b285192aSMauro Carvalho Chehab 	&cx18_card_hvr1600_esmt,
562b285192aSMauro Carvalho Chehab 	&cx18_card_hvr1600_samsung,
563b285192aSMauro Carvalho Chehab 	&cx18_card_h900,
564b285192aSMauro Carvalho Chehab 	&cx18_card_mpc718,
565b285192aSMauro Carvalho Chehab 	&cx18_card_cnxt_raptor_pal,
566b285192aSMauro Carvalho Chehab 	&cx18_card_toshiba_qosmio_dvbt,
567b285192aSMauro Carvalho Chehab 	&cx18_card_leadtek_pvr2100,
568b285192aSMauro Carvalho Chehab 	&cx18_card_leadtek_dvr3100h,
569b285192aSMauro Carvalho Chehab 	&cx18_card_gotview_dvd3,
570b285192aSMauro Carvalho Chehab 	&cx18_card_hvr1600_s5h1411
571b285192aSMauro Carvalho Chehab };
572b285192aSMauro Carvalho Chehab 
cx18_get_card(u16 index)573b285192aSMauro Carvalho Chehab const struct cx18_card *cx18_get_card(u16 index)
574b285192aSMauro Carvalho Chehab {
575b285192aSMauro Carvalho Chehab 	if (index >= ARRAY_SIZE(cx18_card_list))
576b285192aSMauro Carvalho Chehab 		return NULL;
577b285192aSMauro Carvalho Chehab 	return cx18_card_list[index];
578b285192aSMauro Carvalho Chehab }
579b285192aSMauro Carvalho Chehab 
cx18_get_input(struct cx18 * cx,u16 index,struct v4l2_input * input)580b285192aSMauro Carvalho Chehab int cx18_get_input(struct cx18 *cx, u16 index, struct v4l2_input *input)
581b285192aSMauro Carvalho Chehab {
582b285192aSMauro Carvalho Chehab 	const struct cx18_card_video_input *card_input =
583b285192aSMauro Carvalho Chehab 		cx->card->video_inputs + index;
584b285192aSMauro Carvalho Chehab 	static const char * const input_strs[] = {
585b285192aSMauro Carvalho Chehab 		"Tuner 1",
586b285192aSMauro Carvalho Chehab 		"S-Video 1",
587b285192aSMauro Carvalho Chehab 		"S-Video 2",
588b285192aSMauro Carvalho Chehab 		"Composite 1",
589b285192aSMauro Carvalho Chehab 		"Composite 2",
590b285192aSMauro Carvalho Chehab 		"Component 1"
591b285192aSMauro Carvalho Chehab 	};
592b285192aSMauro Carvalho Chehab 
593b285192aSMauro Carvalho Chehab 	if (index >= cx->nof_inputs)
594b285192aSMauro Carvalho Chehab 		return -EINVAL;
595b285192aSMauro Carvalho Chehab 	input->index = index;
596c0decac1SMauro Carvalho Chehab 	strscpy(input->name, input_strs[card_input->video_type - 1],
597b285192aSMauro Carvalho Chehab 		sizeof(input->name));
598b285192aSMauro Carvalho Chehab 	input->type = (card_input->video_type == CX18_CARD_INPUT_VID_TUNER ?
599b285192aSMauro Carvalho Chehab 			V4L2_INPUT_TYPE_TUNER : V4L2_INPUT_TYPE_CAMERA);
600b285192aSMauro Carvalho Chehab 	input->audioset = (1 << cx->nof_audio_inputs) - 1;
601b285192aSMauro Carvalho Chehab 	input->std = (input->type == V4L2_INPUT_TYPE_TUNER) ?
602b285192aSMauro Carvalho Chehab 				cx->tuner_std : V4L2_STD_ALL;
603b285192aSMauro Carvalho Chehab 	return 0;
604b285192aSMauro Carvalho Chehab }
605b285192aSMauro Carvalho Chehab 
cx18_get_audio_input(struct cx18 * cx,u16 index,struct v4l2_audio * audio)606b285192aSMauro Carvalho Chehab int cx18_get_audio_input(struct cx18 *cx, u16 index, struct v4l2_audio *audio)
607b285192aSMauro Carvalho Chehab {
608b285192aSMauro Carvalho Chehab 	const struct cx18_card_audio_input *aud_input =
609b285192aSMauro Carvalho Chehab 		cx->card->audio_inputs + index;
610b285192aSMauro Carvalho Chehab 	static const char * const input_strs[] = {
611b285192aSMauro Carvalho Chehab 		"Tuner 1",
612b285192aSMauro Carvalho Chehab 		"Line In 1",
613b285192aSMauro Carvalho Chehab 		"Line In 2"
614b285192aSMauro Carvalho Chehab 	};
615b285192aSMauro Carvalho Chehab 
616b285192aSMauro Carvalho Chehab 	memset(audio, 0, sizeof(*audio));
617b285192aSMauro Carvalho Chehab 	if (index >= cx->nof_audio_inputs)
618b285192aSMauro Carvalho Chehab 		return -EINVAL;
619c0decac1SMauro Carvalho Chehab 	strscpy(audio->name, input_strs[aud_input->audio_type - 1],
620b285192aSMauro Carvalho Chehab 		sizeof(audio->name));
621b285192aSMauro Carvalho Chehab 	audio->index = index;
622b285192aSMauro Carvalho Chehab 	audio->capability = V4L2_AUDCAP_STEREO;
623b285192aSMauro Carvalho Chehab 	return 0;
624b285192aSMauro Carvalho Chehab }
625