diff options
-rw-r--r-- | Documentation/video4linux/CARDLIST.cx88 | 1 | ||||
-rw-r--r-- | drivers/media/video/cx88/cx88-cards.c | 27 | ||||
-rw-r--r-- | drivers/media/video/cx88/cx88-dvb.c | 69 | ||||
-rw-r--r-- | drivers/media/video/cx88/cx88.h | 1 |
4 files changed, 98 insertions, 0 deletions
diff --git a/Documentation/video4linux/CARDLIST.cx88 b/Documentation/video4linux/CARDLIST.cx88 index bc5593bd9704..79c166a7f230 100644 --- a/Documentation/video4linux/CARDLIST.cx88 +++ b/Documentation/video4linux/CARDLIST.cx88 | |||
@@ -57,3 +57,4 @@ | |||
57 | 56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602] | 57 | 56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602] |
58 | 57 -> ADS Tech Instant Video PCI [1421:0390] | 58 | 57 -> ADS Tech Instant Video PCI [1421:0390] |
59 | 58 -> Pinnacle PCTV HD 800i [11bd:0051] | 59 | 58 -> Pinnacle PCTV HD 800i [11bd:0051] |
60 | 59 -> DVICO HDTV5 PCI Nano [18ac:d530] | ||
diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c index 8c9a8adf52de..23b58bc9cf2b 100644 --- a/drivers/media/video/cx88/cx88-cards.c +++ b/drivers/media/video/cx88/cx88-cards.c | |||
@@ -1401,6 +1401,29 @@ static const struct cx88_board cx88_boards[] = { | |||
1401 | }}, | 1401 | }}, |
1402 | .mpeg = CX88_MPEG_DVB, | 1402 | .mpeg = CX88_MPEG_DVB, |
1403 | }, | 1403 | }, |
1404 | [CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = { | ||
1405 | .name = "DVICO HDTV5 PCI Nano", | ||
1406 | .tuner_type = TUNER_ABSENT, | ||
1407 | .radio_type = UNSET, | ||
1408 | .tuner_addr = ADDR_UNSET, | ||
1409 | .radio_addr = ADDR_UNSET, | ||
1410 | .input = {{ | ||
1411 | .type = CX88_VMUX_TELEVISION, | ||
1412 | .vmux = 0, | ||
1413 | .gpio0 = 0x000027df, /* Unconfirmed */ | ||
1414 | }, { | ||
1415 | .type = CX88_VMUX_COMPOSITE1, | ||
1416 | .vmux = 1, | ||
1417 | .gpio0 = 0x000027df, /* Unconfirmed */ | ||
1418 | .audioroute = 1, | ||
1419 | }, { | ||
1420 | .type = CX88_VMUX_SVIDEO, | ||
1421 | .vmux = 2, | ||
1422 | .gpio0 = 0x000027df, /* Unconfirmed */ | ||
1423 | .audioroute = 1, | ||
1424 | } }, | ||
1425 | .mpeg = CX88_MPEG_DVB, | ||
1426 | }, | ||
1404 | }; | 1427 | }; |
1405 | 1428 | ||
1406 | /* ------------------------------------------------------------------ */ | 1429 | /* ------------------------------------------------------------------ */ |
@@ -1714,6 +1737,10 @@ static const struct cx88_subid cx88_subids[] = { | |||
1714 | .subvendor = 0x11bd, | 1737 | .subvendor = 0x11bd, |
1715 | .subdevice = 0x0051, | 1738 | .subdevice = 0x0051, |
1716 | .card = CX88_BOARD_PINNACLE_PCTV_HD_800i, | 1739 | .card = CX88_BOARD_PINNACLE_PCTV_HD_800i, |
1740 | }, { | ||
1741 | .subvendor = 0x18ac, | ||
1742 | .subdevice = 0xd530, | ||
1743 | .card = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO, | ||
1717 | }, | 1744 | }, |
1718 | }; | 1745 | }; |
1719 | 1746 | ||
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c index fa21666966e6..735376060df2 100644 --- a/drivers/media/video/cx88/cx88-dvb.c +++ b/drivers/media/video/cx88/cx88-dvb.c | |||
@@ -45,6 +45,8 @@ | |||
45 | #include "nxt200x.h" | 45 | #include "nxt200x.h" |
46 | #include "cx24123.h" | 46 | #include "cx24123.h" |
47 | #include "isl6421.h" | 47 | #include "isl6421.h" |
48 | #include "tuner-xc2028.h" | ||
49 | #include "tuner-xc2028-types.h" | ||
48 | 50 | ||
49 | MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); | 51 | MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); |
50 | MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>"); | 52 | MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>"); |
@@ -357,6 +359,40 @@ static int geniatech_dvbs_set_voltage(struct dvb_frontend *fe, | |||
357 | return 0; | 359 | return 0; |
358 | } | 360 | } |
359 | 361 | ||
362 | static int cx88_xc3028_callback(void *ptr, int command, int arg) | ||
363 | { | ||
364 | struct cx88_core *core = ptr; | ||
365 | |||
366 | switch (command) { | ||
367 | case XC2028_TUNER_RESET: | ||
368 | /* Send the tuner in then out of reset */ | ||
369 | dprintk(1, "%s: XC2028_TUNER_RESET %d\n", __FUNCTION__, arg); | ||
370 | |||
371 | switch (core->boardnr) { | ||
372 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: | ||
373 | /* GPIO-4 xc3028 tuner */ | ||
374 | |||
375 | cx_set(MO_GP0_IO, 0x00001000); | ||
376 | cx_clear(MO_GP0_IO, 0x00000010); | ||
377 | msleep(100); | ||
378 | cx_set(MO_GP0_IO, 0x00000010); | ||
379 | msleep(100); | ||
380 | break; | ||
381 | } | ||
382 | |||
383 | break; | ||
384 | case XC2028_RESET_CLK: | ||
385 | dprintk(1, "%s: XC2028_RESET_CLK %d\n", __FUNCTION__, arg); | ||
386 | break; | ||
387 | default: | ||
388 | dprintk(1, "%s: unknown command %d, arg %d\n", __FUNCTION__, | ||
389 | command, arg); | ||
390 | return -EINVAL; | ||
391 | } | ||
392 | |||
393 | return 0; | ||
394 | } | ||
395 | |||
360 | static struct cx24123_config geniatech_dvbs_config = { | 396 | static struct cx24123_config geniatech_dvbs_config = { |
361 | .demod_address = 0x55, | 397 | .demod_address = 0x55, |
362 | .set_ts_params = cx24123_set_ts_param, | 398 | .set_ts_params = cx24123_set_ts_param, |
@@ -383,6 +419,15 @@ static struct s5h1409_config pinnacle_pctv_hd_800i_config = { | |||
383 | .mpeg_timing = S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK, | 419 | .mpeg_timing = S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK, |
384 | }; | 420 | }; |
385 | 421 | ||
422 | static struct s5h1409_config dvico_hdtv5_pci_nano_config = { | ||
423 | .demod_address = 0x32 >> 1, | ||
424 | .output_mode = S5H1409_SERIAL_OUTPUT, | ||
425 | .gpio = S5H1409_GPIO_OFF, | ||
426 | .inversion = S5H1409_INVERSION_OFF, | ||
427 | .status_mode = S5H1409_DEMODLOCKING, | ||
428 | .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, | ||
429 | }; | ||
430 | |||
386 | static struct xc5000_config pinnacle_pctv_hd_800i_tuner_config = { | 431 | static struct xc5000_config pinnacle_pctv_hd_800i_tuner_config = { |
387 | .i2c_address = 0x64, | 432 | .i2c_address = 0x64, |
388 | .if_khz = 5380, | 433 | .if_khz = 5380, |
@@ -658,6 +703,30 @@ static int dvb_register(struct cx8802_dev *dev) | |||
658 | &pinnacle_pctv_hd_800i_tuner_config); | 703 | &pinnacle_pctv_hd_800i_tuner_config); |
659 | } | 704 | } |
660 | break; | 705 | break; |
706 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: | ||
707 | dev->dvb.frontend = dvb_attach(s5h1409_attach, | ||
708 | &dvico_hdtv5_pci_nano_config, | ||
709 | &dev->core->i2c_adap); | ||
710 | if (dev->dvb.frontend != NULL) { | ||
711 | struct dvb_frontend *fe; | ||
712 | struct xc2028_config cfg = { | ||
713 | .i2c_adap = &dev->core->i2c_adap, | ||
714 | .i2c_addr = 0x61, | ||
715 | .video_dev = dev->core, | ||
716 | .callback = cx88_xc3028_callback, | ||
717 | }; | ||
718 | static struct xc2028_ctrl ctl = { | ||
719 | .fname = "xc3028-v27.fw", | ||
720 | .max_len = 64, | ||
721 | .scode_table = OREN538, | ||
722 | }; | ||
723 | |||
724 | fe = dvb_attach(xc2028_attach, | ||
725 | dev->dvb.frontend, &cfg); | ||
726 | if (fe != NULL && fe->ops.tuner_ops.set_config != NULL) | ||
727 | fe->ops.tuner_ops.set_config(fe, &ctl); | ||
728 | } | ||
729 | break; | ||
661 | default: | 730 | default: |
662 | printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n", | 731 | printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n", |
663 | dev->core->name); | 732 | dev->core->name); |
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h index 37e6d2e4002f..8121bd07a88a 100644 --- a/drivers/media/video/cx88/cx88.h +++ b/drivers/media/video/cx88/cx88.h | |||
@@ -211,6 +211,7 @@ extern struct sram_channel cx88_sram_channels[]; | |||
211 | #define CX88_BOARD_HAUPPAUGE_HVR1300 56 | 211 | #define CX88_BOARD_HAUPPAUGE_HVR1300 56 |
212 | #define CX88_BOARD_ADSTECH_PTV_390 57 | 212 | #define CX88_BOARD_ADSTECH_PTV_390 57 |
213 | #define CX88_BOARD_PINNACLE_PCTV_HD_800i 58 | 213 | #define CX88_BOARD_PINNACLE_PCTV_HD_800i 58 |
214 | #define CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO 59 | ||
214 | 215 | ||
215 | enum cx88_itype { | 216 | enum cx88_itype { |
216 | CX88_VMUX_COMPOSITE1 = 1, | 217 | CX88_VMUX_COMPOSITE1 = 1, |