diff --git a/drivers/power/oplus/charger_ic/oplus_battery_msm7250_R.c b/drivers/power/oplus/charger_ic/oplus_battery_msm7250_R.c index 9e0db34e0c2512a4fecf641f0c5cc52b93263e32..6e760acb8b8a6622dc80107cc9d3da53c6928dcd 100755 --- a/drivers/power/oplus/charger_ic/oplus_battery_msm7250_R.c +++ b/drivers/power/oplus/charger_ic/oplus_battery_msm7250_R.c @@ -12640,6 +12640,9 @@ static enum power_supply_property smb5_batt_props[] = { POWER_SUPPLY_PROP_CHARGE_COUNTER, POWER_SUPPLY_PROP_CYCLE_COUNT, POWER_SUPPLY_PROP_RECHARGE_SOC, +#ifdef OPLUS_FEATURE_CHG_BASIC + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, +#endif POWER_SUPPLY_PROP_CHARGE_FULL, POWER_SUPPLY_PROP_FORCE_RECHARGE, POWER_SUPPLY_PROP_FCC_STEPPER_ENABLE, @@ -12810,9 +12813,23 @@ static int smb5_batt_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_CHARGE_QNOVO_ENABLE: val->intval = 0; break; +#ifdef OPLUS_FEATURE_CHG_BASIC + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + if (g_oplus_chip) { + val->intval = oplus_gauge_get_design_capacity() * 1000 * g_oplus_chip->vbatt_num; + } else { + val->intval = -ENODATA; + } + break; +#endif case POWER_SUPPLY_PROP_CHARGE_FULL: rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CHARGE_FULL, val); +#ifdef OPLUS_FEATURE_CHG_BASIC + if (g_oplus_chip) { + val->intval = g_oplus_chip->batt_fcc * 1000; + } +#endif break; case POWER_SUPPLY_PROP_FORCE_RECHARGE: val->intval = 0; diff --git a/drivers/power/oplus/gauge_ic/oplus_bq27541.c b/drivers/power/oplus/gauge_ic/oplus_bq27541.c index 4fd114fb7e1b6f272b1fbdf57e19b0d73bf862e1..65b61c1014e68c7ee1d9b7a48e71d570a8163632 100755 --- a/drivers/power/oplus/gauge_ic/oplus_bq27541.c +++ b/drivers/power/oplus/gauge_ic/oplus_bq27541.c @@ -1863,7 +1863,7 @@ static int bq27541_get_battery_temperature(void) gauge_ic->temp_pre = temp; return temp + ZERO_DEGREE_CELSIUS_IN_TENTH_KELVIN; } - + static int bq27541_get_sub_battery_temperature(void) { int ret = 0; @@ -1896,8 +1896,8 @@ static int bq27541_get_sub_battery_temperature(void) sub_gauge_ic->temp_pre = temp; return temp + ZERO_DEGREE_CELSIUS_IN_TENTH_KELVIN; -} - +} + static bool bq27541_is_battery_present(void) { int flags = 0, ret = 0; @@ -1908,19 +1908,67 @@ static bool bq27541_is_battery_present(void) if (atomic_read(&gauge_ic->suspended) == 1) { return 0; } - ret = bq27541_read_i2c(gauge_ic, gauge_ic->cmd_addr.subcmd_chem_id, &flags); + ret = bq27541_read_i2c(gauge_ic, gauge_ic->cmd_addr.subcmd_chem_id, &flags); if (ret < 0) { pr_err("read bq27541 fail\n"); mdelay(100); - ret = bq27541_read_i2c(gauge_ic, gauge_ic->cmd_addr.subcmd_chem_id, &flags); + ret = bq27541_read_i2c(gauge_ic, gauge_ic->cmd_addr.subcmd_chem_id, &flags); if (ret < 0) { pr_err("read bq27541 fail again\n"); return true; } } return true; -} - +} + +static int bq27541_get_batt_design_capacity(void) +{ + int ret; + int cap = 0; + + if (!gauge_ic) { + return 0; + } + if (atomic_read(&gauge_ic->suspended) == 1) { + return gauge_ic->dcap_pre; + } + if (oplus_vooc_get_allow_reading() == true) { + ret = bq27541_read_i2c(gauge_ic, gauge_ic->cmd_addr.reg_dcap, &cap); + if (ret) { + dev_err(gauge_ic->dev, "error reading capacity.\n"); + return ret; + } + gauge_ic->dcap_pre = cap; + return gauge_ic->dcap_pre; + } else { + return gauge_ic->dcap_pre; + } +} + +static int bq27541_get_sub_gauge_batt_design_capacity(void) +{ + int ret; + int cap = 0; + + if (!sub_gauge_ic) { + return 0; + } + if (atomic_read(&sub_gauge_ic->suspended) == 1) { + return sub_gauge_ic->dcap_pre; + } + if (oplus_vooc_get_allow_reading() == true) { + ret = bq27541_read_i2c(sub_gauge_ic, sub_gauge_ic->cmd_addr.reg_dcap, &cap); + if (ret) { + dev_err(sub_gauge_ic->dev, "error reading capacity.\n"); + return ret; + } + sub_gauge_ic->dcap_pre = cap; + return sub_gauge_ic->dcap_pre; + } else { + return sub_gauge_ic->dcap_pre; + } +} + static int bq27541_get_batt_remaining_capacity(void) { int ret; @@ -2475,6 +2523,7 @@ static struct oplus_gauge_operations bq27541_gauge_ops = { .get_battery_qs = bq27541_get_battery_qs, .get_battery_temperature = bq27541_get_battery_temperature, .is_battery_present = bq27541_is_battery_present, + .get_batt_design_capacity = bq27541_get_batt_design_capacity, .get_batt_remaining_capacity = bq27541_get_batt_remaining_capacity, .get_battery_soc = bq27541_get_battery_soc, .get_average_current = bq27541_get_average_current, @@ -2514,6 +2563,7 @@ static struct oplus_gauge_operations bq27541_sub_gauge_ops = { .get_average_current = bq27541_get_sub_battery_average_current, .get_battery_fcc = bq27541_get_sub_gauge_battery_fcc, .get_prev_batt_fcc = bq27541_get_sub_gauge_prev_batt_fcc, + .get_batt_design_capacity = bq27541_get_sub_gauge_batt_design_capacity, .get_batt_remaining_capacity = bq27541_get_sub_gauge_batt_remaining_capacity, .get_prev_batt_remaining_capacity = bq27541_get_sub_gauge_prev_batt_remaining_capacity, .get_battery_authenticate = bq27541_get_sub_battery_authenticate, @@ -2542,6 +2592,7 @@ static void gauge_set_cmd_addr(struct chip_bq27541 *chip, int device_type) chip->cmd_addr.reg_soc = BQ27541_REG_SOC; chip->cmd_addr.reg_inttemp = BQ27541_REG_INTTEMP; chip->cmd_addr.reg_soh = BQ27541_REG_SOH; + chip->cmd_addr.reg_dcap = BQ27541_REG_DCAP; chip->cmd_addr.flag_dsc = BQ27541_FLAG_DSC; chip->cmd_addr.flag_fc = BQ27541_FLAG_FC; chip->cmd_addr.cs_dlogen = BQ27541_CS_DLOGEN; @@ -2605,6 +2656,7 @@ static void gauge_set_cmd_addr(struct chip_bq27541 *chip, int device_type) chip->cmd_addr.reg_soc = BQ27411_REG_SOC; chip->cmd_addr.reg_inttemp = BQ27411_REG_INTTEMP; chip->cmd_addr.reg_soh = BQ27411_REG_SOH; + chip->cmd_addr.reg_dcap = BQ27411_REG_DCAP; chip->cmd_addr.reg_fc = BQ27411_REG_FC; chip->cmd_addr.reg_qm = BQ27411_REG_QM; chip->cmd_addr.reg_pd = BQ27411_REG_PD; @@ -2676,11 +2728,11 @@ static void bq27541_hw_config(struct chip_bq27541 *chip) int flags = 0; int device_type = 0; int fw_ver = 0; - -#ifdef OPLUS_CUSTOM_OP_DEF - exfg_information_register(&bq27541_gauge_ops); -#endif - bq27541_cntl_cmd(chip, BQ27541_BQ27411_SUBCMD_CTNL_STATUS); + +#ifdef OPLUS_CUSTOM_OP_DEF + exfg_information_register(&bq27541_gauge_ops); +#endif + bq27541_cntl_cmd(chip, BQ27541_BQ27411_SUBCMD_CTNL_STATUS); udelay(66); bq27541_read_i2c(chip, BQ27541_BQ27411_REG_CNTL, &flags); udelay(66); diff --git a/drivers/power/oplus/gauge_ic/oplus_bq27541.h b/drivers/power/oplus/gauge_ic/oplus_bq27541.h index 240ffa7ab0044ae58c69f3b65dfd7fe93a16180a..9c56014a706fdab402a87c8ce115fc829ae35cfd 100755 --- a/drivers/power/oplus/gauge_ic/oplus_bq27541.h +++ b/drivers/power/oplus/gauge_ic/oplus_bq27541.h @@ -44,6 +44,7 @@ #define BQ27541_REG_LOGIDX 0x32 #define BQ27541_REG_LOGBUF 0x34 #define BQ27541_REG_DOD0 0x36 +#define BQ27541_REG_DCAP 0x3c #define BQ27541_FLAG_DSC BIT(0) #define BQ27541_FLAG_FC BIT(9) #define BQ27541_CS_DLOGEN BIT(15) @@ -104,6 +105,7 @@ #define BQ27411_REG_FCU 0x2c #define BQ27411_REG_FCF 0x2e #define BQ27411_REG_SOU 0x30 +#define BQ27411_REG_DCAP 0x3c #define BQ27411_REG_DO0 0x66 #define BQ27411_REG_DOE 0x68 #define BQ27411_REG_TRM 0x6a @@ -278,6 +280,7 @@ struct cmd_address { u8 reg_fcu; u8 reg_fcf; u8 reg_sou; + u8 reg_dcap; u8 reg_do0; u8 reg_doe; u8 reg_trm; @@ -386,6 +389,7 @@ struct chip_bq27541 { int sou_pre; int do0_pre; int doe_pre; + int dcap_pre; int trm_pre; int pc_pre; int qs_pre; //add gauge reg print log end diff --git a/drivers/power/oplus/oplus_gauge.c b/drivers/power/oplus/oplus_gauge.c index f98346f28f3dd4178bea16468192d675886a4dd6..41efa5b5ba0d64c94f04c02fcc9ca4940b69e8ee 100755 --- a/drivers/power/oplus/oplus_gauge.c +++ b/drivers/power/oplus/oplus_gauge.c @@ -303,6 +303,19 @@ int oplus_gauge_get_sub_current(void) } } +int oplus_gauge_get_design_capacity(void) +{ + if (!g_gauge_chip) { + return 0; + } else { + if (!g_sub_gauge_chip || !g_sub_gauge_chip->gauge_ops + || !g_sub_gauge_chip->gauge_ops->get_batt_design_capacity) { + return g_gauge_chip->gauge_ops->get_batt_design_capacity(); + } else { + return g_gauge_chip->gauge_ops->get_batt_design_capacity() + g_sub_gauge_chip->gauge_ops->get_batt_design_capacity(); + } + } +} int oplus_gauge_get_remaining_capacity(void) { diff --git a/drivers/power/oplus/oplus_gauge.h b/drivers/power/oplus/oplus_gauge.h index 2de1bff1cdbc1e04c490c06682eece2e70461390..fdd020f7f4a7643002a2d461fa1547959ec1fdda 100755 --- a/drivers/power/oplus/oplus_gauge.h +++ b/drivers/power/oplus/oplus_gauge.h @@ -47,6 +47,7 @@ struct oplus_gauge_operations { int (*get_battery_qs)(void); int (*get_battery_temperature)(void); bool (*is_battery_present)(void); + int (*get_batt_design_capacity)(void); int (*get_batt_remaining_capacity)(void); int (*get_battery_soc)(void); int (*get_average_current)(void); @@ -118,6 +119,7 @@ int oplus_gauge_get_batt_temperature(void); int oplus_gauge_get_batt_soc(void); int oplus_gauge_get_batt_current(void); int oplus_gauge_get_sub_current(void); +int oplus_gauge_get_design_capacity(void); int oplus_gauge_get_remaining_capacity(void); int oplus_gauge_get_device_type(void); int oplus_gauge_get_device_type_for_vooc(void);