Skip to content

Commit 9baa8a1

Browse files
shimodaykwilczynski
authored andcommitted
PCI: dwc: endpoint: Introduce .pre_init() and .deinit()
Renesas R-Car Gen4 PCIe controllers require vendor-specific initialization before .init(). To use dw->dbi and dw->num-lanes in the initialization code, introduce .pre_init() into struct dw_pcie_ep_ops. While at it, also introduce .deinit() to disable the controller by using vendor-specific de-initialization. Note that the ep_init in the struct dw_pcie_ep_ops should be renamed to init later. Link: https://lore.kernel.org/linux-pci/[email protected] Signed-off-by: Yoshihiro Shimoda <[email protected]> Signed-off-by: Krzysztof Wilczyński <[email protected]> Reviewed-by: Manivannan Sadhasivam <[email protected]> Reviewed-by: Serge Semin <[email protected]>
1 parent 303e845 commit 9baa8a1

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

drivers/pci/controller/dwc/pcie-designware-ep.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,9 @@ void dw_pcie_ep_exit(struct dw_pcie_ep *ep)
637637
epc->mem->window.page_size);
638638

639639
pci_epc_mem_exit(epc);
640+
641+
if (ep->ops->deinit)
642+
ep->ops->deinit(ep);
640643
}
641644
EXPORT_SYMBOL_GPL(dw_pcie_ep_exit);
642645

@@ -740,6 +743,9 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
740743
ep->phys_base = res->start;
741744
ep->addr_size = resource_size(res);
742745

746+
if (ep->ops->pre_init)
747+
ep->ops->pre_init(ep);
748+
743749
dw_pcie_version_detect(pci);
744750

745751
dw_pcie_iatu_detect(pci);
@@ -794,7 +800,7 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
794800
ep->page_size);
795801
if (ret < 0) {
796802
dev_err(dev, "Failed to initialize address space\n");
797-
return ret;
803+
goto err_ep_deinit;
798804
}
799805

800806
ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys,
@@ -831,6 +837,10 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
831837
err_exit_epc_mem:
832838
pci_epc_mem_exit(epc);
833839

840+
err_ep_deinit:
841+
if (ep->ops->deinit)
842+
ep->ops->deinit(ep);
843+
834844
return ret;
835845
}
836846
EXPORT_SYMBOL_GPL(dw_pcie_ep_init);

drivers/pci/controller/dwc/pcie-designware.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,9 @@ struct dw_pcie_rp {
330330
};
331331

332332
struct dw_pcie_ep_ops {
333+
void (*pre_init)(struct dw_pcie_ep *ep);
333334
void (*ep_init)(struct dw_pcie_ep *ep);
335+
void (*deinit)(struct dw_pcie_ep *ep);
334336
int (*raise_irq)(struct dw_pcie_ep *ep, u8 func_no,
335337
enum pci_epc_irq_type type, u16 interrupt_num);
336338
const struct pci_epc_features* (*get_features)(struct dw_pcie_ep *ep);

0 commit comments

Comments
 (0)