diff options
author | Rajkumar Kasirajan <rajkumar.kasirajan@stericsson.com> | 2012-05-28 06:27:33 -0400 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2013-01-23 09:39:19 -0500 |
commit | e41f39ea2a0e9ba32d6896c2cc38bfec880a0937 (patch) | |
tree | 6cb68505ec708a7f29af974003bc6a4f223538be | |
parent | 53ef1f590dc59f3c1478c68ea1f06a28f55ddccb (diff) |
pm2301: Enable vbat low monitoring
Enable support for low battery checking.
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>
-rw-r--r-- | drivers/power/pm2301_charger.c | 86 |
1 files changed, 45 insertions, 41 deletions
diff --git a/drivers/power/pm2301_charger.c b/drivers/power/pm2301_charger.c index 8c1dd5628d16..9b2e8943f944 100644 --- a/drivers/power/pm2301_charger.c +++ b/drivers/power/pm2301_charger.c | |||
@@ -118,6 +118,8 @@ static int pm2xxx_reg_read(struct pm2xxx_charger *pm2, int reg, u8 *val) | |||
118 | 1, val); | 118 | 1, val); |
119 | if (ret < 0) | 119 | if (ret < 0) |
120 | dev_err(pm2->dev, "Error reading register at 0x%x\n", reg); | 120 | dev_err(pm2->dev, "Error reading register at 0x%x\n", reg); |
121 | else | ||
122 | ret = 0; | ||
121 | 123 | ||
122 | return ret; | 124 | return ret; |
123 | } | 125 | } |
@@ -130,6 +132,8 @@ static int pm2xxx_reg_write(struct pm2xxx_charger *pm2, int reg, u8 val) | |||
130 | 1, &val); | 132 | 1, &val); |
131 | if (ret < 0) | 133 | if (ret < 0) |
132 | dev_err(pm2->dev, "Error writing register at 0x%x\n", reg); | 134 | dev_err(pm2->dev, "Error writing register at 0x%x\n", reg); |
135 | else | ||
136 | ret = 0; | ||
133 | 137 | ||
134 | return ret; | 138 | return ret; |
135 | } | 139 | } |
@@ -227,7 +231,7 @@ static int pm2xxx_charger_bat_disc_mngt(struct pm2xxx_charger *pm2, int val) | |||
227 | 231 | ||
228 | static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val) | 232 | static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val) |
229 | { | 233 | { |
230 | int ret = 0; | 234 | int ret; |
231 | 235 | ||
232 | ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT2, val); | 236 | ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT2, val); |
233 | 237 | ||
@@ -237,6 +241,7 @@ static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val) | |||
237 | } | 241 | } |
238 | 242 | ||
239 | *val &= (PM2XXX_INT2_S_ITVPWR1PLUG | PM2XXX_INT2_S_ITVPWR2PLUG); | 243 | *val &= (PM2XXX_INT2_S_ITVPWR1PLUG | PM2XXX_INT2_S_ITVPWR2PLUG); |
244 | |||
240 | out: | 245 | out: |
241 | return ret; | 246 | return ret; |
242 | } | 247 | } |
@@ -628,7 +633,7 @@ static int pm2xxx_charging_init(struct pm2xxx_charger *pm2) | |||
628 | 633 | ||
629 | /* Disable battery low monitoring */ | 634 | /* Disable battery low monitoring */ |
630 | ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_LOW_LEV_COMP_REG, | 635 | ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_LOW_LEV_COMP_REG, |
631 | PM2XXX_VBAT_LOW_MONITORING_DIS); | 636 | PM2XXX_VBAT_LOW_MONITORING_ENA); |
632 | 637 | ||
633 | /* Disable LED */ | 638 | /* Disable LED */ |
634 | ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG, | 639 | ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG, |
@@ -677,53 +682,51 @@ static int pm2xxx_charger_ac_en(struct ux500_charger *charger, | |||
677 | } | 682 | } |
678 | 683 | ||
679 | ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG8, &val); | 684 | ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG8, &val); |
680 | if (ret >= 0) { | 685 | if (ret < 0) { |
681 | val &= ~PM2XXX_CH_VOLT_MASK; | 686 | dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__); |
682 | val |= volt_index; | 687 | goto error_occured; |
683 | ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8, val); | 688 | } |
684 | 689 | val &= ~PM2XXX_CH_VOLT_MASK; | |
685 | if (ret < 0) { | 690 | val |= volt_index; |
686 | dev_err(pm2->dev, | 691 | ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8, val); |
687 | "%s write failed\n", __func__); | 692 | if (ret < 0) { |
688 | goto error_occured; | 693 | dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__); |
689 | } | 694 | goto error_occured; |
690 | else | ||
691 | dev_err(pm2->dev, "%s read failed\n", __func__); | ||
692 | } | 695 | } |
693 | 696 | ||
694 | ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val); | 697 | ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val); |
695 | if (ret >= 0) { | 698 | if (ret < 0) { |
696 | val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK; | 699 | dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__); |
697 | val |= curr_index; | 700 | goto error_occured; |
698 | ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val); | 701 | } |
699 | if (ret < 0) { | 702 | val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK; |
700 | dev_err(pm2->dev, | 703 | val |= curr_index; |
701 | "%s write failed\n", __func__); | 704 | ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val); |
702 | goto error_occured; | 705 | if (ret < 0) { |
703 | } | 706 | dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__); |
704 | else | 707 | goto error_occured; |
705 | dev_err(pm2->dev, "%s read failed\n", __func__); | ||
706 | } | 708 | } |
707 | 709 | ||
708 | if (!pm2->bat->enable_overshoot) { | 710 | if (!pm2->bat->enable_overshoot) { |
709 | ret = pm2xxx_reg_read(pm2, PM2XXX_LED_CTRL_REG, &val); | 711 | ret = pm2xxx_reg_read(pm2, PM2XXX_LED_CTRL_REG, &val); |
710 | if (ret >= 0) { | 712 | if (ret < 0) { |
711 | val |= PM2XXX_ANTI_OVERSHOOT_EN; | 713 | dev_err(pm2->dev, "%s pm2xxx read failed\n", |
712 | ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG, | 714 | __func__); |
713 | val); | 715 | goto error_occured; |
714 | if (ret < 0){ | 716 | } |
715 | dev_err(pm2->dev, "%s write failed\n", | 717 | val |= PM2XXX_ANTI_OVERSHOOT_EN; |
716 | __func__); | 718 | ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG, val); |
717 | goto error_occured; | 719 | if (ret < 0) { |
718 | } | 720 | dev_err(pm2->dev, "%s pm2xxx write failed\n", |
721 | __func__); | ||
722 | goto error_occured; | ||
719 | } | 723 | } |
720 | else | ||
721 | dev_err(pm2->dev, "%s read failed\n", __func__); | ||
722 | } | 724 | } |
723 | 725 | ||
724 | ret = pm2xxx_charging_enable_mngt(pm2); | 726 | ret = pm2xxx_charging_enable_mngt(pm2); |
725 | if (ret) { | 727 | if (ret < 0) { |
726 | dev_err(pm2->dev, "%s write failed\n", __func__); | 728 | dev_err(pm2->dev, "Failed to enable" |
729 | "pm2xxx ac charger\n"); | ||
727 | goto error_occured; | 730 | goto error_occured; |
728 | } | 731 | } |
729 | 732 | ||
@@ -739,9 +742,10 @@ static int pm2xxx_charger_ac_en(struct ux500_charger *charger, | |||
739 | } | 742 | } |
740 | 743 | ||
741 | ret = pm2xxx_charging_disable_mngt(pm2); | 744 | ret = pm2xxx_charging_disable_mngt(pm2); |
742 | if (ret) { | 745 | if (ret < 0) { |
743 | dev_err(pm2->dev, "%s write failed\n", __func__); | 746 | dev_err(pm2->dev, "failed to disable" |
744 | return ret; | 747 | "pm2xxx ac charger\n"); |
748 | goto error_occured; | ||
745 | } | 749 | } |
746 | 750 | ||
747 | dev_dbg(pm2->dev, "PM2301: " "Disabled AC charging\n"); | 751 | dev_dbg(pm2->dev, "PM2301: " "Disabled AC charging\n"); |