]>
Commit | Line | Data |
---|---|---|
1c1e45d1 HV |
1 | /* |
2 | * cx18 functions to query card hardware | |
3 | * | |
4 | * Derived from ivtv-cards.c | |
5 | * | |
6 | * Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl> | |
6afdeaf8 | 7 | * Copyright (C) 2008 Andy Walls <awalls@md.metrocast.net> |
1c1e45d1 HV |
8 | * |
9 | * This program is free software; you can redistribute it and/or modify | |
10 | * it under the terms of the GNU General Public License as published by | |
11 | * the Free Software Foundation; either version 2 of the License, or | |
12 | * (at your option) any later version. | |
13 | * | |
14 | * This program is distributed in the hope that it will be useful, | |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | * GNU General Public License for more details. | |
18 | * | |
19 | * You should have received a copy of the GNU General Public License | |
20 | * along with this program; if not, write to the Free Software | |
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
22 | * 02111-1307 USA | |
23 | */ | |
24 | ||
25 | #include "cx18-driver.h" | |
26 | #include "cx18-cards.h" | |
d3d9b803 | 27 | #include "cx18-av-core.h" |
1c1e45d1 HV |
28 | #include "cx18-i2c.h" |
29 | #include <media/cs5345.h> | |
30 | ||
156f194b | 31 | #define V4L2_STD_PAL_SECAM (V4L2_STD_PAL|V4L2_STD_SECAM) |
03c28085 | 32 | |
1c1e45d1 HV |
33 | /********************** card configuration *******************************/ |
34 | ||
35 | /* usual i2c tuner addresses to probe */ | |
36 | static struct cx18_card_tuner_i2c cx18_i2c_std = { | |
37 | .radio = { I2C_CLIENT_END }, | |
38 | .demod = { 0x43, I2C_CLIENT_END }, | |
39 | .tv = { 0x61, 0x60, I2C_CLIENT_END }, | |
40 | }; | |
41 | ||
42 | /* Please add new PCI IDs to: http://pci-ids.ucw.cz/iii | |
43 | This keeps the PCI ID database up to date. Note that the entries | |
44 | must be added under vendor 0x4444 (Conexant) as subsystem IDs. | |
45 | New vendor IDs should still be added to the vendor ID list. */ | |
46 | ||
47 | /* Hauppauge HVR-1600 cards */ | |
48 | ||
49 | /* Note: for Hauppauge cards the tveeprom information is used instead | |
50 | of PCI IDs */ | |
51 | static const struct cx18_card cx18_card_hvr1600_esmt = { | |
52 | .type = CX18_CARD_HVR_1600_ESMT, | |
53 | .name = "Hauppauge HVR-1600", | |
302df970 | 54 | .comment = "Simultaneous Digital and Analog TV capture supported\n", |
1c1e45d1 | 55 | .v4l2_capabilities = CX18_CAP_ENCODER, |
ff2a2001 | 56 | .hw_audio_ctrl = CX18_HW_418_AV, |
1c1e45d1 | 57 | .hw_muxer = CX18_HW_CS5345, |
ff2a2001 | 58 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER | |
8ca95568 AW |
59 | CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL | |
60 | CX18_HW_Z8F0811_IR_HAUP, | |
1c1e45d1 | 61 | .video_inputs = { |
d3d9b803 HV |
62 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 }, |
63 | { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 }, | |
64 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 }, | |
65 | { CX18_CARD_INPUT_SVIDEO2, 2, CX18_AV_SVIDEO2 }, | |
66 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 }, | |
1c1e45d1 HV |
67 | }, |
68 | .audio_inputs = { | |
69 | { CX18_CARD_INPUT_AUD_TUNER, | |
d3d9b803 | 70 | CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, |
1c1e45d1 | 71 | { CX18_CARD_INPUT_LINE_IN1, |
81cb727d | 72 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 }, |
1c1e45d1 | 73 | { CX18_CARD_INPUT_LINE_IN2, |
81cb727d | 74 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 }, |
1c1e45d1 HV |
75 | }, |
76 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, | |
81cb727d | 77 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 }, |
1c1e45d1 HV |
78 | .ddr = { |
79 | /* ESMT M13S128324A-5B memory */ | |
80 | .chip_config = 0x003, | |
81 | .refresh = 0x30c, | |
82 | .timing1 = 0x44220e82, | |
83 | .timing2 = 0x08, | |
84 | .tune_lane = 0, | |
85 | .initial_emrs = 0, | |
86 | }, | |
87 | .gpio_init.initial_value = 0x3001, | |
88 | .gpio_init.direction = 0x3001, | |
1f09e8a2 AW |
89 | .gpio_i2c_slave_reset = { |
90 | .active_lo_mask = 0x3001, | |
91 | .msecs_asserted = 10, | |
92 | .msecs_recovery = 40, | |
02fa272f | 93 | .ir_reset_mask = 0x0001, |
1f09e8a2 | 94 | }, |
1c1e45d1 HV |
95 | .i2c = &cx18_i2c_std, |
96 | }; | |
97 | ||
98 | static const struct cx18_card cx18_card_hvr1600_samsung = { | |
99 | .type = CX18_CARD_HVR_1600_SAMSUNG, | |
100 | .name = "Hauppauge HVR-1600 (Preproduction)", | |
302df970 | 101 | .comment = "Simultaneous Digital and Analog TV capture supported\n", |
1c1e45d1 | 102 | .v4l2_capabilities = CX18_CAP_ENCODER, |
ff2a2001 | 103 | .hw_audio_ctrl = CX18_HW_418_AV, |
1c1e45d1 | 104 | .hw_muxer = CX18_HW_CS5345, |
ff2a2001 | 105 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER | |
8ca95568 AW |
106 | CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL | |
107 | CX18_HW_Z8F0811_IR_HAUP, | |
1c1e45d1 | 108 | .video_inputs = { |
d3d9b803 HV |
109 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 }, |
110 | { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 }, | |
111 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 }, | |
112 | { CX18_CARD_INPUT_SVIDEO2, 2, CX18_AV_SVIDEO2 }, | |
113 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 }, | |
1c1e45d1 HV |
114 | }, |
115 | .audio_inputs = { | |
116 | { CX18_CARD_INPUT_AUD_TUNER, | |
d3d9b803 | 117 | CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, |
1c1e45d1 | 118 | { CX18_CARD_INPUT_LINE_IN1, |
81cb727d | 119 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 }, |
1c1e45d1 | 120 | { CX18_CARD_INPUT_LINE_IN2, |
81cb727d | 121 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 }, |
1c1e45d1 HV |
122 | }, |
123 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, | |
81cb727d | 124 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 }, |
1c1e45d1 HV |
125 | .ddr = { |
126 | /* Samsung K4D263238G-VC33 memory */ | |
127 | .chip_config = 0x003, | |
128 | .refresh = 0x30c, | |
129 | .timing1 = 0x23230b73, | |
130 | .timing2 = 0x08, | |
131 | .tune_lane = 0, | |
132 | .initial_emrs = 2, | |
133 | }, | |
134 | .gpio_init.initial_value = 0x3001, | |
135 | .gpio_init.direction = 0x3001, | |
1f09e8a2 AW |
136 | .gpio_i2c_slave_reset = { |
137 | .active_lo_mask = 0x3001, | |
138 | .msecs_asserted = 10, | |
139 | .msecs_recovery = 40, | |
02fa272f | 140 | .ir_reset_mask = 0x0001, |
1f09e8a2 | 141 | }, |
1c1e45d1 HV |
142 | .i2c = &cx18_i2c_std, |
143 | }; | |
144 | ||
145 | /* ------------------------------------------------------------------------- */ | |
146 | ||
8f993573 | 147 | /* Compro VideoMate H900: note that this card is analog only! */ |
1c1e45d1 HV |
148 | |
149 | static const struct cx18_card_pci_info cx18_pci_h900[] = { | |
150 | { PCI_DEVICE_ID_CX23418, CX18_PCI_ID_COMPRO, 0xe100 }, | |
151 | { 0, 0, 0 } | |
152 | }; | |
153 | ||
154 | static const struct cx18_card cx18_card_h900 = { | |
155 | .type = CX18_CARD_COMPRO_H900, | |
156 | .name = "Compro VideoMate H900", | |
302df970 | 157 | .comment = "Analog TV capture supported\n", |
9dcbf35a | 158 | .v4l2_capabilities = CX18_CAP_ENCODER, |
ff2a2001 | 159 | .hw_audio_ctrl = CX18_HW_418_AV, |
eefe1010 | 160 | .hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_RESET_CTRL, |
1c1e45d1 | 161 | .video_inputs = { |
d3d9b803 | 162 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE2 }, |
9dcbf35a | 163 | { CX18_CARD_INPUT_SVIDEO1, 1, |
d3d9b803 HV |
164 | CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 }, |
165 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 }, | |
1c1e45d1 HV |
166 | }, |
167 | .audio_inputs = { | |
168 | { CX18_CARD_INPUT_AUD_TUNER, | |
1167b2e4 | 169 | CX18_AV_AUDIO5, 0 }, |
1c1e45d1 | 170 | { CX18_CARD_INPUT_LINE_IN1, |
81cb727d | 171 | CX18_AV_AUDIO_SERIAL1, 0 }, |
1c1e45d1 HV |
172 | }, |
173 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, | |
81cb727d | 174 | CX18_AV_AUDIO_SERIAL1, 0 }, |
1c1e45d1 HV |
175 | .tuners = { |
176 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, | |
177 | }, | |
178 | .ddr = { | |
179 | /* EtronTech EM6A9160TS-5G memory */ | |
180 | .chip_config = 0x50003, | |
181 | .refresh = 0x753, | |
182 | .timing1 = 0x24330e84, | |
183 | .timing2 = 0x1f, | |
184 | .tune_lane = 0, | |
185 | .initial_emrs = 0, | |
186 | }, | |
9dcbf35a | 187 | .xceive_pin = 15, |
1c1e45d1 HV |
188 | .pci_list = cx18_pci_h900, |
189 | .i2c = &cx18_i2c_std, | |
190 | }; | |
191 | ||
192 | /* ------------------------------------------------------------------------- */ | |
193 | ||
194 | /* Yuan MPC718: not working at the moment! */ | |
195 | ||
196 | static const struct cx18_card_pci_info cx18_pci_mpc718[] = { | |
197 | { PCI_DEVICE_ID_CX23418, CX18_PCI_ID_YUAN, 0x0718 }, | |
198 | { 0, 0, 0 } | |
199 | }; | |
200 | ||
201 | static const struct cx18_card cx18_card_mpc718 = { | |
202 | .type = CX18_CARD_YUAN_MPC718, | |
637fb3d7 AW |
203 | .name = "Yuan MPC718 MiniPCI DVB-T/Analog", |
204 | .comment = "Experimenters needed for device to work well.\n" | |
205 | "\tTo help, mail the ivtv-devel list (www.ivtvdriver.org).\n", | |
ad907fa3 | 206 | .v4l2_capabilities = CX18_CAP_ENCODER, |
ff2a2001 | 207 | .hw_audio_ctrl = CX18_HW_418_AV, |
637fb3d7 | 208 | .hw_muxer = CX18_HW_GPIO_MUX, |
25a42e4d | 209 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER | |
ff861fb2 | 210 | CX18_HW_GPIO_MUX | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL, |
1c1e45d1 | 211 | .video_inputs = { |
ad907fa3 AW |
212 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE2 }, |
213 | { CX18_CARD_INPUT_SVIDEO1, 1, | |
214 | CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 }, | |
215 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 }, | |
216 | { CX18_CARD_INPUT_SVIDEO2, 2, | |
217 | CX18_AV_SVIDEO_LUMA7 | CX18_AV_SVIDEO_CHROMA8 }, | |
218 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 }, | |
1c1e45d1 HV |
219 | }, |
220 | .audio_inputs = { | |
81cb727d | 221 | { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 }, |
637fb3d7 AW |
222 | { CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL1, 1 }, |
223 | { CX18_CARD_INPUT_LINE_IN2, CX18_AV_AUDIO_SERIAL2, 1 }, | |
1c1e45d1 | 224 | }, |
1c1e45d1 HV |
225 | .tuners = { |
226 | /* XC3028 tuner */ | |
227 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, | |
228 | }, | |
637fb3d7 AW |
229 | /* FIXME - the FM radio is just a guess and driver doesn't use SIF */ |
230 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 2 }, | |
1c1e45d1 | 231 | .ddr = { |
637fb3d7 AW |
232 | /* Hynix HY5DU283222B DDR RAM */ |
233 | .chip_config = 0x303, | |
234 | .refresh = 0x3bd, | |
235 | .timing1 = 0x36320966, | |
236 | .timing2 = 0x1f, | |
1c1e45d1 HV |
237 | .tune_lane = 0, |
238 | .initial_emrs = 2, | |
239 | }, | |
637fb3d7 AW |
240 | .gpio_init.initial_value = 0x1, |
241 | .gpio_init.direction = 0x3, | |
242 | /* FIXME - these GPIO's are just guesses */ | |
243 | .gpio_audio_input = { .mask = 0x3, | |
244 | .tuner = 0x1, | |
245 | .linein = 0x3, | |
246 | .radio = 0x1 }, | |
0c616214 | 247 | .xceive_pin = 0, |
1c1e45d1 HV |
248 | .pci_list = cx18_pci_mpc718, |
249 | .i2c = &cx18_i2c_std, | |
250 | }; | |
251 | ||
03c28085 SD |
252 | /* ------------------------------------------------------------------------- */ |
253 | ||
254 | /* Conexant Raptor PAL/SECAM: note that this card is analog only! */ | |
255 | ||
256 | static const struct cx18_card_pci_info cx18_pci_cnxt_raptor_pal[] = { | |
257 | { PCI_DEVICE_ID_CX23418, CX18_PCI_ID_CONEXANT, 0x0009 }, | |
258 | { 0, 0, 0 } | |
259 | }; | |
260 | ||
261 | static const struct cx18_card cx18_card_cnxt_raptor_pal = { | |
262 | .type = CX18_CARD_CNXT_RAPTOR_PAL, | |
263 | .name = "Conexant Raptor PAL/SECAM", | |
302df970 | 264 | .comment = "Analog TV capture supported\n", |
03c28085 | 265 | .v4l2_capabilities = CX18_CAP_ENCODER, |
ff2a2001 | 266 | .hw_audio_ctrl = CX18_HW_418_AV, |
eefe1010 AW |
267 | .hw_muxer = CX18_HW_GPIO_MUX, |
268 | .hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_MUX, | |
03c28085 SD |
269 | .video_inputs = { |
270 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE2 }, | |
271 | { CX18_CARD_INPUT_SVIDEO1, 1, | |
272 | CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 }, | |
273 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 }, | |
274 | { CX18_CARD_INPUT_SVIDEO2, 2, | |
275 | CX18_AV_SVIDEO_LUMA7 | CX18_AV_SVIDEO_CHROMA8 }, | |
276 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 }, | |
277 | }, | |
278 | .audio_inputs = { | |
81cb727d HV |
279 | { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 }, |
280 | { CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL1, 1 }, | |
281 | { CX18_CARD_INPUT_LINE_IN2, CX18_AV_AUDIO_SERIAL2, 1 }, | |
03c28085 SD |
282 | }, |
283 | .tuners = { | |
156f194b | 284 | { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 }, |
03c28085 | 285 | }, |
81cb727d | 286 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL1, 2 }, |
03c28085 SD |
287 | .ddr = { |
288 | /* MT 46V16M16 memory */ | |
289 | .chip_config = 0x50306, | |
290 | .refresh = 0x753, | |
291 | .timing1 = 0x33220953, | |
292 | .timing2 = 0x09, | |
293 | .tune_lane = 0, | |
294 | .initial_emrs = 0, | |
295 | }, | |
c5588b5c AW |
296 | .gpio_init.initial_value = 0x1002, |
297 | .gpio_init.direction = 0xf002, | |
298 | .gpio_audio_input = { .mask = 0xf002, | |
299 | .tuner = 0x1002, /* LED D1 Tuner AF */ | |
300 | .linein = 0x2000, /* LED D2 Line In 1 */ | |
301 | .radio = 0x4002 }, /* LED D3 Tuner AF */ | |
03c28085 SD |
302 | .pci_list = cx18_pci_cnxt_raptor_pal, |
303 | .i2c = &cx18_i2c_std, | |
304 | }; | |
305 | ||
306 | /* ------------------------------------------------------------------------- */ | |
307 | ||
9eee4fb6 AW |
308 | /* Toshiba Qosmio laptop internal DVB-T/Analog Hybrid Tuner */ |
309 | ||
310 | static const struct cx18_card_pci_info cx18_pci_toshiba_qosmio_dvbt[] = { | |
311 | { PCI_DEVICE_ID_CX23418, CX18_PCI_ID_TOSHIBA, 0x0110 }, | |
312 | { 0, 0, 0 } | |
313 | }; | |
314 | ||
315 | static const struct cx18_card cx18_card_toshiba_qosmio_dvbt = { | |
316 | .type = CX18_CARD_TOSHIBA_QOSMIO_DVBT, | |
317 | .name = "Toshiba Qosmio DVB-T/Analog", | |
318 | .comment = "Experimenters and photos needed for device to work well.\n" | |
319 | "\tTo help, mail the ivtv-devel list (www.ivtvdriver.org).\n", | |
320 | .v4l2_capabilities = CX18_CAP_ENCODER, | |
ff2a2001 | 321 | .hw_audio_ctrl = CX18_HW_418_AV, |
eefe1010 | 322 | .hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_RESET_CTRL, |
9eee4fb6 AW |
323 | .video_inputs = { |
324 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE6 }, | |
325 | { CX18_CARD_INPUT_SVIDEO1, 1, | |
326 | CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 }, | |
327 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 }, | |
328 | }, | |
329 | .audio_inputs = { | |
330 | { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 }, | |
331 | { CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL1, 1 }, | |
332 | }, | |
333 | .tuners = { | |
334 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, | |
335 | }, | |
336 | .ddr = { | |
337 | .chip_config = 0x202, | |
338 | .refresh = 0x3bb, | |
339 | .timing1 = 0x33320a63, | |
340 | .timing2 = 0x0a, | |
341 | .tune_lane = 0, | |
342 | .initial_emrs = 0x42, | |
343 | }, | |
344 | .xceive_pin = 15, | |
345 | .pci_list = cx18_pci_toshiba_qosmio_dvbt, | |
346 | .i2c = &cx18_i2c_std, | |
347 | }; | |
348 | ||
349 | /* ------------------------------------------------------------------------- */ | |
350 | ||
351 | /* Leadtek WinFast PVR2100 */ | |
352 | ||
353 | static const struct cx18_card_pci_info cx18_pci_leadtek_pvr2100[] = { | |
6ce9ee53 | 354 | { PCI_DEVICE_ID_CX23418, CX18_PCI_ID_LEADTEK, 0x6f27 }, /* PVR2100 */ |
9eee4fb6 AW |
355 | { 0, 0, 0 } |
356 | }; | |
357 | ||
358 | static const struct cx18_card cx18_card_leadtek_pvr2100 = { | |
359 | .type = CX18_CARD_LEADTEK_PVR2100, | |
9d5af862 | 360 | .name = "Leadtek WinFast PVR2100", |
9eee4fb6 AW |
361 | .comment = "Experimenters and photos needed for device to work well.\n" |
362 | "\tTo help, mail the ivtv-devel list (www.ivtvdriver.org).\n", | |
363 | .v4l2_capabilities = CX18_CAP_ENCODER, | |
ff2a2001 | 364 | .hw_audio_ctrl = CX18_HW_418_AV, |
eefe1010 AW |
365 | .hw_muxer = CX18_HW_GPIO_MUX, |
366 | .hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_MUX | | |
367 | CX18_HW_GPIO_RESET_CTRL, | |
9eee4fb6 AW |
368 | .video_inputs = { |
369 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE2 }, | |
370 | { CX18_CARD_INPUT_SVIDEO1, 1, | |
371 | CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 }, | |
372 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE7 }, | |
f978ac90 | 373 | { CX18_CARD_INPUT_COMPONENT1, 1, CX18_AV_COMPONENT1 }, |
9eee4fb6 AW |
374 | }, |
375 | .audio_inputs = { | |
376 | { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 }, | |
377 | { CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL1, 1 }, | |
378 | }, | |
379 | .tuners = { | |
9d5af862 | 380 | /* XC2028 tuner */ |
9eee4fb6 AW |
381 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, |
382 | }, | |
383 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 2 }, | |
384 | .ddr = { | |
8bb09db3 | 385 | /* Pointer to proper DDR config values provided by Terry Wu */ |
9eee4fb6 AW |
386 | .chip_config = 0x303, |
387 | .refresh = 0x3bb, | |
388 | .timing1 = 0x24220e83, | |
389 | .timing2 = 0x1f, | |
390 | .tune_lane = 0, | |
391 | .initial_emrs = 0x2, | |
392 | }, | |
393 | .gpio_init.initial_value = 0x6, | |
394 | .gpio_init.direction = 0x7, | |
395 | .gpio_audio_input = { .mask = 0x7, | |
396 | .tuner = 0x6, .linein = 0x2, .radio = 0x2 }, | |
a8073119 | 397 | .xceive_pin = 1, |
9eee4fb6 AW |
398 | .pci_list = cx18_pci_leadtek_pvr2100, |
399 | .i2c = &cx18_i2c_std, | |
400 | }; | |
401 | ||
402 | /* ------------------------------------------------------------------------- */ | |
403 | ||
9d5af862 AW |
404 | /* Leadtek WinFast DVR3100 H */ |
405 | ||
406 | static const struct cx18_card_pci_info cx18_pci_leadtek_dvr3100h[] = { | |
407 | { PCI_DEVICE_ID_CX23418, CX18_PCI_ID_LEADTEK, 0x6690 }, /* DVR3100 H */ | |
408 | { 0, 0, 0 } | |
409 | }; | |
410 | ||
411 | static const struct cx18_card cx18_card_leadtek_dvr3100h = { | |
412 | .type = CX18_CARD_LEADTEK_DVR3100H, | |
413 | .name = "Leadtek WinFast DVR3100 H", | |
8bb09db3 AW |
414 | .comment = "Simultaneous DVB-T and Analog capture supported,\n" |
415 | "\texcept when capturing Analog from the antenna input.\n", | |
9d5af862 AW |
416 | .v4l2_capabilities = CX18_CAP_ENCODER, |
417 | .hw_audio_ctrl = CX18_HW_418_AV, | |
418 | .hw_muxer = CX18_HW_GPIO_MUX, | |
419 | .hw_all = CX18_HW_418_AV | CX18_HW_TUNER | CX18_HW_GPIO_MUX | | |
8bb09db3 | 420 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL, |
9d5af862 AW |
421 | .video_inputs = { |
422 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE2 }, | |
423 | { CX18_CARD_INPUT_SVIDEO1, 1, | |
424 | CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 }, | |
425 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE7 }, | |
f978ac90 | 426 | { CX18_CARD_INPUT_COMPONENT1, 1, CX18_AV_COMPONENT1 }, |
9d5af862 AW |
427 | }, |
428 | .audio_inputs = { | |
429 | { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 }, | |
430 | { CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL1, 1 }, | |
431 | }, | |
432 | .tuners = { | |
433 | /* XC3028 tuner */ | |
434 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, | |
435 | }, | |
436 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 2 }, | |
437 | .ddr = { | |
8bb09db3 | 438 | /* Pointer to proper DDR config values provided by Terry Wu */ |
9d5af862 AW |
439 | .chip_config = 0x303, |
440 | .refresh = 0x3bb, | |
441 | .timing1 = 0x24220e83, | |
442 | .timing2 = 0x1f, | |
443 | .tune_lane = 0, | |
444 | .initial_emrs = 0x2, | |
445 | }, | |
446 | .gpio_init.initial_value = 0x6, | |
447 | .gpio_init.direction = 0x7, | |
448 | .gpio_audio_input = { .mask = 0x7, | |
449 | .tuner = 0x6, .linein = 0x2, .radio = 0x2 }, | |
8bb09db3 | 450 | .xceive_pin = 1, |
9d5af862 AW |
451 | .pci_list = cx18_pci_leadtek_dvr3100h, |
452 | .i2c = &cx18_i2c_std, | |
453 | }; | |
454 | ||
455 | /* ------------------------------------------------------------------------- */ | |
456 | ||
1c1e45d1 HV |
457 | static const struct cx18_card *cx18_card_list[] = { |
458 | &cx18_card_hvr1600_esmt, | |
459 | &cx18_card_hvr1600_samsung, | |
460 | &cx18_card_h900, | |
461 | &cx18_card_mpc718, | |
03c28085 | 462 | &cx18_card_cnxt_raptor_pal, |
9eee4fb6 AW |
463 | &cx18_card_toshiba_qosmio_dvbt, |
464 | &cx18_card_leadtek_pvr2100, | |
9d5af862 | 465 | &cx18_card_leadtek_dvr3100h, |
1c1e45d1 HV |
466 | }; |
467 | ||
468 | const struct cx18_card *cx18_get_card(u16 index) | |
469 | { | |
470 | if (index >= ARRAY_SIZE(cx18_card_list)) | |
471 | return NULL; | |
472 | return cx18_card_list[index]; | |
473 | } | |
474 | ||
475 | int cx18_get_input(struct cx18 *cx, u16 index, struct v4l2_input *input) | |
476 | { | |
477 | const struct cx18_card_video_input *card_input = | |
478 | cx->card->video_inputs + index; | |
479 | static const char * const input_strs[] = { | |
480 | "Tuner 1", | |
481 | "S-Video 1", | |
482 | "S-Video 2", | |
483 | "Composite 1", | |
484 | "Composite 2", | |
d9a325a8 | 485 | "Component 1" |
1c1e45d1 HV |
486 | }; |
487 | ||
488 | memset(input, 0, sizeof(*input)); | |
489 | if (index >= cx->nof_inputs) | |
490 | return -EINVAL; | |
491 | input->index = index; | |
492 | strlcpy(input->name, input_strs[card_input->video_type - 1], | |
493 | sizeof(input->name)); | |
494 | input->type = (card_input->video_type == CX18_CARD_INPUT_VID_TUNER ? | |
495 | V4L2_INPUT_TYPE_TUNER : V4L2_INPUT_TYPE_CAMERA); | |
496 | input->audioset = (1 << cx->nof_audio_inputs) - 1; | |
497 | input->std = (input->type == V4L2_INPUT_TYPE_TUNER) ? | |
498 | cx->tuner_std : V4L2_STD_ALL; | |
499 | return 0; | |
500 | } | |
501 | ||
502 | int cx18_get_audio_input(struct cx18 *cx, u16 index, struct v4l2_audio *audio) | |
503 | { | |
504 | const struct cx18_card_audio_input *aud_input = | |
505 | cx->card->audio_inputs + index; | |
506 | static const char * const input_strs[] = { | |
507 | "Tuner 1", | |
508 | "Line In 1", | |
509 | "Line In 2" | |
510 | }; | |
511 | ||
512 | memset(audio, 0, sizeof(*audio)); | |
513 | if (index >= cx->nof_audio_inputs) | |
514 | return -EINVAL; | |
515 | strlcpy(audio->name, input_strs[aud_input->audio_type - 1], | |
516 | sizeof(audio->name)); | |
517 | audio->index = index; | |
518 | audio->capability = V4L2_AUDCAP_STEREO; | |
519 | return 0; | |
520 | } |