[vim][display] Move out display driver from top level board driver

TEST- Connect to HDMI monitor to see if display works
Change-Id: Ib4089d5642641791b08db89e283a155ea650cf47
diff --git a/system/dev/board/vim/rules.mk b/system/dev/board/vim/rules.mk
index 9c0fbc8..e06a5b7 100644
--- a/system/dev/board/vim/rules.mk
+++ b/system/dev/board/vim/rules.mk
@@ -20,6 +20,7 @@
     $(LOCAL_DIR)/vim-eth.c \
     $(LOCAL_DIR)/vim-thermal.c \
     $(LOCAL_DIR)/vim-mailbox.c \
+    $(LOCAL_DIR)/vim-display.c \
 
 MODULE_STATIC_LIBS := \
     system/ulib/ddk \
diff --git a/system/dev/board/vim/vim-display.c b/system/dev/board/vim/vim-display.c
new file mode 100644
index 0000000..ae34ab2
--- /dev/null
+++ b/system/dev/board/vim/vim-display.c
@@ -0,0 +1,89 @@
+// Copyright 2018 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <ddk/debug.h>
+#include <ddk/device.h>
+#include <ddk/protocol/platform-bus.h>
+#include <ddk/protocol/platform-defs.h>
+#include <soc/aml-s912/s912-hw.h>
+#include <soc/aml-s912/s912-gpio.h>
+#include "vim.h"
+
+// DMC MMIO for display driver
+static pbus_mmio_t vim_display_mmios[] = {
+    {
+        .base =     S912_PRESET_BASE,
+        .length =   S912_PRESET_LENGTH,
+    },
+    {
+        .base =     S912_HDMITX_BASE,
+        .length =   S912_HDMITX_LENGTH,
+    },
+    {
+        .base =     S912_HIU_BASE,
+        .length =   S912_HIU_LENGTH,
+    },
+    {
+        .base =     S912_VPU_BASE,
+        .length =   S912_VPU_LENGTH,
+    },
+    {
+        .base =     S912_HDMITX_SEC_BASE,
+        .length =   S912_HDMITX_SEC_LENGTH,
+    },
+    {
+        .base =     S912_DMC_REG_BASE,
+        .length =   S912_DMC_REG_LENGTH,
+    },
+    {
+        .base =     S912_CBUS_REG_BASE,
+        .length =   S912_CBUS_REG_LENGTH,
+    },
+};
+
+const pbus_gpio_t vim_display_gpios[] = {
+    {
+        // HPD
+        .gpio = S912_GPIOH(0),
+    },
+};
+
+static const pbus_irq_t vim_display_irqs[] = {
+    {
+        .irq = S912_VIU1_VSYNC_IRQ,
+        .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
+    },
+};
+
+static const pbus_bti_t vim_display_btis[] = {
+    {
+        .iommu_index = 0,
+        .bti_id = BTI_DISPLAY,
+    },
+};
+
+static const pbus_dev_t display_dev = {
+    .name = "display",
+    .vid = PDEV_VID_KHADAS,
+    .pid = PDEV_PID_VIM2,
+    .did = PDEV_DID_VIM_DISPLAY,
+    .mmios = vim_display_mmios,
+    .mmio_count = countof(vim_display_mmios),
+    .gpios = vim_display_gpios,
+    .gpio_count = countof(vim_display_gpios),
+    .irqs = vim_display_irqs,
+    .irq_count = countof(vim_display_irqs),
+    .btis = vim_display_btis,
+    .bti_count = countof(vim_display_btis),
+};
+
+zx_status_t vim_display_init(vim_bus_t* bus) {
+    zx_status_t status;
+    if ((status = pbus_device_add(&bus->pbus, &display_dev, 0)) != ZX_OK) {
+        zxlogf(ERROR, "vim_display_init: pbus_device_add() failed for display: %d\n", status);
+        return status;
+    }
+
+    return ZX_OK;
+}
diff --git a/system/dev/board/vim/vim.c b/system/dev/board/vim/vim.c
index 1ec0954..c4e6870 100644
--- a/system/dev/board/vim/vim.c
+++ b/system/dev/board/vim/vim.c
@@ -20,7 +20,6 @@
 #include <hw/reg.h>
 
 #include <soc/aml-s912/s912-hw.h>
