dmaengine: qcom_hidma: Cleanup MSI handling
There is no reason to walk the MSI descriptors to retrieve the interrupt number for a device. Use msi_get_virq() instead. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Acked-by: Sinan Kaya <okaya@kernel.org> Acked-by: Vinod Koul <vkoul@kernel.org> Link: https://lore.kernel.org/r/20211210221815.329792721@linutronix.de
This commit is contained in:
parent
89e0032ec2
commit
1900c962e2
@ -678,11 +678,13 @@ static void hidma_free_msis(struct hidma_dev *dmadev)
|
||||
{
|
||||
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
|
||||
struct device *dev = dmadev->ddev.dev;
|
||||
struct msi_desc *desc;
|
||||
int i, virq;
|
||||
|
||||
/* free allocated MSI interrupts above */
|
||||
for_each_msi_entry(desc, dev)
|
||||
devm_free_irq(dev, desc->irq, &dmadev->lldev);
|
||||
for (i = 0; i < HIDMA_MSI_INTS; i++) {
|
||||
virq = msi_get_virq(dev, i);
|
||||
if (virq)
|
||||
devm_free_irq(dev, virq, &dmadev->lldev);
|
||||
}
|
||||
|
||||
platform_msi_domain_free_irqs(dev);
|
||||
#endif
|
||||
@ -692,45 +694,37 @@ static int hidma_request_msi(struct hidma_dev *dmadev,
|
||||
struct platform_device *pdev)
|
||||
{
|
||||
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
|
||||
int rc;
|
||||
struct msi_desc *desc;
|
||||
struct msi_desc *failed_desc = NULL;
|
||||
int rc, i, virq;
|
||||
|
||||
rc = platform_msi_domain_alloc_irqs(&pdev->dev, HIDMA_MSI_INTS,
|
||||
hidma_write_msi_msg);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
for_each_msi_entry(desc, &pdev->dev) {
|
||||
if (!desc->msi_index)
|
||||
dmadev->msi_virqbase = desc->irq;
|
||||
|
||||
rc = devm_request_irq(&pdev->dev, desc->irq,
|
||||
for (i = 0; i < HIDMA_MSI_INTS; i++) {
|
||||
virq = msi_get_virq(&pdev->dev, i);
|
||||
rc = devm_request_irq(&pdev->dev, virq,
|
||||
hidma_chirq_handler_msi,
|
||||
0, "qcom-hidma-msi",
|
||||
&dmadev->lldev);
|
||||
if (rc) {
|
||||
failed_desc = desc;
|
||||
if (rc)
|
||||
break;
|
||||
}
|
||||
if (!i)
|
||||
dmadev->msi_virqbase = virq;
|
||||
}
|
||||
|
||||
if (rc) {
|
||||
/* free allocated MSI interrupts above */
|
||||
for_each_msi_entry(desc, &pdev->dev) {
|
||||
if (desc == failed_desc)
|
||||
break;
|
||||
devm_free_irq(&pdev->dev, desc->irq,
|
||||
&dmadev->lldev);
|
||||
for (--i; i >= 0; i--) {
|
||||
virq = msi_get_virq(&pdev->dev, i);
|
||||
devm_free_irq(&pdev->dev, virq, &dmadev->lldev);
|
||||
}
|
||||
dev_warn(&pdev->dev,
|
||||
"failed to request MSI irq, falling back to wired IRQ\n");
|
||||
} else {
|
||||
/* Add callback to free MSIs on teardown */
|
||||
hidma_ll_setup_irq(dmadev->lldev, true);
|
||||
|
||||
}
|
||||
if (rc)
|
||||
dev_warn(&pdev->dev,
|
||||
"failed to request MSI irq, falling back to wired IRQ\n");
|
||||
return rc;
|
||||
#else
|
||||
return -EINVAL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user