From: Jiri Slaby <jslaby@suse.cz>
Subject: kABI: PCI: dwc: Add dw_pcie_ops.host_deinit() callback
Patch-mainline: never, kabi
References: kabi bsc#1210206
Commit c6481d51dc65 (PCI: dwc: Add dw_pcie_ops.host_deinit() callback)
added a callback to struct dw_pcie_host_ops. This made the kABI checker
complaining.
While struct dw_pcie_host_ops is strictly internal, dw_pcie_host_init()
is exported.
So deal with this by:
* moving dw_pcie_host_ops::host_deinit to the end,
* protect it by usual __GENKSYMS__,
* introduce dw_pcie_host_init2() which should take the new member
into account (and only that),
* use that in pcie-qcom which is the only user of ::host_deinit.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
---
drivers/pci/controller/dwc/pcie-designware-host.c | 24 ++++++++++++++++++----
drivers/pci/controller/dwc/pcie-designware.h | 5 +++-
drivers/pci/controller/dwc/pcie-qcom.c | 2 -
3 files changed, 25 insertions(+), 6 deletions(-)
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -286,7 +286,7 @@ static void dw_pcie_msi_init(struct pcie
dw_pcie_writel_dbi(pci, PCIE_MSI_ADDR_HI, upper_32_bits(msi_target));
}
-int dw_pcie_host_init(struct pcie_port *pp)
+int __dw_pcie_host_init(struct pcie_port *pp, bool v2)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
struct device *dev = pci->dev;
@@ -432,14 +432,25 @@ err_free_msi:
dw_pcie_free_msi(pp);
err_deinit_host:
- if (pp->ops->host_deinit)
+ if (v2 && pp->ops->host_deinit)
pp->ops->host_deinit(pp);
return ret;
}
+
+int dw_pcie_host_init(struct pcie_port *pp)
+{
+ return __dw_pcie_host_init(pp, false);
+}
EXPORT_SYMBOL_GPL(dw_pcie_host_init);
-void dw_pcie_host_deinit(struct pcie_port *pp)
+int dw_pcie_host_init2(struct pcie_port *pp)
+{
+ return __dw_pcie_host_init(pp, true);
+}
+EXPORT_SYMBOL_GPL(dw_pcie_host_init2);
+
+void __dw_pcie_host_deinit(struct pcie_port *pp, bool v2)
{
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
@@ -452,9 +463,14 @@ void dw_pcie_host_deinit(struct pcie_por
if (pp->has_msi_ctrl)
dw_pcie_free_msi(pp);
- if (pp->ops->host_deinit)
+ if (v2 && pp->ops->host_deinit)
pp->ops->host_deinit(pp);
}
+
+void dw_pcie_host_deinit(struct pcie_port *pp)
+{
+ return __dw_pcie_host_deinit(pp, false);
+}
EXPORT_SYMBOL_GPL(dw_pcie_host_deinit);
static void __iomem *dw_pcie_other_conf_map_bus(struct pci_bus *bus,
--- a/drivers/pci/controller/dwc/pcie-designware.h
+++ b/drivers/pci/controller/dwc/pcie-designware.h
@@ -174,8 +174,10 @@ enum dw_pcie_device_mode {
struct dw_pcie_host_ops {
int (*host_init)(struct pcie_port *pp);
- void (*host_deinit)(struct pcie_port *pp);
int (*msi_host_init)(struct pcie_port *pp);
+#ifndef __GENKSYMS__
+ void (*host_deinit)(struct pcie_port *pp);
+#endif
};
struct pcie_port {
@@ -370,6 +372,7 @@ static inline void dw_pcie_dbi_ro_wr_dis
irqreturn_t dw_handle_msi_irq(struct pcie_port *pp);
void dw_pcie_setup_rc(struct pcie_port *pp);
int dw_pcie_host_init(struct pcie_port *pp);
+int dw_pcie_host_init2(struct pcie_port *pp);
void dw_pcie_host_deinit(struct pcie_port *pp);
int dw_pcie_allocate_domains(struct pcie_port *pp);
void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus, unsigned int devfn,
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
@@ -1537,7 +1537,7 @@ static int qcom_pcie_probe(struct platfo
platform_set_drvdata(pdev, pcie);
- ret = dw_pcie_host_init(pp);
+ ret = dw_pcie_host_init2(pp);
if (ret) {
dev_err(dev, "cannot initialize host\n");
goto err_phy_exit;