blob: 012542781c76855c62940bf652e059d8859259de [file] [log] [blame]
// Copyright 2020 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 <lib/ddk/debug.h>
#include <lib/ddk/device.h>
#include <lib/ddk/metadata.h>
#include <lib/ddk/platform-defs.h>
#include <lib/thermal/ntc.h>
#include <limits.h>
#include <soc/aml-t931/t931-hw.h>
#include "sherlock.h"
namespace sherlock {
static const pbus_mmio_t saradc_mmios[] = {
{
.base = T931_SARADC_BASE,
.length = T931_SARADC_LENGTH,
},
{
.base = T931_AOBUS_BASE,
.length = T931_AOBUS_LENGTH,
},
};
static const pbus_irq_t saradc_irqs[] = {
{
.irq = T931_SARADC_IRQ,
.mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
},
};
zx_status_t Sherlock::ThermistorInit() {
thermal::NtcInfo ntc_info[] = {
{.part = "ncpXXwf104",
.profile =
{
{.temperature_c = -40, .resistance_ohm = 4397119},
{.temperature_c = -35, .resistance_ohm = 3088599},
{.temperature_c = -30, .resistance_ohm = 2197225},
{.temperature_c = -25, .resistance_ohm = 1581881},
{.temperature_c = -20, .resistance_ohm = 1151037},
{.temperature_c = -15, .resistance_ohm = 846579},
{.temperature_c = -10, .resistance_ohm = 628988},
{.temperature_c = -5, .resistance_ohm = 471632},
{.temperature_c = 0, .resistance_ohm = 357012},
{.temperature_c = 5, .resistance_ohm = 272500},
{.temperature_c = 10, .resistance_ohm = 209710},
{.temperature_c = 15, .resistance_ohm = 162651},
{.temperature_c = 20, .resistance_ohm = 127080},
{.temperature_c = 25, .resistance_ohm = 100000},
{.temperature_c = 30, .resistance_ohm = 79222},
{.temperature_c = 35, .resistance_ohm = 63167},
{.temperature_c = 40, .resistance_ohm = 50677},
{.temperature_c = 45, .resistance_ohm = 40904},
{.temperature_c = 50, .resistance_ohm = 33195},
{.temperature_c = 55, .resistance_ohm = 27091},
{.temperature_c = 60, .resistance_ohm = 22224},
{.temperature_c = 65, .resistance_ohm = 18323},
{.temperature_c = 70, .resistance_ohm = 15184},
{.temperature_c = 75, .resistance_ohm = 12635},
{.temperature_c = 80, .resistance_ohm = 10566},
{.temperature_c = 85, .resistance_ohm = 8873},
{.temperature_c = 90, .resistance_ohm = 7481},
{.temperature_c = 95, .resistance_ohm = 6337},
{.temperature_c = 100, .resistance_ohm = 5384},
{.temperature_c = 105, .resistance_ohm = 4594},
{.temperature_c = 110, .resistance_ohm = 3934},
{.temperature_c = 115, .resistance_ohm = 3380},
{.temperature_c = 120, .resistance_ohm = 2916},
{.temperature_c = 125, .resistance_ohm = 2522},
}},
};
pbus_dev_t thermistor = {};
thermistor.name = "thermistor";
thermistor.vid = PDEV_VID_GOOGLE;
thermistor.did = PDEV_DID_AMLOGIC_THERMISTOR;
thermistor.mmio_list = saradc_mmios;
thermistor.mmio_count = countof(saradc_mmios);
thermistor.irq_list = saradc_irqs;
thermistor.irq_count = countof(saradc_irqs);
if (pid_ == PDEV_PID_LUIS) {
thermal::NtcChannel ntc_channels_luis[] = {
{.adc_channel = 1, .pullup_ohms = 47000, .profile_idx = 0, .name = "therm-mic"},
{.adc_channel = 2, .pullup_ohms = 47000, .profile_idx = 0, .name = "therm-amp"},
{.adc_channel = 3, .pullup_ohms = 47000, .profile_idx = 0, .name = "therm-ambient"},
};
pbus_metadata_t therm_metadata_luis[] = {
{
.type = NTC_CHANNELS_METADATA_PRIVATE,
.data_buffer = reinterpret_cast<uint8_t*>(&ntc_channels_luis),
.data_size = sizeof(ntc_channels_luis),
},
{
.type = NTC_PROFILE_METADATA_PRIVATE,
.data_buffer = reinterpret_cast<uint8_t*>(&ntc_info),
.data_size = sizeof(ntc_info),
},
};
thermistor.pid = PDEV_PID_LUIS;
thermistor.metadata_list = therm_metadata_luis;
thermistor.metadata_count = countof(therm_metadata_luis);
zx_status_t status = pbus_.DeviceAdd(&thermistor);
if (status != ZX_OK) {
zxlogf(ERROR, "DeviceAdd for Luis failed: %s", zx_status_get_string(status));
return status;
}
} else {
thermal::NtcChannel ntc_channels_sherlock[] = {
{.adc_channel = 1, .pullup_ohms = 47000, .profile_idx = 0, .name = "therm-base"},
{.adc_channel = 2, .pullup_ohms = 47000, .profile_idx = 0, .name = "therm-audio"},
{.adc_channel = 3, .pullup_ohms = 47000, .profile_idx = 0, .name = "therm-ambient"},
};
pbus_metadata_t therm_metadata_sherlock[] = {
{
.type = NTC_CHANNELS_METADATA_PRIVATE,
.data_buffer = reinterpret_cast<uint8_t*>(&ntc_channels_sherlock),
.data_size = sizeof(ntc_channels_sherlock),
},
{
.type = NTC_PROFILE_METADATA_PRIVATE,
.data_buffer = reinterpret_cast<uint8_t*>(&ntc_info),
.data_size = sizeof(ntc_info),
},
};
thermistor.pid = PDEV_PID_SHERLOCK;
thermistor.metadata_list = therm_metadata_sherlock;
thermistor.metadata_count = countof(therm_metadata_sherlock);
zx_status_t status = pbus_.DeviceAdd(&thermistor);
if (status != ZX_OK) {
zxlogf(ERROR, "DeviceAdd for Sherlock failed: %s", zx_status_get_string(status));
return status;
}
}
return ZX_OK;
}
} // namespace sherlock