> -----Original Message----- > From: Lucas Stach <l.stach@xxxxxxxxxxxxxx> > Sent: 2022年11月3日 17:12 > To: Hongxing Zhu <hongxing.zhu@xxxxxxx>; bhelgaas@xxxxxxxxxx; > lorenzo.pieralisi@xxxxxxx > Cc: linux-pci@xxxxxxxxxxxxxxx; linux-arm-kernel@xxxxxxxxxxxxxxxxxxx; > linux-kernel@xxxxxxxxxxxxxxx; kernel@xxxxxxxxxxxxxx; dl-linux-imx > <linux-imx@xxxxxxx> > Subject: Re: [PATCH v1] PCI: imx6: Keep the GPIO regulator always on > > Am Donnerstag, dem 03.11.2022 um 14:08 +0800 schrieb Richard Zhu: > > Since vpcie regulator is one GPIO regulator, used to control the > > VPCIe_3V3 and power up remote PCIe EP device. > > > > Some WIFI modules load their firmware once in probe, and can't be > > powered off during suspend. Otherwise, these WIFI modules wouldn't be > > functional anymore after resume back. > > I would call this a bug in the WiFi driver. > > I think we need to walk down the PCIe hierarchy to see if it is safe to disable > the PCIe regulator. When all devices in the hierarchy are in D3hot state, we can > safely put the whole hierarchy into D3cold by removing power. When any of > the devices connected to the RC are in a state other than D3hot, we need to > keep the regulator enabled, as those devices may need power in suspend to > implement wakeups or other functionality that should be available during > suspend. > Understood, thanks a lot. Best Regards Richard Zhu > Regards, > Lucas > > > > > So, keep this regulator always on in the probe. > > > > Fixes: a4bb720eeb1e ("PCI: imx6: Turn off regulator when system is in > > suspend mode") > > Signed-off-by: Richard Zhu <hongxing.zhu@xxxxxxx> > > --- > > drivers/pci/controller/dwc/pci-imx6.c | 24 ++++++++---------------- > > 1 file changed, 8 insertions(+), 16 deletions(-) > > > > diff --git a/drivers/pci/controller/dwc/pci-imx6.c > > b/drivers/pci/controller/dwc/pci-imx6.c > > index 2616585ca5f8..94a89bbf381d 100644 > > --- a/drivers/pci/controller/dwc/pci-imx6.c > > +++ b/drivers/pci/controller/dwc/pci-imx6.c > > @@ -926,22 +926,13 @@ static int imx6_pcie_host_init(struct dw_pcie_rp > *pp) > > struct imx6_pcie *imx6_pcie = to_imx6_pcie(pci); > > int ret; > > > > - if (imx6_pcie->vpcie) { > > - ret = regulator_enable(imx6_pcie->vpcie); > > - if (ret) { > > - dev_err(dev, "failed to enable vpcie regulator: %d\n", > > - ret); > > - return ret; > > - } > > - } > > - > > imx6_pcie_assert_core_reset(imx6_pcie); > > imx6_pcie_init_phy(imx6_pcie); > > > > ret = imx6_pcie_clk_enable(imx6_pcie); > > if (ret) { > > dev_err(dev, "unable to enable pcie clocks: %d\n", ret); > > - goto err_reg_disable; > > + return ret; > > } > > > > if (imx6_pcie->phy) { > > @@ -974,9 +965,6 @@ static int imx6_pcie_host_init(struct dw_pcie_rp > *pp) > > phy_exit(imx6_pcie->phy); > > err_clk_disable: > > imx6_pcie_clk_disable(imx6_pcie); > > -err_reg_disable: > > - if (imx6_pcie->vpcie) > > - regulator_disable(imx6_pcie->vpcie); > > return ret; > > } > > > > @@ -991,9 +979,6 @@ static void imx6_pcie_host_exit(struct dw_pcie_rp > *pp) > > phy_exit(imx6_pcie->phy); > > } > > imx6_pcie_clk_disable(imx6_pcie); > > - > > - if (imx6_pcie->vpcie) > > - regulator_disable(imx6_pcie->vpcie); > > } > > > > static const struct dw_pcie_host_ops imx6_pcie_host_ops = { @@ > > -1263,6 +1248,13 @@ static int imx6_pcie_probe(struct platform_device > *pdev) > > if (PTR_ERR(imx6_pcie->vpcie) != -ENODEV) > > return PTR_ERR(imx6_pcie->vpcie); > > imx6_pcie->vpcie = NULL; > > + } else { > > + ret = regulator_enable(imx6_pcie->vpcie); > > + if (ret) { > > + dev_err(dev, "failed to enable vpcie regulator: %d\n", > > + ret); > > + return ret; > > + } > > } > > > > imx6_pcie->vph = devm_regulator_get_optional(&pdev->dev, "vph"); >