/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *  * Neither the name of The Linux Foundation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.

 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

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

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

#define SYSFS_PLATFORMID   "/sys/devices/soc0/soc_id"
#define SOC_INFO_NAME_LEN  15

struct therm_msm_soc_type {
    enum therm_msm_id msm_id;
    int  soc_id;
};

static struct therm_msm_soc_type msm_soc_table[] = {
    {THERM_MSM_8953, 293},
    {THERM_MSM_8953, 304},
    {THERM_MSM_8953, 338},
    {THERM_MSM_8953, 351},
    {THERM_SDM_660, 317},
    {THERM_SDM_660, 324},
    {THERM_SDM_660, 325},
    {THERM_SDM_660, 326},
    {THERM_SDM_660, 345},
    {THERM_SDM_660, 346},
    {THERM_SDM_630, 318},
    {THERM_SDM_630, 327},
    {THERM_SDM_630, 385},
    {THERM_SDM_710, 336},
    {THERM_SDM_710, 337},
    {THERM_SDM_710, 393}, // This SOC ID is for SDM712
    {THERM_QCS_605, 347},
    {THERM_SDM_632, 349},
    {THERM_SDM_632, 350},
    {THERM_SDM_439, 353},
    {THERM_SDM_439, 354},
    {THERM_SDM_439, 363},
    {THERM_SDM_439, 364},
    {THERM_MSMNILE, 339},
    {THERM_MSMNILE, 362},
    {THERM_MSMNILE, 367},
    {THERM_TALOS,  355},
    {THERM_SDMMAGPIE, 365},
    {THERM_MSM_8917, 303},
    {THERM_MSM_8917, 307},
    {THERM_MSM_8917, 308},
    {THERM_MSM_8917, 309},
    {THERM_MSM_8917, 386}, // This SOC ID is for QM215
};

static char *cpu_sensors_talos[] =
{
    "cpuss-2-usr",
    "cpuss-2-usr",
    "cpuss-1-usr",
    "cpuss-1-usr",
    "cpuss-0-usr",
    "cpuss-0-usr",
    "cpu-1-0-usr",
    "cpu-1-2-usr",
};

static char *misc_sensors_talos[] =
{
    "gpu-usr",
    "battery",
    "xo-therm"
};

static struct target_therm_cfg sensor_cfg_talos[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_talos,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_talos),
        .mult = 0.001,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_talos[0],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_talos[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_talos[2],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "skin",
    }
};

static char *cpu_sensors_sdmmagpie[] =
{
    "cpu-0-0-usr",
    "cpu-0-1-usr",
    "cpu-0-2-usr",
    "cpu-0-3-usr",
    "cpu-0-4-usr",
    "cpu-0-5-usr",
    "cpu-1-0-usr",
    "cpu-1-2-usr",
};

static char *misc_sensors_sdmmagpie[] =
{
    "gpuss-0-usr",
    "battery",
    "xo-therm-adc"
};

static struct target_therm_cfg sensor_cfg_sdmmagpie[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_sdmmagpie,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_sdmmagpie),
        .mult = 0.001,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_sdmmagpie[0],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_sdmmagpie[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_sdmmagpie[2],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "skin",
    }
};

static char *cpu_sensors_msmnile[] =
{
    "cpu-0-0-usr",
    "cpu-0-1-usr",
    "cpu-0-2-usr",
    "cpu-0-3-usr",
    "cpu-1-0-usr",
    "cpu-1-1-usr",
    "cpu-1-2-usr",
    "cpu-1-3-usr",
};

static char *misc_sensors_msmnile[] =
{
    "gpuss-0-usr",
    "battery",
    "xo-therm"
};

static struct target_therm_cfg sensor_cfg_msmnile[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_msmnile,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_msmnile),
        .mult = 0.001,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_msmnile[0],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_msmnile[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_msmnile[2],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "skin",
    }
};

static char *cpu_sensors_660[] =
{
    "tsens_tz_sensor1",
    "tsens_tz_sensor1",
    "tsens_tz_sensor1",
    "tsens_tz_sensor1",
    "tsens_tz_sensor3",
    "tsens_tz_sensor4",
    "tsens_tz_sensor5",
    "tsens_tz_sensor6",
};

