// 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_THERMAL_DRIVERS_AML_THERMAL_S905D2G_LEGACY_AML_TSENSOR_H_
#define SRC_DEVICES_THERMAL_DRIVERS_AML_THERMAL_S905D2G_LEGACY_AML_TSENSOR_H_

#include <fuchsia/hardware/thermal/c/fidl.h>
#include <lib/mmio/mmio.h>
#include <lib/zx/interrupt.h>
#include <threads.h>

#include <atomic>
#include <optional>

#include <ddktl/device.h>

namespace thermal {

// This class represents a temperature sensor
// which is on the S905D2 core.
class AmlTSensor {
 public:
  DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(AmlTSensor);
  AmlTSensor() {}
  // For testing
  AmlTSensor(ddk::MmioBuffer pll_mmio, ddk::MmioBuffer trim_mmio, ddk::MmioBuffer hiu_mmio)
      : pll_mmio_(std::move(pll_mmio)),
        trim_mmio_(std::move(trim_mmio)),
        hiu_mmio_(std::move(hiu_mmio)) {}
  float ReadTemperatureCelsius();
  zx_status_t Create(zx_device_t* parent,
                     fuchsia_hardware_thermal_ThermalDeviceInfo thermal_config);
  zx_status_t InitSensor(fuchsia_hardware_thermal_ThermalDeviceInfo thermal_config);
  zx_status_t GetStateChangePort(zx_handle_t* port);
  ~AmlTSensor();

 private:
  int TripPointIrqHandler();
  uint32_t TempCelsiusToCode(float temp_c, bool trend);
  float CodeToTempCelsius(uint32_t temp_code);
  void SetRebootTemperatureCelsius(float temp_c);
  zx_status_t InitTripPoints();
  zx_status_t NotifyThermalDaemon();
  void UpdateFallThresholdIrq(uint32_t irq);
  void UpdateRiseThresholdIrq(uint32_t irq);

  uint32_t trim_info_;
  std::optional<ddk::MmioBuffer> pll_mmio_;
  std::optional<ddk::MmioBuffer> trim_mmio_;
  std::optional<ddk::MmioBuffer> hiu_mmio_;
  zx::interrupt tsensor_irq_;
  std::optional<thrd_t> irq_thread_;
  std::atomic<bool> running_;
  zx_handle_t port_;
  fuchsia_hardware_thermal_ThermalDeviceInfo thermal_config_;
  uint32_t current_trip_idx_ = 0;
};
}  // namespace thermal

#endif  // SRC_DEVICES_THERMAL_DRIVERS_AML_THERMAL_S905D2G_LEGACY_AML_TSENSOR_H_
