diff options
| author | Daniel Axtens | 2015-03-31 07:00:42 +0200 | 
|---|---|---|
| committer | Michael Ellerman | 2015-04-11 12:49:11 +0200 | 
| commit | e02def5bce12b472e9eb6dcdd9f7af72239e6330 (patch) | |
| tree | 9878fe07343f450446e63976d80a8cb50bc8b4de /arch/powerpc | |
| parent | powerpc: pcibios_enable_device_hook: return bool rather than int (diff) | |
| download | kernel-qcow2-linux-e02def5bce12b472e9eb6dcdd9f7af72239e6330.tar.gz kernel-qcow2-linux-e02def5bce12b472e9eb6dcdd9f7af72239e6330.tar.xz kernel-qcow2-linux-e02def5bce12b472e9eb6dcdd9f7af72239e6330.zip | |
powerpc: Create pci_controller_ops.dma_dev_setup and shim
Introduces the pci_controller_ops structure.
Add pci_controller_ops.dma_dev_setup, shadowing ppc_md.pci_dma_dev_setup.
Add a shim, and change the callsites to use the shim.
Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc')
| -rw-r--r-- | arch/powerpc/include/asm/pci-bridge.h | 21 | ||||
| -rw-r--r-- | arch/powerpc/kernel/pci-common.c | 3 | 
2 files changed, 22 insertions, 2 deletions
| diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h index 2c6dc2a3d14a..0f441b8e1ea1 100644 --- a/arch/powerpc/include/asm/pci-bridge.h +++ b/arch/powerpc/include/asm/pci-bridge.h @@ -15,6 +15,13 @@  struct device_node;  /* + * PCI controller operations + */ +struct pci_controller_ops { +	void		(*dma_dev_setup)(struct pci_dev *dev); +}; + +/*   * Structure of a PCI controller (host bridge)   */  struct pci_controller { @@ -46,6 +53,7 @@ struct pci_controller {  	resource_size_t	isa_mem_phys;  	resource_size_t	isa_mem_size; +	struct pci_controller_ops controller_ops;  	struct pci_ops *ops;  	unsigned int __iomem *cfg_addr;  	void __iomem *cfg_data; @@ -260,5 +268,18 @@ static inline int pcibios_vaddr_is_ioport(void __iomem *address)  }  #endif	/* CONFIG_PCI */ +/* + * Shims to prefer pci_controller version over ppc_md where available. + */ +static inline void pci_dma_dev_setup(struct pci_dev *dev) +{ +	struct pci_controller *phb = pci_bus_to_host(dev->bus); + +	if (phb->controller_ops.dma_dev_setup) +		phb->controller_ops.dma_dev_setup(dev); +	else if (ppc_md.pci_dma_dev_setup) +		ppc_md.pci_dma_dev_setup(dev); +} +  #endif	/* __KERNEL__ */  #endif	/* _ASM_POWERPC_PCI_BRIDGE_H */ diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 17827c7345a7..7e3757e403d4 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -969,8 +969,7 @@ static void pcibios_setup_device(struct pci_dev *dev)  	set_dma_offset(&dev->dev, PCI_DRAM_OFFSET);  	/* Additional platform DMA/iommu setup */ -	if (ppc_md.pci_dma_dev_setup) -		ppc_md.pci_dma_dev_setup(dev); +	pci_dma_dev_setup(dev);  	/* Read default IRQs and fixup if necessary */  	pci_read_irq_line(dev); | 
