You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
kernel_samsung_sm7125/drivers/battery_v2/sec_battery_sbm.c

148 lines
3.6 KiB

/*
* sec_battery_log.c
* Samsung Mobile Battery Driver
*
* Copyright (C) 2012 Samsung Electronics
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include "include/sec_battery.h"
#define DISABLE_FUNC 0
#define MAX_DATA_STR_LEN 128//1024
static char strSbmData[MAX_DATA_STR_LEN];
void sec_bat_get_sbm_data_string(union power_supply_propval *value)
{
pr_err("%s: %s\n", __func__,strSbmData);
sprintf(strSbmData+strlen(strSbmData), "\n");
value->strval = strSbmData;
}
static bool sec_bat_make_sbm_data_battery(
struct sec_battery_info *battery, int data_type)
{
union power_supply_propval value;
bool bRet = true;
char *str = NULL;
pr_err("%s \n", __func__);
str = kzalloc(sizeof(char)*MAX_DATA_STR_LEN, GFP_KERNEL);
if (!str)
return false;
mutex_lock(&battery->sbmlock);
sprintf(str, " [%d]", data_type);
switch(data_type) {
case SBM_DATA_COMMON_INFO:
sprintf(str+strlen(str), "%d,%d,%d,%d,%d,%d,%d,%d,%d",
battery->cable_type,
battery->capacity,
battery->voltage_now,
battery->health,
battery->current_now,
battery->current_max,
battery->charging_current,
battery->temperature,
battery->chg_temp);
break;
case SBM_DATA_SET_CHARGE:
sprintf(str+strlen(str), "%d,%d,%d",
battery->cable_type, battery->capacity, battery->voltage_now);
break;
case SBM_DATA_FULL_1ST:
sprintf(str+strlen(str), "%d,%d,%d",
battery->charging_mode, battery->capacity, battery->voltage_now);
/* get data from fuelgague */
value.intval = SBM_DATA_FULL_1ST;
psy_do_property(battery->pdata->fuelgauge_name, set,
POWER_SUPPLY_EXT_PROP_SBM_DATA, value);
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_SBM_DATA, value);
if (value.intval) {
sprintf(str+strlen(str), ",%s", value.strval);
}
break;
case SBM_DATA_FULL_2ND:
sprintf(str+strlen(str), "%d,%d,%d",
battery->charging_mode, battery->capacity, battery->voltage_now);
/* get data from fuelgague */
value.intval = SBM_DATA_FULL_2ND;
psy_do_property(battery->pdata->fuelgauge_name, set,
POWER_SUPPLY_EXT_PROP_SBM_DATA, value);
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_SBM_DATA, value);
if (value.intval) {
sprintf(str+strlen(str), ",%s", value.strval);
}
break;
case SBM_DATA_TEMP:
sprintf(str+strlen(str), "%d,%d,%d,%d",
battery->temperature, battery->chg_temp, battery->wpc_temp, battery->usb_temp);
break;
default:
bRet = false;
goto err_make_data;
break;
}
if (strlen(strSbmData) + strlen(str) > MAX_DATA_STR_LEN) {
/* do someting */
if(strlen(str) < MAX_DATA_STR_LEN)
sprintf(strSbmData, "%s", str);
else
pr_err("%s new str length is too long\n", __func__);
goto err_make_data;
}
if (battery->sbm_data)
sprintf(strSbmData+strlen(strSbmData), "%s", str);
else
sprintf(strSbmData, "%s", str);
err_make_data:
kfree(str);
mutex_unlock(&battery->sbmlock);
return bRet;
}
bool sec_bat_add_sbm_data(struct sec_battery_info *battery, int data_type)
{
bool bData = false;
pr_err("%s \n", __func__);
if (is_sbm_data_type(data_type)) {
bData = sec_bat_make_sbm_data_battery(battery, data_type);
} else {
return false;
}
battery->sbm_data = bData;
return true;
}
void sec_bat_init_sbm(struct sec_battery_info *battery)
{
pr_err("%s \n", __func__);
}
void sec_bat_exit_sbm(struct sec_battery_info *battery)
{
pr_err("%s \n", __func__);
if (battery->strSbmData)
kfree(battery->strSbmData);
if (battery->strSbmDataB)
kfree(battery->strSbmDataB);
}