power: pm8921-charger: fix 10mv error on vdd_max
It was observed that the charging voltage is off by 10mV. The root
cause was the 10mV bit in the vdd_max register adds 10mV to the voltage
instead of reducing the voltage by 10mV.
The current driver thinks it subtracts 10mV. Fix this.
Change-Id: I37949113cb4c25642c873ce0cf39ac9fdeb276e1
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
diff --git a/drivers/power/pm8921-charger.c b/drivers/power/pm8921-charger.c
index 65e923e..60d4e64 100644
--- a/drivers/power/pm8921-charger.c
+++ b/drivers/power/pm8921-charger.c
@@ -417,23 +417,28 @@
#define PM8921_CHG_V_MIN_MV 3240
#define PM8921_CHG_V_STEP_MV 20
-#define PM8921_CHG_V_STEP_10_MV_BIT BIT(7)
+#define PM8921_CHG_V_STEP_10MV_OFFSET_BIT BIT(7)
#define PM8921_CHG_VDDMAX_MAX 4500
#define PM8921_CHG_VDDMAX_MIN 3400
#define PM8921_CHG_V_MASK 0x7F
static int __pm_chg_vddmax_set(struct pm8921_chg_chip *chip, int voltage)
{
- int remainder, voltage_20_step;
+ int remainder;
u8 temp = 0;
- voltage_20_step = voltage;
- remainder = voltage % 20;
- if (remainder >= 10) {
- voltage_20_step += 10;
- temp = PM8921_CHG_V_STEP_10_MV_BIT;
+ if (voltage < PM8921_CHG_VDDMAX_MIN
+ || voltage > PM8921_CHG_VDDMAX_MAX) {
+ pr_err("bad mV=%d asked to set\n", voltage);
+ return -EINVAL;
}
- temp |= (voltage_20_step - PM8921_CHG_V_MIN_MV) / PM8921_CHG_V_STEP_MV;
+ temp = (voltage - PM8921_CHG_V_MIN_MV) / PM8921_CHG_V_STEP_MV;
+
+ remainder = voltage % 20;
+ if (remainder >= 10) {
+ temp |= PM8921_CHG_V_STEP_10MV_OFFSET_BIT;
+ }
+
pr_debug("voltage=%d setting %02x\n", voltage, temp);
return pm8xxx_writeb(chip->dev->parent, CHG_VDD_MAX, temp);
}
@@ -449,10 +454,10 @@
*voltage = 0;
return rc;
}
- temp &= PM8921_CHG_V_MASK;
- *voltage = (int)temp * PM8921_CHG_V_STEP_MV + PM8921_CHG_V_MIN_MV;
- if (temp & PM8921_CHG_V_STEP_10_MV_BIT)
- *voltage = *voltage - 10;
+ *voltage = (int)(temp & PM8921_CHG_V_MASK) * PM8921_CHG_V_STEP_MV
+ + PM8921_CHG_V_MIN_MV;
+ if (temp & PM8921_CHG_V_STEP_10MV_OFFSET_BIT)
+ *voltage = *voltage + 10;
return 0;
}