Commit a37beefb authored by Serge Semin's avatar Serge Semin Committed by Bjorn Helgaas
Browse files

PCI: dwc: Add start_link/stop_link inlines

Factor out this pattern:

  if (!pci->ops || !pci->ops->start_link)
    return -EINVAL;

  return pci->ops->start_link(pci);

into a new dw_pcie_start_link() wrapper and do the same for the stop_link()
method.

Note that dw_pcie_ep_start() previously returned -EINVAL if there was no
platform start_link() method, which didn't make much sense since that is
not an error.  It will now return 0 in that case.

As a side-effect, drop the empty start_link() and dummy dw_pcie_ops
instances from the generic DW PCIe and Layerscape EP platform drivers.

[bhelgaas: commit log]
Link: https://lore.kernel.org/r/20220624143428.8334-14-Sergey.Semin@baikalelectronics.ru


Signed-off-by: default avatarSerge Semin <Sergey.Semin@baikalelectronics.ru>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarRob Herring <robh@kernel.org>
Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
parent bd42f310
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -32,15 +32,6 @@ struct ls_pcie_ep {
	const struct ls_pcie_ep_drvdata *drvdata;
};

static int ls_pcie_establish_link(struct dw_pcie *pci)
{
	return 0;
}

static const struct dw_pcie_ops dw_ls_pcie_ep_ops = {
	.start_link = ls_pcie_establish_link,
};

static const struct pci_epc_features*
ls_pcie_ep_get_features(struct dw_pcie_ep *ep)
{
@@ -106,19 +97,16 @@ static const struct dw_pcie_ep_ops ls_pcie_ep_ops = {

static const struct ls_pcie_ep_drvdata ls1_ep_drvdata = {
	.ops = &ls_pcie_ep_ops,
	.dw_pcie_ops = &dw_ls_pcie_ep_ops,
};

static const struct ls_pcie_ep_drvdata ls2_ep_drvdata = {
	.func_offset = 0x20000,
	.ops = &ls_pcie_ep_ops,
	.dw_pcie_ops = &dw_ls_pcie_ep_ops,
};

static const struct ls_pcie_ep_drvdata lx2_ep_drvdata = {
	.func_offset = 0x8000,
	.ops = &ls_pcie_ep_ops,
	.dw_pcie_ops = &dw_ls_pcie_ep_ops,
};

static const struct of_device_id ls_pcie_ep_of_match[] = {
+2 −6
Original line number Diff line number Diff line
@@ -435,8 +435,7 @@ static void dw_pcie_ep_stop(struct pci_epc *epc)
	struct dw_pcie_ep *ep = epc_get_drvdata(epc);
	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);

	if (pci->ops && pci->ops->stop_link)
		pci->ops->stop_link(pci);
	dw_pcie_stop_link(pci);
}

static int dw_pcie_ep_start(struct pci_epc *epc)
@@ -444,10 +443,7 @@ static int dw_pcie_ep_start(struct pci_epc *epc)
	struct dw_pcie_ep *ep = epc_get_drvdata(epc);
	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);

	if (!pci->ops || !pci->ops->start_link)
		return -EINVAL;

	return pci->ops->start_link(pci);
	return dw_pcie_start_link(pci);
}

static const struct pci_epc_features*
+4 −6
Original line number Diff line number Diff line
@@ -409,8 +409,8 @@ int dw_pcie_host_init(struct pcie_port *pp)

	dw_pcie_setup_rc(pp);

	if (!dw_pcie_link_up(pci) && pci->ops && pci->ops->start_link) {
		ret = pci->ops->start_link(pci);
	if (!dw_pcie_link_up(pci)) {
		ret = dw_pcie_start_link(pci);
		if (ret)
			goto err_free_msi;
	}
@@ -427,8 +427,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
	return 0;

err_stop_link:
	if (pci->ops && pci->ops->stop_link)
		pci->ops->stop_link(pci);
	dw_pcie_stop_link(pci);

err_free_msi:
	if (pp->has_msi_ctrl)
@@ -444,8 +443,7 @@ void dw_pcie_host_deinit(struct pcie_port *pp)
	pci_stop_root_bus(pp->bridge->bus);
	pci_remove_root_bus(pp->bridge->bus);

	if (pci->ops && pci->ops->stop_link)
		pci->ops->stop_link(pci);
	dw_pcie_stop_link(pci);

	if (pp->has_msi_ctrl)
		dw_pcie_free_msi(pp);
+0 −10
Original line number Diff line number Diff line
@@ -36,15 +36,6 @@ static const struct of_device_id dw_plat_pcie_of_match[];
static const struct dw_pcie_host_ops dw_plat_pcie_host_ops = {
};

static int dw_plat_pcie_establish_link(struct dw_pcie *pci)
{
	return 0;
}

static const struct dw_pcie_ops dw_pcie_ops = {
	.start_link = dw_plat_pcie_establish_link,
};

static void dw_plat_pcie_ep_init(struct dw_pcie_ep *ep)
{
	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
@@ -140,7 +131,6 @@ static int dw_plat_pcie_probe(struct platform_device *pdev)
		return -ENOMEM;

	pci->dev = dev;
	pci->ops = &dw_pcie_ops;

	dw_plat_pcie->pci = pci;
	dw_plat_pcie->mode = mode;
+14 −0
Original line number Diff line number Diff line
@@ -365,6 +365,20 @@ static inline void dw_pcie_dbi_ro_wr_dis(struct dw_pcie *pci)
	dw_pcie_writel_dbi(pci, reg, val);
}

static inline int dw_pcie_start_link(struct dw_pcie *pci)
{
	if (pci->ops && pci->ops->start_link)
		return pci->ops->start_link(pci);

	return 0;
}

static inline void dw_pcie_stop_link(struct dw_pcie *pci)
{
	if (pci->ops && pci->ops->stop_link)
		pci->ops->stop_link(pci);
}

#ifdef CONFIG_PCIE_DW_HOST
irqreturn_t dw_handle_msi_irq(struct pcie_port *pp);
void dw_pcie_setup_rc(struct pcie_port *pp);