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