PCI: layerscape: Add function pointer for exit_from_l2()
authorFrank Li <Frank.Li@nxp.com>
Mon, 4 Dec 2023 16:08:26 +0000 (11:08 -0500)
committerLorenzo Pieralisi <lpieralisi@kernel.org>
Tue, 12 Dec 2023 10:11:38 +0000 (11:11 +0100)
Since different SoCs require different sequences for exiting L2, let's add
a separate "exit_from_l2()" callback to handle SoC specific sequences.

Change ls_pcie_exit_from_l2() return value from void to int in order
to propagate errors. Return an error if the exit_from_l2() callback
fails in the resume flow.

Link: https://lore.kernel.org/r/20231204160829.2498703-2-Frank.Li@nxp.com
Signed-off-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Acked-by: Roy Zang <Roy.Zang@nxp.com>
drivers/pci/controller/dwc/pci-layerscape.c

index 37956e09c65bd51c95937e25b982f6e00a0491d4..aea89926bcc4f0cb284d42bcf10ffa5c6c9b95c3 100644 (file)
@@ -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);
 }