* driver.
  */
 
+#include <linux/device.h>
 #include <linux/errno.h>
 #include <linux/list.h>
 #include <linux/module.h>
                kfree(desc);
        }
 }
+
+/**
+ * of_msi_configure - Set the msi_domain field of a device
+ * @dev: device structure to associate with an MSI irq domain
+ * @np: device node for that device
+ */
+void of_msi_configure(struct device *dev, struct device_node *np)
+{
+       struct device_node *msi_np;
+       struct irq_domain *d;
+
+       msi_np = of_parse_phandle(np, "msi-parent", 0);
+       if (!msi_np)
+               return;
+
+       d = irq_find_matching_host(msi_np, DOMAIN_BUS_PLATFORM_MSI);
+       if (!d)
+               d = irq_find_host(msi_np);
+       dev_set_msi_domain(dev, d);
+}
 
        dev->dev.bus = &platform_bus_type;
        dev->dev.platform_data = platform_data;
        of_dma_configure(&dev->dev, dev->dev.of_node);
+       of_msi_configure(&dev->dev, dev->dev.of_node);
 
        if (of_device_add(dev) != 0) {
                of_dma_deconfigure(&dev->dev);
 
  */
 extern unsigned int irq_of_parse_and_map(struct device_node *node, int index);
 extern struct device_node *of_irq_find_parent(struct device_node *child);
+extern void of_msi_configure(struct device *dev, struct device_node *np);
 
 #else /* !CONFIG_OF */
 static inline unsigned int irq_of_parse_and_map(struct device_node *dev,