aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiam Breck <liam@networkimprov.net>2017-01-18 12:26:54 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-05-14 08:00:15 -0400
commite7b34f4a74f607e6ad67763ef47c26b762b8dd34 (patch)
treed10643987426f95fcdc7683acaf866f695c82dcd
parent7f2b4ad9c07af5291ff4b18548160b2816cda849 (diff)
power: supply: bq24190_charger: Handle fault before status on interrupt
commit ba52e75718784fda1b683ee0bfded72a0b83b047 upstream. Reading both fault and status registers and logging any fault should take priority over handling status register update. Fix by moving the status handling to later in interrupt routine. Fixes: d7bf353fd0aa3 ("bq24190_charger: Add support for TI BQ24190 Battery Charger") Signed-off-by: Liam Breck <kernel@networkimprov.net> Acked-by: Mark Greer <mgreer@animalcreek.com> Acked-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Sebastian Reichel <sre@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/power/supply/bq24190_charger.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/drivers/power/supply/bq24190_charger.c b/drivers/power/supply/bq24190_charger.c
index 5659b831720f..50171fd3cc6d 100644
--- a/drivers/power/supply/bq24190_charger.c
+++ b/drivers/power/supply/bq24190_charger.c
@@ -1175,29 +1175,6 @@ static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1175 goto out; 1175 goto out;
1176 } 1176 }
1177 1177
1178 if (ss_reg != bdi->ss_reg) {
1179 /*
1180 * The device is in host mode so when PG_STAT goes from 1->0
1181 * (i.e., power removed) HIZ needs to be disabled.
1182 */
1183 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1184 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1185 ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1186 BQ24190_REG_ISC_EN_HIZ_MASK,
1187 BQ24190_REG_ISC_EN_HIZ_SHIFT,
1188 0);
1189 if (ret < 0)
1190 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1191 ret);
1192 }
1193
1194 if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1195 alert_battery = true;
1196 if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1197 alert_charger = true;
1198 bdi->ss_reg = ss_reg;
1199 }
1200
1201 i = 0; 1178 i = 0;
1202 do { 1179 do {
1203 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg); 1180 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
@@ -1224,6 +1201,29 @@ static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1224 mutex_unlock(&bdi->f_reg_lock); 1201 mutex_unlock(&bdi->f_reg_lock);
1225 } 1202 }
1226 1203
1204 if (ss_reg != bdi->ss_reg) {
1205 /*
1206 * The device is in host mode so when PG_STAT goes from 1->0
1207 * (i.e., power removed) HIZ needs to be disabled.
1208 */
1209 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1210 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1211 ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1212 BQ24190_REG_ISC_EN_HIZ_MASK,
1213 BQ24190_REG_ISC_EN_HIZ_SHIFT,
1214 0);
1215 if (ret < 0)
1216 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1217 ret);
1218 }
1219
1220 if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1221 alert_battery = true;
1222 if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1223 alert_charger = true;
1224 bdi->ss_reg = ss_reg;
1225 }
1226
1227 if (alert_charger) 1227 if (alert_charger)
1228 power_supply_changed(bdi->charger); 1228 power_supply_changed(bdi->charger);
1229 if (alert_battery) 1229 if (alert_battery)