PCI: layerscape: Add ls_pcie_msi_host_init()
[karo-tx-linux.git] / drivers / pci / host / pci-layerscape.c
index 0f6dd44..3923bed 100644 (file)
@@ -150,14 +150,37 @@ static void ls_pcie_host_init(struct pcie_port *pp)
        iowrite32(0, pcie->dbi + PCIE_DBI_RO_WR_EN);
 }
 
+static int ls_pcie_msi_host_init(struct pcie_port *pp,
+                                struct msi_controller *chip)
+{
+       struct device_node *msi_node;
+       struct device_node *np = pp->dev->of_node;
+
+       /*
+        * The MSI domain is set by the generic of_msi_configure().  This
+        * .msi_host_init() function keeps us from doing the default MSI
+        * domain setup in dw_pcie_host_init() and also enforces the
+        * requirement that "msi-parent" exists.
+        */
+       msi_node = of_parse_phandle(np, "msi-parent", 0);
+       if (!msi_node) {
+               dev_err(pp->dev, "failed to find msi-parent\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static struct pcie_host_ops ls1021_pcie_host_ops = {
        .link_up = ls1021_pcie_link_up,
        .host_init = ls1021_pcie_host_init,
+       .msi_host_init = ls_pcie_msi_host_init,
 };
 
 static struct pcie_host_ops ls_pcie_host_ops = {
        .link_up = ls_pcie_link_up,
        .host_init = ls_pcie_host_init,
+       .msi_host_init = ls_pcie_msi_host_init,
 };
 
 static struct ls_pcie_drvdata ls1021_drvdata = {