// Copyright 2020 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 dwc2_phy;

using fuchsia.designware.platform;
using fuchsia.hardware.usb.phy;
using fuchsia.platform;
using fuchsia.usb.phy;
using fuchsia.devicetree;


primary node "dwc2-phy" {
  if fuchsia.BIND_PROTOCOL == fuchsia.usb.phy.BIND_PROTOCOL.DEVICE {
    true;
  } else if fuchsia.hardware.usb.phy.Service == fuchsia.hardware.usb.phy.Service.DriverTransport {
    fuchsia.BIND_PLATFORM_DEV_VID == fuchsia.platform.BIND_PLATFORM_DEV_VID.GENERIC;
    fuchsia.BIND_PLATFORM_DEV_PID == fuchsia.platform.BIND_PLATFORM_DEV_PID.GENERIC;
    fuchsia.BIND_PLATFORM_DEV_DID == fuchsia.platform.BIND_PLATFORM_DEV_DID.USB_DWC2;
  } else {
    false;
  }
}

node "pdev" {
  fuchsia.BIND_PLATFORM_DEV_VID == fuchsia.platform.BIND_PLATFORM_DEV_VID.GENERIC;
  accept fuchsia.BIND_PLATFORM_DEV_DID {
    fuchsia.platform.BIND_PLATFORM_DEV_DID.USB_DWC2,
    fuchsia.platform.BIND_PLATFORM_DEV_DID.DEVICETREE,
  }
  if fuchsia.BIND_PLATFORM_DEV_DID == fuchsia.platform.BIND_PLATFORM_DEV_DID.DEVICETREE {
    fuchsia.devicetree.FIRST_COMPATIBLE == "snps,dwc2";
  } else {
    fuchsia.BIND_PROTOCOL == fuchsia.platform.BIND_PROTOCOL.DEVICE;
    fuchsia.BIND_PLATFORM_DEV_PID == fuchsia.platform.BIND_PLATFORM_DEV_PID.GENERIC;
    fuchsia.BIND_PLATFORM_DEV_INSTANCE_ID == 0;
  }
}
