[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);