Message ID | 20231017193145.3198380-2-Frank.Li@nxp.com (mailing list archive) |
---|---|
State | Handled Elsewhere, archived |
Headers | show |
Series | PCI: layerscape: Add suspend/resume support for ls1043 and ls1021 | expand |
On Tue, Oct 17, 2023 at 03:31:42PM -0400, Frank Li wrote: > Since difference SoCs require different sequence for exiting L2, let's add > a separate "exit_from_l2()" callback. This callback can be used to execute > SoC specific sequence. > I missed the fact that this patch honors the return value of the callback (which was ignored previously). So this should be added to the description as well. > Signed-off-by: Frank Li <Frank.Li@nxp.com> With that, Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> - Mani > --- > > Notes: > Change from v2 to v3 > - fixed according to mani's feedback > 1. update commit message > 2. move dw_pcie_host_ops to next patch > 3. check return value from exit_from_l2() > Change from v1 to v2 > - change subject 'a' to 'A' > > Change from v1 to v2 > - change subject 'a' to 'A' > > drivers/pci/controller/dwc/pci-layerscape.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/drivers/pci/controller/dwc/pci-layerscape.c b/drivers/pci/controller/dwc/pci-layerscape.c > index 37956e09c65bd..aea89926bcc4f 100644 > --- a/drivers/pci/controller/dwc/pci-layerscape.c > +++ b/drivers/pci/controller/dwc/pci-layerscape.c > @@ -39,6 +39,7 @@ > > struct ls_pcie_drvdata { > const u32 pf_off; > + int (*exit_from_l2)(struct dw_pcie_rp *pp); > bool pm_support; > }; > > @@ -125,7 +126,7 @@ static void ls_pcie_send_turnoff_msg(struct dw_pcie_rp *pp) > dev_err(pcie->pci->dev, "PME_Turn_off timeout\n"); > } > > -static void ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) > +static int ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) > { > struct dw_pcie *pci = to_dw_pcie_from_pp(pp); > struct ls_pcie *pcie = to_ls_pcie(pci); > @@ -150,6 +151,8 @@ static void ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) > 10000); > if (ret) > dev_err(pcie->pci->dev, "L2 exit timeout\n"); > + > + return ret; > } > > static int ls_pcie_host_init(struct dw_pcie_rp *pp) > @@ -180,6 +183,7 @@ static const struct ls_pcie_drvdata ls1021a_drvdata = { > static const struct ls_pcie_drvdata layerscape_drvdata = { > .pf_off = 0xc0000, > .pm_support = true, > + .exit_from_l2 = ls_pcie_exit_from_l2, > }; > > static const struct of_device_id ls_pcie_of_match[] = { > @@ -247,11 +251,14 @@ static int ls_pcie_suspend_noirq(struct device *dev) > static int ls_pcie_resume_noirq(struct device *dev) > { > struct ls_pcie *pcie = dev_get_drvdata(dev); > + int ret; > > if (!pcie->drvdata->pm_support) > return 0; > > - ls_pcie_exit_from_l2(&pcie->pci->pp); > + ret = pcie->drvdata->exit_from_l2(&pcie->pci->pp); > + if (ret) > + return ret; > > return dw_pcie_resume_noirq(pcie->pci); > } > -- > 2.34.1 >
On Thu, Nov 02, 2023 at 10:28:08PM +0530, Manivannan Sadhasivam wrote: > On Tue, Oct 17, 2023 at 03:31:42PM -0400, Frank Li wrote: > > Since difference SoCs require different sequence for exiting L2, let's add > > a separate "exit_from_l2()" callback. This callback can be used to execute > > SoC specific sequence. > > > > I missed the fact that this patch honors the return value of the callback (which > was ignored previously). So this should be added to the description as well. How about add below? "Change ls_pcie_exit_from_l2() return value from void to int. Return error when exit_from_l2() failure to exit suspend flow." Frank > > > Signed-off-by: Frank Li <Frank.Li@nxp.com> > > With that, > > Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> > > - Mani > > > --- > > > > Notes: > > Change from v2 to v3 > > - fixed according to mani's feedback > > 1. update commit message > > 2. move dw_pcie_host_ops to next patch > > 3. check return value from exit_from_l2() > > Change from v1 to v2 > > - change subject 'a' to 'A' > > > > Change from v1 to v2 > > - change subject 'a' to 'A' > > > > drivers/pci/controller/dwc/pci-layerscape.c | 11 +++++++++-- > > 1 file changed, 9 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/pci/controller/dwc/pci-layerscape.c b/drivers/pci/controller/dwc/pci-layerscape.c > > index 37956e09c65bd..aea89926bcc4f 100644 > > --- a/drivers/pci/controller/dwc/pci-layerscape.c > > +++ b/drivers/pci/controller/dwc/pci-layerscape.c > > @@ -39,6 +39,7 @@ > > > > struct ls_pcie_drvdata { > > const u32 pf_off; > > + int (*exit_from_l2)(struct dw_pcie_rp *pp); > > bool pm_support; > > }; > > > > @@ -125,7 +126,7 @@ static void ls_pcie_send_turnoff_msg(struct dw_pcie_rp *pp) > > dev_err(pcie->pci->dev, "PME_Turn_off timeout\n"); > > } > > > > -static void ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) > > +static int ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) > > { > > struct dw_pcie *pci = to_dw_pcie_from_pp(pp); > > struct ls_pcie *pcie = to_ls_pcie(pci); > > @@ -150,6 +151,8 @@ static void ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) > > 10000); > > if (ret) > > dev_err(pcie->pci->dev, "L2 exit timeout\n"); > > + > > + return ret; > > } > > > > static int ls_pcie_host_init(struct dw_pcie_rp *pp) > > @@ -180,6 +183,7 @@ static const struct ls_pcie_drvdata ls1021a_drvdata = { > > static const struct ls_pcie_drvdata layerscape_drvdata = { > > .pf_off = 0xc0000, > > .pm_support = true, > > + .exit_from_l2 = ls_pcie_exit_from_l2, > > }; > > > > static const struct of_device_id ls_pcie_of_match[] = { > > @@ -247,11 +251,14 @@ static int ls_pcie_suspend_noirq(struct device *dev) > > static int ls_pcie_resume_noirq(struct device *dev) > > { > > struct ls_pcie *pcie = dev_get_drvdata(dev); > > + int ret; > > > > if (!pcie->drvdata->pm_support) > > return 0; > > > > - ls_pcie_exit_from_l2(&pcie->pci->pp); > > + ret = pcie->drvdata->exit_from_l2(&pcie->pci->pp); > > + if (ret) > > + return ret; > > > > return dw_pcie_resume_noirq(pcie->pci); > > } > > -- > > 2.34.1 > > > > -- > மணிவண்ணன் சதாசிவம்
diff --git a/drivers/pci/controller/dwc/pci-layerscape.c b/drivers/pci/controller/dwc/pci-layerscape.c index 37956e09c65bd..aea89926bcc4f 100644 --- a/drivers/pci/controller/dwc/pci-layerscape.c +++ b/drivers/pci/controller/dwc/pci-layerscape.c @@ -39,6 +39,7 @@ struct ls_pcie_drvdata { const u32 pf_off; + int (*exit_from_l2)(struct dw_pcie_rp *pp); bool pm_support; }; @@ -125,7 +126,7 @@ static void ls_pcie_send_turnoff_msg(struct dw_pcie_rp *pp) dev_err(pcie->pci->dev, "PME_Turn_off timeout\n"); } -static void ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) +static int ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) { struct dw_pcie *pci = to_dw_pcie_from_pp(pp); struct ls_pcie *pcie = to_ls_pcie(pci); @@ -150,6 +151,8 @@ static void ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) 10000); if (ret) dev_err(pcie->pci->dev, "L2 exit timeout\n"); + + return ret; } static int ls_pcie_host_init(struct dw_pcie_rp *pp) @@ -180,6 +183,7 @@ static const struct ls_pcie_drvdata ls1021a_drvdata = { static const struct ls_pcie_drvdata layerscape_drvdata = { .pf_off = 0xc0000, .pm_support = true, + .exit_from_l2 = ls_pcie_exit_from_l2, }; static const struct of_device_id ls_pcie_of_match[] = { @@ -247,11 +251,14 @@ static int ls_pcie_suspend_noirq(struct device *dev) static int ls_pcie_resume_noirq(struct device *dev) { struct ls_pcie *pcie = dev_get_drvdata(dev); + int ret; if (!pcie->drvdata->pm_support) return 0; - ls_pcie_exit_from_l2(&pcie->pci->pp); + ret = pcie->drvdata->exit_from_l2(&pcie->pci->pp); + if (ret) + return ret; return dw_pcie_resume_noirq(pcie->pci); }
Since difference SoCs require different sequence for exiting L2, let's add a separate "exit_from_l2()" callback. This callback can be used to execute SoC specific sequence. Signed-off-by: Frank Li <Frank.Li@nxp.com> --- Notes: Change from v2 to v3 - fixed according to mani's feedback 1. update commit message 2. move dw_pcie_host_ops to next patch 3. check return value from exit_from_l2() Change from v1 to v2 - change subject 'a' to 'A' Change from v1 to v2 - change subject 'a' to 'A' drivers/pci/controller/dwc/pci-layerscape.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)