-#include <soc/aml-s912/s912-gpio.h>
 
 #include <zircon/assert.h>
 #include <zircon/process.h>
@@ -29,74 +28,6 @@
 
 #include "vim.h"
 
-// DMC MMIO for display driver
-static pbus_mmio_t vim_display_mmios[] = {
-    {
-        .base =     S912_PRESET_BASE,
-        .length =   S912_PRESET_LENGTH,
-    },
-    {
-        .base =     S912_HDMITX_BASE,
-        .length =   S912_HDMITX_LENGTH,
-    },
-    {
-        .base =     S912_HIU_BASE,
-        .length =   S912_HIU_LENGTH,
-    },
-    {
-        .base =     S912_VPU_BASE,
-        .length =   S912_VPU_LENGTH,
-    },
-    {
-        .base =     S912_HDMITX_SEC_BASE,
-        .length =   S912_HDMITX_SEC_LENGTH,
-    },
-    {
-        .base =     S912_DMC_REG_BASE,
-        .length =   S912_DMC_REG_LENGTH,
-    },
-    {
-        .base =     S912_CBUS_REG_BASE,
-        .length =   S912_CBUS_REG_LENGTH,
-    },
-};
-
-const pbus_gpio_t vim_display_gpios[] = {
-    {
-        // HPD
-        .gpio = S912_GPIOH(0),
-    },
-};
-
-static const pbus_irq_t vim_display_irqs[] = {
-    {
-        .irq = S912_VIU1_VSYNC_IRQ,
-        .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
-    },
-};
-
-static const pbus_bti_t vim_display_btis[] = {
-    {
-        .iommu_index = 0,
-        .bti_id = BTI_DISPLAY,
-    },
-};
-
-static const pbus_dev_t display_dev = {
-    .name = "display",
-    .vid = PDEV_VID_KHADAS,
-    .pid = PDEV_PID_VIM2,
-    .did = PDEV_DID_VIM_DISPLAY,
-    .mmios = vim_display_mmios,
-    .mmio_count = countof(vim_display_mmios),
-    .gpios = vim_display_gpios,
-    .gpio_count = countof(vim_display_gpios),
-    .irqs = vim_display_irqs,
-    .irq_count = countof(vim_display_irqs),
-    .btis = vim_display_btis,
-    .bti_count = countof(vim_display_btis),
-};
-
 static void vim_bus_release(void* ctx) {
     vim_bus_t* bus = ctx;
     free(bus);
@@ -230,13 +161,14 @@
         zxlogf(ERROR, "vim2_mailbox_init failed: %d\n", status);
         goto fail;
     }
+
     if ((status = vim2_thermal_init(bus)) != ZX_OK) {
         zxlogf(ERROR, "vim2_thermal_init failed: %d\n", status);
         goto fail;
     }
 
-    if ((status = pbus_device_add(&bus->pbus, &display_dev, 0)) != ZX_OK) {
-        zxlogf(ERROR, "vim_start_thread could not add display_dev: %d\n", status);
+    if ((status = vim_display_init(bus)) != ZX_OK) {
+        zxlogf(ERROR, "vim_display_init failed: %d\n", status);
         goto fail;
     }
 
diff --git a/system/dev/board/vim/vim.h b/system/dev/board/vim/vim.h
index f29b17e..2e02443 100644
--- a/system/dev/board/vim/vim.h
+++ b/system/dev/board/vim/vim.h
@@ -66,3 +66,6 @@
 
 // vim-mailbox.c
 zx_status_t vim2_mailbox_init(vim_bus_t* bus);
+
+// vim-display.c
+zx_status_t vim_display_init(vim_bus_t* bus);