mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
add the MSI support to tbsci and tbsmod
This commit is contained in:
@@ -29,6 +29,10 @@
|
||||
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
|
||||
struct workqueue_struct *wq;
|
||||
|
||||
static bool enable_msi = true;
|
||||
module_param(enable_msi, bool, 0444);
|
||||
MODULE_PARM_DESC(enable_msi, "use an msi interrupt if available");
|
||||
|
||||
static int write_block_cell = 64;
|
||||
module_param(write_block_cell, int, 0444);
|
||||
MODULE_PARM_DESC(
|
||||
@@ -1038,6 +1042,10 @@ static void tbsci_remove(struct pci_dev *pdev)
|
||||
|
||||
/* disable interrupts */
|
||||
free_irq(dev->pdev->irq, dev);
|
||||
if (dev->msi) {
|
||||
pci_disable_msi(pdev);
|
||||
dev->msi = false;
|
||||
}
|
||||
|
||||
if (dev->mmio)
|
||||
iounmap(dev->mmio);
|
||||
@@ -1047,6 +1055,38 @@ static void tbsci_remove(struct pci_dev *pdev)
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
}
|
||||
|
||||
static bool tbsci_enable_msi(struct pci_dev *pdev, struct tbs_pcie_dev *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!enable_msi) {
|
||||
dev_warn(&dev->pdev->dev,
|
||||
"MSI disabled by module parameter 'enable_msi'\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
err = pci_enable_msi(pdev);
|
||||
if (err) {
|
||||
dev_err(&dev->pdev->dev,
|
||||
"Failed to enable MSI interrupt."
|
||||
" Falling back to a shared IRQ\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
/* no error - so request an msi interrupt */
|
||||
err = request_irq(pdev->irq, tbsci_irq, 0,
|
||||
KBUILD_MODNAME, dev);
|
||||
if (err) {
|
||||
/* fall back to legacy interrupt */
|
||||
dev_err(&dev->pdev->dev,
|
||||
"Failed to get an MSI interrupt."
|
||||
" Falling back to a shared IRQ\n");
|
||||
pci_disable_msi(pdev);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static int tbsci_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *pci_id)
|
||||
@@ -1091,19 +1131,30 @@ static int tbsci_probe(struct pci_dev *pdev,
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
ret = request_irq(dev->pdev->irq, tbsci_irq, IRQF_SHARED,
|
||||
KBUILD_MODNAME, (void *)dev);
|
||||
if (ret < 0) {
|
||||
printk("%s ERROR: IRQ registration failed <%d>\n", __func__,
|
||||
ret);
|
||||
ret = -ENODEV;
|
||||
goto fail3;
|
||||
//interrupts
|
||||
if (tbsci_enable_msi(pdev, dev)) {
|
||||
printk("KBUILD_MODNAME : %s --MSI!\n",KBUILD_MODNAME);
|
||||
dev->msi = true;
|
||||
} else {
|
||||
printk("KBUILD_MODNAME : %s --INTx\n\n",KBUILD_MODNAME);
|
||||
ret = request_irq(pdev->irq, tbsci_irq,
|
||||
IRQF_SHARED, KBUILD_MODNAME, dev);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "%s ERROR: IRQ registration failed <%d>\n", __func__, ret);
|
||||
ret = -ENODEV;
|
||||
goto fail3;
|
||||
}
|
||||
dev->msi = false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
fail3:
|
||||
free_irq(dev->pdev->irq, dev);
|
||||
if (dev->msi) {
|
||||
pci_disable_msi(pdev);
|
||||
dev->msi = false;
|
||||
}
|
||||
if (dev->mmio)
|
||||
iounmap(dev->mmio);
|
||||
fail2:
|
||||
|
@@ -71,6 +71,7 @@ struct tbs_pcie_dev {
|
||||
void __iomem *mmio;
|
||||
struct dvb_adapter adapter;
|
||||
struct ca_channel channnel[CHANNELS];
|
||||
bool msi;
|
||||
};
|
||||
|
||||
|
||||
|
@@ -523,7 +523,7 @@ struct tbsecp3_board tbsecp3_boards[] = {
|
||||
},
|
||||
[TBSECP3_BOARD_TBS6302T] = {
|
||||
.board_id = TBSECP3_BOARD_TBS6302T,
|
||||
.name = "TurboSight TBS 6302T HDMI Capture ",
|
||||
.name = "TurboSight TBS 6302X HDMI Capture ",
|
||||
.adapters = 2,
|
||||
.i2c_speed = 39,
|
||||
.eeprom_i2c = 1,
|
||||
|
@@ -24,6 +24,10 @@
|
||||
#define BOOL bool
|
||||
#define PIKOTV_MBKB_THRESHOLD 210 /* PikoTV */
|
||||
|
||||
static bool enable_msi = true;
|
||||
module_param(enable_msi, bool, 0444);
|
||||
MODULE_PARM_DESC(enable_msi, "use an msi interrupt if available");
|
||||
|
||||
static void spi_ad9789Enable(struct tbs_pcie_dev *dev, int Data)
|
||||
{
|
||||
unsigned char tmpbuf[4];
|
||||
@@ -3123,6 +3127,10 @@ static void tbsmod_remove(struct pci_dev *pdev)
|
||||
|
||||
/* disable interrupts */
|
||||
free_irq(dev->pdev->irq, dev);
|
||||
if (dev->msi) {
|
||||
pci_disable_msi(pdev);
|
||||
dev->msi = false;
|
||||
}
|
||||
|
||||
if (dev->mmio)
|
||||
iounmap(dev->mmio);
|
||||
@@ -3132,6 +3140,38 @@ static void tbsmod_remove(struct pci_dev *pdev)
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
}
|
||||
|
||||
static bool tbsmod_enable_msi(struct pci_dev *pdev, struct tbs_pcie_dev *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!enable_msi) {
|
||||
dev_warn(&dev->pdev->dev,
|
||||
"MSI disabled by module parameter 'enable_msi'\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
err = pci_enable_msi(pdev);
|
||||
if (err) {
|
||||
dev_err(&dev->pdev->dev,
|
||||
"Failed to enable MSI interrupt."
|
||||
" Falling back to a shared IRQ\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
/* no error - so request an msi interrupt */
|
||||
err = request_irq(pdev->irq, tbsmod_irq, 0,
|
||||
KBUILD_MODNAME, dev);
|
||||
if (err) {
|
||||
/* fall back to legacy interrupt */
|
||||
dev_err(&dev->pdev->dev,
|
||||
"Failed to get an MSI interrupt."
|
||||
" Falling back to a shared IRQ\n");
|
||||
pci_disable_msi(pdev);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static int tbsmod_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *pci_id)
|
||||
{
|
||||
@@ -3168,12 +3208,20 @@ static int tbsmod_probe(struct pci_dev *pdev,
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
ret = request_irq(dev->pdev->irq, tbsmod_irq, IRQF_SHARED, KBUILD_MODNAME, (void *)dev);
|
||||
if (ret < 0)
|
||||
{
|
||||
printk(KERN_ERR "%s ERROR: IRQ registration failed <%d>\n", __func__, ret);
|
||||
ret = -ENODEV;
|
||||
goto fail2;
|
||||
//interrupts
|
||||
if (tbsmod_enable_msi(pdev, dev)) {
|
||||
printk("KBUILD_MODNAME : %s --MSI!\n",KBUILD_MODNAME);
|
||||
dev->msi = true;
|
||||
} else {
|
||||
printk("KBUILD_MODNAME : %s --INTx\n\n",KBUILD_MODNAME);
|
||||
ret = request_irq(pdev->irq, tbsmod_irq,
|
||||
IRQF_SHARED, KBUILD_MODNAME, dev);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "%s ERROR: IRQ registration failed <%d>\n", __func__, ret);
|
||||
ret = -ENODEV;
|
||||
goto fail2;
|
||||
}
|
||||
dev->msi = false;
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
@@ -3322,6 +3370,10 @@ static int tbsmod_probe(struct pci_dev *pdev,
|
||||
|
||||
fail3:
|
||||
free_irq(dev->pdev->irq, dev);
|
||||
if (dev->msi) {
|
||||
pci_disable_msi(pdev);
|
||||
dev->msi = false;
|
||||
}
|
||||
if (dev->mmio)
|
||||
iounmap(dev->mmio);
|
||||
fail2:
|
||||
|
@@ -45,6 +45,7 @@ struct tbs_pcie_dev {
|
||||
u8 mods_num;
|
||||
|
||||
u8 bw; //dvbt
|
||||
bool msi;
|
||||
|
||||
|
||||
};
|
||||
|
Reference in New Issue
Block a user