diff --git a/drivers/power/sm5602_fg_mmi/sm5602_fg.c b/drivers/power/sm5602_fg_mmi/sm5602_fg.c index 073878d3abda..f360f6980f16 100644 --- a/drivers/power/sm5602_fg_mmi/sm5602_fg.c +++ b/drivers/power/sm5602_fg_mmi/sm5602_fg.c @@ -47,6 +47,13 @@ #define queue_delayed_work_time 8000//8000 #define queue_start_work_time 50 #define SM_CUR_UNIT 1000 +#define ENABLE_MAP_SOC + +#ifdef ENABLE_MAP_SOC +#define MAP_MAX_SOC 97 +#define MAP_RATE_SOC 975 +#define MAP_MIN_SOC 4 +#endif enum sm_fg_reg_idx { SM_FG_REG_DEVICE_ID = 0, @@ -254,7 +261,6 @@ struct sm_fg_chip { struct power_supply *batt_psy; struct power_supply *bms_psy; //struct power_supply fg_psy; - struct power_supply_desc *fg_psy; }; static int show_registers(struct seq_file *m, void *data); @@ -926,7 +932,11 @@ static int fg_get_charge_counter(struct sm_fg_chip *sm) int ui_soc; full_capacity = fg_read_fcc(sm) * 1000; +#ifdef ENABLE_MAP_SOC + ui_soc = (((100*(sm->batt_soc*10+MAP_MAX_SOC))/MAP_RATE_SOC)-MAP_MIN_SOC)/10; +#else ui_soc = sm->batt_soc/10; +#endif charge_counter = div_s64(full_capacity * ui_soc, 100); return charge_counter; @@ -1005,7 +1015,12 @@ static int fg_get_property(struct power_supply *psy, enum power_supply_property if (ret >= 0) sm->batt_soc = ret; //val->intval = sm->batt_soc; +#ifdef ENABLE_MAP_SOC + val->intval = (((100*(sm->batt_soc*10+MAP_MAX_SOC))/MAP_RATE_SOC)-MAP_MIN_SOC)/10; +#else val->intval = sm->batt_soc/10; +#endif + pr_info("fg POWER_SUPPLY_PROP_STATUS:%d\n", val->intval); mutex_unlock(&sm->data_lock); break; @@ -1247,7 +1262,6 @@ static void fg_refresh_status(struct sm_fg_chip *sm) } // sm->last_update = jiffies; - } #endif @@ -1305,7 +1319,8 @@ static int sm_update_data(struct sm_fg_chip *sm) sm->batt_temp = -ENODATA; fg_cal_carc(sm); - pr_info("RSOC:%d, Volt:%d, Current:%d, Temperature:%d, OCV:%d\n", + + pr_info("RSOC:%d, Volt:%d, Current:%d, Temperature:%d, OCV:%d\n", sm->batt_soc, sm->batt_volt, sm->batt_curr, sm->batt_temp, sm->batt_ocv); } @@ -2403,85 +2418,85 @@ static int fg_common_parse_dt(struct sm_fg_chip *sm) } static const char *get_battery_serialnumber(void) -{ - struct device_node *np = of_find_node_by_path("/chosen"); - const char *battsn_buf; - int retval; - - battsn_buf = NULL; - - if (np) - retval = of_property_read_string(np, "mmi,battid", - &battsn_buf); - else - return NULL; - - if ((retval == -EINVAL) || !battsn_buf) { +{ + struct device_node *np = of_find_node_by_path("/chosen"); + const char *battsn_buf; + int retval; + + battsn_buf = NULL; + + if (np) + retval = of_property_read_string(np, "mmi,battid", + &battsn_buf); + else + return NULL; + + if ((retval == -EINVAL) || !battsn_buf) { pr_info(" Battsn unused\n"); - of_node_put(np); - return NULL; - - } else + of_node_put(np); + return NULL; + + } else pr_info("Battsn = %s\n", battsn_buf); - - of_node_put(np); - - return battsn_buf; -} - + + of_node_put(np); + + return battsn_buf; +} + static struct device_node *get_profile_by_serialnumber( - const struct device_node *np) -{ - struct device_node *node, *df_node, *sn_node; - const char *sn_buf, *df_sn, *dev_sn; - int rc; - - if (!np) - return NULL; - - dev_sn = NULL; - df_sn = NULL; - sn_buf = NULL; - df_node = NULL; - sn_node = NULL; - + const struct device_node *np) +{ + struct device_node *node, *df_node, *sn_node; + const char *sn_buf, *df_sn, *dev_sn; + int rc; + + if (!np) + return NULL; + + dev_sn = NULL; + df_sn = NULL; + sn_buf = NULL; + df_node = NULL; + sn_node = NULL; + dev_sn = get_battery_serialnumber(); - - rc = of_property_read_string(np, "df-serialnum", - &df_sn); - if (rc) + + rc = of_property_read_string(np, "df-serialnum", + &df_sn); + if (rc) pr_info("No Default Serial Number defined\n"); - else if (df_sn) + else if (df_sn) pr_info("Default Serial Number %s\n", df_sn); - - for_each_child_of_node(np, node) { - rc = of_property_read_string(node, "serialnum", - &sn_buf); - if (!rc && sn_buf) { - if (dev_sn) - if (strnstr(dev_sn, sn_buf, 32)) - sn_node = node; - if (df_sn) - if (strnstr(df_sn, sn_buf, 32)) - df_node = node; - } - } - - if (sn_node) { - node = sn_node; - df_node = NULL; + + for_each_child_of_node(np, node) { + rc = of_property_read_string(node, "serialnum", + &sn_buf); + if (!rc && sn_buf) { + if (dev_sn) + if (strnstr(dev_sn, sn_buf, 32)) + sn_node = node; + if (df_sn) + if (strnstr(df_sn, sn_buf, 32)) + df_node = node; + } + } + + if (sn_node) { + node = sn_node; + df_node = NULL; pr_info("Battery Match Found using %s\n", sn_node->name); - } else if (df_node) { - node = df_node; - sn_node = NULL; + } else if (df_node) { + node = df_node; + sn_node = NULL; pr_info("Battery Match Found using default %s\n", - df_node->name); - } else { + df_node->name); + } else { pr_info("No Battery Match Found!\n"); - return NULL; - } - - return node; + return NULL; + } + + return node; } static int fg_battery_parse_dt(struct sm_fg_chip *sm)