blob: 780360dc38a56318ca48e413bd7e0a663cc8e45c [file] [log] [blame]
// 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