// Copyright 2022 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_AML_USB_PHY_USB_PHY3_REGS_H_
#define SRC_DEVICES_USB_DRIVERS_AML_USB_PHY_USB_PHY3_REGS_H_

#include <lib/mmio/mmio.h>
#include <zircon/types.h>

#include <hwreg/bitfields.h>

namespace aml_usb_phy {

constexpr uint32_t PHY3_R1_OFFSET = 0x4;
constexpr uint32_t PHY3_R2_OFFSET = 0x8;
constexpr uint32_t PHY3_R4_OFFSET = 0x10;
constexpr uint32_t PHY3_R5_OFFSET = 0x14;

class PHY3_R1 : public hwreg::RegisterBase<PHY3_R1, uint32_t> {
 public:
  DEF_FIELD(4, 0, phy_tx1_term_offset);
  DEF_FIELD(9, 5, phy_tx0_term_offset);
  DEF_FIELD(12, 10, phy_rx1_eq);
  DEF_FIELD(15, 13, phy_rx0_eq);
  DEF_FIELD(20, 16, phy_los_level);
  DEF_FIELD(23, 21, phy_los_bias);
  DEF_BIT(24, phy_ref_clkdiv2);
  DEF_FIELD(31, 25, phy_mpll_multiplier);
  static auto Get() { return hwreg::RegisterAddr<PHY3_R1>(PHY3_R1_OFFSET); }
};

class PHY3_R2 : public hwreg::RegisterBase<PHY3_R2, uint32_t> {
 public:
  DEF_FIELD(5, 0, pcs_tx_deemph_gen2_6db);
  DEF_FIELD(11, 6, pcs_tx_deemph_gen2_3p5db);
  DEF_FIELD(17, 12, pcs_tx_deemph_gen1);
  DEF_FIELD(20, 18, phy_tx_vboost_lvl);
  DEF_FIELD(31, 21, reserved);
  static auto Get() { return hwreg::RegisterAddr<PHY3_R2>(PHY3_R2_OFFSET); }
};

class PHY3_R4 : public hwreg::RegisterBase<PHY3_R4, uint32_t> {
 public:
  DEF_BIT(0, phy_cr_write);
  DEF_BIT(1, phy_cr_read);
  DEF_FIELD(17, 2, phy_cr_data_in);
  DEF_BIT(18, phy_cr_cap_data);
  DEF_BIT(19, phy_cr_cap_addr);
  DEF_FIELD(31, 20, reserved);
  static auto Get() { return hwreg::RegisterAddr<PHY3_R4>(PHY3_R4_OFFSET); }
};

class PHY3_R5 : public hwreg::RegisterBase<PHY3_R5, uint32_t> {
 public:
  DEF_FIELD(15, 0, phy_cr_data_out);
  DEF_BIT(16, phy_cr_ack);
  DEF_BIT(17, phy_bs_out);
  DEF_FIELD(31, 18, reserved);
  static auto Get() { return hwreg::RegisterAddr<PHY3_R5>(PHY3_R5_OFFSET); }
};

}  // namespace aml_usb_phy

#endif  // SRC_DEVICES_USB_DRIVERS_AML_USB_PHY_USB_PHY3_REGS_H_
