Some chipsets use the function 0 for DMA on other functions of a multifunctional device. One of the example is Intel EG20T PCH. This is also applicable to Lynxpoint PCH when LPSS devices are switched to PCI mode. This patch exports a useful helper to get a device of the DMA. This device is needed to request a DMA channel from a proper controller. Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> --- drivers/pci/quirks.c | 2 +- include/linux/pci.h | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 80c2d01..8352e5b 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -3517,7 +3517,7 @@ static struct pci_dev *pci_func_0_dma_source(struct pci_dev *dev) if (!PCI_FUNC(dev->devfn)) return pci_dev_get(dev); - return pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn), 0)); + return pci_get_dma_device(dev); } static const struct pci_dev_dma_source { diff --git a/include/linux/pci.h b/include/linux/pci.h index 61978a4..86caab7 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1575,6 +1575,15 @@ static inline int pci_dev_specific_acs_enabled(struct pci_dev *dev, static inline void pci_dev_specific_enable_acs(struct pci_dev *dev) { } #endif +/* + * Some chipsets use the function 0 for DMA on other functions of a + * multifunctional device. + */ +static inline struct pci_dev *pci_get_dma_device(struct pci_dev *dev) +{ + return pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn), 0)); +} + void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen); void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr); void __iomem * const *pcim_iomap_table(struct pci_dev *pdev); -- 2.0.1 -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html