PCI: qcom-ep: Disable IRQs during driver remove
authorManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Wed, 14 Sep 2022 07:53:42 +0000 (13:23 +0530)
committerLorenzo Pieralisi <lpieralisi@kernel.org>
Wed, 5 Oct 2022 14:17:27 +0000 (16:17 +0200)
Disable the Global and PERST IRQs during driver remove to avoid getting
spurious IRQs after resource deallocation.

Link: https://lore.kernel.org/r/20220914075350.7992-5-manivannan.sadhasivam@linaro.org
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
drivers/pci/controller/dwc/pcie-qcom-ep.c

index 51afd9c..d7a8dd0 100644 (file)
@@ -581,13 +581,13 @@ static irqreturn_t qcom_pcie_ep_perst_irq_thread(int irq, void *data)
 static int qcom_pcie_ep_enable_irq_resources(struct platform_device *pdev,
                                             struct qcom_pcie_ep *pcie_ep)
 {
-       int irq, ret;
+       int ret;
 
-       irq = platform_get_irq_byname(pdev, "global");
-       if (irq < 0)
-               return irq;
+       pcie_ep->global_irq = platform_get_irq_byname(pdev, "global");
+       if (pcie_ep->global_irq < 0)
+               return pcie_ep->global_irq;
 
-       ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
+       ret = devm_request_threaded_irq(&pdev->dev, pcie_ep->global_irq, NULL,
                                        qcom_pcie_ep_global_irq_thread,
                                        IRQF_ONESHOT,
                                        "global_irq", pcie_ep);
@@ -604,7 +604,7 @@ static int qcom_pcie_ep_enable_irq_resources(struct platform_device *pdev,
                                        "perst_irq", pcie_ep);
        if (ret) {
                dev_err(&pdev->dev, "Failed to request PERST IRQ\n");
-               disable_irq(irq);
+               disable_irq(pcie_ep->global_irq);
                return ret;
        }
 
@@ -702,6 +702,9 @@ static int qcom_pcie_ep_remove(struct platform_device *pdev)
 {
        struct qcom_pcie_ep *pcie_ep = platform_get_drvdata(pdev);
 
+       disable_irq(pcie_ep->global_irq);
+       disable_irq(pcie_ep->perst_irq);
+
        if (pcie_ep->link_status == QCOM_PCIE_EP_LINK_DISABLED)
                return 0;