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

Hongxing Zhu hongxing.zhu at nxp.com
Thu Nov 3 18:14:01 PDT 2022


> -----Original Message-----
> From: Lucas Stach <l.stach at pengutronix.de>
> Sent: 2022年11月3日 17:12
> To: Hongxing Zhu <hongxing.zhu at nxp.com>; bhelgaas at google.com;
> lorenzo.pieralisi at arm.com
> Cc: linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org;
> linux-kernel at vger.kernel.org; kernel at pengutronix.de; dl-linux-imx
> <linux-imx at nxp.com>
> 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 at nxp.com>
> > ---
> >  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");
> 



More information about the linux-arm-kernel mailing list