Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

V4L/DVB (11984): Add support for yet another SDMC DM1105 based DVB-S card.

Add support for SDMC DM1105 based DVB-S cards with PCI ID 195d:1105
Also create separate workqueue for demuxing.

Signed-off-by: Igor M. Liplianin <liplianin@me.by>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Igor M. Liplianin and committed by
Mauro Carvalho Chehab
519a4bdc 1dac77c9

+88 -49
+88 -49
drivers/media/dvb/dm1105/dm1105.c
··· 51 51 #ifndef PCI_VENDOR_ID_TRIGEM 52 52 #define PCI_VENDOR_ID_TRIGEM 0x109f 53 53 #endif 54 + #ifndef PCI_VENDOR_ID_AXESS 55 + #define PCI_VENDOR_ID_AXESS 0x195d 56 + #endif 54 57 #ifndef PCI_DEVICE_ID_DM1105 55 58 #define PCI_DEVICE_ID_DM1105 0x036f 56 59 #endif ··· 62 59 #endif 63 60 #ifndef PCI_DEVICE_ID_DW2004 64 61 #define PCI_DEVICE_ID_DW2004 0x2004 62 + #endif 63 + #ifndef PCI_DEVICE_ID_DM05 64 + #define PCI_DEVICE_ID_DM05 0x1105 65 65 #endif 66 66 /* ----------------------------------------------- */ 67 67 /* sdmc dm1105 registers */ ··· 156 150 #define DM1105_LNB_13V 0x00010100 157 151 #define DM1105_LNB_18V 0x00000100 158 152 153 + /* GPIO's for LNB power control for Axess DM05 */ 154 + #define DM05_LNB_MASK 0x00000000 155 + #define DM05_LNB_13V 0x00020000 156 + #define DM05_LNB_18V 0x00030000 157 + 159 158 static int ir_debug; 160 159 module_param(ir_debug, int, 0644); 161 160 MODULE_PARM_DESC(ir_debug, "enable debugging information for IR decoding"); ··· 199 188 200 189 /* irq */ 201 190 struct work_struct work; 191 + struct workqueue_struct *wq; 192 + char wqn[16]; 202 193 203 194 /* dma */ 204 195 dma_addr_t dma_addr; ··· 326 313 static int dm1105dvb_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) 327 314 { 328 315 struct dm1105dvb *dm1105dvb = frontend_to_dm1105dvb(fe); 316 + u32 lnb_mask, lnb_13v, lnb_18v; 329 317 330 - if (voltage == SEC_VOLTAGE_18) { 331 - outl(DM1105_LNB_MASK, dm_io_mem(DM1105_GPIOCTR)); 332 - outl(DM1105_LNB_18V, dm_io_mem(DM1105_GPIOVAL)); 333 - } else { 334 - /*LNB ON-13V by default!*/ 335 - outl(DM1105_LNB_MASK, dm_io_mem(DM1105_GPIOCTR)); 336 - outl(DM1105_LNB_13V, dm_io_mem(DM1105_GPIOVAL)); 337 - } 318 + switch (dm1105dvb->pdev->subsystem_device) { 319 + case PCI_DEVICE_ID_DM05: 320 + lnb_mask = DM05_LNB_MASK; 321 + lnb_13v = DM05_LNB_13V; 322 + lnb_18v = DM05_LNB_18V; 323 + break; 324 + default: 325 + lnb_mask = DM1105_LNB_MASK; 326 + lnb_13v = DM1105_LNB_13V; 327 + lnb_18v = DM1105_LNB_18V; 328 + } 329 + 330 + outl(lnb_mask, dm_io_mem(DM1105_GPIOCTR)); 331 + if (voltage == SEC_VOLTAGE_18) 332 + outl(lnb_18v , dm_io_mem(DM1105_GPIOVAL)); 333 + else 334 + outl(lnb_13v, dm_io_mem(DM1105_GPIOVAL)); 338 335 339 336 return 0; 340 337 } ··· 463 440 case (INTSTS_TSIRQ | INTSTS_IR): 464 441 dm1105dvb->nextwrp = inl(dm_io_mem(DM1105_WRP)) - 465 442 inl(dm_io_mem(DM1105_STADR)); 466 - schedule_work(&dm1105dvb->work); 443 + queue_work(dm1105dvb->wq, &dm1105dvb->work); 467 444 break; 468 445 case INTSTS_IR: 469 446 dm1105dvb->ir.ir_command = inl(dm_io_mem(DM1105_IRCODE)); ··· 590 567 int ret; 591 568 592 569 switch (dm1105dvb->pdev->subsystem_device) { 593 - case PCI_DEVICE_ID_DW2002: 594 - dm1105dvb->fe = dvb_attach( 595 - stv0299_attach, &sharp_z0194a_config, 596 - &dm1105dvb->i2c_adap); 597 - 598 - if (dm1105dvb->fe) { 599 - dm1105dvb->fe->ops.set_voltage = 600 - dm1105dvb_set_voltage; 601 - dvb_attach(dvb_pll_attach, dm1105dvb->fe, 0x60, 602 - &dm1105dvb->i2c_adap, DVB_PLL_OPERA1); 603 - } 604 - 605 - if (!dm1105dvb->fe) { 606 - dm1105dvb->fe = dvb_attach( 607 - stv0288_attach, &earda_config, 608 - &dm1105dvb->i2c_adap); 609 - if (dm1105dvb->fe) { 610 - dm1105dvb->fe->ops.set_voltage = 611 - dm1105dvb_set_voltage; 612 - dvb_attach(stb6000_attach, dm1105dvb->fe, 0x61, 613 - &dm1105dvb->i2c_adap); 614 - } 615 - } 616 - 617 - if (!dm1105dvb->fe) { 618 - dm1105dvb->fe = dvb_attach( 619 - si21xx_attach, &serit_config, 620 - &dm1105dvb->i2c_adap); 621 - if (dm1105dvb->fe) 622 - dm1105dvb->fe->ops.set_voltage = 623 - dm1105dvb_set_voltage; 624 - } 625 - break; 626 570 case PCI_DEVICE_ID_DW2004: 627 571 dm1105dvb->fe = dvb_attach( 628 572 cx24116_attach, &serit_sp2633_config, 629 573 &dm1105dvb->i2c_adap); 630 574 if (dm1105dvb->fe) 631 575 dm1105dvb->fe->ops.set_voltage = dm1105dvb_set_voltage; 576 + 632 577 break; 578 + default: 579 + dm1105dvb->fe = dvb_attach( 580 + stv0299_attach, &sharp_z0194a_config, 581 + &dm1105dvb->i2c_adap); 582 + if (dm1105dvb->fe) { 583 + dm1105dvb->fe->ops.set_voltage = 584 + dm1105dvb_set_voltage; 585 + dvb_attach(dvb_pll_attach, dm1105dvb->fe, 0x60, 586 + &dm1105dvb->i2c_adap, DVB_PLL_OPERA1); 587 + break; 588 + } 589 + 590 + dm1105dvb->fe = dvb_attach( 591 + stv0288_attach, &earda_config, 592 + &dm1105dvb->i2c_adap); 593 + if (dm1105dvb->fe) { 594 + dm1105dvb->fe->ops.set_voltage = 595 + dm1105dvb_set_voltage; 596 + dvb_attach(stb6000_attach, dm1105dvb->fe, 0x61, 597 + &dm1105dvb->i2c_adap); 598 + break; 599 + } 600 + 601 + dm1105dvb->fe = dvb_attach( 602 + si21xx_attach, &serit_config, 603 + &dm1105dvb->i2c_adap); 604 + if (dm1105dvb->fe) 605 + dm1105dvb->fe->ops.set_voltage = 606 + dm1105dvb_set_voltage; 607 + 633 608 } 634 609 635 610 if (!dm1105dvb->fe) { ··· 651 630 static u8 command[1] = { 0x28 }; 652 631 653 632 struct i2c_msg msg[] = { 654 - { .addr = IIC_24C01_addr >> 1, .flags = 0, 655 - .buf = command, .len = 1 }, 656 - { .addr = IIC_24C01_addr >> 1, .flags = I2C_M_RD, 657 - .buf = mac, .len = 6 }, 633 + { 634 + .addr = IIC_24C01_addr >> 1, 635 + .flags = 0, 636 + .buf = command, 637 + .len = 1 638 + }, { 639 + .addr = IIC_24C01_addr >> 1, 640 + .flags = I2C_M_RD, 641 + .buf = mac, 642 + .len = 6 643 + }, 658 644 }; 659 645 660 646 dm1105_i2c_xfer(&dm1105dvb->i2c_adap, msg , 2); ··· 780 752 dm1105_ir_init(dm1105dvb); 781 753 782 754 INIT_WORK(&dm1105dvb->work, dm1105_dmx_buffer); 755 + sprintf(dm1105dvb->wqn, "%s/%d", dvb_adapter->name, dvb_adapter->num); 756 + dm1105dvb->wq = create_singlethread_workqueue(dm1105dvb->wqn); 757 + if (!dm1105dvb->wq) 758 + goto err_dvb_net; 783 759 784 760 ret = request_irq(pdev->irq, dm1105dvb_irq, IRQF_SHARED, 785 761 DRIVER_NAME, dm1105dvb); 786 762 if (ret < 0) 787 - goto err_free_irq; 763 + goto err_workqueue; 788 764 789 765 return 0; 790 766 767 + err_workqueue: 768 + destroy_workqueue(dm1105dvb->wq); 769 + err_dvb_net: 770 + dvb_net_release(&dm1105dvb->dvbnet); 791 771 err_disconnect_frontend: 792 772 dmx->disconnect_frontend(dmx); 793 773 err_remove_mem_frontend: ··· 812 776 i2c_del_adapter(&dm1105dvb->i2c_adap); 813 777 err_dm1105dvb_hw_exit: 814 778 dm1105dvb_hw_exit(dm1105dvb); 815 - err_free_irq: 816 - free_irq(pdev->irq, dm1105dvb); 817 779 err_pci_iounmap: 818 780 pci_iounmap(pdev, dm1105dvb->io_mem); 819 781 err_pci_release_regions: ··· 867 833 .device = PCI_DEVICE_ID_DM1105, 868 834 .subvendor = PCI_ANY_ID, 869 835 .subdevice = PCI_DEVICE_ID_DW2004, 836 + }, { 837 + .vendor = PCI_VENDOR_ID_AXESS, 838 + .device = PCI_DEVICE_ID_DM05, 839 + .subvendor = PCI_VENDOR_ID_AXESS, 840 + .subdevice = PCI_DEVICE_ID_DM05, 870 841 }, { 871 842 /* empty */ 872 843 },