power: pm8921-bms: periodic hkadc calibration
Introduce periodic hkadc calibration again. A bug was introduced when
periodic ccadc calibration code was moved to the ccadc driver - hkadc
calibration got dropped.
Reintroduce periodic hkadc calibration.
Change-Id: Ib22e03ce881320ca556bfbddd55e658b42363065
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
diff --git a/drivers/power/pm8921-bms.c b/drivers/power/pm8921-bms.c
index 6898435..dba2b06 100644
--- a/drivers/power/pm8921-bms.c
+++ b/drivers/power/pm8921-bms.c
@@ -93,6 +93,8 @@
struct sf_lut *rbatt_sf_lut;
int delta_rbatt_mohm;
struct work_struct calib_hkadc_work;
+ struct delayed_work calib_hkadc_delayed_work;
+ struct mutex calib_mutex;
unsigned int revision;
unsigned int xoadc_v0625_usb_present;
unsigned int xoadc_v0625_usb_absent;
@@ -1636,10 +1638,11 @@
int usb_chg;
int this_delta;
+ mutex_lock(&chip->calib_mutex);
rc = pm8xxx_adc_read(the_chip->ref1p25v_channel, &result);
if (rc) {
pr_err("ADC failed for 1.25volts rc = %d\n", rc);
- return;
+ goto out;
}
voltage = xoadc_reading_to_microvolt(result.adc_code);
@@ -1651,7 +1654,7 @@
rc = pm8xxx_adc_read(the_chip->ref625mv_channel, &result);
if (rc) {
pr_err("ADC failed for 1.25volts rc = %d\n", rc);
- return;
+ goto out;
}
voltage = xoadc_reading_to_microvolt(result.adc_code);
@@ -1678,6 +1681,8 @@
chip->xoadc_v0625_usb_absent,
last_usb_cal_delta_uv);
}
+out:
+ mutex_unlock(&chip->calib_mutex);
}
static void calibrate_hkadc_work(struct work_struct *work)
@@ -1693,6 +1698,19 @@
schedule_work(&the_chip->calib_hkadc_work);
}
+#define HKADC_CALIB_DELAY_MS 600000
+static void calibrate_hkadc_delayed_work(struct work_struct *work)
+{
+ struct pm8921_bms_chip *chip = container_of(work,
+ struct pm8921_bms_chip,
+ calib_hkadc_delayed_work.work);
+
+ calib_hkadc(chip);
+ schedule_delayed_work(&chip->calib_hkadc_delayed_work,
+ round_jiffies_relative(msecs_to_jiffies
+ (HKADC_CALIB_DELAY_MS)));
+}
+
int pm8921_bms_get_vsense_avg(int *result)
{
int rc = -EINVAL;
@@ -2603,7 +2621,11 @@
chip->batt_id_channel = pdata->bms_cdata.batt_id_channel;
chip->revision = pm8xxx_get_revision(chip->dev->parent);
chip->enable_fcc_learning = pdata->enable_fcc_learning;
+
+ mutex_init(&chip->calib_mutex);
INIT_WORK(&chip->calib_hkadc_work, calibrate_hkadc_work);
+ INIT_DELAYED_WORK(&chip->calib_hkadc_delayed_work,
+ calibrate_hkadc_delayed_work);
rc = request_irqs(chip, pdev);
if (rc) {
@@ -2630,8 +2652,9 @@
}
check_initial_ocv(chip);
- /* initial hkadc calibration */
- schedule_work(&chip->calib_hkadc_work);
+ /* start periodic hkadc calibration */
+ schedule_delayed_work(&chip->calib_hkadc_delayed_work, 0);
+
/* enable the vbatt reading interrupts for scheduling hkadc calib */
pm8921_bms_enable_irq(chip, PM8921_BMS_GOOD_OCV);
pm8921_bms_enable_irq(chip, PM8921_BMS_OCV_FOR_R);