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: Daniel Scheller <d.scheller@gmx.net> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
95c2ab9e21
commit
6bf0f0512a
|
@ -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)
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue