diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88-dvb.c')
-rw-r--r-- | drivers/media/video/cx88/cx88-dvb.c | 59 |
1 files changed, 49 insertions, 10 deletions
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c index 4334744652de..9cce91ec334b 100644 --- a/drivers/media/video/cx88/cx88-dvb.c +++ b/drivers/media/video/cx88/cx88-dvb.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <linux/file.h> | 29 | #include <linux/file.h> |
30 | #include <linux/suspend.h> | 30 | #include <linux/suspend.h> |
31 | 31 | ||
32 | |||
33 | #include "cx88.h" | 32 | #include "cx88.h" |
34 | #include "dvb-pll.h" | 33 | #include "dvb-pll.h" |
35 | 34 | ||
@@ -46,6 +45,9 @@ | |||
46 | #ifdef HAVE_LGDT330X | 45 | #ifdef HAVE_LGDT330X |
47 | # include "lgdt330x.h" | 46 | # include "lgdt330x.h" |
48 | #endif | 47 | #endif |
48 | #ifdef HAVE_NXT200X | ||
49 | # include "nxt200x.h" | ||
50 | #endif | ||
49 | 51 | ||
50 | MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); | 52 | MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); |
51 | MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>"); | 53 | MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>"); |
@@ -78,7 +80,7 @@ static int dvb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, | |||
78 | enum v4l2_field field) | 80 | enum v4l2_field field) |
79 | { | 81 | { |
80 | struct cx8802_dev *dev = q->priv_data; | 82 | struct cx8802_dev *dev = q->priv_data; |
81 | return cx8802_buf_prepare(dev, (struct cx88_buffer*)vb); | 83 | return cx8802_buf_prepare(dev, (struct cx88_buffer*)vb,field); |
82 | } | 84 | } |
83 | 85 | ||
84 | static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) | 86 | static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) |
@@ -129,7 +131,7 @@ static int dntv_live_dvbt_demod_init(struct dvb_frontend* fe) | |||
129 | static u8 reset [] = { 0x50, 0x80 }; | 131 | static u8 reset [] = { 0x50, 0x80 }; |
130 | static u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 }; | 132 | static u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 }; |
131 | static u8 agc_cfg [] = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF, | 133 | static u8 agc_cfg [] = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF, |
132 | 0x00, 0xFF, 0x00, 0x40, 0x40 }; | 134 | 0x00, 0xFF, 0x00, 0x40, 0x40 }; |
133 | static u8 dntv_extra[] = { 0xB5, 0x7A }; | 135 | static u8 dntv_extra[] = { 0xB5, 0x7A }; |
134 | static u8 capt_range_cfg[] = { 0x75, 0x32 }; | 136 | static u8 capt_range_cfg[] = { 0x75, 0x32 }; |
135 | 137 | ||
@@ -285,6 +287,33 @@ static struct lgdt330x_config fusionhdtv_5_gold = { | |||
285 | }; | 287 | }; |
286 | #endif | 288 | #endif |
287 | 289 | ||
290 | #ifdef HAVE_NXT200X | ||
291 | static int nxt200x_set_ts_param(struct dvb_frontend* fe, | ||
292 | int is_punctured) | ||
293 | { | ||
294 | struct cx8802_dev *dev= fe->dvb->priv; | ||
295 | dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00; | ||
296 | return 0; | ||
297 | } | ||
298 | |||
299 | static int nxt200x_set_pll_input(u8* buf, int input) | ||
300 | { | ||
301 | if (input) | ||
302 | buf[3] |= 0x08; | ||
303 | else | ||
304 | buf[3] &= ~0x08; | ||
305 | return 0; | ||
306 | } | ||
307 | |||
308 | static struct nxt200x_config ati_hdtvwonder = { | ||
309 | .demod_address = 0x0a, | ||
310 | .pll_address = 0x61, | ||
311 | .pll_desc = &dvb_pll_tuv1236d, | ||
312 | .set_pll_input = nxt200x_set_pll_input, | ||
313 | .set_ts_params = nxt200x_set_ts_param, | ||
314 | }; | ||
315 | #endif | ||
316 | |||
288 | static int dvb_register(struct cx8802_dev *dev) | 317 | static int dvb_register(struct cx8802_dev *dev) |
289 | { | 318 | { |
290 | /* init struct videobuf_dvb */ | 319 | /* init struct videobuf_dvb */ |
@@ -300,6 +329,7 @@ static int dvb_register(struct cx8802_dev *dev) | |||
300 | break; | 329 | break; |
301 | case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1: | 330 | case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1: |
302 | case CX88_BOARD_CONEXANT_DVB_T1: | 331 | case CX88_BOARD_CONEXANT_DVB_T1: |
332 | case CX88_BOARD_WINFAST_DTV1000: | ||
303 | dev->dvb.frontend = cx22702_attach(&connexant_refboard_config, | 333 | dev->dvb.frontend = cx22702_attach(&connexant_refboard_config, |
304 | &dev->core->i2c_adap); | 334 | &dev->core->i2c_adap); |
305 | break; | 335 | break; |
@@ -385,6 +415,12 @@ static int dvb_register(struct cx8802_dev *dev) | |||
385 | } | 415 | } |
386 | break; | 416 | break; |
387 | #endif | 417 | #endif |
418 | #ifdef HAVE_NXT200X | ||
419 | case CX88_BOARD_ATI_HDTVWONDER: | ||
420 | dev->dvb.frontend = nxt200x_attach(&ati_hdtvwonder, | ||
421 | &dev->core->i2c_adap); | ||
422 | break; | ||
423 | #endif | ||
388 | default: | 424 | default: |
389 | printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n", | 425 | printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n", |
390 | dev->core->name); | 426 | dev->core->name); |
@@ -403,6 +439,9 @@ static int dvb_register(struct cx8802_dev *dev) | |||
403 | /* Put the analog decoder in standby to keep it quiet */ | 439 | /* Put the analog decoder in standby to keep it quiet */ |
404 | cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL); | 440 | cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL); |
405 | 441 | ||
442 | /* Put the analog decoder in standby to keep it quiet */ | ||
443 | cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL); | ||
444 | |||
406 | /* register everything */ | 445 | /* register everything */ |
407 | return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev); | 446 | return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev); |
408 | } | 447 | } |
@@ -461,7 +500,7 @@ static int __devinit dvb_probe(struct pci_dev *pci_dev, | |||
461 | 500 | ||
462 | static void __devexit dvb_remove(struct pci_dev *pci_dev) | 501 | static void __devexit dvb_remove(struct pci_dev *pci_dev) |
463 | { | 502 | { |
464 | struct cx8802_dev *dev = pci_get_drvdata(pci_dev); | 503 | struct cx8802_dev *dev = pci_get_drvdata(pci_dev); |
465 | 504 | ||
466 | /* dvb */ | 505 | /* dvb */ |
467 | videobuf_dvb_unregister(&dev->dvb); | 506 | videobuf_dvb_unregister(&dev->dvb); |
@@ -476,8 +515,8 @@ static struct pci_device_id cx8802_pci_tbl[] = { | |||
476 | { | 515 | { |
477 | .vendor = 0x14f1, | 516 | .vendor = 0x14f1, |
478 | .device = 0x8802, | 517 | .device = 0x8802, |
479 | .subvendor = PCI_ANY_ID, | 518 | .subvendor = PCI_ANY_ID, |
480 | .subdevice = PCI_ANY_ID, | 519 | .subdevice = PCI_ANY_ID, |
481 | },{ | 520 | },{ |
482 | /* --- end of list --- */ | 521 | /* --- end of list --- */ |
483 | } | 522 | } |
@@ -485,10 +524,10 @@ static struct pci_device_id cx8802_pci_tbl[] = { | |||
485 | MODULE_DEVICE_TABLE(pci, cx8802_pci_tbl); | 524 | MODULE_DEVICE_TABLE(pci, cx8802_pci_tbl); |
486 | 525 | ||
487 | static struct pci_driver dvb_pci_driver = { | 526 | static struct pci_driver dvb_pci_driver = { |
488 | .name = "cx88-dvb", | 527 | .name = "cx88-dvb", |
489 | .id_table = cx8802_pci_tbl, | 528 | .id_table = cx8802_pci_tbl, |
490 | .probe = dvb_probe, | 529 | .probe = dvb_probe, |
491 | .remove = __devexit_p(dvb_remove), | 530 | .remove = __devexit_p(dvb_remove), |
492 | .suspend = cx8802_suspend_common, | 531 | .suspend = cx8802_suspend_common, |
493 | .resume = cx8802_resume_common, | 532 | .resume = cx8802_resume_common, |
494 | }; | 533 | }; |