blob: 35bfb69ad8bfdd9186451047ac63ec815a2b8b6b [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.
#include <ddk/debug.h>
#include <ddk/platform-defs.h>
#include <soc/mt8167/mt8167-clk.h>
#include <soc/mt8167/mt8167-hw.h>
#include <zircon/device/thermal.h>
#include "mt8167.h"
namespace {
constexpr pbus_mmio_t thermal_mmios[] = {
{
.base = MT8167_THERMAL_BASE,
.length = MT8167_THERMAL_SIZE
},
{
.base = MT8167_FUSE_BASE,
.length = MT8167_FUSE_SIZE
},
{
.base = MT8167_AP_MIXED_SYS_BASE,
.length = MT8167_AP_MIXED_SYS_SIZE
},
{
.base = MT8167_PMIC_WRAP_BASE,
.length = MT8167_PMIC_WRAP_SIZE
}
};
constexpr pbus_clk_t thermal_clks[] = {
{
.clk = board_mt8167::kClkThermal
},
{
.clk = board_mt8167::kClkAuxAdc
},
{
.clk = board_mt8167::kClkPmicWrapAp
},
{
.clk = board_mt8167::kClkPmicWrap26M
}
};
constexpr thermal_device_info_t thermal_dev_info = {
.active_cooling = false,
.passive_cooling = true,
.gpu_throttling = true,
.num_trip_points = 0,
.big_little = false,
.critical_temp = 0,
.trip_point_info = {},
.opps = {
[BIG_CLUSTER_POWER_DOMAIN] = {
// See section 3.6 (MTCMOS Domains) of the functional specification document.
.opp = {
[0] = {
.freq_hz = 598000000,
.volt_mv = 1150000
},
[1] = {
.freq_hz = 747500000,
.volt_mv = 1150000
},
[2] = {
.freq_hz = 1040000000,
.volt_mv = 1200000
},
[3] = {
.freq_hz = 1196000000,
.volt_mv = 1250000
},
[4] = {
.freq_hz = 1300000000,
.volt_mv = 1300000
},
},
.latency = 0,
.count = 5
},
[LITTLE_CLUSTER_POWER_DOMAIN] = {
.opp = {},
.latency = 0,
.count = 0
}
}
};
constexpr pbus_metadata_t thermal_metadata[] = {
{
.type = THERMAL_CONFIG_METADATA,
.data_buffer = &thermal_dev_info,
.data_size = sizeof(thermal_dev_info)
},
};
const pbus_dev_t thermal_dev = []() {
pbus_dev_t thermal_dev = {};
thermal_dev.name = "thermal";
thermal_dev.vid = PDEV_VID_MEDIATEK;
thermal_dev.pid = PDEV_PID_MEDIATEK_8167S_REF;
thermal_dev.did = PDEV_DID_MEDIATEK_THERMAL;
thermal_dev.mmio_list = thermal_mmios;
thermal_dev.mmio_count = countof(thermal_mmios);
thermal_dev.clk_list = thermal_clks;
thermal_dev.clk_count = countof(thermal_clks);
thermal_dev.metadata_list = thermal_metadata;
thermal_dev.metadata_count = countof(thermal_metadata);
thermal_dev.bti_count = 0;
thermal_dev.irq_count = 0;
thermal_dev.gpio_count = 0;
return thermal_dev;
}();
} // namespace
namespace board_mt8167 {
zx_status_t Mt8167::ThermalInit() {
zx_status_t status = pbus_.DeviceAdd(&thermal_dev);
if (status != ZX_OK) {
zxlogf(ERROR, "%s: DeviceAdd thermal failed: %d\n", __FUNCTION__, status);
}
return status;
}
} // namespace board_mt8167