RE: [PATCH v1] PCI: imx6: Keep the GPIO regulator always on

From: Hongxing Zhu
Date: Thu Nov 03 2022 - 21:14:16 EST


> -----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");
>