/*
 * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
 * Not a contribution
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#define LOG_TAG "ThermalHAL-8998"
#include <utils/Log.h>

#include <hardware/hardware.h>
#include <hardware/thermal.h>
#include "thermal_common.h"

static char *cpu_sensors_8998[] =
{
    "tsens_tz_sensor1",
    "tsens_tz_sensor2",
    "tsens_tz_sensor3",
    "tsens_tz_sensor4",
    "tsens_tz_sensor7",
    "tsens_tz_sensor8",
    "tsens_tz_sensor9",
    "tsens_tz_sensor10",
};

static char *misc_sensors_8998[] =
{
    "tsens_tz_sensor12",
    "battery",
    "quiet_therm"
};

static struct target_therm_cfg sensor_cfg_8998[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_8998,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_8998),
        .mult = 0.1,
        .throt_thresh = 60,
        .shutdwn_thresh = 115,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_8998[0],
        .sens_cnt = 1,
        .mult = 0.1,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_8998[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .shutdwn_thresh = 60,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_8998[2],
        .sens_cnt = 1,
        .mult = 1.0,
        .throt_thresh = 44,
        .shutdwn_thresh = 70,
        .vr_thresh = 58,
        .label = "skin",
    }
};

ssize_t get_temperatures(thermal_module_t *module, temperature_t *list, size_t size) {
    ALOGD("Entering %s",__func__);
    static int thermal_sens_size;

    if (!thermal_sens_size) {
        thermal_sens_size = thermal_zone_init(sensor_cfg_8998,
                                ARRAY_SIZE(sensor_cfg_8998));
        if (thermal_sens_size <= 0) {
            ALOGE("thermal sensor initialization is failed\n");
            thermal_sens_size = 0;
            return 0;
        }
    }

    if (list == NULL)
        return thermal_sens_size;

    return get_temperature_for_all(list, size);
}
