]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: starfive: Enable controller runtime PM before probing host bridge
authorMayank Rana <quic_mrana@quicinc.com>
Mon, 11 Nov 2024 08:41:52 +0000 (14:11 +0530)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 13 Nov 2024 21:08:14 +0000 (15:08 -0600)
A PCI controller device, e.g., StarFive, is parent to PCI host bridge
device. We must enable runtime PM of the controller before enabling runtime
PM of the host bridge, which will happen in pci_host_probe(), to avoid this
warning:

  pcie-starfive 940000000.pcie: Enabling runtime PM for inactive device with active children

Fix this issue by enabling StarFive controller device's runtime PM before
calling pci_host_probe() in plda_pcie_host_init().

Link: https://lore.kernel.org/r/20241111-runtime_pm-v7-1-9c164eefcd87@quicinc.com
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Mayank Rana <quic_mrana@quicinc.com>
[bhelgaas: commit log]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
drivers/pci/controller/plda/pcie-starfive.c

index c9933ecf68338207e006407130c3a4d039db4465..0564fdce47c2a3de8b0bf33d165970530698f24f 100644 (file)
@@ -404,6 +404,9 @@ static int starfive_pcie_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       pm_runtime_enable(&pdev->dev);
+       pm_runtime_get_sync(&pdev->dev);
+
        plda->host_ops = &sf_host_ops;
        plda->num_events = PLDA_MAX_EVENT_NUM;
        /* mask doorbell event */
@@ -413,11 +416,12 @@ static int starfive_pcie_probe(struct platform_device *pdev)
        plda->events_bitmap <<= PLDA_NUM_DMA_EVENTS;
        ret = plda_pcie_host_init(&pcie->plda, &starfive_pcie_ops,
                                  &stf_pcie_event);
-       if (ret)
+       if (ret) {
+               pm_runtime_put_sync(&pdev->dev);
+               pm_runtime_disable(&pdev->dev);
                return ret;
+       }
 
-       pm_runtime_enable(&pdev->dev);
-       pm_runtime_get_sync(&pdev->dev);
        platform_set_drvdata(pdev, pcie);
 
        return 0;