aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power/pm2301_charger.c
diff options
context:
space:
mode:
authorRajkumar Kasirajan <rajkumar.kasirajan@stericsson.com>2012-06-05 03:01:25 -0400
committerLee Jones <lee.jones@linaro.org>2013-03-06 23:35:34 -0500
commit584f970339bb259d4ac7dd82b355f283550193b2 (patch)
tree25b7e34a40381bbe162d187a02c55843318e49ba /drivers/power/pm2301_charger.c
parent116c326e74494806f2524ea07dc256f12b245652 (diff)
pm2301-charger: Enable SW EOC control on the ab9540
End of charging is managed by SW. Signed-off-by: Rajkumar Kasirajan <rajkumar.kasirajan@stericsson.com> Signed-off-by: Lee Jones <lee.jones@linaro.org> Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com> Tested-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'drivers/power/pm2301_charger.c')
-rw-r--r--drivers/power/pm2301_charger.c48
1 files changed, 43 insertions, 5 deletions
diff --git a/drivers/power/pm2301_charger.c b/drivers/power/pm2301_charger.c
index ca424b844b21..b2f2d4188da9 100644
--- a/drivers/power/pm2301_charger.c
+++ b/drivers/power/pm2301_charger.c
@@ -192,11 +192,22 @@ static int pm2xxx_charging_disable_mngt(struct pm2xxx_charger *pm2)
192{ 192{
193 int ret; 193 int ret;
194 194
195 /* Disable SW EOC ctrl */
196 ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG, PM2XXX_SWCTRL_HW);
197 if (ret < 0) {
198 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
199 return ret;
200 }
201
195 /* Disable charging */ 202 /* Disable charging */
196 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2, 203 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2,
197 (PM2XXX_CH_AUTO_RESUME_DIS | PM2XXX_CHARGER_DIS)); 204 (PM2XXX_CH_AUTO_RESUME_DIS | PM2XXX_CHARGER_DIS));
205 if (ret < 0) {
206 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
207 return ret;
208 }
198 209
199 return ret; 210 return 0;
200} 211}
201 212
202static int pm2xxx_charger_batt_therm_mngt(struct pm2xxx_charger *pm2, int val) 213static int pm2xxx_charger_batt_therm_mngt(struct pm2xxx_charger *pm2, int val)
@@ -245,13 +256,29 @@ static int pm2xxx_charger_wd_exp_mngt(struct pm2xxx_charger *pm2, int val)
245 256
246static int pm2xxx_charger_vbat_lsig_mngt(struct pm2xxx_charger *pm2, int val) 257static int pm2xxx_charger_vbat_lsig_mngt(struct pm2xxx_charger *pm2, int val)
247{ 258{
259 int ret;
260
248 switch (val) { 261 switch (val) {
249 case PM2XXX_INT1_ITVBATLOWR: 262 case PM2XXX_INT1_ITVBATLOWR:
250 dev_dbg(pm2->dev, "VBAT grows above VBAT_LOW level\n"); 263 dev_dbg(pm2->dev, "VBAT grows above VBAT_LOW level\n");
264 /* Enable SW EOC ctrl */
265 ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG,
266 PM2XXX_SWCTRL_SW);
267 if (ret < 0) {
268 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
269 return ret;
270 }
251 break; 271 break;
252 272
253 case PM2XXX_INT1_ITVBATLOWF: 273 case PM2XXX_INT1_ITVBATLOWF:
254 dev_dbg(pm2->dev, "VBAT drops below VBAT_LOW level\n"); 274 dev_dbg(pm2->dev, "VBAT drops below VBAT_LOW level\n");
275 /* Disable SW EOC ctrl */
276 ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG,
277 PM2XXX_SWCTRL_HW);
278 if (ret < 0) {
279 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
280 return ret;
281 }
255 break; 282 break;
256 283
257 default: 284 default:
@@ -322,16 +349,27 @@ static int pm2_int_reg0(void *pm2_data, int val)
322 struct pm2xxx_charger *pm2 = pm2_data; 349 struct pm2xxx_charger *pm2 = pm2_data;
323 int ret = 0; 350 int ret = 0;
324 351
325 if (val & (PM2XXX_INT1_ITVBATLOWR | PM2XXX_INT1_ITVBATLOWF)) { 352 if (val & PM2XXX_INT1_ITVBATLOWR) {
326 ret = pm2xxx_charger_vbat_lsig_mngt(pm2, val & 353 ret = pm2xxx_charger_vbat_lsig_mngt(pm2,
327 (PM2XXX_INT1_ITVBATLOWR | PM2XXX_INT1_ITVBATLOWF)); 354 PM2XXX_INT1_ITVBATLOWR);
355 if (ret < 0)
356 goto out;
357 }
358
359 if (val & PM2XXX_INT1_ITVBATLOWF) {
360 ret = pm2xxx_charger_vbat_lsig_mngt(pm2,
361 PM2XXX_INT1_ITVBATLOWF);
362 if (ret < 0)
363 goto out;
328 } 364 }
329 365
330 if (val & PM2XXX_INT1_ITVBATDISCONNECT) { 366 if (val & PM2XXX_INT1_ITVBATDISCONNECT) {
331 ret = pm2xxx_charger_bat_disc_mngt(pm2, 367 ret = pm2xxx_charger_bat_disc_mngt(pm2,
332 PM2XXX_INT1_ITVBATDISCONNECT); 368 PM2XXX_INT1_ITVBATDISCONNECT);
369 if (ret < 0)
370 goto out;
333 } 371 }
334 372out:
335 return ret; 373 return ret;
336} 374}
337 375