static char *misc_sensors_660[] =
{
    "tsens_tz_sensor8",
    "battery",
    "xo_therm"
};

static struct target_therm_cfg sensor_cfg_660[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_660,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_660),
        .mult = 0.1,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_660[0],
        .sens_cnt = 1,
        .mult = 0.1,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_660[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_660[2],
        .sens_cnt = 1,
        .mult = 1,
        .label = "skin",
    }
};

static char *cpu_sensors_630[] =
{
    "tsens_tz_sensor3",
    "tsens_tz_sensor4",
    "tsens_tz_sensor5",
    "tsens_tz_sensor6",
    "tsens_tz_sensor7",
    "tsens_tz_sensor7",
    "tsens_tz_sensor7",
    "tsens_tz_sensor7",
};

static struct target_therm_cfg sensor_cfg_630[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_630,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_630),
        .mult = 0.1,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_660[0],
        .sens_cnt = 1,
        .mult = 0.1,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_660[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_660[2],
        .sens_cnt = 1,
        .mult = 1,
        .label = "skin",
    }
};

static char *cpu_sensors_8953[] =
{
    "tsens_tz_sensor9",
    "tsens_tz_sensor10",
    "tsens_tz_sensor11",
    "tsens_tz_sensor12",
    "tsens_tz_sensor4",
    "tsens_tz_sensor5",
    "tsens_tz_sensor6",
    "tsens_tz_sensor7",
};

static char *misc_sensors_8953[] =
{
    "tsens_tz_sensor15",
    "battery",
    "xo_therm"
};

static struct target_therm_cfg sensor_cfg_8953[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_8953,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_8953),
        .mult = 0.1,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_8953[0],
        .sens_cnt = 1,
        .mult = 0.1,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_8953[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_8953[2],
        .sens_cnt = 1,
        .mult = 1,
        .label = "skin",
    }
};


static char *cpu_sensors_710[] =
{
    "cpu0-silver-usr",
    "cpu1-silver-usr",
    "cpu2-silver-usr",
    "cpu3-silver-usr",
    "cpu4-silver-usr",
    "cpu5-silver-usr",
    "cpu0-gold-usr",
    "cpu1-gold-usr",
};

static char *misc_sensors_710[] =
{
    "gpu0-usr",
    "battery",
    "xo-therm-adc"
};

static struct target_therm_cfg sensor_cfg_710[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_710,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_710),
        .mult = 0.001,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_710[0],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_710[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_710[2],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "skin",
    }
};

static char *cpu_sensors_632[] =
{
    "cpuss0-usr",
    "cpuss0-usr",
    "cpuss0-usr",
    "cpuss0-usr",
    "apc1-cpu0-usr",
    "apc1-cpu1-usr",
    "apc1-cpu2-usr",
    "apc1-cpu3-usr",
};

static char *misc_sensors_632[] =
{
    "gpu0-usr",
    "battery",
    "quiet-therm-adc"
};

static struct target_therm_cfg sensor_cfg_632[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_632,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_632),
        .mult = 0.001,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_632[0],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_632[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_632[2],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "skin",
    }
};

static char *cpu_sensors_439[] =
{
    "apc1-cpu0-usr",
    "apc1-cpu1-usr",
    "apc1-cpu2-usr",
    "apc1-cpu3-usr",
    "cpuss0-usr",
    "cpuss0-usr",
    "cpuss0-usr",
    "cpuss0-usr",
};

static char *misc_sensors_439[] =
{
    "gpu-usr",
    "battery",
    "quiet-therm-adc"
};

static struct target_therm_cfg sensor_cfg_439[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_439,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_439),
        .mult = 0.001,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_439[0],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_439[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_439[2],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "skin",
    }
};

static char *cpu_sensors_8917[] =
{
    "apc1-cpu0-usr",
    "apc1-cpu1-usr",
    "apc1-cpu2-usr",
    "apc1-cpu3-usr",
};

static char *misc_sensors_8917[] =
{
    "gpu0-usr",
    "battery",
    "xo-therm-adc"
};

static struct target_therm_cfg sensor_cfg_8917[] = {
    {
        .type = DEVICE_TEMPERATURE_CPU,
        .sensor_list = cpu_sensors_8917,
        .sens_cnt = ARRAY_SIZE(cpu_sensors_8917),
        .mult = 0.001,
    },
    {
        .type = DEVICE_TEMPERATURE_GPU,
        .sensor_list = &misc_sensors_8917[0],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "GPU",
    },
    {
        .type = DEVICE_TEMPERATURE_BATTERY,
        .sensor_list = &misc_sensors_8917[1],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "battery",
    },
    {
        .type = DEVICE_TEMPERATURE_SKIN,
        .sensor_list = &misc_sensors_8917[2],
        .sens_cnt = 1,
        .mult = 0.001,
        .label = "skin",
    }
};

static int get_soc_info(char *buf)
{
    int ret = 0;

    ret = read_line_from_file(SYSFS_PLATFORMID, buf, SOC_INFO_NAME_LEN);
    if (ret < 0) {
        ALOGE("Error getting platform_id %d", ret);
        return ret;
    }
    if (ret && buf[ret - 1] == '\n')
        buf[ret - 1] = '\0';

    return ret;
}

enum therm_msm_id therm_get_soc_id(void)
{
    static enum therm_msm_id msm_id;
    int soc_id = -1;

    if (!msm_id) {
        int idx;
        char buf[SOC_INFO_NAME_LEN];

        if (get_soc_info(buf) <= 0)
            return msm_id;

        soc_id = atoi(buf);
        for (idx = 0; idx < ARRAY_SIZE(msm_soc_table); idx++) {
            if (soc_id == msm_soc_table[idx].soc_id) {
                msm_id = msm_soc_table[idx].msm_id;
                break;
            }
        }
        if (!msm_id)
            ALOGE("Unknown target identified with soc id %d\n", soc_id);
   }

   return msm_id;
}

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) {
	struct target_therm_cfg *cfg = NULL;
        size_t num_cfg = 0;

        switch (therm_get_soc_id()) {
            case THERM_MSM_8953:
                cfg = sensor_cfg_8953;
                num_cfg = ARRAY_SIZE(sensor_cfg_8953);
                break;
            case THERM_SDM_660:
                cfg = sensor_cfg_660;
                num_cfg = ARRAY_SIZE(sensor_cfg_660);
                break;
            case THERM_SDM_630:
                cfg = sensor_cfg_630;
                num_cfg = ARRAY_SIZE(sensor_cfg_630);
                break;
            case THERM_SDM_710:
            case THERM_QCS_605:
                cfg = sensor_cfg_710;
                num_cfg = ARRAY_SIZE(sensor_cfg_710);
                break;
            case THERM_SDM_632:
                cfg = sensor_cfg_632;
                num_cfg = ARRAY_SIZE(sensor_cfg_632);
                break;
            case THERM_SDM_439:
                cfg = sensor_cfg_439;
                num_cfg = ARRAY_SIZE(sensor_cfg_439);
                break;
            case THERM_MSM_8917:
                cfg = sensor_cfg_8917;
                num_cfg = ARRAY_SIZE(sensor_cfg_8917);
                break;
            case THERM_MSMNILE:
                cfg = sensor_cfg_msmnile;
                num_cfg = ARRAY_SIZE(sensor_cfg_msmnile);
                break;
            case THERM_TALOS:
                cfg = sensor_cfg_talos;
                num_cfg = ARRAY_SIZE(sensor_cfg_talos);
                break;
            case THERM_SDMMAGPIE:
                cfg = sensor_cfg_sdmmagpie;
                num_cfg = ARRAY_SIZE(sensor_cfg_sdmmagpie);
                break;
            default:
                cfg = NULL;
                num_cfg = 0;
                break;
	}
	if (cfg == NULL || num_cfg == 0) {
            ALOGE("No target specific sensor config\n");
            return 0;
	}
	thermal_sens_size = thermal_zone_init(cfg, num_cfg);
	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);
}
