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

#ifndef SRC_DEVICES_USB_DRIVERS_USB_BUS_USB_BUS_H_
#define SRC_DEVICES_USB_DRIVERS_USB_BUS_USB_BUS_H_

#include <ddktl/device.h>
#include <ddktl/protocol/usb/bus.h>
#include <ddktl/protocol/usb/hci.h>
#include <fbl/array.h>
#include <fbl/ref_ptr.h>

namespace usb_bus {

class UsbBus;
class UsbDevice;
using UsbBusType = ddk::Device<UsbBus, ddk::UnbindableDeprecated>;

class UsbBus : public UsbBusType,
               public ddk::UsbBusProtocol<UsbBus, ddk::base_protocol>,
               public ddk::UsbBusInterfaceProtocol<UsbBus> {
 public:
  UsbBus(zx_device_t* parent) : UsbBusType(parent), hci_(parent) {}

  static zx_status_t Create(void* ctx, zx_device_t* parent);

  // Device protocol implementation.
  void DdkUnbindDeprecated();
  void DdkRelease();

  // USB Bus protocol implementation.
  zx_status_t UsbBusConfigureHub(zx_device_t* hub_device, usb_speed_t speed,
                                 const usb_hub_descriptor_t* desc, bool multi_tt);
  zx_status_t UsbBusDeviceAdded(zx_device_t* hub_device, uint32_t port, usb_speed_t speed);
  zx_status_t UsbBusDeviceRemoved(zx_device_t* hub_device, uint32_t port);
  zx_status_t UsbBusSetHubInterface(zx_device_t* usb_device,
                                    const usb_hub_interface_protocol_t* hub);

  // USB Bus interface implementation.
  zx_status_t UsbBusInterfaceAddDevice(uint32_t device_id, uint32_t hub_id, usb_speed_t speed);
  zx_status_t UsbBusInterfaceRemoveDevice(uint32_t device_id);
  zx_status_t UsbBusInterfaceResetPort(uint32_t hub_id, uint32_t port, bool enumerating);
  zx_status_t UsbBusInterfaceReinitializeDevice(uint32_t device_id);

 private:
  DISALLOW_COPY_ASSIGN_AND_MOVE(UsbBus);

  zx_status_t Init();

  zx_status_t GetDeviceId(zx_device_t* device, uint32_t* out);

  // Our parent's HCI protocol.
  const ddk::UsbHciProtocolClient hci_;
  // Array of all our USB devices.
  fbl::Array<fbl::RefPtr<UsbDevice>> devices_;
};

}  // namespace usb_bus

#endif  // SRC_DEVICES_USB_DRIVERS_USB_BUS_USB_BUS_H_
