diff options
author | Sergey Ryazanov <ryazanov.s.a@gmail.com> | 2014-10-29 03:18:47 +0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2014-11-24 07:45:28 +0100 |
commit | 3ed7a2a702dc0f5bc44d67f27a1a289356b5dc42 (patch) | |
tree | e6be54de91de364abe733cf1b6ebec18aaf48ca1 /arch/mips/include | |
parent | d58eaa7ffdcb58ab8bb95927149e2f152ec163c6 (diff) | |
download | op-kernel-dev-3ed7a2a702dc0f5bc44d67f27a1a289356b5dc42.zip op-kernel-dev-3ed7a2a702dc0f5bc44d67f27a1a289356b5dc42.tar.gz |
MIPS: ath25: add AR2315 PCI host controller driver
Add PCI host controller driver and DMA address calculation hook.
Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
Cc: Linux MIPS <linux-mips@linux-mips.org>
Patchwork: https://patchwork.linux-mips.org/patch/8246/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/include')
-rw-r--r-- | arch/mips/include/asm/mach-ath25/dma-coherence.h | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/arch/mips/include/asm/mach-ath25/dma-coherence.h b/arch/mips/include/asm/mach-ath25/dma-coherence.h index 8b3d0cc..d8009c9 100644 --- a/arch/mips/include/asm/mach-ath25/dma-coherence.h +++ b/arch/mips/include/asm/mach-ath25/dma-coherence.h @@ -12,22 +12,40 @@ #include <linux/device.h> +/* + * We need some arbitrary non-zero value to be programmed to the BAR1 register + * of PCI host controller to enable DMA. The same value should be used as the + * offset to calculate the physical address of DMA buffer for PCI devices. + */ +#define AR2315_PCI_HOST_SDRAM_BASEADDR 0x20000000 + +static inline dma_addr_t ath25_dev_offset(struct device *dev) +{ +#ifdef CONFIG_PCI + extern struct bus_type pci_bus_type; + + if (dev && dev->bus == &pci_bus_type) + return AR2315_PCI_HOST_SDRAM_BASEADDR; +#endif + return 0; +} + static inline dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size) { - return virt_to_phys(addr); + return virt_to_phys(addr) + ath25_dev_offset(dev); } static inline dma_addr_t plat_map_dma_mem_page(struct device *dev, struct page *page) { - return page_to_phys(page); + return page_to_phys(page) + ath25_dev_offset(dev); } static inline unsigned long plat_dma_addr_to_phys(struct device *dev, dma_addr_t dma_addr) { - return dma_addr; + return dma_addr - ath25_dev_offset(dev); } static inline void |