diff options
author | Rajkumar Kasirajan <rajkumar.kasirajan@stericsson.com> | 2012-06-05 03:01:25 -0400 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2013-03-06 23:35:34 -0500 |
commit | 584f970339bb259d4ac7dd82b355f283550193b2 (patch) | |
tree | 25b7e34a40381bbe162d187a02c55843318e49ba /drivers/power/pm2301_charger.c | |
parent | 116c326e74494806f2524ea07dc256f12b245652 (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.c | 48 |
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 | ||
202 | static int pm2xxx_charger_batt_therm_mngt(struct pm2xxx_charger *pm2, int val) | 213 | static 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 | ||
246 | static int pm2xxx_charger_vbat_lsig_mngt(struct pm2xxx_charger *pm2, int val) | 257 | static 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 | 372 | out: | |
335 | return ret; | 373 | return ret; |
336 | } | 374 | } |
337 | 375 | ||