/*
 * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
 * Copyright (C) 2017-2018 The LineageOS Project
 *
 * 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.
 */

#ifndef __POWER_HELPER_H__
#define __POWER_HELPER_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "hardware/power.h"

#ifdef LEGACY_STATS
enum platform_param_id {
    VLOW_COUNT = 0,
    ACCUMULATED_VLOW_TIME,
    VMIN_COUNT,
    ACCUMULATED_VMIN_TIME,
    RPM_PARAM_COUNT,

    XO_ACCUMULATED_DURATION_APSS = RPM_PARAM_COUNT,
    XO_COUNT_APSS,
    XO_ACCUMULATED_DURATION_MPSS,
    XO_COUNT_MPSS,
    XO_ACCUMULATED_DURATION_ADSP,
    XO_COUNT_ADSP,
    XO_ACCUMULATED_DURATION_SLPI,
    XO_COUNT_SLPI,

    //Don't add any lines after that line
    PLATFORM_PARAM_COUNT
};
#endif

enum stats_type {
    //Platform Stats
    RPM_MODE_XO = 0,
    RPM_MODE_VMIN,
    RPM_MODE_MAX,
    XO_VOTERS_START = RPM_MODE_MAX,
    VOTER_APSS = XO_VOTERS_START,
    VOTER_MPSS,
    VOTER_ADSP,
    VOTER_SLPI,
    VOTER_PRONTO,
    VOTER_TZ,
    VOTER_LPASS,
    VOTER_SPSS,
    MAX_PLATFORM_STATS,

#ifndef NO_WLAN_STATS
    //WLAN Stats
    WLAN_POWER_DEBUG_STATS = 0,
    MAX_WLAN_STATS,
#endif
};

#ifndef NO_WLAN_STATS
enum subsystem_type {
    SUBSYSTEM_WLAN = 0,

    //Don't add any lines after this line
    SUBSYSTEM_COUNT
};

enum wlan_sleep_states {
    WLAN_STATE_ACTIVE = 0,
    WLAN_STATE_DEEP_SLEEP,

    //Don't add any lines after this line
    WLAN_STATES_COUNT
};

enum wlan_power_params {
    CUMULATIVE_SLEEP_TIME_MS = 0,
    CUMULATIVE_TOTAL_ON_TIME_MS,
    DEEP_SLEEP_ENTER_COUNTER,
    LAST_DEEP_SLEEP_ENTER_TSTAMP_MS,

    //Don't add any lines after this line
    WLAN_POWER_PARAMS_COUNT
};
#endif

#define PLATFORM_SLEEP_MODES_COUNT RPM_MODE_MAX

#define MAX_RPM_PARAMS 2
#ifdef LEGACY_STATS
#define XO_VOTERS 4
#else
#define XO_VOTERS (MAX_PLATFORM_STATS - XO_VOTERS_START)
#endif
#define VMIN_VOTERS 0

struct stat_pair {
    enum stats_type stat;
    const char *label;
    const char **parameters;
    size_t num_parameters;
};


void power_init(void);
void power_hint(power_hint_t hint, void *data);
void power_set_interactive(int on);
void set_feature(feature_t feature, int state);
int extract_platform_stats(uint64_t *list);
#ifndef NO_WLAN_STATS
int extract_wlan_stats(uint64_t *list);
#endif
int __attribute__ ((weak)) get_number_of_profiles();

#ifdef __cplusplus
}
#endif

#endif //__POWER_HELPER_H__
