blob: cfc43060d7ffab6b7cdf18438ab2f63bb9ea44b5 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2018-2020 Oplus. All rights reserved.
*/
#include "oplus_gauge.h"
#include "oplus_charger.h"
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/debugfs.h>
#include <soc/oplus/system/oplus_project.h>
static struct oplus_gauge_chip *g_gauge_chip = NULL;
static int gauge_dbg_tbat = 0;
module_param(gauge_dbg_tbat, int, 0644);
MODULE_PARM_DESC(gauge_dbg_tbat, "debug battery temperature");
static int gauge_dbg_vbat = 0;
module_param(gauge_dbg_vbat, int, 0644);
MODULE_PARM_DESC(gauge_dbg_vbat, "debug battery voltage");
static int gauge_dbg_ibat = 0;
module_param(gauge_dbg_ibat, int, 0644);
MODULE_PARM_DESC(gauge_dbg_ibat, "debug battery current");
int oplus_gauge_get_batt_mvolts(void)
{
if (!g_gauge_chip) {
return 3800;
} else {
if (gauge_dbg_vbat != 0) {
printk(KERN_ERR "[OPLUS_CHG]%s:debug enabled,voltage gauge_dbg_vbat[%d] \n", __func__, gauge_dbg_vbat);
return gauge_dbg_vbat;
}
return g_gauge_chip->gauge_ops->get_battery_mvolts();
}
}
int oplus_gauge_get_batt_fc(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_fc) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_fc();
}
}
int oplus_gauge_get_batt_qm(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_qm) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_qm();
}
}
int oplus_gauge_get_batt_pd(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_pd) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_pd();
}
}
int oplus_gauge_get_batt_rcu(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_rcu) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_rcu();
}
}
int oplus_gauge_get_batt_rcf(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_rcf) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_rcf();
}
}
int oplus_gauge_get_batt_fcu(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_fcu) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_fcu();
}
}
int oplus_gauge_get_batt_fcf(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_fcf) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_fcf();
}
}
int oplus_gauge_get_batt_sou(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_sou) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_sou();
}
}
int oplus_gauge_get_batt_do0(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_do0) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_do0();
}
}
int oplus_gauge_get_batt_doe(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_doe) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_doe();
}
}
int oplus_gauge_get_batt_trm(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_trm) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_trm();
}
}
int oplus_gauge_get_batt_pc(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_pc) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_pc();
}
}
int oplus_gauge_get_batt_qs(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_battery_qs) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_qs();
}
}
int oplus_gauge_get_batt_mvolts_2cell_max(void)
{
if(!g_gauge_chip)
return 3800;
else
return g_gauge_chip->gauge_ops->get_battery_mvolts_2cell_max();
}
int oplus_gauge_get_batt_mvolts_2cell_min(void)
{
if(!g_gauge_chip)
return 3800;
else
return g_gauge_chip->gauge_ops->get_battery_mvolts_2cell_min();
}
int oplus_gauge_get_batt_temperature(void)
{
int batt_temp = 0;
if (!g_gauge_chip) {
return 250;
} else {
if (gauge_dbg_tbat != 0) {
printk(KERN_ERR "[OPLUS_CHG]debug enabled, gauge_dbg_tbat[%d] \n", gauge_dbg_tbat);
return gauge_dbg_tbat;
}
batt_temp = g_gauge_chip->gauge_ops->get_battery_temperature();
if (get_eng_version() == HIGH_TEMP_AGING) {
printk(KERN_ERR "[OPLUS_CHG]CONFIG_HIGH_TEMP_VERSION enable here, \
disable high tbat shutdown \n");
if (batt_temp > 690)
batt_temp = 690;
}
return batt_temp;
}
}
int oplus_gauge_get_batt_soc(void)
{
if (!g_gauge_chip) {
return -1;
} else {
return g_gauge_chip->gauge_ops->get_battery_soc();
}
}
int oplus_gauge_get_batt_current(void)
{
if (!g_gauge_chip) {
return 100;
} else {
if (gauge_dbg_ibat != 0) {
printk(KERN_ERR "[OPLUS_CHG]debug enabled,current gauge_dbg_ibat[%d] \n", gauge_dbg_ibat);
return gauge_dbg_ibat;
}
return g_gauge_chip->gauge_ops->get_average_current();
}
}
int oplus_gauge_get_remaining_capacity(void)
{
if (!g_gauge_chip) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_batt_remaining_capacity();
}
}
int oplus_gauge_get_device_type(void)
{
if (!g_gauge_chip) {
return 0;
} else {
return g_gauge_chip->device_type;
}
}
int oplus_gauge_get_device_type_for_vooc(void)
{
if (!g_gauge_chip) {
return 0;
} else {
return g_gauge_chip->device_type_for_vooc;
}
}
int oplus_gauge_get_batt_fcc(void)
{
if (!g_gauge_chip) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_fcc();
}
}
int oplus_gauge_get_batt_cc(void)
{
if (!g_gauge_chip) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_cc();
}
}
int oplus_gauge_get_batt_soh(void)
{
if (!g_gauge_chip) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_battery_soh();
}
}
bool oplus_gauge_get_batt_hmac(void)
{
if (!g_gauge_chip) {
return false;
} else if (!g_gauge_chip->gauge_ops->get_battery_hmac) {
return true;
} else {
return g_gauge_chip->gauge_ops->get_battery_hmac();
}
}
bool oplus_gauge_get_batt_authenticate(void)
{
if (!g_gauge_chip) {
return false;
} else {
return g_gauge_chip->gauge_ops->get_battery_authenticate();
}
}
void oplus_gauge_set_batt_full(bool full)
{
if (g_gauge_chip) {
g_gauge_chip->gauge_ops->set_battery_full(full);
}
}
bool oplus_gauge_check_chip_is_null(void)
{
if (!g_gauge_chip) {
return true;
} else {
return false;
}
}
void oplus_gauge_init(struct oplus_gauge_chip *chip)
{
g_gauge_chip = chip;
}
int oplus_gauge_get_prev_batt_mvolts(void)
{
if (!g_gauge_chip)
return 3800;
else {
if (gauge_dbg_vbat != 0) {
printk(KERN_ERR "[OPLUS_CHG]%s:debug enabled,voltage gauge_dbg_vbat[%d] \n", __func__, gauge_dbg_vbat);
return gauge_dbg_vbat;
}
return g_gauge_chip->gauge_ops->get_prev_battery_mvolts();
}
}
int oplus_gauge_get_prev_batt_mvolts_2cell_max(void)
{
if(!g_gauge_chip)
return 3800;
else{
if (gauge_dbg_vbat != 0) {
printk(KERN_ERR "[OPLUS_CHG]%s: debug enabled,voltage gauge_dbg_vbat[%d] \n", __func__, gauge_dbg_vbat);
return gauge_dbg_vbat;
}
return g_gauge_chip->gauge_ops->get_prev_battery_mvolts_2cell_max();
}
}
int oplus_gauge_get_prev_batt_mvolts_2cell_min(void)
{
if(!g_gauge_chip)
return 3800;
else {
if (gauge_dbg_vbat != 0) {
printk(KERN_ERR "[OPLUS_CHG]%s:debug enabled,voltage gauge_dbg_vbat[%d] \n", __func__, gauge_dbg_vbat);
return gauge_dbg_vbat;
}
return g_gauge_chip->gauge_ops->get_prev_battery_mvolts_2cell_min();
}
}
int oplus_gauge_get_prev_batt_temperature(void)
{
int batt_temp = 0;
if (!g_gauge_chip)
return 250;
else {
if (gauge_dbg_tbat != 0) {
printk(KERN_ERR "[OPLUS_CHG]%s: debug enabled, gauge_dbg_tbat[%d] \n", __func__, gauge_dbg_tbat);
return gauge_dbg_tbat;
}
batt_temp = g_gauge_chip->gauge_ops->get_prev_battery_temperature();
if (get_eng_version() == HIGH_TEMP_AGING) {
printk(KERN_ERR "[OPLUS_CHG]CONFIG_HIGH_TEMP_VERSION enable here, \
disable high tbat shutdown \n");
if (batt_temp > 690)
batt_temp = 690;
}
return batt_temp;
}
}
int oplus_gauge_get_prev_batt_soc(void)
{
if (!g_gauge_chip)
return 50;
else
return g_gauge_chip->gauge_ops->get_prev_battery_soc();
}
int oplus_gauge_get_prev_batt_current(void)
{
if (!g_gauge_chip)
return 100;
else {
if (gauge_dbg_ibat != 0) {
printk(KERN_ERR "[OPLUS_CHG]%s:debug enabled,current gauge_dbg_ibat[%d] \n", __func__, gauge_dbg_ibat);
return gauge_dbg_ibat;
}
return g_gauge_chip->gauge_ops->get_prev_average_current();
}
}
int oplus_gauge_get_prev_remaining_capacity(void)
{
if (!g_gauge_chip) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_prev_batt_remaining_capacity();
}
}
int oplus_gauge_update_battery_dod0(void)
{
if (!g_gauge_chip)
return 0;
else
return g_gauge_chip->gauge_ops->update_battery_dod0();
}
int oplus_gauge_update_soc_smooth_parameter(void)
{
if (!g_gauge_chip)
return 0;
else
return g_gauge_chip->gauge_ops->update_soc_smooth_parameter();
}
int oplus_gauge_get_battery_cb_status(void)
{
if (!g_gauge_chip)
return 0;
else
return g_gauge_chip->gauge_ops->get_battery_cb_status();
}
int oplus_gauge_get_i2c_err(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_gauge_i2c_err) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_gauge_i2c_err();
}
}
void oplus_gauge_clear_i2c_err(void)
{
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->clear_gauge_i2c_err) {
return;
} else {
return g_gauge_chip->gauge_ops->clear_gauge_i2c_err();
}
}
int oplus_gauge_get_prev_batt_fcc(void)
{
if (!g_gauge_chip) {
return 0;
} else {
return g_gauge_chip->gauge_ops->get_prev_batt_fcc();
}
}
int oplus_gauge_get_passedchg(int *val)
{
int ret;
if (!g_gauge_chip || !g_gauge_chip->gauge_ops
|| !g_gauge_chip->gauge_ops->get_passdchg) {
return 0;
} else {
ret = g_gauge_chip->gauge_ops->get_passdchg(val);
if(ret) {
pr_err("%s: get passedchg error %d\n", __FUNCTION__, ret);
}
return ret;
}
}
int oplus_gauge_dump_register(void)
{
if (!g_gauge_chip)
return 0;
else {
if (g_gauge_chip->gauge_ops && g_gauge_chip->gauge_ops->dump_register) {
g_gauge_chip->gauge_ops->dump_register();
}
return 0;
}
}