Commit 6bf0f051 authored by Daniel Scheller's avatar Daniel Scheller Committed by Mauro Carvalho Chehab

media: ddbridge: request/free_irq using pci_irq_vector, enable MSI-X

Instead of trying to manage IRQ numbers on itself, utilise the
pci_irq_vector() function to do this, which will take care of correct IRQ
numbering for MSI and non-MSI IRQs. While at it, request and enable MSI-X
interrupts for hardware (boards and cards) that support this.

Picked up from the upstream dddvb-0.9.33 release.
Signed-off-by: default avatarDaniel Scheller <d.scheller@gmx.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 95c2ab9e
...@@ -77,8 +77,8 @@ static void ddb_irq_exit(struct ddb *dev) ...@@ -77,8 +77,8 @@ static void ddb_irq_exit(struct ddb *dev)
{ {
ddb_irq_disable(dev); ddb_irq_disable(dev);
if (dev->msi == 2) if (dev->msi == 2)
free_irq(dev->pdev->irq + 1, dev); free_irq(pci_irq_vector(dev->pdev, 1), dev);
free_irq(dev->pdev->irq, dev); free_irq(pci_irq_vector(dev->pdev, 0), dev);
} }
static void ddb_remove(struct pci_dev *pdev) static void ddb_remove(struct pci_dev *pdev)
...@@ -105,7 +105,8 @@ static void ddb_irq_msi(struct ddb *dev, int nr) ...@@ -105,7 +105,8 @@ static void ddb_irq_msi(struct ddb *dev, int nr)
int stat; int stat;
if (msi && pci_msi_enabled()) { if (msi && pci_msi_enabled()) {
stat = pci_alloc_irq_vectors(dev->pdev, 1, nr, PCI_IRQ_MSI); stat = pci_alloc_irq_vectors(dev->pdev, 1, nr,
PCI_IRQ_MSI | PCI_IRQ_MSIX);
if (stat >= 1) { if (stat >= 1) {
dev->msi = stat; dev->msi = stat;
dev_info(dev->dev, "using %d MSI interrupt(s)\n", dev_info(dev->dev, "using %d MSI interrupt(s)\n",
...@@ -137,21 +138,24 @@ static int ddb_irq_init(struct ddb *dev) ...@@ -137,21 +138,24 @@ static int ddb_irq_init(struct ddb *dev)
if (dev->msi) if (dev->msi)
irq_flag = 0; irq_flag = 0;
if (dev->msi == 2) { if (dev->msi == 2) {
stat = request_irq(dev->pdev->irq, ddb_irq_handler0, stat = request_irq(pci_irq_vector(dev->pdev, 0),
irq_flag, "ddbridge", (void *)dev); ddb_irq_handler0, irq_flag, "ddbridge",
(void *)dev);
if (stat < 0) if (stat < 0)
return stat; return stat;
stat = request_irq(dev->pdev->irq + 1, ddb_irq_handler1, stat = request_irq(pci_irq_vector(dev->pdev, 1),
irq_flag, "ddbridge", (void *)dev); ddb_irq_handler1, irq_flag, "ddbridge",
(void *)dev);
if (stat < 0) { if (stat < 0) {
free_irq(dev->pdev->irq, dev); free_irq(pci_irq_vector(dev->pdev, 0), dev);
return stat; return stat;
} }
} else } else
#endif #endif
{ {
stat = request_irq(dev->pdev->irq, ddb_irq_handler, stat = request_irq(pci_irq_vector(dev->pdev, 0),
irq_flag, "ddbridge", (void *)dev); ddb_irq_handler, irq_flag, "ddbridge",
(void *)dev);
if (stat < 0) if (stat < 0)
return stat; return stat;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment