// Copyright 2021 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.

composite aml_video;

using fuchsia.amlogic.platform;
using fuchsia.clock;
using fuchsia.hardware.amlogiccanvas;
using fuchsia.hardware.clock;
using fuchsia.hardware.tee;
using fuchsia.platform;
using fuchsia.hardware.sysmem;
using fuchsia.devicetree;

primary node "pdev" {
  if fuchsia.BIND_PLATFORM_DEV_VID == fuchsia.platform.BIND_PLATFORM_DEV_VID.GENERIC {
    fuchsia.BIND_PLATFORM_DEV_DID == fuchsia.platform.BIND_PLATFORM_DEV_DID.DEVICETREE;
    accept fuchsia.devicetree.FIRST_COMPATIBLE {
      "amlogic,g12a-vdec",
      "amlogic,g12b-vdec",
    }
  } else {
    fuchsia.BIND_PROTOCOL == fuchsia.platform.BIND_PROTOCOL.DEVICE;
    fuchsia.BIND_PLATFORM_DEV_VID == fuchsia.amlogic.platform.BIND_PLATFORM_DEV_VID.AMLOGIC;
    fuchsia.BIND_PLATFORM_DEV_DID == fuchsia.amlogic.platform.BIND_PLATFORM_DEV_DID.VIDEO;
    accept fuchsia.BIND_PLATFORM_DEV_PID {
      fuchsia.amlogic.platform.BIND_PLATFORM_DEV_PID.T931,
      fuchsia.amlogic.platform.BIND_PLATFORM_DEV_PID.A311D,
      fuchsia.amlogic.platform.BIND_PLATFORM_DEV_PID.S905D2,
      fuchsia.amlogic.platform.BIND_PLATFORM_DEV_PID.S905D3,
    }
  }
}

node "sysmem" {
  fuchsia.hardware.sysmem.Service == fuchsia.hardware.sysmem.Service.ZirconTransport;
}

node "canvas" {
  fuchsia.hardware.amlogiccanvas.Service == fuchsia.hardware.amlogiccanvas.Service.ZirconTransport;
}

node "clock-dos-vdec" {
  fuchsia.hardware.clock.Service == fuchsia.hardware.clock.Service.ZirconTransport;
  fuchsia.clock.FUNCTION == fuchsia.clock.FUNCTION.DOS_GCLK_VDEC;
}

node "clock-dos" {
  fuchsia.hardware.clock.Service == fuchsia.hardware.clock.Service.ZirconTransport;
  fuchsia.clock.FUNCTION == fuchsia.clock.FUNCTION.DOS;
}

optional node "tee" {
  fuchsia.hardware.tee.Service == fuchsia.hardware.tee.Service.ZirconTransport;
}