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

#pragma once

#include <atomic>
#include <ddk/protocol/platform-device-lib.h>
#include <ddk/protocol/platform/device.h>
#include <ddktl/device.h>
#include <fuchsia/hardware/thermal/c/fidl.h>
#include <lib/mmio/mmio.h>
#include <lib/zx/interrupt.h>
#include <optional>
#include <threads.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(){}
    uint32_t ReadTemperature();
    zx_status_t InitSensor(zx_device_t* parent,
                           fuchsia_hardware_thermal_ThermalDeviceInfo thermal_config);
    zx_status_t GetStateChangePort(zx_handle_t* port);
    ~AmlTSensor();

private:
    int TripPointIrqHandler();
    zx_status_t InitPdev(zx_device_t* parent);
    uint32_t TempToCode(uint32_t temp, bool trend);
    uint32_t CodeToTemp(uint32_t temp_code);
    void SetRebootTemperature(uint32_t temp);
    zx_status_t InitTripPoints();
    zx_status_t NotifyThermalDaemon();
    void UpdateFallThresholdIrq(uint32_t irq);
    void UpdateRiseThresholdIrq(uint32_t irq);
    uint32_t trim_info_;
    pdev_protocol_t pdev_;
    std::optional<ddk::MmioBuffer> pll_mmio_;
    std::optional<ddk::MmioBuffer> ao_mmio_;
    std::optional<ddk::MmioBuffer> hiu_mmio_;
    zx::interrupt tsensor_irq_;
    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
