aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power/ab8500_charger.c
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2013-02-14 07:37:29 -0500
committerLee Jones <lee.jones@linaro.org>2013-03-06 23:35:42 -0500
commitf7470b5d246294761892f4bafc0eeedaa4369d92 (patch)
tree126b36d748838bd988725381c105012281cbd8d4 /drivers/power/ab8500_charger.c
parent49fddeec9fbb0dd58507185104812fde77c38def (diff)
ab8500_charger: Prevent auto drop of VBUS
Do not set higher current in stepping functionality if VBUS is dropping. After VBUS has dropped try to set current once again. If dropping again then we have found the maximum capability of the charger. Signed-off-by: Lee Jones <lee.jones@linaro.org>
Diffstat (limited to 'drivers/power/ab8500_charger.c')
-rw-r--r--drivers/power/ab8500_charger.c169
1 files changed, 120 insertions, 49 deletions
diff --git a/drivers/power/ab8500_charger.c b/drivers/power/ab8500_charger.c
index f1d712308b02..547f6ea1b695 100644
--- a/drivers/power/ab8500_charger.c
+++ b/drivers/power/ab8500_charger.c
@@ -58,6 +58,7 @@
58#define MAIN_CH_INPUT_CURR_SHIFT 4 58#define MAIN_CH_INPUT_CURR_SHIFT 4
59#define VBUS_IN_CURR_LIM_SHIFT 4 59#define VBUS_IN_CURR_LIM_SHIFT 4
60#define AUTO_VBUS_IN_CURR_LIM_SHIFT 4 60#define AUTO_VBUS_IN_CURR_LIM_SHIFT 4
61#define VBUS_IN_CURR_LIM_RETRY_SET_TIME 30 /* seconds */
61 62
62#define LED_INDICATOR_PWM_ENA 0x01 63#define LED_INDICATOR_PWM_ENA 0x01
63#define LED_INDICATOR_PWM_DIS 0x00 64#define LED_INDICATOR_PWM_DIS 0x00
@@ -202,10 +203,15 @@ struct ab8500_charger_usb_state {
202 spinlock_t usb_lock; 203 spinlock_t usb_lock;
203}; 204};
204 205
206struct ab8500_charger_max_usb_in_curr {
207 int usb_type_max;
208 int set_max;
209 int calculated_max;
210};
211
205/** 212/**
206 * struct ab8500_charger - ab8500 Charger device information 213 * struct ab8500_charger - ab8500 Charger device information
207 * @dev: Pointer to the structure device 214 * @dev: Pointer to the structure device
208 * @max_usb_in_curr: Max USB charger input current
209 * @vbus_detected: VBUS detected 215 * @vbus_detected: VBUS detected
210 * @vbus_detected_start: 216 * @vbus_detected_start:
211 * VBUS detected during startup 217 * VBUS detected during startup
@@ -220,7 +226,6 @@ struct ab8500_charger_usb_state {
220 * @autopower Indicate if we should have automatic pwron after pwrloss 226 * @autopower Indicate if we should have automatic pwron after pwrloss
221 * @autopower_cfg platform specific power config support for "pwron after pwrloss" 227 * @autopower_cfg platform specific power config support for "pwron after pwrloss"
222 * @invalid_charger_detect_state State when forcing AB to use invalid charger 228 * @invalid_charger_detect_state State when forcing AB to use invalid charger
223 * @is_usb_host: Indicate if last detected USB type is host
224 * @is_aca_rid: Incicate if accessory is ACA type 229 * @is_aca_rid: Incicate if accessory is ACA type
225 * @current_stepping_sessions: 230 * @current_stepping_sessions:
226 * Counter for current stepping sessions 231 * Counter for current stepping sessions
@@ -229,6 +234,7 @@ struct ab8500_charger_usb_state {
229 * @bm: Platform specific battery management information 234 * @bm: Platform specific battery management information
230 * @flags: Structure for information about events triggered 235 * @flags: Structure for information about events triggered
231 * @usb_state: Structure for usb stack information 236 * @usb_state: Structure for usb stack information
237 * @max_usb_in_curr: Max USB charger input current
232 * @ac_chg: AC charger power supply 238 * @ac_chg: AC charger power supply
233 * @usb_chg: USB charger power supply 239 * @usb_chg: USB charger power supply
234 * @ac: Structure that holds the AC charger properties 240 * @ac: Structure that holds the AC charger properties
@@ -260,7 +266,6 @@ struct ab8500_charger_usb_state {
260 */ 266 */
261struct ab8500_charger { 267struct ab8500_charger {
262 struct device *dev; 268 struct device *dev;
263 int max_usb_in_curr;
264 bool vbus_detected; 269 bool vbus_detected;
265 bool vbus_detected_start; 270 bool vbus_detected_start;
266 bool ac_conn; 271 bool ac_conn;
@@ -272,7 +277,6 @@ struct ab8500_charger {
272 bool autopower; 277 bool autopower;
273 bool autopower_cfg; 278 bool autopower_cfg;
274 int invalid_charger_detect_state; 279 int invalid_charger_detect_state;
275 bool is_usb_host;
276 int is_aca_rid; 280 int is_aca_rid;
277 atomic_t current_stepping_sessions; 281 atomic_t current_stepping_sessions;
278 struct ab8500 *parent; 282 struct ab8500 *parent;
@@ -280,6 +284,7 @@ struct ab8500_charger {
280 struct abx500_bm_data *bm; 284 struct abx500_bm_data *bm;
281 struct ab8500_charger_event_flags flags; 285 struct ab8500_charger_event_flags flags;
282 struct ab8500_charger_usb_state usb_state; 286 struct ab8500_charger_usb_state usb_state;
287 struct ab8500_charger_max_usb_in_curr max_usb_in_curr;
283 struct ux500_charger ac_chg; 288 struct ux500_charger ac_chg;
284 struct ux500_charger usb_chg; 289 struct ux500_charger usb_chg;
285 struct ab8500_charger_info ac; 290 struct ab8500_charger_info ac;
@@ -421,6 +426,10 @@ static void ab8500_charger_set_usb_connected(struct ab8500_charger *di,
421 if (connected != di->usb.charger_connected) { 426 if (connected != di->usb.charger_connected) {
422 dev_dbg(di->dev, "USB connected:%i\n", connected); 427 dev_dbg(di->dev, "USB connected:%i\n", connected);
423 di->usb.charger_connected = connected; 428 di->usb.charger_connected = connected;
429
430 if (!connected)
431 di->flags.vbus_drop_end = false;
432
424 sysfs_notify(&di->usb_chg.psy.dev->kobj, NULL, "present"); 433 sysfs_notify(&di->usb_chg.psy.dev->kobj, NULL, "present");
425 434
426 if (connected) { 435 if (connected) {
@@ -674,23 +683,19 @@ static int ab8500_charger_max_usb_curr(struct ab8500_charger *di,
674 case USB_STAT_STD_HOST_C_S: 683 case USB_STAT_STD_HOST_C_S:
675 dev_dbg(di->dev, "USB Type - Standard host is " 684 dev_dbg(di->dev, "USB Type - Standard host is "
676 "detected through USB driver\n"); 685 "detected through USB driver\n");
677 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P5; 686 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5;
678 di->is_usb_host = true;
679 di->is_aca_rid = 0; 687 di->is_aca_rid = 0;
680 break; 688 break;
681 case USB_STAT_HOST_CHG_HS_CHIRP: 689 case USB_STAT_HOST_CHG_HS_CHIRP:
682 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P5; 690 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5;
683 di->is_usb_host = true;
684 di->is_aca_rid = 0; 691 di->is_aca_rid = 0;
685 break; 692 break;
686 case USB_STAT_HOST_CHG_HS: 693 case USB_STAT_HOST_CHG_HS:
687 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P5; 694 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5;
688 di->is_usb_host = true;
689 di->is_aca_rid = 0; 695 di->is_aca_rid = 0;
690 break; 696 break;
691 case USB_STAT_ACA_RID_C_HS: 697 case USB_STAT_ACA_RID_C_HS:
692 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P9; 698 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P9;
693 di->is_usb_host = false;
694 di->is_aca_rid = 0; 699 di->is_aca_rid = 0;
695 break; 700 break;
696 case USB_STAT_ACA_RID_A: 701 case USB_STAT_ACA_RID_A:
@@ -699,8 +704,7 @@ static int ab8500_charger_max_usb_curr(struct ab8500_charger *di,
699 * can consume (900mA). Closest level is 500mA 704 * can consume (900mA). Closest level is 500mA
700 */ 705 */
701 dev_dbg(di->dev, "USB_STAT_ACA_RID_A detected\n"); 706 dev_dbg(di->dev, "USB_STAT_ACA_RID_A detected\n");
702 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P5; 707 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5;
703 di->is_usb_host = false;
704 di->is_aca_rid = 1; 708 di->is_aca_rid = 1;
705 break; 709 break;
706 case USB_STAT_ACA_RID_B: 710 case USB_STAT_ACA_RID_B:
@@ -708,38 +712,35 @@ static int ab8500_charger_max_usb_curr(struct ab8500_charger *di,
708 * Dedicated charger level minus 120mA (20mA for ACA and 712 * Dedicated charger level minus 120mA (20mA for ACA and
709 * 100mA for potential accessory). Closest level is 1300mA 713 * 100mA for potential accessory). Closest level is 1300mA
710 */ 714 */
711 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_1P3; 715 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_1P3;
712 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", link_status, 716 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", link_status,
713 di->max_usb_in_curr); 717 di->max_usb_in_curr.usb_type_max);
714 di->is_usb_host = false;
715 di->is_aca_rid = 1; 718 di->is_aca_rid = 1;
716 break; 719 break;
717 case USB_STAT_HOST_CHG_NM: 720 case USB_STAT_HOST_CHG_NM:
718 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P5; 721 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5;
719 di->is_usb_host = true;
720 di->is_aca_rid = 0; 722 di->is_aca_rid = 0;
721 break; 723 break;
722 case USB_STAT_DEDICATED_CHG: 724 case USB_STAT_DEDICATED_CHG:
723 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_1P5; 725 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_1P5;
724 di->is_usb_host = false;
725 di->is_aca_rid = 0; 726 di->is_aca_rid = 0;
726 break; 727 break;
727 case USB_STAT_ACA_RID_C_HS_CHIRP: 728 case USB_STAT_ACA_RID_C_HS_CHIRP:
728 case USB_STAT_ACA_RID_C_NM: 729 case USB_STAT_ACA_RID_C_NM:
729 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_1P5; 730 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_1P5;
730 di->is_usb_host = false;
731 di->is_aca_rid = 1; 731 di->is_aca_rid = 1;
732 break; 732 break;
733 case USB_STAT_NOT_CONFIGURED: 733 case USB_STAT_NOT_CONFIGURED:
734 if (di->vbus_detected) { 734 if (di->vbus_detected) {
735 di->usb_device_is_unrecognised = true; 735 di->usb_device_is_unrecognised = true;
736 dev_dbg(di->dev, "USB Type - Legacy charger.\n"); 736 dev_dbg(di->dev, "USB Type - Legacy charger.\n");
737 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_1P5; 737 di->max_usb_in_curr.usb_type_max =
738 USB_CH_IP_CUR_LVL_1P5;
738 break; 739 break;
739 } 740 }
740 case USB_STAT_HM_IDGND: 741 case USB_STAT_HM_IDGND:
741 dev_err(di->dev, "USB Type - Charging not allowed\n"); 742 dev_err(di->dev, "USB Type - Charging not allowed\n");
742 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P05; 743 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P05;
743 ret = -ENXIO; 744 ret = -ENXIO;
744 break; 745 break;
745 case USB_STAT_RESERVED: 746 case USB_STAT_RESERVED:
@@ -752,9 +753,11 @@ static int ab8500_charger_max_usb_curr(struct ab8500_charger *di,
752 } 753 }
753 if (is_ab9540(di->parent) || is_ab8505(di->parent)) { 754 if (is_ab9540(di->parent) || is_ab8505(di->parent)) {
754 dev_dbg(di->dev, "USB Type - Charging not allowed\n"); 755 dev_dbg(di->dev, "USB Type - Charging not allowed\n");
755 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P05; 756 di->max_usb_in_curr.usb_type_max =
757 USB_CH_IP_CUR_LVL_0P05;
756 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", 758 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d",
757 link_status, di->max_usb_in_curr); 759 link_status,
760 di->max_usb_in_curr.usb_type_max);
758 ret = -ENXIO; 761 ret = -ENXIO;
759 break; 762 break;
760 } 763 }
@@ -763,23 +766,24 @@ static int ab8500_charger_max_usb_curr(struct ab8500_charger *di,
763 case USB_STAT_CARKIT_2: 766 case USB_STAT_CARKIT_2:
764 case USB_STAT_ACA_DOCK_CHARGER: 767 case USB_STAT_ACA_DOCK_CHARGER:
765 case USB_STAT_CHARGER_LINE_1: 768 case USB_STAT_CHARGER_LINE_1:
766 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P5; 769 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5;
767 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", link_status, 770 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", link_status,
768 di->max_usb_in_curr); 771 di->max_usb_in_curr.usb_type_max);
769 case USB_STAT_NOT_VALID_LINK: 772 case USB_STAT_NOT_VALID_LINK:
770 dev_err(di->dev, "USB Type invalid - try charging anyway\n"); 773 dev_err(di->dev, "USB Type invalid - try charging anyway\n");
771 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P5; 774 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5;
772 break; 775 break;
773 776
774 default: 777 default:
775 dev_err(di->dev, "USB Type - Unknown\n"); 778 dev_err(di->dev, "USB Type - Unknown\n");
776 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P05; 779 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P05;
777 ret = -ENXIO; 780 ret = -ENXIO;
778 break; 781 break;
779 }; 782 };
780 783
784 di->max_usb_in_curr.set_max = di->max_usb_in_curr.usb_type_max;
781 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", 785 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d",
782 link_status, di->max_usb_in_curr); 786 link_status, di->max_usb_in_curr.set_max);
783 787
784 return ret; 788 return ret;
785} 789}
@@ -1083,28 +1087,48 @@ static int ab8500_vbus_in_curr_to_regval(int curr)
1083 */ 1087 */
1084static int ab8500_charger_get_usb_cur(struct ab8500_charger *di) 1088static int ab8500_charger_get_usb_cur(struct ab8500_charger *di)
1085{ 1089{
1090 int ret = 0;
1086 switch (di->usb_state.usb_current) { 1091 switch (di->usb_state.usb_current) {
1087 case 100: 1092 case 100:
1088 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P09; 1093 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P09;
1089 break; 1094 break;
1090 case 200: 1095 case 200:
1091 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P19; 1096 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P19;
1092 break; 1097 break;
1093 case 300: 1098 case 300:
1094 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P29; 1099 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P29;
1095 break; 1100 break;
1096 case 400: 1101 case 400:
1097 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P38; 1102 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P38;
1098 break; 1103 break;
1099 case 500: 1104 case 500:
1100 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P5; 1105 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5;
1101 break; 1106 break;
1102 default: 1107 default:
1103 di->max_usb_in_curr = USB_CH_IP_CUR_LVL_0P05; 1108 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P05;
1104 return -1; 1109 ret = -EPERM;
1105 break; 1110 break;
1106 }; 1111 };
1107 return 0; 1112 di->max_usb_in_curr.set_max = di->max_usb_in_curr.usb_type_max;
1113 return ret;
1114}
1115
1116/**
1117 * ab8500_charger_check_continue_stepping() - Check to allow stepping
1118 * @di: pointer to the ab8500_charger structure
1119 * @reg: select what charger register to check
1120 *
1121 * Check if current stepping should be allowed to continue.
1122 * Checks if charger source has not collapsed. If it has, further stepping
1123 * is not allowed.
1124 */
1125static bool ab8500_charger_check_continue_stepping(struct ab8500_charger *di,
1126 int reg)
1127{
1128 if (reg == AB8500_USBCH_IPT_CRNTLVL_REG)
1129 return !di->flags.vbus_drop_end;
1130 else
1131 return true;
1108} 1132}
1109 1133
1110/** 1134/**
@@ -1225,7 +1249,8 @@ static int ab8500_charger_set_current(struct ab8500_charger *di,
1225 usleep_range(step_udelay, step_udelay * 2); 1249 usleep_range(step_udelay, step_udelay * 2);
1226 } 1250 }
1227 } else { 1251 } else {
1228 for (i = prev_curr_index + 1; i <= curr_index; i++) { 1252 bool allow = true;
1253 for (i = prev_curr_index + 1; i <= curr_index && allow; i++) {
1229 dev_dbg(di->dev, "curr change_2 to: %x for 0x%02x\n", 1254 dev_dbg(di->dev, "curr change_2 to: %x for 0x%02x\n",
1230 (u8)i << shift_value, reg); 1255 (u8)i << shift_value, reg);
1231 ret = abx500_set_register_interruptible(di->dev, 1256 ret = abx500_set_register_interruptible(di->dev,
@@ -1236,6 +1261,8 @@ static int ab8500_charger_set_current(struct ab8500_charger *di,
1236 } 1261 }
1237 if (i != curr_index) 1262 if (i != curr_index)
1238 usleep_range(step_udelay, step_udelay * 2); 1263 usleep_range(step_udelay, step_udelay * 2);
1264
1265 allow = ab8500_charger_check_continue_stepping(di, reg);
1239 } 1266 }
1240 } 1267 }
1241 1268
@@ -1261,6 +1288,11 @@ static int ab8500_charger_set_vbus_in_curr(struct ab8500_charger *di,
1261 1288
1262 /* We should always use to lowest current limit */ 1289 /* We should always use to lowest current limit */
1263 min_value = min(di->bm->chg_params->usb_curr_max, ich_in); 1290 min_value = min(di->bm->chg_params->usb_curr_max, ich_in);
1291 if (di->max_usb_in_curr.set_max > 0)
1292 min_value = min(di->max_usb_in_curr.set_max, min_value);
1293
1294 if (di->usb_state.usb_current >= 0)
1295 min_value = min(di->usb_state.usb_current, min_value);
1264 1296
1265 switch (min_value) { 1297 switch (min_value) {
1266 case 100: 1298 case 100:
@@ -1615,7 +1647,8 @@ static int ab8500_charger_usb_en(struct ux500_charger *charger,
1615 di->usb.charger_online = 1; 1647 di->usb.charger_online = 1;
1616 1648
1617 /* USBChInputCurr: current that can be drawn from the usb */ 1649 /* USBChInputCurr: current that can be drawn from the usb */
1618 ret = ab8500_charger_set_vbus_in_curr(di, di->max_usb_in_curr); 1650 ret = ab8500_charger_set_vbus_in_curr(di,
1651 di->max_usb_in_curr.usb_type_max);
1619 if (ret) { 1652 if (ret) {
1620 dev_err(di->dev, "setting USBChInputCurr failed\n"); 1653 dev_err(di->dev, "setting USBChInputCurr failed\n");
1621 return ret; 1654 return ret;
@@ -1950,9 +1983,10 @@ static void ab8500_charger_check_vbat_work(struct work_struct *work)
1950 di->vbat > VBAT_TRESH_IP_CUR_RED))) { 1983 di->vbat > VBAT_TRESH_IP_CUR_RED))) {
1951 1984
1952 dev_dbg(di->dev, "Vbat did cross threshold, curr: %d, new: %d," 1985 dev_dbg(di->dev, "Vbat did cross threshold, curr: %d, new: %d,"
1953 " old: %d\n", di->max_usb_in_curr, di->vbat, 1986 " old: %d\n", di->max_usb_in_curr.usb_type_max,
1954 di->old_vbat); 1987 di->vbat, di->old_vbat);
1955 ab8500_charger_set_vbus_in_curr(di, di->max_usb_in_curr); 1988 ab8500_charger_set_vbus_in_curr(di,
1989 di->max_usb_in_curr.usb_type_max);
1956 power_supply_changed(&di->usb_chg.psy); 1990 power_supply_changed(&di->usb_chg.psy);
1957 } 1991 }
1958 1992
@@ -2232,7 +2266,8 @@ static void ab8500_charger_usb_link_attach_work(struct work_struct *work)
2232 2266
2233 /* Update maximum input current if USB enumeration is not detected */ 2267 /* Update maximum input current if USB enumeration is not detected */
2234 if (!di->usb.charger_online) { 2268 if (!di->usb.charger_online) {
2235 ret = ab8500_charger_set_vbus_in_curr(di, di->max_usb_in_curr); 2269 ret = ab8500_charger_set_vbus_in_curr(di,
2270 di->max_usb_in_curr.usb_type_max);
2236 if (ret) 2271 if (ret)
2237 return; 2272 return;
2238 } 2273 }
@@ -2400,7 +2435,7 @@ static void ab8500_charger_usb_state_changed_work(struct work_struct *work)
2400 if (!ab8500_charger_get_usb_cur(di)) { 2435 if (!ab8500_charger_get_usb_cur(di)) {
2401 /* Update maximum input current */ 2436 /* Update maximum input current */
2402 ret = ab8500_charger_set_vbus_in_curr(di, 2437 ret = ab8500_charger_set_vbus_in_curr(di,
2403 di->max_usb_in_curr); 2438 di->max_usb_in_curr.usb_type_max);
2404 if (ret) 2439 if (ret)
2405 return; 2440 return;
2406 2441
@@ -2618,15 +2653,45 @@ static void ab8500_charger_vbus_drop_end_work(struct work_struct *work)
2618{ 2653{
2619 struct ab8500_charger *di = container_of(work, 2654 struct ab8500_charger *di = container_of(work,
2620 struct ab8500_charger, vbus_drop_end_work.work); 2655 struct ab8500_charger, vbus_drop_end_work.work);
2656 int ret;
2657 u8 reg_value;
2621 2658
2622 di->flags.vbus_drop_end = false; 2659 di->flags.vbus_drop_end = false;
2623 2660
2624 /* Reset the drop counter */ 2661 /* Reset the drop counter */
2625 abx500_set_register_interruptible(di->dev, 2662 abx500_set_register_interruptible(di->dev,
2626 AB8500_CHARGER, AB8500_CHARGER_CTRL, 0x01); 2663 AB8500_CHARGER, AB8500_CHARGER_CTRL, 0x01);
2664 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER,
2665 AB8500_CH_USBCH_STAT2_REG,
2666 &reg_value);
2667 if (ret < 0) {
2668 dev_err(di->dev, "%s ab8500 read failed\n", __func__);
2669 } else {
2670 int curr = ab8500_charger_vbus_in_curr_map[
2671 reg_value >> AUTO_VBUS_IN_CURR_LIM_SHIFT];
2672 if (di->max_usb_in_curr.calculated_max != curr) {
2673 /* USB source is collapsing */
2674 di->max_usb_in_curr.calculated_max = curr;
2675 dev_dbg(di->dev,
2676 "VBUS input current limiting to %d mA\n",
2677 di->max_usb_in_curr.calculated_max);
2678 } else {
2679 /*
2680 * USB source can not give more than this amount.
2681 * Taking more will collapse the source.
2682 */
2683 di->max_usb_in_curr.set_max =
2684 di->max_usb_in_curr.calculated_max;
2685 dev_dbg(di->dev,
2686 "VBUS input current limited to %d mA\n",
2687 di->max_usb_in_curr.set_max);
2688 return;
2689 }
2690 }
2627 2691
2628 if (di->usb.charger_connected) 2692 if (di->usb.charger_connected)
2629 ab8500_charger_set_vbus_in_curr(di, di->max_usb_in_curr); 2693 ab8500_charger_set_vbus_in_curr(di,
2694 di->max_usb_in_curr.usb_type_max);
2630} 2695}
2631 2696
2632/** 2697/**
@@ -2781,8 +2846,13 @@ static irqreturn_t ab8500_charger_vbuschdropend_handler(int irq, void *_di)
2781 2846
2782 dev_dbg(di->dev, "VBUS charger drop ended\n"); 2847 dev_dbg(di->dev, "VBUS charger drop ended\n");
2783 di->flags.vbus_drop_end = true; 2848 di->flags.vbus_drop_end = true;
2849
2850 /*
2851 * VBUS might have dropped due to bad connection.
2852 * Schedule a new input limit set to the value SW requests.
2853 */
2784 queue_delayed_work(di->charger_wq, &di->vbus_drop_end_work, 2854 queue_delayed_work(di->charger_wq, &di->vbus_drop_end_work,
2785 round_jiffies(30 * HZ)); 2855 round_jiffies(VBUS_IN_CURR_LIM_RETRY_SET_TIME * HZ));
2786 2856
2787 return IRQ_HANDLED; 2857 return IRQ_HANDLED;
2788} 2858}
@@ -3394,6 +3464,7 @@ static int ab8500_charger_probe(struct platform_device *pdev)
3394 di->usb_chg.wdt_refresh = CHG_WD_INTERVAL; 3464 di->usb_chg.wdt_refresh = CHG_WD_INTERVAL;
3395 di->usb_chg.enabled = di->bm->usb_enabled; 3465 di->usb_chg.enabled = di->bm->usb_enabled;
3396 di->usb_chg.external = false; 3466 di->usb_chg.external = false;
3467 di->usb_state.usb_current = -1;
3397 3468
3398 /* Create a work queue for the charger */ 3469 /* Create a work queue for the charger */
3399 di->charger_wq = 3470 di->charger_wq =