lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 279/339] Revert "PCI: brcmstb: Add control of subdevice voltage regulators"
    Date
    From: Bjorn Helgaas <bhelgaas@google.com>

    [ Upstream commit 212942609d83b591f5a2f2691df122d13aa3a87d ]

    This reverts commit 93e41f3fca3d4a0f927b784012338c37f80a8a80.

    This is part of a revert of the following commits:

    11ed8b8624b8 ("PCI: brcmstb: Do not turn off WOL regulators on suspend")
    93e41f3fca3d ("PCI: brcmstb: Add control of subdevice voltage regulators")
    67211aadcb4b ("PCI: brcmstb: Add mechanism to turn on subdev regulators")
    830aa6f29f07 ("PCI: brcmstb: Split brcm_pcie_setup() into two funcs")

    Cyril reported that 830aa6f29f07 ("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 830aa6f29f07 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-3-helgaas@kernel.org
    Reported-by: Cyril Brulebois <kibi@debian.org>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pci/controller/pcie-brcmstb.c | 83 ++-------------------------
    1 file changed, 5 insertions(+), 78 deletions(-)

    diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c
    index 3edd63735948..fd464d38fecb 100644
    --- a/drivers/pci/controller/pcie-brcmstb.c
    +++ b/drivers/pci/controller/pcie-brcmstb.c
    @@ -196,8 +196,6 @@ static inline void brcm_pcie_bridge_sw_init_set_generic(struct brcm_pcie *pcie,
    static inline void brcm_pcie_perst_set_4908(struct brcm_pcie *pcie, u32 val);
    static inline void brcm_pcie_perst_set_7278(struct brcm_pcie *pcie, u32 val);
    static inline void brcm_pcie_perst_set_generic(struct brcm_pcie *pcie, u32 val);
    -static int brcm_pcie_linkup(struct brcm_pcie *pcie);
    -static int brcm_pcie_add_bus(struct pci_bus *bus);

    enum {
    RGR1_SW_INIT_1,
    @@ -331,8 +329,6 @@ struct brcm_pcie {
    u32 hw_rev;
    void (*perst_set)(struct brcm_pcie *pcie, u32 val);
    void (*bridge_sw_init_set)(struct brcm_pcie *pcie, u32 val);
    - bool refusal_mode;
    - struct subdev_regulators *sr;
    };

    static inline bool is_bmips(const struct brcm_pcie *pcie)
    @@ -501,34 +497,6 @@ static int pci_subdev_regulators_add_bus(struct pci_bus *bus)
    return 0;
    }

    -static int brcm_pcie_add_bus(struct pci_bus *bus)
    -{
    - struct device *dev = &bus->dev;
    - struct brcm_pcie *pcie = (struct brcm_pcie *) bus->sysdata;
    - int ret;
    -
    - if (!dev->of_node || !bus->parent || !pci_is_root_bus(bus->parent))
    - return 0;
    -
    - ret = pci_subdev_regulators_add_bus(bus);
    - if (ret)
    - return ret;
    -
    - /* Grab the regulators for suspend/resume */
    - pcie->sr = bus->dev.driver_data;
    -
    - /*
    - * If we have failed linkup there is no point to return an error as
    - * currently it will cause a WARNING() from pci_alloc_child_bus().
    - * We return 0 and turn on the "refusal_mode" so that any further
    - * accesses to the pci_dev just get 0xffffffff
    - */
    - if (brcm_pcie_linkup(pcie) != 0)
    - pcie->refusal_mode = true;
    -
    - return 0;
    -}
    -
    static void pci_subdev_regulators_remove_bus(struct pci_bus *bus)
    {
    struct device *dev = &bus->dev;
    @@ -857,18 +825,6 @@ static void __iomem *brcm_pcie_map_conf(struct pci_bus *bus, unsigned int devfn,
    /* Accesses to the RC go right to the RC registers if slot==0 */
    if (pci_is_root_bus(bus))
    return PCI_SLOT(devfn) ? NULL : base + where;
    - if (pcie->refusal_mode) {
    - /*
    - * At this point we do not have link. There will be a CPU
    - * abort -- a quirk with this controller --if Linux tries
    - * to read any config-space registers besides those
    - * targeting the host bridge. To prevent this we hijack
    - * the address to point to a safe access that will return
    - * 0xffffffff.
    - */
    - writel(0xffffffff, base + PCIE_MISC_RC_BAR2_CONFIG_HI);
    - return base + PCIE_MISC_RC_BAR2_CONFIG_HI + (where & 0x3);
    - }

    /* For devices, write to the config space index register */
    idx = PCIE_ECAM_OFFSET(bus->number, devfn, 0);
    @@ -897,7 +853,7 @@ static struct pci_ops brcm_pcie_ops = {
    .map_bus = brcm_pcie_map_conf,
    .read = pci_generic_config_read,
    .write = pci_generic_config_write,
    - .add_bus = brcm_pcie_add_bus,
    + .add_bus = pci_subdev_regulators_add_bus,
    .remove_bus = pci_subdev_regulators_remove_bus,
    };

    @@ -1370,14 +1326,6 @@ static int brcm_pcie_suspend(struct device *dev)
    return ret;
    }

    - if (pcie->sr) {
    - 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);

    return 0;
    @@ -1395,17 +1343,9 @@ static int brcm_pcie_resume(struct device *dev)
    if (ret)
    return ret;

    - if (pcie->sr) {
    - 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 = reset_control_reset(pcie->rescal);
    if (ret)
    - goto err_regulator;
    + goto err_disable_clk;

    ret = brcm_phy_start(pcie);
    if (ret)
    @@ -1437,9 +1377,6 @@ static int brcm_pcie_resume(struct device *dev)

    err_reset:
    reset_control_rearm(pcie->rescal);
    -err_regulator:
    - if (pcie->sr)
    - regulator_bulk_disable(pcie->sr->num_supplies, pcie->sr->supplies);
    err_disable_clk:
    clk_disable_unprepare(pcie->clk);
    return ret;
    @@ -1571,17 +1508,7 @@ static int brcm_pcie_probe(struct platform_device *pdev)

    platform_set_drvdata(pdev, pcie);

    - ret = pci_host_probe(bridge);
    - if (!ret && !brcm_pcie_link_up(pcie))
    - ret = -ENODEV;
    -
    - if (ret) {
    - brcm_pcie_remove(pdev);
    - return ret;
    - }
    -
    - return 0;
    -
    + return pci_host_probe(bridge);
    fail:
    __brcm_pcie_remove(pcie);
    return ret;
    @@ -1590,8 +1517,8 @@ static int brcm_pcie_probe(struct platform_device *pdev)
    MODULE_DEVICE_TABLE(of, brcm_pcie_match);

    static const struct dev_pm_ops brcm_pcie_pm_ops = {
    - .suspend_noirq = brcm_pcie_suspend,
    - .resume_noirq = brcm_pcie_resume,
    + .suspend = brcm_pcie_suspend,
    + .resume = brcm_pcie_resume,
    };

    static struct platform_driver brcm_pcie_driver = {
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-13 16:03    [W:3.260 / U:1.420 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site