blob: e8bd87b9d27f99cfd9e5a923638afc3615d7e99e [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 <threads.h>
#include <ddk/protocol/platform-device-lib.h>
#include <ddktl/device.h>
#include <ddktl/mmio.h>
#include <ddktl/protocol/clk.h>
#include <ddktl/protocol/empty-protocol.h>
#include <fbl/mutex.h>
#include <lib/zx/interrupt.h>
#include <lib/zx/port.h>
#include <zircon/device/thermal.h>
namespace thermal {
class MtkThermal;
using DeviceType = ddk::Device<MtkThermal, ddk::Ioctlable>;
class MtkThermal : public DeviceType, public ddk::EmptyProtocol<ZX_PROTOCOL_THERMAL> {
public:
static zx_status_t Create(void* ctx, zx_device_t* parent);
void DdkRelease() { delete this; }
zx_status_t DdkIoctl(uint32_t op, const void* in_buf, size_t in_len, void* out_buf,
size_t out_len, size_t* actual);
private:
MtkThermal(zx_device_t* parent, ddk::MmioBuffer mmio, ddk::MmioBuffer fuse_mmio,
ddk::MmioBuffer pll_mmio, ddk::MmioBuffer pmic_mmio,
const ddk::ClkProtocolClient& clk, const pdev_device_info_t& info,
const thermal_device_info_t& thermal_info, zx::port port, zx::interrupt irq)
: DeviceType(parent), mmio_(std::move(mmio)), fuse_mmio_(std::move(fuse_mmio)),
pll_mmio_(std::move(pll_mmio)), pmic_mmio_(std::move(pmic_mmio)), clk_(clk),
clk_count_(info.clk_count), thermal_info_(thermal_info), port_(std::move(port)),
irq_(std::move(irq)) {}
uint32_t GetTemperature();
zx_status_t SetDvfsOpp(const dvfs_info_t* opp);
zx_status_t Init();
uint32_t RawToTemperature(uint32_t raw, uint32_t sensor);
uint32_t TemperatureToRaw(uint32_t temp, uint32_t sensor);
uint32_t GetRawHot(uint32_t temp);
uint32_t GetRawCold(uint32_t temp);
zx_status_t SetTripPoint(size_t trip_pt);
uint16_t PmicRead(uint32_t addr);
void PmicWrite(uint16_t data, uint32_t addr);
int Thread();
ddk::MmioBuffer mmio_;
ddk::MmioBuffer fuse_mmio_;
ddk::MmioBuffer pll_mmio_;
ddk::MmioBuffer pmic_mmio_;
ddk::ClkProtocolClient clk_;
const uint32_t clk_count_;
const thermal_device_info_t thermal_info_;
uint32_t current_opp_idx_ = 0;
zx::port port_;
zx::interrupt irq_;
thrd_t thread_;
fbl::Mutex dvfs_lock_;
};
} // namespace thermal