power: pm8921-bms: account for capacitive drop
As the battery discharges, we need to account for the voltage drop across
capacitance in the battery. This voltage drop can be simulated using
a resistance in series with the battery such that it increases as state of
charge of the battery decreases.
Add parameter to account for this resistance in the profile tables.
Change-Id: Ic67b798ae8f480d8f42d9321e3847c4294bf7db3
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
diff --git a/arch/arm/mach-msm/bms-batterydata.c b/arch/arm/mach-msm/bms-batterydata.c
index 2960a8b..77e7dab 100644
--- a/arch/arm/mach-msm/bms-batterydata.c
+++ b/arch/arm/mach-msm/bms-batterydata.c
@@ -123,4 +123,5 @@
.pc_sf_lut = &palladium_1500_pc_sf,
.rbatt_sf_lut = &palladium_1500_rbatt_sf,
.default_rbatt_mohm = 254,
+ .delta_rbatt_mohm = 60,
};
diff --git a/drivers/power/pm8921-bms.c b/drivers/power/pm8921-bms.c
index 8259515..b93ea95 100644
--- a/drivers/power/pm8921-bms.c
+++ b/drivers/power/pm8921-bms.c
@@ -94,6 +94,7 @@
struct pc_temp_ocv_lut *pc_temp_ocv_lut;
struct sf_lut *pc_sf_lut;
struct sf_lut *rbatt_sf_lut;
+ int delta_rbatt_mohm;
struct work_struct calib_hkadc_work;
struct delayed_work calib_ccadc_work;
unsigned int calib_delay_ms;
@@ -996,6 +997,13 @@
pr_debug("adding rconn_mohm = %d rbatt = %d\n",
the_chip->rconn_mohm, rbatt);
+ if (is_between(20, 10, soc_rbatt))
+ rbatt = rbatt
+ + ((20 - soc_rbatt) * chip->delta_rbatt_mohm) / 10;
+ else
+ if (is_between(10, 0, soc_rbatt))
+ rbatt = rbatt + chip->delta_rbatt_mohm;
+
pr_debug("RBATT = %d\n", rbatt);
return rbatt;
}
@@ -1961,6 +1969,7 @@
chip->rbatt_sf_lut = palladium_1500_data.rbatt_sf_lut;
chip->default_rbatt_mohm
= palladium_1500_data.default_rbatt_mohm;
+ chip->delta_rbatt_mohm = palladium_1500_data.delta_rbatt_mohm;
return 0;
desay:
chip->fcc = desay_5200_data.fcc;
@@ -1969,6 +1978,7 @@
chip->pc_sf_lut = desay_5200_data.pc_sf_lut;
chip->rbatt_sf_lut = desay_5200_data.rbatt_sf_lut;
chip->default_rbatt_mohm = desay_5200_data.default_rbatt_mohm;
+ chip->delta_rbatt_mohm = desay_5200_data.delta_rbatt_mohm;
return 0;
}
diff --git a/include/linux/mfd/pm8xxx/pm8921-bms.h b/include/linux/mfd/pm8xxx/pm8921-bms.h
index b1ce91c..4dc3c80 100644
--- a/include/linux/mfd/pm8xxx/pm8921-bms.h
+++ b/include/linux/mfd/pm8xxx/pm8921-bms.h
@@ -80,8 +80,10 @@
* and percent charge
* @rbatt_sf_lut: table to get battery resistance scaling factor given
* temperature and percent charge
- * default_rbatt_mohm: the default value of battery resistance to use when
+ * @default_rbatt_mohm: the default value of battery resistance to use when
* readings from bms are not available.
+ * @delta_rbatt_mohm: the resistance to be added towards lower soc to
+ * compensate for battery capacitance.
*/
struct pm8921_bms_battery_data {
unsigned int fcc;
@@ -91,6 +93,7 @@
struct sf_lut *pc_sf_lut;
struct sf_lut *rbatt_sf_lut;
int default_rbatt_mohm;
+ int delta_rbatt_mohm;
};
struct pm8xxx_bms_core_data {