diff mbox series

[RFC,14/15] WIP: PCI: qcom: use pwrseq to power up bus devices

Message ID 20210817005507.1507580-15-dmitry.baryshkov@linaro.org
State New
Headers show
Series create power sequencing subsystem | expand

Commit Message

Dmitry Baryshkov Aug. 17, 2021, 12:55 a.m. UTC
Use bus-pwrseq device tree node to power up the devices on the bus. This
is to be rewritten with the proper code parsing the device tree and
powering up individual devices.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/pci/controller/dwc/pcie-qcom.c | 13 +++++++++++++
 drivers/power/pwrseq/pwrseq_qca.c      |  1 +
 2 files changed, 14 insertions(+)

Comments

Bjorn Andersson Aug. 19, 2021, 11:44 p.m. UTC | #1
On Mon 16 Aug 17:55 PDT 2021, Dmitry Baryshkov wrote:

> Use bus-pwrseq device tree node to power up the devices on the bus. This
> is to be rewritten with the proper code parsing the device tree and
> powering up individual devices.
> 

How about describing the PCI device in DT and having the PCIe controller
dig it up up from there? Although we won't have a struct device until
later, so perhaps we need the of-based pwrseq_get() for that.

Regards,
Bjorn

> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
>  drivers/pci/controller/dwc/pcie-qcom.c | 13 +++++++++++++
>  drivers/power/pwrseq/pwrseq_qca.c      |  1 +
>  2 files changed, 14 insertions(+)
> 
> diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
> index 8a7a300163e5..a60d41fbcd6f 100644
> --- a/drivers/pci/controller/dwc/pcie-qcom.c
> +++ b/drivers/pci/controller/dwc/pcie-qcom.c
> @@ -23,6 +23,7 @@
>  #include <linux/pm_runtime.h>
>  #include <linux/platform_device.h>
>  #include <linux/phy/phy.h>
> +#include <linux/pwrseq/consumer.h>
>  #include <linux/regulator/consumer.h>
>  #include <linux/reset.h>
>  #include <linux/slab.h>
> @@ -1467,6 +1468,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
>  	struct pcie_port *pp;
>  	struct dw_pcie *pci;
>  	struct qcom_pcie *pcie;
> +	struct pwrseq *pwrseq;
>  	int ret;
>  
>  	pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
> @@ -1520,6 +1522,17 @@ static int qcom_pcie_probe(struct platform_device *pdev)
>  
>  	pp->ops = &qcom_pcie_dw_ops;
>  
> +	pwrseq = devm_pwrseq_get_optional(dev, "bus");
> +	if (IS_ERR(pwrseq)) {
> +		ret = PTR_ERR(pwrseq);
> +		goto err_pm_runtime_put;
> +	}
> +	if (pwrseq) {
> +		ret = pwrseq_full_power_on(pwrseq);
> +		if (ret)
> +			goto err_pm_runtime_put;
> +	}
> +
>  	ret = phy_init(pcie->phy);
>  	if (ret) {
>  		pm_runtime_disable(&pdev->dev);
> diff --git a/drivers/power/pwrseq/pwrseq_qca.c b/drivers/power/pwrseq/pwrseq_qca.c
> index 3421a4821126..4107f0a9c05d 100644
> --- a/drivers/power/pwrseq/pwrseq_qca.c
> +++ b/drivers/power/pwrseq/pwrseq_qca.c
> @@ -1,3 +1,4 @@
> +#define DEBUG
>  // SPDX-License-Identifier: GPL-2.0-only
>  /*
>   * Copyright (c) 2021, Linaro Ltd.
> -- 
> 2.30.2
>
Dmitry Baryshkov Aug. 20, 2021, 8:50 a.m. UTC | #2
Hi,

On Fri, 20 Aug 2021 at 02:43, Bjorn Andersson
<bjorn.andersson@linaro.org> wrote:
>

> On Mon 16 Aug 17:55 PDT 2021, Dmitry Baryshkov wrote:

>

> > Use bus-pwrseq device tree node to power up the devices on the bus. This

> > is to be rewritten with the proper code parsing the device tree and

> > powering up individual devices.

> >

>

> How about describing the PCI device in DT and having the PCIe controller

> dig it up up from there? Although we won't have a struct device until

> later, so perhaps we need the of-based pwrseq_get() for that.


Yes, this is the plan. Currently I just wanted to have a way to power
up the PCIe part of the chip and be able to test that.
In the previous attempts to provide qca6390 support, Rob has clearly
stated that we'd have to have the following device tree snippet:

pcie0 {
    bridge@0,0 {
        qca6390@1,0 {
            supplies-or-whatever = ....;
        };
    };
};

>

> Regards,

> Bjorn

>

> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

> > ---

> >  drivers/pci/controller/dwc/pcie-qcom.c | 13 +++++++++++++

> >  drivers/power/pwrseq/pwrseq_qca.c      |  1 +

> >  2 files changed, 14 insertions(+)

> >

> > diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c

> > index 8a7a300163e5..a60d41fbcd6f 100644

> > --- a/drivers/pci/controller/dwc/pcie-qcom.c

> > +++ b/drivers/pci/controller/dwc/pcie-qcom.c

> > @@ -23,6 +23,7 @@

> >  #include <linux/pm_runtime.h>

> >  #include <linux/platform_device.h>

> >  #include <linux/phy/phy.h>

> > +#include <linux/pwrseq/consumer.h>

> >  #include <linux/regulator/consumer.h>

> >  #include <linux/reset.h>

> >  #include <linux/slab.h>

> > @@ -1467,6 +1468,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)

> >       struct pcie_port *pp;

> >       struct dw_pcie *pci;

> >       struct qcom_pcie *pcie;

> > +     struct pwrseq *pwrseq;

> >       int ret;

> >

> >       pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);

> > @@ -1520,6 +1522,17 @@ static int qcom_pcie_probe(struct platform_device *pdev)

> >

> >       pp->ops = &qcom_pcie_dw_ops;

> >

> > +     pwrseq = devm_pwrseq_get_optional(dev, "bus");

> > +     if (IS_ERR(pwrseq)) {

> > +             ret = PTR_ERR(pwrseq);

> > +             goto err_pm_runtime_put;

> > +     }

> > +     if (pwrseq) {

> > +             ret = pwrseq_full_power_on(pwrseq);

> > +             if (ret)

> > +                     goto err_pm_runtime_put;

> > +     }

> > +

> >       ret = phy_init(pcie->phy);

> >       if (ret) {

> >               pm_runtime_disable(&pdev->dev);

> > diff --git a/drivers/power/pwrseq/pwrseq_qca.c b/drivers/power/pwrseq/pwrseq_qca.c

> > index 3421a4821126..4107f0a9c05d 100644

> > --- a/drivers/power/pwrseq/pwrseq_qca.c

> > +++ b/drivers/power/pwrseq/pwrseq_qca.c

> > @@ -1,3 +1,4 @@

> > +#define DEBUG

> >  // SPDX-License-Identifier: GPL-2.0-only

> >  /*

> >   * Copyright (c) 2021, Linaro Ltd.

> > --

> > 2.30.2

> >




-- 
With best wishes
Dmitry
diff mbox series

Patch

diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
index 8a7a300163e5..a60d41fbcd6f 100644
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
@@ -23,6 +23,7 @@ 
 #include <linux/pm_runtime.h>
 #include <linux/platform_device.h>
 #include <linux/phy/phy.h>
+#include <linux/pwrseq/consumer.h>
 #include <linux/regulator/consumer.h>
 #include <linux/reset.h>
 #include <linux/slab.h>
@@ -1467,6 +1468,7 @@  static int qcom_pcie_probe(struct platform_device *pdev)
 	struct pcie_port *pp;
 	struct dw_pcie *pci;
 	struct qcom_pcie *pcie;
+	struct pwrseq *pwrseq;
 	int ret;
 
 	pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
@@ -1520,6 +1522,17 @@  static int qcom_pcie_probe(struct platform_device *pdev)
 
 	pp->ops = &qcom_pcie_dw_ops;
 
+	pwrseq = devm_pwrseq_get_optional(dev, "bus");
+	if (IS_ERR(pwrseq)) {
+		ret = PTR_ERR(pwrseq);
+		goto err_pm_runtime_put;
+	}
+	if (pwrseq) {
+		ret = pwrseq_full_power_on(pwrseq);
+		if (ret)
+			goto err_pm_runtime_put;
+	}
+
 	ret = phy_init(pcie->phy);
 	if (ret) {
 		pm_runtime_disable(&pdev->dev);
diff --git a/drivers/power/pwrseq/pwrseq_qca.c b/drivers/power/pwrseq/pwrseq_qca.c
index 3421a4821126..4107f0a9c05d 100644
--- a/drivers/power/pwrseq/pwrseq_qca.c
+++ b/drivers/power/pwrseq/pwrseq_qca.c
@@ -1,3 +1,4 @@ 
+#define DEBUG
 // SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright (c) 2021, Linaro Ltd.