diff options
author | Johan Palsson <johan.palsson@stericsson.com> | 2011-02-16 15:57:21 +0100 |
---|---|---|
committer | Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com> | 2011-02-17 07:37:03 +0100 |
commit | 3751163c49f2cd79b8680a83fa9201f610bc608f (patch) | |
tree | 87b17e17e43ea33bfcf5d0dabc3d67fa28ac821f /drivers/power | |
parent | 868248fe7882643d816d9bf363608bb6debec545 (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.c | 41 |
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); } |