aboutsummaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorJohan Palsson <johan.palsson@stericsson.com>2011-02-16 15:57:21 +0100
committerSrinidhi KASAGAR <srinidhi.kasagar@stericsson.com>2011-02-17 07:37:03 +0100
commit3751163c49f2cd79b8680a83fa9201f610bc608f (patch)
tree87b17e17e43ea33bfcf5d0dabc3d67fa28ac821f /drivers/power
parent868248fe7882643d816d9bf363608bb6debec545 (diff)
power: ab8500_bm: Set USB input current limit on state-change
USB input current limit is set when the USB link status changes. This is needed to support ACA ST-Ericsson ID: CR281330 Change-Id: Ie0f695f0ee2754b506c220fd821dbff96d857188 Signed-off-by: Johan Palsson <johan.palsson@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/14004 Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/ab8500_charger.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/drivers/power/ab8500_charger.c b/drivers/power/ab8500_charger.c
index a91ca8ac0db..7b90ad057c0 100644
--- a/drivers/power/ab8500_charger.c
+++ b/drivers/power/ab8500_charger.c
@@ -410,12 +410,24 @@ static int ab8500_charger_max_usb_curr(struct ab8500_charger *di,
case USB_STAT_ACA_RID_C_HS:
di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P9;
break;
- case USB_STAT_DEDICATED_CHG:
case USB_STAT_ACA_RID_A:
+ /*
+ * Dedicated charger level minus maximum current accessory
+ * can consume (300mA). Closest level is 1100mA
+ */
+ di->max_usb_in_curr = USB_CH_IP_CUR_LVL_1P1;
+ break;
case USB_STAT_ACA_RID_B:
+ /*
+ * Dedicated charger level minus 120mA (20mA for ACA and
+ * 100mA for potential accessory). Closest level is 1300mA
+ */
+ di->max_usb_in_curr = USB_CH_IP_CUR_LVL_1P3;
+ break;
+ case USB_STAT_DEDICATED_CHG:
+ case USB_STAT_HOST_CHG_NM:
case USB_STAT_ACA_RID_C_HS_CHIRP:
case USB_STAT_ACA_RID_C_NM:
- case USB_STAT_HOST_CHG_NM:
di->max_usb_in_curr = USB_CH_IP_CUR_LVL_1P5;
break;
case USB_STAT_HM_IDGND:
@@ -424,12 +436,12 @@ static int ab8500_charger_max_usb_curr(struct ab8500_charger *di,
case USB_STAT_NOT_VALID_LINK:
dev_err(di->dev, "USB Type - Charging not allowed\n");
di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P05;
- ret = -1;
+ ret = -ENXIO;
break;
default:
dev_err(di->dev, "USB Type - Unknown\n");
di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P05;
- ret = -1;
+ ret = -ENXIO;
break;
};
@@ -1315,14 +1327,27 @@ static void ab8500_charger_usb_link_status_work(struct work_struct *work)
di->vbus_detected = 1;
ret = ab8500_charger_read_usb_type(di);
if (!ret) {
+ /* Update maximum input current */
+ ret = abx500_set_register_interruptible(di->dev,
+ AB8500_CHARGER, AB8500_USBCH_IPT_CRNTLVL_REG,
+ di->max_usb_in_curr);
+ if (ret) {
+ dev_err(di->dev, "%s write failed\n", __func__);
+ return;
+ }
di->usb.charger_connected = 1;
power_supply_changed(&di->usb_psy);
+ } else if (ret == -ENXIO) {
+ /* No valid charger type detected */
+ di->usb.charger_connected = 0;
+ power_supply_changed(&di->usb_psy);
}
}
}
static void ab8500_charger_usb_state_changed_work(struct work_struct *work)
{
+ int ret;
struct ab8500_charger *di = container_of(work,
struct ab8500_charger, usb_state_changed_work);
@@ -1367,6 +1392,14 @@ static void ab8500_charger_usb_state_changed_work(struct work_struct *work)
* input current obtained from USB driver
*/
if (!ab8500_charger_get_usb_cur(di)) {
+ /* Update maximum input current */
+ ret = abx500_set_register_interruptible(di->dev,
+ AB8500_CHARGER, AB8500_USBCH_IPT_CRNTLVL_REG,
+ di->max_usb_in_curr);
+ if (ret) {
+ dev_err(di->dev, "%s write failed\n", __func__);
+ return;
+ }
di->usb.charger_connected = 1;
power_supply_changed(&di->usb_psy);
}