Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: dwc: Don't assume the ops in dw_pcie always exist

Some dwc-based device drivers, especially host-only drivers, may work well
with the default read_dbi/write_dbi/link_up implementations in
pcie-designware.c, so remove the assumption that every driver implements
them to simplify those drivers.

Link: https://lore.kernel.org/r/20210128144258.10329aa4@xhacker.debian
Signed-off-by: Jisheng Zhang <Jisheng.Zhang@synaptics.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

authored by

Jisheng Zhang and committed by
Bjorn Helgaas
a2f882d8 5b4cf0f6

+11 -13
+3 -5
drivers/pci/controller/dwc/pcie-designware-ep.c
··· 434 434 struct dw_pcie_ep *ep = epc_get_drvdata(epc); 435 435 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); 436 436 437 - if (!pci->ops->stop_link) 438 - return; 439 - 440 - pci->ops->stop_link(pci); 437 + if (pci->ops && pci->ops->stop_link) 438 + pci->ops->stop_link(pci); 441 439 } 442 440 443 441 static int dw_pcie_ep_start(struct pci_epc *epc) ··· 443 445 struct dw_pcie_ep *ep = epc_get_drvdata(epc); 444 446 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); 445 447 446 - if (!pci->ops->start_link) 448 + if (!pci->ops || !pci->ops->start_link) 447 449 return -EINVAL; 448 450 449 451 return pci->ops->start_link(pci);
+1 -1
drivers/pci/controller/dwc/pcie-designware-host.c
··· 404 404 dw_pcie_setup_rc(pp); 405 405 dw_pcie_msi_init(pp); 406 406 407 - if (!dw_pcie_link_up(pci) && pci->ops->start_link) { 407 + if (!dw_pcie_link_up(pci) && pci->ops && pci->ops->start_link) { 408 408 ret = pci->ops->start_link(pci); 409 409 if (ret) 410 410 goto err_free_msi;
+7 -7
drivers/pci/controller/dwc/pcie-designware.c
··· 141 141 int ret; 142 142 u32 val; 143 143 144 - if (pci->ops->read_dbi) 144 + if (pci->ops && pci->ops->read_dbi) 145 145 return pci->ops->read_dbi(pci, pci->dbi_base, reg, size); 146 146 147 147 ret = dw_pcie_read(pci->dbi_base + reg, size, &val); ··· 156 156 { 157 157 int ret; 158 158 159 - if (pci->ops->write_dbi) { 159 + if (pci->ops && pci->ops->write_dbi) { 160 160 pci->ops->write_dbi(pci, pci->dbi_base, reg, size, val); 161 161 return; 162 162 } ··· 171 171 { 172 172 int ret; 173 173 174 - if (pci->ops->write_dbi2) { 174 + if (pci->ops && pci->ops->write_dbi2) { 175 175 pci->ops->write_dbi2(pci, pci->dbi_base2, reg, size, val); 176 176 return; 177 177 } ··· 186 186 int ret; 187 187 u32 val; 188 188 189 - if (pci->ops->read_dbi) 189 + if (pci->ops && pci->ops->read_dbi) 190 190 return pci->ops->read_dbi(pci, pci->atu_base, reg, 4); 191 191 192 192 ret = dw_pcie_read(pci->atu_base + reg, 4, &val); ··· 200 200 { 201 201 int ret; 202 202 203 - if (pci->ops->write_dbi) { 203 + if (pci->ops && pci->ops->write_dbi) { 204 204 pci->ops->write_dbi(pci, pci->atu_base, reg, 4, val); 205 205 return; 206 206 } ··· 316 316 { 317 317 u32 retries, val; 318 318 319 - if (pci->ops->cpu_addr_fixup) 319 + if (pci->ops && pci->ops->cpu_addr_fixup) 320 320 cpu_addr = pci->ops->cpu_addr_fixup(pci, cpu_addr); 321 321 322 322 if (pci->iatu_unroll_enabled) { ··· 531 531 { 532 532 u32 val; 533 533 534 - if (pci->ops->link_up) 534 + if (pci->ops && pci->ops->link_up) 535 535 return pci->ops->link_up(pci); 536 536 537 537 val = readl(pci->dbi_base + PCIE_PORT_DEBUG1);