diff options
| -rw-r--r-- | drivers/media/dvb/dvb-usb/cxusb.c | 144 |
1 files changed, 143 insertions, 1 deletions
diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c index 358ed153865f..228aa4237334 100644 --- a/drivers/media/dvb/dvb-usb/cxusb.c +++ b/drivers/media/dvb/dvb-usb/cxusb.c | |||
| @@ -253,6 +253,26 @@ static int cxusb_dee1601_demod_init(struct dvb_frontend* fe) | |||
| 253 | return 0; | 253 | return 0; |
| 254 | } | 254 | } |
| 255 | 255 | ||
| 256 | static int cxusb_mt352_demod_init(struct dvb_frontend* fe) | ||
| 257 | { /* used in both lgz201 and th7579 */ | ||
| 258 | static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x39 }; | ||
| 259 | static u8 reset [] = { RESET, 0x80 }; | ||
| 260 | static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 }; | ||
| 261 | static u8 agc_cfg [] = { AGC_TARGET, 0x24, 0x20 }; | ||
| 262 | static u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 }; | ||
| 263 | static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 }; | ||
| 264 | |||
| 265 | mt352_write(fe, clock_config, sizeof(clock_config)); | ||
| 266 | udelay(200); | ||
| 267 | mt352_write(fe, reset, sizeof(reset)); | ||
| 268 | mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg)); | ||
| 269 | |||
| 270 | mt352_write(fe, agc_cfg, sizeof(agc_cfg)); | ||
| 271 | mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg)); | ||
| 272 | mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg)); | ||
| 273 | return 0; | ||
| 274 | } | ||
| 275 | |||
| 256 | struct cx22702_config cxusb_cx22702_config = { | 276 | struct cx22702_config cxusb_cx22702_config = { |
| 257 | .demod_address = 0x63, | 277 | .demod_address = 0x63, |
| 258 | 278 | ||
| @@ -274,6 +294,13 @@ struct mt352_config cxusb_dee1601_config = { | |||
| 274 | .pll_set = dvb_usb_pll_set, | 294 | .pll_set = dvb_usb_pll_set, |
| 275 | }; | 295 | }; |
| 276 | 296 | ||
| 297 | struct mt352_config cxusb_mt352_config = { | ||
| 298 | /* used in both lgz201 and th7579 */ | ||
| 299 | .demod_address = 0x0f, | ||
| 300 | .demod_init = cxusb_mt352_demod_init, | ||
| 301 | .pll_set = dvb_usb_pll_set, | ||
| 302 | }; | ||
| 303 | |||
| 277 | /* Callbacks for DVB USB */ | 304 | /* Callbacks for DVB USB */ |
| 278 | static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_device *d) | 305 | static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_device *d) |
| 279 | { | 306 | { |
| @@ -302,6 +329,20 @@ static int cxusb_dee1601_tuner_attach(struct dvb_usb_device *d) | |||
| 302 | return 0; | 329 | return 0; |
| 303 | } | 330 | } |
| 304 | 331 | ||
| 332 | static int cxusb_lgz201_tuner_attach(struct dvb_usb_device *d) | ||
| 333 | { | ||
| 334 | d->pll_addr = 0x61; | ||
| 335 | d->pll_desc = &dvb_pll_lg_z201; | ||
| 336 | return 0; | ||
| 337 | } | ||
| 338 | |||
| 339 | static int cxusb_dtt7579_tuner_attach(struct dvb_usb_device *d) | ||
| 340 | { | ||
| 341 | d->pll_addr = 0x60; | ||
| 342 | d->pll_desc = &dvb_pll_thomson_dtt7579; | ||
| 343 | return 0; | ||
| 344 | } | ||
| 345 | |||
| 305 | static int cxusb_cx22702_frontend_attach(struct dvb_usb_device *d) | 346 | static int cxusb_cx22702_frontend_attach(struct dvb_usb_device *d) |
| 306 | { | 347 | { |
| 307 | u8 b; | 348 | u8 b; |
| @@ -329,6 +370,19 @@ static int cxusb_lgdt330x_frontend_attach(struct dvb_usb_device *d) | |||
| 329 | return -EIO; | 370 | return -EIO; |
| 330 | } | 371 | } |
| 331 | 372 | ||
| 373 | static int cxusb_mt352_frontend_attach(struct dvb_usb_device *d) | ||
| 374 | { /* used in both lgz201 and th7579 */ | ||
| 375 | if (usb_set_interface(d->udev,0,0) < 0) | ||
| 376 | err("set interface failed"); | ||
| 377 | |||
| 378 | cxusb_ctrl_msg(d,CMD_DIGITAL, NULL, 0, NULL, 0); | ||
| 379 | |||
| 380 | if ((d->fe = mt352_attach(&cxusb_mt352_config, &d->i2c_adap)) != NULL) | ||
| 381 | return 0; | ||
| 382 | |||
| 383 | return -EIO; | ||
| 384 | } | ||
| 385 | |||
| 332 | static int cxusb_dee1601_frontend_attach(struct dvb_usb_device *d) | 386 | static int cxusb_dee1601_frontend_attach(struct dvb_usb_device *d) |
| 333 | { | 387 | { |
| 334 | if (usb_set_interface(d->udev,0,0) < 0) | 388 | if (usb_set_interface(d->udev,0,0) < 0) |
| @@ -370,13 +424,17 @@ static int bluebird_patch_dvico_firmware_download(struct usb_device *udev, const | |||
| 370 | static struct dvb_usb_properties cxusb_medion_properties; | 424 | static struct dvb_usb_properties cxusb_medion_properties; |
| 371 | static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties; | 425 | static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties; |
| 372 | static struct dvb_usb_properties cxusb_bluebird_dee1601_properties; | 426 | static struct dvb_usb_properties cxusb_bluebird_dee1601_properties; |
| 427 | static struct dvb_usb_properties cxusb_bluebird_lgz201_properties; | ||
| 428 | static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties; | ||
| 373 | 429 | ||
| 374 | static int cxusb_probe(struct usb_interface *intf, | 430 | static int cxusb_probe(struct usb_interface *intf, |
| 375 | const struct usb_device_id *id) | 431 | const struct usb_device_id *id) |
| 376 | { | 432 | { |
| 377 | if (dvb_usb_device_init(intf,&cxusb_medion_properties,THIS_MODULE,NULL) == 0 || | 433 | if (dvb_usb_device_init(intf,&cxusb_medion_properties,THIS_MODULE,NULL) == 0 || |
| 378 | dvb_usb_device_init(intf,&cxusb_bluebird_lgh064f_properties,THIS_MODULE,NULL) == 0 || | 434 | dvb_usb_device_init(intf,&cxusb_bluebird_lgh064f_properties,THIS_MODULE,NULL) == 0 || |
| 379 | dvb_usb_device_init(intf,&cxusb_bluebird_dee1601_properties,THIS_MODULE,NULL) == 0) { | 435 | dvb_usb_device_init(intf,&cxusb_bluebird_dee1601_properties,THIS_MODULE,NULL) == 0 || |
| 436 | dvb_usb_device_init(intf,&cxusb_bluebird_lgz201_properties,THIS_MODULE,NULL) == 0 || | ||
| 437 | dvb_usb_device_init(intf,&cxusb_bluebird_dtt7579_properties,THIS_MODULE,NULL) == 0) { | ||
| 380 | return 0; | 438 | return 0; |
| 381 | } | 439 | } |
| 382 | 440 | ||
| @@ -389,6 +447,10 @@ static struct usb_device_id cxusb_table [] = { | |||
| 389 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_WARM) }, | 447 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_WARM) }, |
| 390 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DEE1601_COLD) }, | 448 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DEE1601_COLD) }, |
| 391 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DEE1601_WARM) }, | 449 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DEE1601_WARM) }, |
| 450 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_COLD) }, | ||
| 451 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_WARM) }, | ||
| 452 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_COLD) }, | ||
| 453 | { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_WARM) }, | ||
| 392 | {} /* Terminating entry */ | 454 | {} /* Terminating entry */ |
| 393 | }; | 455 | }; |
| 394 | MODULE_DEVICE_TABLE (usb, cxusb_table); | 456 | MODULE_DEVICE_TABLE (usb, cxusb_table); |
| @@ -514,6 +576,86 @@ static struct dvb_usb_properties cxusb_bluebird_dee1601_properties = { | |||
| 514 | } | 576 | } |
| 515 | }; | 577 | }; |
| 516 | 578 | ||
| 579 | static struct dvb_usb_properties cxusb_bluebird_lgz201_properties = { | ||
| 580 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | ||
| 581 | |||
| 582 | .usb_ctrl = DEVICE_SPECIFIC, | ||
| 583 | .firmware = "dvb-usb-bluebird-01.fw", | ||
| 584 | .download_firmware = bluebird_patch_dvico_firmware_download, | ||
| 585 | /* use usb alt setting 0 for EP4 transfer (dvb-t), | ||
| 586 | use usb alt setting 7 for EP2 transfer (atsc) */ | ||
| 587 | |||
| 588 | .size_of_priv = sizeof(struct cxusb_state), | ||
| 589 | |||
| 590 | .streaming_ctrl = cxusb_streaming_ctrl, | ||
| 591 | .power_ctrl = cxusb_power_ctrl, | ||
| 592 | .frontend_attach = cxusb_mt352_frontend_attach, | ||
| 593 | .tuner_attach = cxusb_lgz201_tuner_attach, | ||
| 594 | |||
| 595 | .i2c_algo = &cxusb_i2c_algo, | ||
| 596 | |||
| 597 | .generic_bulk_ctrl_endpoint = 0x01, | ||
| 598 | /* parameter for the MPEG2-data transfer */ | ||
| 599 | .urb = { | ||
| 600 | .type = DVB_USB_BULK, | ||
| 601 | .count = 5, | ||
| 602 | .endpoint = 0x04, | ||
| 603 | .u = { | ||
| 604 | .bulk = { | ||
| 605 | .buffersize = 8192, | ||
| 606 | } | ||
| 607 | } | ||
| 608 | }, | ||
| 609 | |||
| 610 | .num_device_descs = 1, | ||
| 611 | .devices = { | ||
| 612 | { "DViCO FusionHDTV DVB-T USB (LGZ201)", | ||
| 613 | { &cxusb_table[5], NULL }, | ||
| 614 | { &cxusb_table[6], NULL }, | ||
| 615 | }, | ||
| 616 | } | ||
| 617 | }; | ||
| 618 | |||
| 619 | static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties = { | ||
| 620 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | ||
| 621 | |||
| 622 | .usb_ctrl = DEVICE_SPECIFIC, | ||
| 623 | .firmware = "dvb-usb-bluebird-01.fw", | ||
| 624 | .download_firmware = bluebird_patch_dvico_firmware_download, | ||
| 625 | /* use usb alt setting 0 for EP4 transfer (dvb-t), | ||
| 626 | use usb alt setting 7 for EP2 transfer (atsc) */ | ||
| 627 | |||
| 628 | .size_of_priv = sizeof(struct cxusb_state), | ||
| 629 | |||
| 630 | .streaming_ctrl = cxusb_streaming_ctrl, | ||
| 631 | .power_ctrl = cxusb_power_ctrl, | ||
| 632 | .frontend_attach = cxusb_mt352_frontend_attach, | ||
| 633 | .tuner_attach = cxusb_dtt7579_tuner_attach, | ||
| 634 | |||
| 635 | .i2c_algo = &cxusb_i2c_algo, | ||
| 636 | |||
| 637 | .generic_bulk_ctrl_endpoint = 0x01, | ||
| 638 | /* parameter for the MPEG2-data transfer */ | ||
| 639 | .urb = { | ||
| 640 | .type = DVB_USB_BULK, | ||
| 641 | .count = 5, | ||
| 642 | .endpoint = 0x04, | ||
| 643 | .u = { | ||
| 644 | .bulk = { | ||
| 645 | .buffersize = 8192, | ||
| 646 | } | ||
| 647 | } | ||
| 648 | }, | ||
| 649 | |||
| 650 | .num_device_descs = 1, | ||
| 651 | .devices = { | ||
| 652 | { "DViCO FusionHDTV DVB-T USB (TH7579)", | ||
| 653 | { &cxusb_table[7], NULL }, | ||
| 654 | { &cxusb_table[8], NULL }, | ||
| 655 | }, | ||
| 656 | } | ||
| 657 | }; | ||
| 658 | |||
| 517 | static struct usb_driver cxusb_driver = { | 659 | static struct usb_driver cxusb_driver = { |
| 518 | .name = "dvb_usb_cxusb", | 660 | .name = "dvb_usb_cxusb", |
| 519 | .probe = cxusb_probe, | 661 | .probe = cxusb_probe, |
