#include <linux/completion.h>
 #include <linux/hyperv.h>
 #include <linux/kernel_stat.h>
+#include <linux/of_address.h>
 #include <linux/clockchips.h>
 #include <linux/cpu.h>
 #include <linux/sched/isolation.h>
        device_unregister(&device_obj->device);
 }
 
-
+#ifdef CONFIG_ACPI
 /*
  * VMBUS is an acpi enumerated device. Get the information we
  * need from DSDT.
 
        return AE_OK;
 }
+#endif
 
 static void vmbus_mmio_remove(void)
 {
        }
 }
 
-static void vmbus_reserve_fb(void)
+static void __maybe_unused vmbus_reserve_fb(void)
 {
        resource_size_t start = 0, size;
        struct pci_dev *pdev;
 }
 EXPORT_SYMBOL_GPL(vmbus_free_mmio);
 
+#ifdef CONFIG_ACPI
 static int vmbus_acpi_add(struct platform_device *pdev)
 {
        acpi_status result;
                vmbus_mmio_remove();
        return ret_val;
 }
+#else
+static int vmbus_acpi_add(struct platform_device *pdev)
+{
+       return 0;
+}
+#endif
+
+static int vmbus_device_add(struct platform_device *pdev)
+{
+       struct resource **cur_res = &hyperv_mmio;
+       struct of_range range;
+       struct of_range_parser parser;
+       struct device_node *np = pdev->dev.of_node;
+       int ret;
+
+       hv_dev = &pdev->dev;
+
+       ret = of_range_parser_init(&parser, np);
+       if (ret)
+               return ret;
+
+       for_each_of_range(&parser, &range) {
+               struct resource *res;
+
+               res = kzalloc(sizeof(*res), GFP_KERNEL);
+               if (!res) {
+                       vmbus_mmio_remove();
+                       return -ENOMEM;
+               }
+
+               res->name = "hyperv mmio";
+               res->flags = range.flags;
+               res->start = range.cpu_addr;
+               res->end = range.cpu_addr + range.size;
+
+               *cur_res = res;
+               cur_res = &res->sibling;
+       }
+
+       return ret;
+}
 
 static int vmbus_platform_driver_probe(struct platform_device *pdev)
 {
-       return vmbus_acpi_add(pdev);
+       if (acpi_disabled)
+               return vmbus_device_add(pdev);
+       else
+               return vmbus_acpi_add(pdev);
 }
 
 static int vmbus_platform_driver_remove(struct platform_device *pdev)
 #define vmbus_bus_resume NULL
 #endif /* CONFIG_PM_SLEEP */
 
-static const struct acpi_device_id vmbus_acpi_device_ids[] = {
+static const __maybe_unused struct of_device_id vmbus_of_match[] = {
+       {
+               .compatible = "microsoft,vmbus",
+       },
+       {
+               /* sentinel */
+       },
+};
+MODULE_DEVICE_TABLE(of, vmbus_of_match);
+
+static const __maybe_unused struct acpi_device_id vmbus_acpi_device_ids[] = {
        {"VMBUS", 0},
        {"VMBus", 0},
        {"", 0},
        .driver = {
                .name = "vmbus",
                .acpi_match_table = ACPI_PTR(vmbus_acpi_device_ids),
+               .of_match_table = of_match_ptr(vmbus_of_match),
                .pm = &vmbus_bus_pm,
                .probe_type = PROBE_FORCE_SYNCHRONOUS,
        }