aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMurali Karicheri <m-karicheri2@ti.com>2015-03-03 12:52:12 -0500
committerBjorn Helgaas <bhelgaas@google.com>2015-03-03 15:42:57 -0500
commitc49b8fc26e115a37eca6f7bcef1847eb80f2a4fd (patch)
tree95916406a9b7ac4bc063310e57df30bb6acbfdde
parent6675a601d72be408025e675599702e30a99188aa (diff)
of/pci: Add of_pci_dma_configure() to update DMA configuration
Add of_pci_dma_configure() to allow updating the DMA configuration of the PCI device using the configuration from DT of the parent of the root bridge device. Use the newly added APIs pci_get/put_host_bridge_device() for implementing this. [bhelgaas: fold in fix for host bridges with no parent OF device] Tested-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> (AMD Seattle) Signed-off-by: Murali Karicheri <m-karicheri2@ti.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Acked-by: Rob Herring <robh+dt@kernel.org> Acked-by: Will Deacon <will.deacon@arm.com> CC: Joerg Roedel <joro@8bytes.org> CC: Grant Likely <grant.likely@linaro.org> CC: Russell King <linux@arm.linux.org.uk> CC: Arnd Bergmann <arnd@arndb.de>
-rw-r--r--drivers/of/of_pci.c21
-rw-r--r--include/linux/of_pci.h3
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
index 62426d81a4d6..5751dc5b6494 100644
--- a/drivers/of/of_pci.c
+++ b/drivers/of/of_pci.c
@@ -2,6 +2,7 @@
2#include <linux/export.h> 2#include <linux/export.h>
3#include <linux/of.h> 3#include <linux/of.h>
4#include <linux/of_address.h> 4#include <linux/of_address.h>
5#include <linux/of_device.h>
5#include <linux/of_pci.h> 6#include <linux/of_pci.h>
6#include <linux/slab.h> 7#include <linux/slab.h>
7 8
@@ -116,6 +117,26 @@ int of_get_pci_domain_nr(struct device_node *node)
116} 117}
117EXPORT_SYMBOL_GPL(of_get_pci_domain_nr); 118EXPORT_SYMBOL_GPL(of_get_pci_domain_nr);
118 119
120/**
121 * of_pci_dma_configure - Setup DMA configuration
122 * @dev: ptr to pci_dev struct of the PCI device
123 *
124 * Function to update PCI devices's DMA configuration using the same
125 * info from the OF node of host bridge's parent (if any).
126 */
127void of_pci_dma_configure(struct pci_dev *pci_dev)
128{
129 struct device *dev = &pci_dev->dev;
130 struct device *bridge = pci_get_host_bridge_device(pci_dev);
131
132 if (!bridge->parent)
133 return;
134
135 of_dma_configure(dev, bridge->parent->of_node);
136 pci_put_host_bridge_device(bridge);
137}
138EXPORT_SYMBOL_GPL(of_pci_dma_configure);
139
119#if defined(CONFIG_OF_ADDRESS) 140#if defined(CONFIG_OF_ADDRESS)
120/** 141/**
121 * of_pci_get_host_bridge_resources - Parse PCI host bridge resources from DT 142 * of_pci_get_host_bridge_resources - Parse PCI host bridge resources from DT
diff --git a/include/linux/of_pci.h b/include/linux/of_pci.h
index ce0e5abeb454..29fd3fe1c035 100644
--- a/include/linux/of_pci.h
+++ b/include/linux/of_pci.h
@@ -16,6 +16,7 @@ int of_pci_get_devfn(struct device_node *np);
16int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin); 16int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin);
17int of_pci_parse_bus_range(struct device_node *node, struct resource *res); 17int of_pci_parse_bus_range(struct device_node *node, struct resource *res);
18int of_get_pci_domain_nr(struct device_node *node); 18int of_get_pci_domain_nr(struct device_node *node);
19void of_pci_dma_configure(struct pci_dev *pci_dev);
19#else 20#else
20static inline int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq) 21static inline int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq)
21{ 22{
@@ -50,6 +51,8 @@ of_get_pci_domain_nr(struct device_node *node)
50{ 51{
51 return -1; 52 return -1;
52} 53}
54
55static inline void of_pci_dma_configure(struct pci_dev *pci_dev) { }
53#endif 56#endif
54 57
55#if defined(CONFIG_OF_ADDRESS) 58#if defined(CONFIG_OF_ADDRESS)