diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88-dvb.c')
-rw-r--r-- | drivers/media/video/cx88/cx88-dvb.c | 77 |
1 files changed, 61 insertions, 16 deletions
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c index c69df7ebb6a7..cf3d33ab541b 100644 --- a/drivers/media/video/cx88/cx88-dvb.c +++ b/drivers/media/video/cx88/cx88-dvb.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include "or51132.h" | 41 | #include "or51132.h" |
42 | #include "lgdt330x.h" | 42 | #include "lgdt330x.h" |
43 | #include "s5h1409.h" | 43 | #include "s5h1409.h" |
44 | #include "xc4000.h" | ||
44 | #include "xc5000.h" | 45 | #include "xc5000.h" |
45 | #include "nxt200x.h" | 46 | #include "nxt200x.h" |
46 | #include "cx24123.h" | 47 | #include "cx24123.h" |
@@ -63,6 +64,7 @@ MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); | |||
63 | MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>"); | 64 | MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>"); |
64 | MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]"); | 65 | MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]"); |
65 | MODULE_LICENSE("GPL"); | 66 | MODULE_LICENSE("GPL"); |
67 | MODULE_VERSION(CX88_VERSION); | ||
66 | 68 | ||
67 | static unsigned int debug; | 69 | static unsigned int debug; |
68 | module_param(debug, int, 0644); | 70 | module_param(debug, int, 0644); |
@@ -605,6 +607,39 @@ static int attach_xc3028(u8 addr, struct cx8802_dev *dev) | |||
605 | return 0; | 607 | return 0; |
606 | } | 608 | } |
607 | 609 | ||
610 | static int attach_xc4000(struct cx8802_dev *dev, struct xc4000_config *cfg) | ||
611 | { | ||
612 | struct dvb_frontend *fe; | ||
613 | struct videobuf_dvb_frontend *fe0 = NULL; | ||
614 | |||
615 | /* Get the first frontend */ | ||
616 | fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1); | ||
617 | if (!fe0) | ||
618 | return -EINVAL; | ||
619 | |||
620 | if (!fe0->dvb.frontend) { | ||
621 | printk(KERN_ERR "%s/2: dvb frontend not attached. " | ||
622 | "Can't attach xc4000\n", | ||
623 | dev->core->name); | ||
624 | return -EINVAL; | ||
625 | } | ||
626 | |||
627 | fe = dvb_attach(xc4000_attach, fe0->dvb.frontend, &dev->core->i2c_adap, | ||
628 | cfg); | ||
629 | if (!fe) { | ||
630 | printk(KERN_ERR "%s/2: xc4000 attach failed\n", | ||
631 | dev->core->name); | ||
632 | dvb_frontend_detach(fe0->dvb.frontend); | ||
633 | dvb_unregister_frontend(fe0->dvb.frontend); | ||
634 | fe0->dvb.frontend = NULL; | ||
635 | return -EINVAL; | ||
636 | } | ||
637 | |||
638 | printk(KERN_INFO "%s/2: xc4000 attached\n", dev->core->name); | ||
639 | |||
640 | return 0; | ||
641 | } | ||
642 | |||
608 | static int cx24116_set_ts_param(struct dvb_frontend *fe, | 643 | static int cx24116_set_ts_param(struct dvb_frontend *fe, |
609 | int is_punctured) | 644 | int is_punctured) |
610 | { | 645 | { |
@@ -1294,7 +1329,25 @@ static int dvb_register(struct cx8802_dev *dev) | |||
1294 | goto frontend_detach; | 1329 | goto frontend_detach; |
1295 | } | 1330 | } |
1296 | break; | 1331 | break; |
1297 | case CX88_BOARD_GENIATECH_X8000_MT: | 1332 | case CX88_BOARD_WINFAST_DTV1800H_XC4000: |
1333 | case CX88_BOARD_WINFAST_DTV2000H_PLUS: | ||
1334 | fe0->dvb.frontend = dvb_attach(zl10353_attach, | ||
1335 | &cx88_pinnacle_hybrid_pctv, | ||
1336 | &core->i2c_adap); | ||
1337 | if (fe0->dvb.frontend) { | ||
1338 | struct xc4000_config cfg = { | ||
1339 | .i2c_address = 0x61, | ||
1340 | .default_pm = 0, | ||
1341 | .dvb_amplitude = 134, | ||
1342 | .set_smoothedcvbs = 1, | ||
1343 | .if_khz = 4560 | ||
1344 | }; | ||
1345 | fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL; | ||
1346 | if (attach_xc4000(dev, &cfg) < 0) | ||
1347 | goto frontend_detach; | ||
1348 | } | ||
1349 | break; | ||
1350 | case CX88_BOARD_GENIATECH_X8000_MT: | ||
1298 | dev->ts_gen_cntrl = 0x00; | 1351 | dev->ts_gen_cntrl = 0x00; |
1299 | 1352 | ||
1300 | fe0->dvb.frontend = dvb_attach(zl10353_attach, | 1353 | fe0->dvb.frontend = dvb_attach(zl10353_attach, |
@@ -1577,6 +1630,11 @@ static int cx8802_dvb_advise_acquire(struct cx8802_driver *drv) | |||
1577 | udelay(1000); | 1630 | udelay(1000); |
1578 | break; | 1631 | break; |
1579 | 1632 | ||
1633 | case CX88_BOARD_WINFAST_DTV2000H_PLUS: | ||
1634 | /* set RF input to AIR for DVB-T (GPIO 16) */ | ||
1635 | cx_write(MO_GP2_IO, 0x0101); | ||
1636 | break; | ||
1637 | |||
1580 | default: | 1638 | default: |
1581 | err = -ENODEV; | 1639 | err = -ENODEV; |
1582 | } | 1640 | } |
@@ -1692,14 +1750,8 @@ static struct cx8802_driver cx8802_dvb_driver = { | |||
1692 | 1750 | ||
1693 | static int __init dvb_init(void) | 1751 | static int __init dvb_init(void) |
1694 | { | 1752 | { |
1695 | printk(KERN_INFO "cx88/2: cx2388x dvb driver version %d.%d.%d loaded\n", | 1753 | printk(KERN_INFO "cx88/2: cx2388x dvb driver version %s loaded\n", |
1696 | (CX88_VERSION_CODE >> 16) & 0xff, | 1754 | CX88_VERSION); |
1697 | (CX88_VERSION_CODE >> 8) & 0xff, | ||
1698 | CX88_VERSION_CODE & 0xff); | ||
1699 | #ifdef SNAPSHOT | ||
1700 | printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n", | ||
1701 | SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100); | ||
1702 | #endif | ||
1703 | return cx8802_register_driver(&cx8802_dvb_driver); | 1755 | return cx8802_register_driver(&cx8802_dvb_driver); |
1704 | } | 1756 | } |
1705 | 1757 | ||
@@ -1710,10 +1762,3 @@ static void __exit dvb_fini(void) | |||
1710 | 1762 | ||
1711 | module_init(dvb_init); | 1763 | module_init(dvb_init); |
1712 | module_exit(dvb_fini); | 1764 | module_exit(dvb_fini); |
1713 | |||
1714 | /* | ||
1715 | * Local variables: | ||
1716 | * c-basic-offset: 8 | ||
1717 | * compile-command: "make DVB=1" | ||
1718 | * End: | ||
1719 | */ | ||