Commit c6481d51 authored by Serge Semin's avatar Serge Semin Committed by Bjorn Helgaas

PCI: dwc: Add dw_pcie_ops.host_deinit() callback

dw_pcie_host_init() calls the dw_pcie_ops.host_init() callback to do
platform-specific host initialization.

Add a dw_pcie_ops.host_deinit() callback to perform the corresponding
cleanups in dw_pcie_host_deinit() and in dw_pcie_host_init() failure paths.

Link: https://lore.kernel.org/r/20220624143947.8991-9-Sergey.Semin@baikalelectronics.ruSigned-off-by: default avatarSerge Semin <Sergey.Semin@baikalelectronics.ru>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
parent 58c379ee
...@@ -354,13 +354,14 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) ...@@ -354,13 +354,14 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
pp->num_vectors = MSI_DEF_NUM_VECTORS; pp->num_vectors = MSI_DEF_NUM_VECTORS;
} else if (pp->num_vectors > MAX_MSI_IRQS) { } else if (pp->num_vectors > MAX_MSI_IRQS) {
dev_err(dev, "Invalid number of vectors\n"); dev_err(dev, "Invalid number of vectors\n");
return -EINVAL; ret = -EINVAL;
goto err_deinit_host;
} }
if (pp->ops->msi_host_init) { if (pp->ops->msi_host_init) {
ret = pp->ops->msi_host_init(pp); ret = pp->ops->msi_host_init(pp);
if (ret < 0) if (ret < 0)
return ret; goto err_deinit_host;
} else if (pp->has_msi_ctrl) { } else if (pp->has_msi_ctrl) {
u32 ctrl, num_ctrls; u32 ctrl, num_ctrls;
...@@ -372,8 +373,10 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) ...@@ -372,8 +373,10 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
pp->msi_irq = platform_get_irq_byname_optional(pdev, "msi"); pp->msi_irq = platform_get_irq_byname_optional(pdev, "msi");
if (pp->msi_irq < 0) { if (pp->msi_irq < 0) {
pp->msi_irq = platform_get_irq(pdev, 0); pp->msi_irq = platform_get_irq(pdev, 0);
if (pp->msi_irq < 0) if (pp->msi_irq < 0) {
return pp->msi_irq; ret = pp->msi_irq;
goto err_deinit_host;
}
} }
} }
...@@ -381,7 +384,7 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) ...@@ -381,7 +384,7 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
ret = dw_pcie_allocate_domains(pp); ret = dw_pcie_allocate_domains(pp);
if (ret) if (ret)
return ret; goto err_deinit_host;
if (pp->msi_irq > 0) if (pp->msi_irq > 0)
irq_set_chained_handler_and_data(pp->msi_irq, irq_set_chained_handler_and_data(pp->msi_irq,
...@@ -434,6 +437,11 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp) ...@@ -434,6 +437,11 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
err_free_msi: err_free_msi:
if (pp->has_msi_ctrl) if (pp->has_msi_ctrl)
dw_pcie_free_msi(pp); dw_pcie_free_msi(pp);
err_deinit_host:
if (pp->ops->host_deinit)
pp->ops->host_deinit(pp);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(dw_pcie_host_init); EXPORT_SYMBOL_GPL(dw_pcie_host_init);
...@@ -449,6 +457,9 @@ void dw_pcie_host_deinit(struct dw_pcie_rp *pp) ...@@ -449,6 +457,9 @@ void dw_pcie_host_deinit(struct dw_pcie_rp *pp)
if (pp->has_msi_ctrl) if (pp->has_msi_ctrl)
dw_pcie_free_msi(pp); dw_pcie_free_msi(pp);
if (pp->ops->host_deinit)
pp->ops->host_deinit(pp);
} }
EXPORT_SYMBOL_GPL(dw_pcie_host_deinit); EXPORT_SYMBOL_GPL(dw_pcie_host_deinit);
......
...@@ -200,6 +200,7 @@ enum dw_pcie_device_mode { ...@@ -200,6 +200,7 @@ enum dw_pcie_device_mode {
struct dw_pcie_host_ops { struct dw_pcie_host_ops {
int (*host_init)(struct dw_pcie_rp *pp); int (*host_init)(struct dw_pcie_rp *pp);
void (*host_deinit)(struct dw_pcie_rp *pp);
int (*msi_host_init)(struct dw_pcie_rp *pp); int (*msi_host_init)(struct dw_pcie_rp *pp);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment