]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Revert "PCI: brcmstb: Do not turn off WOL regulators on suspend"
authorBjorn Helgaas <bhelgaas@google.com>
Wed, 11 May 2022 20:18:53 +0000 (15:18 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 31 May 2022 20:06:19 +0000 (15:06 -0500)
This reverts commit 9124fa69a5c5c0b0b5046621519b8227988913a6.

This is part of a revert of the following commits:

  9124fa69a5c5 ("PCI: brcmstb: Do not turn off WOL regulators on suspend")
  7392030db6aa ("PCI: brcmstb: Add control of subdevice voltage regulators")
  145289ca7118 ("PCI: brcmstb: Add mechanism to turn on subdev regulators")
  39cc3722e3d4 ("PCI: brcmstb: Split brcm_pcie_setup() into two funcs")

Cyril reported that 39cc3722e3d4 ("PCI: brcmstb: Split brcm_pcie_setup()
into two funcs"), which appeared in v5.17-rc1, broke booting on the
Raspberry Pi Compute Module 4.  Apparently 39cc3722e3d4 panics with an
Asynchronous SError Interrupt, and after further commits here is a black
screen on HDMI and no output on the serial console.

This does not seem to affect the Raspberry Pi 4 B.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=215925
Link: https://lore.kernel.org/r/20220511201856.808690-2-helgaas@kernel.org
Reported-by: Cyril Brulebois <kibi@debian.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/controller/pcie-brcmstb.c

index 375c0c40bbf8de34a26b0f0feecf6ad24da885f4..3edd63735948009706d46e0eb0d27c8fa19457fd 100644 (file)
@@ -333,7 +333,6 @@ struct brcm_pcie {
        void                    (*bridge_sw_init_set)(struct brcm_pcie *pcie, u32 val);
        bool                    refusal_mode;
        struct subdev_regulators *sr;
-       bool                    ep_wakeup_capable;
 };
 
 static inline bool is_bmips(const struct brcm_pcie *pcie)
@@ -1351,21 +1350,9 @@ static void brcm_pcie_turn_off(struct brcm_pcie *pcie)
        pcie->bridge_sw_init_set(pcie, 1);
 }
 
-static int pci_dev_may_wakeup(struct pci_dev *dev, void *data)
-{
-       bool *ret = data;
-
-       if (device_may_wakeup(&dev->dev)) {
-               *ret = true;
-               dev_info(&dev->dev, "disable cancelled for wake-up device\n");
-       }
-       return (int) *ret;
-}
-
 static int brcm_pcie_suspend(struct device *dev)
 {
        struct brcm_pcie *pcie = dev_get_drvdata(dev);
-       struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
        int ret;
 
        brcm_pcie_turn_off(pcie);
@@ -1384,22 +1371,11 @@ static int brcm_pcie_suspend(struct device *dev)
        }
 
        if (pcie->sr) {
-               /*
-                * Now turn off the regulators, but if at least one
-                * downstream device is enabled as a wake-up source, do not
-                * turn off regulators.
-                */
-               pcie->ep_wakeup_capable = false;
-               pci_walk_bus(bridge->bus, pci_dev_may_wakeup,
-                            &pcie->ep_wakeup_capable);
-               if (!pcie->ep_wakeup_capable) {
-                       ret = regulator_bulk_disable(pcie->sr->num_supplies,
-                                                    pcie->sr->supplies);
-                       if (ret) {
-                               dev_err(dev, "Could not turn off regulators\n");
-                               reset_control_reset(pcie->rescal);
-                               return ret;
-                       }
+               ret = regulator_bulk_disable(pcie->sr->num_supplies, pcie->sr->supplies);
+               if (ret) {
+                       dev_err(dev, "Could not turn off regulators\n");
+                       reset_control_reset(pcie->rescal);
+                       return ret;
                }
        }
        clk_disable_unprepare(pcie->clk);
@@ -1420,21 +1396,10 @@ static int brcm_pcie_resume(struct device *dev)
                return ret;
 
        if (pcie->sr) {
-               if (pcie->ep_wakeup_capable) {
-                       /*
-                        * We are resuming from a suspend.  In the suspend we
-                        * did not disable the power supplies, so there is
-                        * no need to enable them (and falsely increase their
-                        * usage count).
-                        */
-                       pcie->ep_wakeup_capable = false;
-               } else {
-                       ret = regulator_bulk_enable(pcie->sr->num_supplies,
-                                                   pcie->sr->supplies);
-                       if (ret) {
-                               dev_err(dev, "Could not turn on regulators\n");
-                               goto err_disable_clk;
-                       }
+               ret = regulator_bulk_enable(pcie->sr->num_supplies, pcie->sr->supplies);
+               if (ret) {
+                       dev_err(dev, "Could not turn on regulators\n");
+                       goto err_disable_clk;
                }
        }