Commit 123971a1 authored by Frank Li's avatar Frank Li Committed by Lorenzo Pieralisi
Browse files

PCI: layerscape: Add function pointer for exit_from_l2()

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: default avatarFrank Li <Frank.Li@nxp.com>
Signed-off-by: default avatarLorenzo Pieralisi <lpieralisi@kernel.org>
Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Acked-by: default avatarRoy Zang <Roy.Zang@nxp.com>
parent b85ea95d
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -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);
}