base-files: define yes/no as valid boolean options
[openwrt.git] / target / linux / mvebu / patches-3.10 / 0078-PCI-mvebu-add-support-for-MSI.patch
1 From be448338edda73460dc3e8c005b17edddf1c1b4f Mon Sep 17 00:00:00 2001
2 From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
3 Date: Thu, 6 Jun 2013 18:27:16 +0200
4 Subject: [PATCH 078/203] PCI: mvebu: add support for MSI
5
6 This commit adds support for Message Signaled Interrupts in the
7 Marvell PCIe host controller. The work is very simple: it simply gets
8 a reference to the msi_chip associated to the PCIe controller thanks
9 to the msi-parent DT property, and stores this reference in the
10 pci_bus structure. This is enough to let the Linux PCI core use the
11 functions of msi_chip to setup and teardown MSIs.
12
13 Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
14 Reviewed-by: Thierry Reding <thierry.reding@gmail.com>
15 Acked-by: Bjorn Helgaas <bhelgaas@google.com>
16 ---
17  .../devicetree/bindings/pci/mvebu-pci.txt          |  3 +++
18  drivers/pci/host/pci-mvebu.c                       | 26 ++++++++++++++++++++++
19  2 files changed, 29 insertions(+)
20
21 --- a/Documentation/devicetree/bindings/pci/mvebu-pci.txt
22 +++ b/Documentation/devicetree/bindings/pci/mvebu-pci.txt
23 @@ -14,6 +14,8 @@ Mandatory properties:
24    interfaces, and ranges describing the MBus windows needed to access
25    the memory and I/O regions of each PCIe interface.
26  
27 +- msi-parent: Link to the hardware entity that serves as the Message
28 +  Signaled Interrupt controller for this PCI controller.
29  The ranges describing the MMIO registers have the following layout:
30  
31      0x82000000 0 r MBUS_ID(0xf0, 0x01) r 0 s
32 @@ -85,6 +87,7 @@ pcie-controller {
33         #size-cells = <2>;
34  
35         bus-range = <0x00 0xff>;
36 +       msi-parent = <&mpic>;
37  
38         ranges =
39                <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000   /* Port 0.0 registers */
40 --- a/drivers/pci/host/pci-mvebu.c
41 +++ b/drivers/pci/host/pci-mvebu.c
42 @@ -11,6 +11,7 @@
43  #include <linux/clk.h>
44  #include <linux/module.h>
45  #include <linux/mbus.h>
46 +#include <linux/msi.h>
47  #include <linux/slab.h>
48  #include <linux/platform_device.h>
49  #include <linux/of_address.h>
50 @@ -103,6 +104,7 @@ struct mvebu_pcie_port;
51  struct mvebu_pcie {
52         struct platform_device *pdev;
53         struct mvebu_pcie_port *ports;
54 +       struct msi_chip *msi;
55         struct resource io;
56         struct resource realio;
57         struct resource mem;
58 @@ -673,6 +675,12 @@ static struct pci_bus *mvebu_pcie_scan_b
59         return bus;
60  }
61  
62 +void mvebu_pcie_add_bus(struct pci_bus *bus)
63 +{
64 +       struct mvebu_pcie *pcie = sys_to_pcie(bus->sysdata);
65 +       bus->msi = pcie->msi;
66 +}
67 +
68  resource_size_t mvebu_pcie_align_resource(struct pci_dev *dev,
69                                           const struct resource *res,
70                                           resource_size_t start,
71 @@ -709,6 +717,7 @@ static void __init mvebu_pcie_enable(str
72         hw.map_irq        = mvebu_pcie_map_irq;
73         hw.ops            = &mvebu_pcie_ops;
74         hw.align_resource = mvebu_pcie_align_resource;
75 +       hw.add_bus        = mvebu_pcie_add_bus;
76  
77         pci_common_init(&hw);
78  }
79 @@ -733,6 +742,21 @@ mvebu_pcie_map_registers(struct platform
80         return devm_request_and_ioremap(&pdev->dev, &regs);
81  }
82  
83 +static void __init mvebu_pcie_msi_enable(struct mvebu_pcie *pcie)
84 +{
85 +       struct device_node *msi_node;
86 +
87 +       msi_node = of_parse_phandle(pcie->pdev->dev.of_node,
88 +                                   "msi-parent", 0);
89 +       if (!msi_node)
90 +               return;
91 +
92 +       pcie->msi = of_pci_find_msi_chip_by_node(msi_node);
93 +
94 +       if (pcie->msi)
95 +               pcie->msi->dev = &pcie->pdev->dev;
96 +}
97 +
98  #define DT_FLAGS_TO_TYPE(flags)       (((flags) >> 24) & 0x03)
99  #define    DT_TYPE_IO                 0x1
100  #define    DT_TYPE_MEM32              0x2
101 @@ -911,6 +935,8 @@ static int __init mvebu_pcie_probe(struc
102                 i++;
103         }
104  
105 +       mvebu_pcie_msi_enable(pcie);
106 +
107         mvebu_pcie_enable(pcie);
108  
109         return 0;