aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mvebu/patches-3.10/0073-of-pci-add-registry-of-MSI-chips.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mvebu/patches-3.10/0073-of-pci-add-registry-of-MSI-chips.patch')
-rw-r--r--target/linux/mvebu/patches-3.10/0073-of-pci-add-registry-of-MSI-chips.patch106
1 files changed, 106 insertions, 0 deletions
diff --git a/target/linux/mvebu/patches-3.10/0073-of-pci-add-registry-of-MSI-chips.patch b/target/linux/mvebu/patches-3.10/0073-of-pci-add-registry-of-MSI-chips.patch
new file mode 100644
index 0000000000..641b8d1701
--- /dev/null
+++ b/target/linux/mvebu/patches-3.10/0073-of-pci-add-registry-of-MSI-chips.patch
@@ -0,0 +1,106 @@
+From a05852e828063b6731fcac543b87367c137c16f8 Mon Sep 17 00:00:00 2001
+From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Date: Thu, 6 Jun 2013 18:21:18 +0200
+Subject: [PATCH 073/203] of: pci: add registry of MSI chips
+
+This commit adds a very basic registry of msi_chip structures, so that
+an IRQ controller driver can register an msi_chip, and a PCIe host
+controller can find it, based on a 'struct device_node'.
+
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Acked-by: Rob Herring <rob.herring@calxeda.com>
+---
+ drivers/of/of_pci.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ include/linux/msi.h | 2 ++
+ include/linux/of_pci.h | 12 ++++++++++++
+ 3 files changed, 59 insertions(+)
+
+--- a/drivers/of/of_pci.c
++++ b/drivers/of/of_pci.c
+@@ -89,3 +89,48 @@ int of_pci_parse_bus_range(struct device
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(of_pci_parse_bus_range);
++
++#ifdef CONFIG_PCI_MSI
++
++static LIST_HEAD(of_pci_msi_chip_list);
++static DEFINE_MUTEX(of_pci_msi_chip_mutex);
++
++int of_pci_msi_chip_add(struct msi_chip *chip)
++{
++ if (!of_property_read_bool(chip->of_node, "msi-controller"))
++ return -EINVAL;
++
++ mutex_lock(&of_pci_msi_chip_mutex);
++ list_add(&chip->list, &of_pci_msi_chip_list);
++ mutex_unlock(&of_pci_msi_chip_mutex);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(of_pci_msi_chip_add);
++
++void of_pci_msi_chip_remove(struct msi_chip *chip)
++{
++ mutex_lock(&of_pci_msi_chip_mutex);
++ list_del(&chip->list);
++ mutex_unlock(&of_pci_msi_chip_mutex);
++}
++EXPORT_SYMBOL_GPL(of_pci_msi_chip_remove);
++
++struct msi_chip *of_pci_find_msi_chip_by_node(struct device_node *of_node)
++{
++ struct msi_chip *c;
++
++ mutex_lock(&of_pci_msi_chip_mutex);
++ list_for_each_entry(c, &of_pci_msi_chip_list, list) {
++ if (c->of_node == of_node) {
++ mutex_unlock(&of_pci_msi_chip_mutex);
++ return c;
++ }
++ }
++ mutex_unlock(&of_pci_msi_chip_mutex);
++
++ return NULL;
++}
++EXPORT_SYMBOL_GPL(of_pci_find_msi_chip_by_node);
++
++#endif /* CONFIG_PCI_MSI */
+--- a/include/linux/msi.h
++++ b/include/linux/msi.h
+@@ -67,6 +67,8 @@ void default_restore_msi_irqs(struct pci
+ struct msi_chip {
+ struct module *owner;
+ struct device *dev;
++ struct device_node *of_node;
++ struct list_head list;
+
+ int (*setup_irq)(struct msi_chip *chip, struct pci_dev *dev,
+ struct msi_desc *desc);
+--- a/include/linux/of_pci.h
++++ b/include/linux/of_pci.h
+@@ -2,6 +2,7 @@
+ #define __OF_PCI_H
+
+ #include <linux/pci.h>
++#include <linux/msi.h>
+
+ struct pci_dev;
+ struct of_irq;
+@@ -13,4 +14,15 @@ struct device_node *of_pci_find_child_de
+ int of_pci_get_devfn(struct device_node *np);
+ int of_pci_parse_bus_range(struct device_node *node, struct resource *res);
+
++#if defined(CONFIG_OF) && defined(CONFIG_PCI_MSI)
++int of_pci_msi_chip_add(struct msi_chip *chip);
++void of_pci_msi_chip_remove(struct msi_chip *chip);
++struct msi_chip *of_pci_find_msi_chip_by_node(struct device_node *of_node);
++#else
++static inline int of_pci_msi_chip_add(struct msi_chip *chip) { return -EINVAL; }
++static inline void of_pci_msi_chip_remove(struct msi_chip *chip) { }
++static inline struct msi_chip *
++of_pci_find_msi_chip_by_node(struct device_node *of_node) { return NULL; }
++#endif
++
+ #endif