Lines Matching +full:ac +full:- +full:charger
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2012
5 * Charger driver for AB8500
31 #include <linux/mfd/abx500/ab8500-bm.h>
37 /* Charger constants */
92 /* Lowest charger voltage is 3.39V -> 0x4E */
105 /*External charger control*/
110 /* UsbLineStatus register - usb types */
172 * struct ab8500_charger_interrupts - ab8500 interupts
216 * struct ab8500_charger - ab8500 Charger device information
221 * @ac_conn: This will be true when the AC charger has been plugged
222 * @vddadc_en_ac: Indicate if VDD ADC supply is enabled because AC
223 * charger is enabled
225 * charger is enabled
231 * @invalid_charger_detect_state State when forcing AB to use invalid charger
236 * @adc_main_charger_v ADC channel for main charger voltage
237 * @adc_main_charger_c ADC channel for main charger current
238 * @adc_vbus_v ADC channel for USB charger voltage
239 * @adc_usb_charger_c ADC channel for USB charger current
243 * @max_usb_in_curr: Max USB charger input current
244 * @ac_chg: AC charger power supply
245 * @usb_chg: USB charger power supply
246 * @ac: Structure that holds the AC charger properties
247 * @usb: Structure that holds the USB charger properties
254 * @check_usbchgnotok_work: Work for checking USB charger not ok status
255 * @kick_wd_work: Work for kicking the charger watchdog in case
257 * @ac_charger_attached_work: Work for checking if AC charger is still
259 * @usb_charger_attached_work: Work for checking if USB charger is still
261 * @ac_work: Work for checking AC charger connection
299 struct ab8500_charger_info ac; member
323 /* AC properties */
346 * should always be disabled when no charger is connected.
357 dev_dbg(di->dev, "SW Fallback: %d\n", fallback); in ab8500_enable_disable_sw_fallback()
359 if (is_ab8500(di->parent)) { in ab8500_enable_disable_sw_fallback()
370 ret = abx500_get_register_interruptible(di->dev, bank, reg, &val); in ab8500_enable_disable_sw_fallback()
372 dev_err(di->dev, "%d read failed\n", __LINE__); in ab8500_enable_disable_sw_fallback()
376 if (is_ab8500(di->parent)) { in ab8500_enable_disable_sw_fallback()
378 ret = abx500_set_register_interruptible(di->dev, 0x11, 0x00, 0x2); in ab8500_enable_disable_sw_fallback()
380 dev_err(di->dev, "%d write failed\n", __LINE__); in ab8500_enable_disable_sw_fallback()
391 ret = abx500_set_register_interruptible(di->dev, bank, reg, val); in ab8500_enable_disable_sw_fallback()
393 dev_err(di->dev, "%d write failed\n", __LINE__); in ab8500_enable_disable_sw_fallback()
397 if (is_ab8500(di->parent)) { in ab8500_enable_disable_sw_fallback()
399 ret = abx500_set_register_interruptible(di->dev, 0x11, 0x00, 0x0); in ab8500_enable_disable_sw_fallback()
401 dev_err(di->dev, "%d write failed\n", __LINE__); in ab8500_enable_disable_sw_fallback()
407 * ab8500_power_supply_changed - a wrapper with local extensions for
424 if (di->autopower_cfg) { in ab8500_power_supply_changed()
425 if (!di->usb.charger_connected && in ab8500_power_supply_changed()
426 !di->ac.charger_connected && in ab8500_power_supply_changed()
427 di->autopower) { in ab8500_power_supply_changed()
428 di->autopower = false; in ab8500_power_supply_changed()
430 } else if (!di->autopower && in ab8500_power_supply_changed()
431 (di->ac.charger_connected || in ab8500_power_supply_changed()
432 di->usb.charger_connected)) { in ab8500_power_supply_changed()
433 di->autopower = true; in ab8500_power_supply_changed()
443 if (connected != di->usb.charger_connected) { in ab8500_charger_set_usb_connected()
444 dev_dbg(di->dev, "USB connected:%i\n", connected); in ab8500_charger_set_usb_connected()
445 di->usb.charger_connected = connected; in ab8500_charger_set_usb_connected()
448 di->flags.vbus_drop_end = false; in ab8500_charger_set_usb_connected()
455 if (di->usb_chg.psy) { in ab8500_charger_set_usb_connected()
456 sysfs_notify(&di->usb_chg.psy->dev.kobj, NULL, in ab8500_charger_set_usb_connected()
461 mutex_lock(&di->charger_attached_mutex); in ab8500_charger_set_usb_connected()
462 mutex_unlock(&di->charger_attached_mutex); in ab8500_charger_set_usb_connected()
464 if (is_ab8500(di->parent)) in ab8500_charger_set_usb_connected()
465 queue_delayed_work(di->charger_wq, in ab8500_charger_set_usb_connected()
466 &di->usb_charger_attached_work, in ab8500_charger_set_usb_connected()
469 cancel_delayed_work_sync(&di->usb_charger_attached_work); in ab8500_charger_set_usb_connected()
470 mutex_lock(&di->charger_attached_mutex); in ab8500_charger_set_usb_connected()
471 mutex_unlock(&di->charger_attached_mutex); in ab8500_charger_set_usb_connected()
477 * ab8500_charger_get_ac_voltage() - get ac charger voltage
480 * Returns ac charger voltage (on success)
486 /* Only measure voltage if the charger is connected */ in ab8500_charger_get_ac_voltage()
487 if (di->ac.charger_connected) { in ab8500_charger_get_ac_voltage()
488 ret = iio_read_channel_processed(di->adc_main_charger_v, &vch); in ab8500_charger_get_ac_voltage()
490 dev_err(di->dev, "%s ADC conv failed,\n", __func__); in ab8500_charger_get_ac_voltage()
498 * ab8500_charger_ac_cv() - check if the main charger is in CV mode
501 * Returns ac charger CV mode (on success) else error code
508 /* Only check CV mode if the charger is online */ in ab8500_charger_ac_cv()
509 if (di->ac.charger_online) { in ab8500_charger_ac_cv()
510 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_ac_cv()
513 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_ac_cv()
527 * ab8500_charger_get_vbus_voltage() - get vbus voltage
537 /* Only measure voltage if the charger is connected */ in ab8500_charger_get_vbus_voltage()
538 if (di->usb.charger_connected) { in ab8500_charger_get_vbus_voltage()
539 ret = iio_read_channel_processed(di->adc_vbus_v, &vch); in ab8500_charger_get_vbus_voltage()
541 dev_err(di->dev, "%s ADC conv failed,\n", __func__); in ab8500_charger_get_vbus_voltage()
549 * ab8500_charger_get_usb_current() - get usb charger current
552 * This function returns the usb charger current.
559 /* Only measure current if the charger is online */ in ab8500_charger_get_usb_current()
560 if (di->usb.charger_online) { in ab8500_charger_get_usb_current()
561 ret = iio_read_channel_processed(di->adc_usb_charger_c, &ich); in ab8500_charger_get_usb_current()
563 dev_err(di->dev, "%s ADC conv failed,\n", __func__); in ab8500_charger_get_usb_current()
571 * ab8500_charger_get_ac_current() - get ac charger current
574 * This function returns the ac charger current.
575 * Returns ac current (on success) and error code on failure.
581 /* Only measure current if the charger is online */ in ab8500_charger_get_ac_current()
582 if (di->ac.charger_online) { in ab8500_charger_get_ac_current()
583 ret = iio_read_channel_processed(di->adc_main_charger_c, &ich); in ab8500_charger_get_ac_current()
585 dev_err(di->dev, "%s ADC conv failed,\n", __func__); in ab8500_charger_get_ac_current()
593 * ab8500_charger_usb_cv() - check if the usb charger is in CV mode
596 * Returns ac charger CV mode (on success) else error code
603 /* Only check CV mode if the charger is online */ in ab8500_charger_usb_cv()
604 if (di->usb.charger_online) { in ab8500_charger_usb_cv()
605 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_usb_cv()
608 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_usb_cv()
624 * ab8500_charger_detect_chargers() - Detect the connected chargers
628 * Returns the type of charger connected.
632 * interrupts of the charger detection
636 * AC_PW_CONN if the AC power supply is connected
638 * AC_PW_CONN + USB_PW_CONN if USB and AC power supplies are both connected
646 /* Check for AC charger */ in ab8500_charger_detect_chargers()
647 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_detect_chargers()
650 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_detect_chargers()
657 /* Check for USB charger */ in ab8500_charger_detect_chargers()
663 * charger was connected. Try waiting a little in ab8500_charger_detect_chargers()
668 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_detect_chargers()
671 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_detect_chargers()
674 dev_dbg(di->dev, in ab8500_charger_detect_chargers()
684 * ab8500_charger_max_usb_curr() - get the max curr for the USB type
697 di->usb_device_is_unrecognised = false; in ab8500_charger_max_usb_curr()
710 dev_dbg(di->dev, "USB Type - Standard host is " in ab8500_charger_max_usb_curr()
712 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5; in ab8500_charger_max_usb_curr()
713 di->is_aca_rid = 0; in ab8500_charger_max_usb_curr()
716 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5; in ab8500_charger_max_usb_curr()
717 di->is_aca_rid = 0; in ab8500_charger_max_usb_curr()
720 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5; in ab8500_charger_max_usb_curr()
721 di->is_aca_rid = 0; in ab8500_charger_max_usb_curr()
724 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P9; in ab8500_charger_max_usb_curr()
725 di->is_aca_rid = 0; in ab8500_charger_max_usb_curr()
729 * Dedicated charger level minus maximum current accessory in ab8500_charger_max_usb_curr()
732 dev_dbg(di->dev, "USB_STAT_ACA_RID_A detected\n"); in ab8500_charger_max_usb_curr()
733 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5; in ab8500_charger_max_usb_curr()
734 di->is_aca_rid = 1; in ab8500_charger_max_usb_curr()
738 * Dedicated charger level minus 120mA (20mA for ACA and in ab8500_charger_max_usb_curr()
741 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_1P3; in ab8500_charger_max_usb_curr()
742 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", link_status, in ab8500_charger_max_usb_curr()
743 di->max_usb_in_curr.usb_type_max); in ab8500_charger_max_usb_curr()
744 di->is_aca_rid = 1; in ab8500_charger_max_usb_curr()
747 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5; in ab8500_charger_max_usb_curr()
748 di->is_aca_rid = 0; in ab8500_charger_max_usb_curr()
751 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_1P5; in ab8500_charger_max_usb_curr()
752 di->is_aca_rid = 0; in ab8500_charger_max_usb_curr()
756 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_1P5; in ab8500_charger_max_usb_curr()
757 di->is_aca_rid = 1; in ab8500_charger_max_usb_curr()
760 if (di->vbus_detected) { in ab8500_charger_max_usb_curr()
761 di->usb_device_is_unrecognised = true; in ab8500_charger_max_usb_curr()
762 dev_dbg(di->dev, "USB Type - Legacy charger.\n"); in ab8500_charger_max_usb_curr()
763 di->max_usb_in_curr.usb_type_max = in ab8500_charger_max_usb_curr()
769 dev_err(di->dev, "USB Type - Charging not allowed\n"); in ab8500_charger_max_usb_curr()
770 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P05; in ab8500_charger_max_usb_curr()
771 ret = -ENXIO; in ab8500_charger_max_usb_curr()
774 if (is_ab8500(di->parent)) { in ab8500_charger_max_usb_curr()
775 di->flags.vbus_collapse = true; in ab8500_charger_max_usb_curr()
776 dev_err(di->dev, "USB Type - USB_STAT_RESERVED " in ab8500_charger_max_usb_curr()
778 ret = -ENXIO; in ab8500_charger_max_usb_curr()
781 dev_dbg(di->dev, "USB Type - Charging not allowed\n"); in ab8500_charger_max_usb_curr()
782 di->max_usb_in_curr.usb_type_max = in ab8500_charger_max_usb_curr()
784 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", in ab8500_charger_max_usb_curr()
786 di->max_usb_in_curr.usb_type_max); in ab8500_charger_max_usb_curr()
787 ret = -ENXIO; in ab8500_charger_max_usb_curr()
794 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5; in ab8500_charger_max_usb_curr()
795 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", link_status, in ab8500_charger_max_usb_curr()
796 di->max_usb_in_curr.usb_type_max); in ab8500_charger_max_usb_curr()
799 dev_err(di->dev, "USB Type invalid - try charging anyway\n"); in ab8500_charger_max_usb_curr()
800 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5; in ab8500_charger_max_usb_curr()
804 dev_err(di->dev, "USB Type - Unknown\n"); in ab8500_charger_max_usb_curr()
805 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P05; in ab8500_charger_max_usb_curr()
806 ret = -ENXIO; in ab8500_charger_max_usb_curr()
810 di->max_usb_in_curr.set_max = di->max_usb_in_curr.usb_type_max; in ab8500_charger_max_usb_curr()
811 dev_dbg(di->dev, "USB Type - 0x%02x MaxCurr: %d", in ab8500_charger_max_usb_curr()
812 link_status, di->max_usb_in_curr.set_max); in ab8500_charger_max_usb_curr()
818 * ab8500_charger_read_usb_type() - read the type of usb connected
829 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_read_usb_type()
832 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_read_usb_type()
835 if (is_ab8500(di->parent)) in ab8500_charger_read_usb_type()
836 ret = abx500_get_register_interruptible(di->dev, AB8500_USB, in ab8500_charger_read_usb_type()
839 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_read_usb_type()
842 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_read_usb_type()
847 if (is_ab8500(di->parent)) in ab8500_charger_read_usb_type()
858 * ab8500_charger_detect_usb_type() - get the type of usb connected
876 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_detect_usb_type()
879 dev_dbg(di->dev, "%s AB8500_IT_SOURCE21_REG %x\n", in ab8500_charger_detect_usb_type()
882 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_detect_usb_type()
886 if (is_ab8500(di->parent)) in ab8500_charger_detect_usb_type()
887 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_detect_usb_type()
890 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_detect_usb_type()
893 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_detect_usb_type()
896 dev_dbg(di->dev, "%s AB8500_USB_LINE_STAT_REG %x\n", __func__, in ab8500_charger_detect_usb_type()
905 if (is_ab8500(di->parent)) in ab8500_charger_detect_usb_type()
921 * This array maps the raw hex value to charger voltage used by the AB8500
1015 return i - 1; in ab8500_voltage_to_regval()
1019 i = ARRAY_SIZE(ab8500_charger_voltage_map) - 1; in ab8500_voltage_to_regval()
1023 return -1; in ab8500_voltage_to_regval()
1030 if (curr < di->bm->chg_output_curr[0]) in ab8500_current_to_regval()
1033 for (i = 0; i < di->bm->n_chg_out_curr; i++) { in ab8500_current_to_regval()
1034 if (curr < di->bm->chg_output_curr[i]) in ab8500_current_to_regval()
1035 return i - 1; in ab8500_current_to_regval()
1039 i = di->bm->n_chg_out_curr - 1; in ab8500_current_to_regval()
1040 if (curr == di->bm->chg_output_curr[i]) in ab8500_current_to_regval()
1043 return -1; in ab8500_current_to_regval()
1050 if (curr < di->bm->chg_input_curr[0]) in ab8500_vbus_in_curr_to_regval()
1053 for (i = 0; i < di->bm->n_chg_in_curr; i++) { in ab8500_vbus_in_curr_to_regval()
1054 if (curr < di->bm->chg_input_curr[i]) in ab8500_vbus_in_curr_to_regval()
1055 return i - 1; in ab8500_vbus_in_curr_to_regval()
1059 i = di->bm->n_chg_in_curr - 1; in ab8500_vbus_in_curr_to_regval()
1060 if (curr == di->bm->chg_input_curr[i]) in ab8500_vbus_in_curr_to_regval()
1063 return -1; in ab8500_vbus_in_curr_to_regval()
1067 * ab8500_charger_get_usb_cur() - get usb current
1073 * to the register. Returns -1 if charging is not allowed
1078 switch (di->usb_state.usb_current) { in ab8500_charger_get_usb_cur()
1080 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P09; in ab8500_charger_get_usb_cur()
1083 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P19; in ab8500_charger_get_usb_cur()
1086 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P29; in ab8500_charger_get_usb_cur()
1089 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P38; in ab8500_charger_get_usb_cur()
1092 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P5; in ab8500_charger_get_usb_cur()
1095 di->max_usb_in_curr.usb_type_max = USB_CH_IP_CUR_LVL_0P05; in ab8500_charger_get_usb_cur()
1096 ret = -EPERM; in ab8500_charger_get_usb_cur()
1099 di->max_usb_in_curr.set_max = di->max_usb_in_curr.usb_type_max; in ab8500_charger_get_usb_cur()
1104 * ab8500_charger_check_continue_stepping() - Check to allow stepping
1106 * @reg: select what charger register to check
1109 * Checks if charger source has not collapsed. If it has, further stepping
1116 return !di->flags.vbus_drop_end; in ab8500_charger_check_continue_stepping()
1122 * ab8500_charger_set_current() - set charger current
1124 * @ich: charger current, in mA
1125 * @reg: select what charger register to set
1127 * Set charger current.
1128 * There is no state machine in the AB to step up/down the charger
1131 * this charger current step-up/down here.
1143 atomic_inc(&di->current_stepping_sessions); in ab8500_charger_set_current()
1145 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_set_current()
1148 dev_err(di->dev, "%s read failed\n", __func__); in ab8500_charger_set_current()
1158 if (!di->ac.charger_connected) in ab8500_charger_set_current()
1167 if (!di->usb.charger_connected) in ab8500_charger_set_current()
1175 if (curr_index && (curr_index - prev_curr_index) > 1) in ab8500_charger_set_current()
1178 if (!di->usb.charger_connected && !di->ac.charger_connected) in ab8500_charger_set_current()
1183 dev_err(di->dev, "%s current register not valid\n", __func__); in ab8500_charger_set_current()
1184 ret = -ENXIO; in ab8500_charger_set_current()
1189 dev_err(di->dev, "requested current limit out-of-range\n"); in ab8500_charger_set_current()
1190 ret = -ENXIO; in ab8500_charger_set_current()
1196 dev_dbg(di->dev, "%s current not changed for reg: 0x%02x\n", in ab8500_charger_set_current()
1202 dev_dbg(di->dev, "%s set charger current: %d mA for reg: 0x%02x\n", in ab8500_charger_set_current()
1206 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_set_current()
1209 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_charger_set_current()
1211 for (i = prev_curr_index - 1; i >= curr_index; i--) { in ab8500_charger_set_current()
1212 dev_dbg(di->dev, "curr change_1 to: %x for 0x%02x\n", in ab8500_charger_set_current()
1214 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_set_current()
1217 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_charger_set_current()
1226 dev_dbg(di->dev, "curr change_2 to: %x for 0x%02x\n", in ab8500_charger_set_current()
1228 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_set_current()
1231 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_charger_set_current()
1242 atomic_dec(&di->current_stepping_sessions); in ab8500_charger_set_current()
1248 * ab8500_charger_set_vbus_in_curr() - set VBUS input current limit
1250 * @ich_in: charger input current limit
1262 min_value = min(di->bm->chg_params->usb_curr_max, ich_in); in ab8500_charger_set_vbus_in_curr()
1263 if (di->max_usb_in_curr.set_max > 0) in ab8500_charger_set_vbus_in_curr()
1264 min_value = min(di->max_usb_in_curr.set_max, min_value); in ab8500_charger_set_vbus_in_curr()
1266 if (di->usb_state.usb_current >= 0) in ab8500_charger_set_vbus_in_curr()
1267 min_value = min(di->usb_state.usb_current, min_value); in ab8500_charger_set_vbus_in_curr()
1271 if (di->vbat < VBAT_TRESH_IP_CUR_RED) in ab8500_charger_set_vbus_in_curr()
1275 if (di->vbat < VBAT_TRESH_IP_CUR_RED) in ab8500_charger_set_vbus_in_curr()
1282 dev_info(di->dev, "VBUS input current limit set to %d mA\n", min_value); in ab8500_charger_set_vbus_in_curr()
1284 mutex_lock(&di->usb_ipt_crnt_lock); in ab8500_charger_set_vbus_in_curr()
1287 mutex_unlock(&di->usb_ipt_crnt_lock); in ab8500_charger_set_vbus_in_curr()
1293 * ab8500_charger_set_main_in_curr() - set main charger input current
1295 * @ich_in: input charger current, in mA
1297 * Set main charger input current.
1308 * ab8500_charger_set_output_curr() - set charger output current
1310 * @ich_out: output charger current, in mA
1312 * Set charger output current.
1323 * ab8500_charger_led_en() - turn on/off chargign led
1336 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_led_en()
1340 dev_err(di->dev, "Power ON LED failed\n"); in ab8500_charger_led_en()
1344 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_led_en()
1348 dev_err(di->dev, "Set LED PWM duty cycle failed\n"); in ab8500_charger_led_en()
1353 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_led_en()
1357 dev_err(di->dev, "Power-off LED failed\n"); in ab8500_charger_led_en()
1366 * ab8500_charger_ac_en() - enable or disable ac charging
1372 * Enable/Disable AC/Mains charging and turns on/off the charging led
1375 static int ab8500_charger_ac_en(struct ux500_charger *charger, in ab8500_charger_ac_en() argument
1384 struct ab8500_charger *di = to_ab8500_charger_ac_device_info(charger); in ab8500_charger_ac_en()
1387 /* Check if AC is connected */ in ab8500_charger_ac_en()
1388 if (!di->ac.charger_connected) { in ab8500_charger_ac_en()
1389 dev_err(di->dev, "AC charger not connected\n"); in ab8500_charger_ac_en()
1390 return -ENXIO; in ab8500_charger_ac_en()
1393 /* Enable AC charging */ in ab8500_charger_ac_en()
1394 dev_dbg(di->dev, "Enable AC: %dmV %dmA\n", vset, iset); in ab8500_charger_ac_en()
1401 * there is a charger enabled. Normally the VDD ADC supply in ab8500_charger_ac_en()
1406 if (!di->vddadc_en_ac) { in ab8500_charger_ac_en()
1407 ret = regulator_enable(di->regu); in ab8500_charger_ac_en()
1409 dev_warn(di->dev, in ab8500_charger_ac_en()
1412 di->vddadc_en_ac = true; in ab8500_charger_ac_en()
1419 di->bm->chg_params->ac_curr_max); in ab8500_charger_ac_en()
1421 dev_err(di->dev, in ab8500_charger_ac_en()
1422 "Charger voltage or current too high, " in ab8500_charger_ac_en()
1424 return -ENXIO; in ab8500_charger_ac_en()
1428 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_ac_en()
1431 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_charger_ac_en()
1434 /* MainChInputCurr: current that can be drawn from the charger*/ in ab8500_charger_ac_en()
1436 di->bm->chg_params->ac_curr_max); in ab8500_charger_ac_en()
1438 dev_err(di->dev, "%s Failed to set MainChInputCurr\n", in ab8500_charger_ac_en()
1445 dev_err(di->dev, "%s " in ab8500_charger_ac_en()
1452 if (!di->bm->enable_overshoot) in ab8500_charger_ac_en()
1455 /* Enable Main Charger */ in ab8500_charger_ac_en()
1456 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_ac_en()
1459 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_charger_ac_en()
1466 dev_err(di->dev, "failed to enable LED\n"); in ab8500_charger_ac_en()
1468 di->ac.charger_online = 1; in ab8500_charger_ac_en()
1470 /* Disable AC charging */ in ab8500_charger_ac_en()
1471 if (is_ab8500_1p1_or_earlier(di->parent)) { in ab8500_charger_ac_en()
1475 * kick the charger watchdog even when no charger is in ab8500_charger_ac_en()
1476 * connected. This is only valid once the AC charger in ab8500_charger_ac_en()
1479 * by the charger driver when the AC charger in ab8500_charger_ac_en()
1482 if (di->ac_conn) { in ab8500_charger_ac_en()
1483 queue_delayed_work(di->charger_wq, in ab8500_charger_ac_en()
1484 &di->kick_wd_work, in ab8500_charger_ac_en()
1495 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_ac_en()
1499 dev_err(di->dev, in ab8500_charger_ac_en()
1506 dev_err(di->dev, "%s " in ab8500_charger_ac_en()
1512 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_ac_en()
1516 dev_err(di->dev, in ab8500_charger_ac_en()
1524 dev_err(di->dev, "failed to disable LED\n"); in ab8500_charger_ac_en()
1526 di->ac.charger_online = 0; in ab8500_charger_ac_en()
1527 di->ac.wd_expired = false; in ab8500_charger_ac_en()
1530 if (di->vddadc_en_ac) { in ab8500_charger_ac_en()
1531 regulator_disable(di->regu); in ab8500_charger_ac_en()
1532 di->vddadc_en_ac = false; in ab8500_charger_ac_en()
1535 dev_dbg(di->dev, "%s Disabled AC charging\n", __func__); in ab8500_charger_ac_en()
1537 ab8500_power_supply_changed(di, di->ac_chg.psy); in ab8500_charger_ac_en()
1543 * ab8500_charger_usb_en() - enable usb charging
1547 * @ich_out: charger output current
1552 static int ab8500_charger_usb_en(struct ux500_charger *charger, in ab8500_charger_usb_en() argument
1560 struct ab8500_charger *di = to_ab8500_charger_usb_device_info(charger); in ab8500_charger_usb_en()
1564 if (!di->usb.charger_connected) { in ab8500_charger_usb_en()
1565 dev_err(di->dev, "USB charger not connected\n"); in ab8500_charger_usb_en()
1566 return -ENXIO; in ab8500_charger_usb_en()
1574 * there is a charger enabled. Normally the VDD ADC supply in ab8500_charger_usb_en()
1579 if (!di->vddadc_en_usb) { in ab8500_charger_usb_en()
1580 ret = regulator_enable(di->regu); in ab8500_charger_usb_en()
1582 dev_warn(di->dev, in ab8500_charger_usb_en()
1585 di->vddadc_en_usb = true; in ab8500_charger_usb_en()
1589 dev_dbg(di->dev, "Enable USB: %dmV %dmA\n", vset, ich_out); in ab8500_charger_usb_en()
1595 dev_err(di->dev, in ab8500_charger_usb_en()
1596 "Charger voltage or current too high, " in ab8500_charger_usb_en()
1598 return -ENXIO; in ab8500_charger_usb_en()
1605 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_usb_en()
1608 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_charger_usb_en()
1612 if (!di->bm->enable_overshoot) in ab8500_charger_usb_en()
1615 /* Enable USB Charger */ in ab8500_charger_usb_en()
1616 dev_dbg(di->dev, in ab8500_charger_usb_en()
1618 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_usb_en()
1621 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_charger_usb_en()
1628 dev_err(di->dev, "failed to enable LED\n"); in ab8500_charger_usb_en()
1630 di->usb.charger_online = 1; in ab8500_charger_usb_en()
1634 di->max_usb_in_curr.usb_type_max); in ab8500_charger_usb_en()
1636 dev_err(di->dev, "setting USBChInputCurr failed\n"); in ab8500_charger_usb_en()
1643 dev_err(di->dev, "%s " in ab8500_charger_usb_en()
1649 queue_delayed_work(di->charger_wq, &di->check_vbat_work, HZ); in ab8500_charger_usb_en()
1653 dev_dbg(di->dev, "%s Disabled USB charging\n", __func__); in ab8500_charger_usb_en()
1654 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_usb_en()
1658 dev_err(di->dev, in ab8500_charger_usb_en()
1665 dev_err(di->dev, "failed to disable LED\n"); in ab8500_charger_usb_en()
1669 dev_err(di->dev, "setting USBChInputCurr failed\n"); in ab8500_charger_usb_en()
1676 dev_err(di->dev, "%s " in ab8500_charger_usb_en()
1681 di->usb.charger_online = 0; in ab8500_charger_usb_en()
1682 di->usb.wd_expired = false; in ab8500_charger_usb_en()
1685 if (di->vddadc_en_usb) { in ab8500_charger_usb_en()
1686 regulator_disable(di->regu); in ab8500_charger_usb_en()
1687 di->vddadc_en_usb = false; in ab8500_charger_usb_en()
1690 dev_dbg(di->dev, "%s Disabled USB charging\n", __func__); in ab8500_charger_usb_en()
1693 cancel_delayed_work(&di->check_vbat_work); in ab8500_charger_usb_en()
1696 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_usb_en()
1706 /*Toggle External charger control pin*/ in ab8500_external_charger_prepare()
1725 * ab8500_charger_usb_check_enable() - enable usb charging
1726 * @charger: pointer to the ux500_charger structure
1728 * @iset: charger output current
1730 * Check if the VBUS charger has been disconnected and reconnected without
1733 static int ab8500_charger_usb_check_enable(struct ux500_charger *charger, in ab8500_charger_usb_check_enable() argument
1739 struct ab8500_charger *di = to_ab8500_charger_usb_device_info(charger); in ab8500_charger_usb_check_enable()
1741 if (!di->usb.charger_connected) in ab8500_charger_usb_check_enable()
1744 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_usb_check_enable()
1747 dev_err(di->dev, "ab8500 read failed %d\n", __LINE__); in ab8500_charger_usb_check_enable()
1750 dev_dbg(di->dev, "USB charger ctrl: 0x%02x\n", usbch_ctrl1); in ab8500_charger_usb_check_enable()
1753 dev_info(di->dev, "Charging has been disabled abnormally and will be re-enabled\n"); in ab8500_charger_usb_check_enable()
1755 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_charger_usb_check_enable()
1759 dev_err(di->dev, "ab8500 write failed %d\n", __LINE__); in ab8500_charger_usb_check_enable()
1763 ret = ab8500_charger_usb_en(&di->usb_chg, true, vset, iset); in ab8500_charger_usb_check_enable()
1765 dev_err(di->dev, "Failed to enable VBUS charger %d\n", in ab8500_charger_usb_check_enable()
1774 * ab8500_charger_ac_check_enable() - enable usb charging
1775 * @charger: pointer to the ux500_charger structure
1777 * @iset: charger output current
1779 * Check if the AC charger has been disconnected and reconnected without
1782 static int ab8500_charger_ac_check_enable(struct ux500_charger *charger, in ab8500_charger_ac_check_enable() argument
1788 struct ab8500_charger *di = to_ab8500_charger_ac_device_info(charger); in ab8500_charger_ac_check_enable()
1790 if (!di->ac.charger_connected) in ab8500_charger_ac_check_enable()
1793 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_ac_check_enable()
1796 dev_err(di->dev, "ab8500 read failed %d\n", __LINE__); in ab8500_charger_ac_check_enable()
1799 dev_dbg(di->dev, "AC charger ctrl: 0x%02x\n", mainch_ctrl1); in ab8500_charger_ac_check_enable()
1802 dev_info(di->dev, "Charging has been disabled abnormally and will be re-enabled\n"); in ab8500_charger_ac_check_enable()
1804 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_charger_ac_check_enable()
1809 dev_err(di->dev, "ab8500 write failed %d\n", __LINE__); in ab8500_charger_ac_check_enable()
1813 ret = ab8500_charger_ac_en(&di->usb_chg, true, vset, iset); in ab8500_charger_ac_check_enable()
1815 dev_err(di->dev, "failed to enable AC charger %d\n", in ab8500_charger_ac_check_enable()
1824 * ab8500_charger_watchdog_kick() - kick charger watchdog
1827 * Kick charger watchdog
1830 static int ab8500_charger_watchdog_kick(struct ux500_charger *charger) in ab8500_charger_watchdog_kick() argument
1835 if (charger->psy->desc->type == POWER_SUPPLY_TYPE_MAINS) in ab8500_charger_watchdog_kick()
1836 di = to_ab8500_charger_ac_device_info(charger); in ab8500_charger_watchdog_kick()
1837 else if (charger->psy->desc->type == POWER_SUPPLY_TYPE_USB) in ab8500_charger_watchdog_kick()
1838 di = to_ab8500_charger_usb_device_info(charger); in ab8500_charger_watchdog_kick()
1840 return -ENXIO; in ab8500_charger_watchdog_kick()
1842 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_watchdog_kick()
1845 dev_err(di->dev, "Failed to kick WD!\n"); in ab8500_charger_watchdog_kick()
1851 * ab8500_charger_update_charger_current() - update charger current
1854 * Update the charger output current for the specified charger
1857 static int ab8500_charger_update_charger_current(struct ux500_charger *charger, in ab8500_charger_update_charger_current() argument
1863 if (charger->psy->desc->type == POWER_SUPPLY_TYPE_MAINS) in ab8500_charger_update_charger_current()
1864 di = to_ab8500_charger_ac_device_info(charger); in ab8500_charger_update_charger_current()
1865 else if (charger->psy->desc->type == POWER_SUPPLY_TYPE_USB) in ab8500_charger_update_charger_current()
1866 di = to_ab8500_charger_usb_device_info(charger); in ab8500_charger_update_charger_current()
1868 return -ENXIO; in ab8500_charger_update_charger_current()
1872 dev_err(di->dev, "%s " in ab8500_charger_update_charger_current()
1879 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_update_charger_current()
1882 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_charger_update_charger_current()
1893 const char **supplicants = (const char **)ext->supplied_to; in ab8500_charger_get_ext_psy_data()
1900 psy = usb_chg->psy; in ab8500_charger_get_ext_psy_data()
1905 j = match_string(supplicants, ext->num_supplicants, psy->desc->name); in ab8500_charger_get_ext_psy_data()
1910 for (j = 0; j < ext->desc->num_properties; j++) { in ab8500_charger_get_ext_psy_data()
1912 prop = ext->desc->properties[j]; in ab8500_charger_get_ext_psy_data()
1919 switch (ext->desc->type) { in ab8500_charger_get_ext_psy_data()
1921 di->vbat = ret.intval / 1000; in ab8500_charger_get_ext_psy_data()
1935 * ab8500_charger_check_vbat_work() - keep vbus current within spec
1939 * charger when charging with at some specific levels. This issue is only valid
1950 di->usb_chg.psy, ab8500_charger_get_ext_psy_data); in ab8500_charger_check_vbat_work()
1953 if (di->old_vbat == 0) in ab8500_charger_check_vbat_work()
1954 di->old_vbat = di->vbat; in ab8500_charger_check_vbat_work()
1956 if (!((di->old_vbat <= VBAT_TRESH_IP_CUR_RED && in ab8500_charger_check_vbat_work()
1957 di->vbat <= VBAT_TRESH_IP_CUR_RED) || in ab8500_charger_check_vbat_work()
1958 (di->old_vbat > VBAT_TRESH_IP_CUR_RED && in ab8500_charger_check_vbat_work()
1959 di->vbat > VBAT_TRESH_IP_CUR_RED))) { in ab8500_charger_check_vbat_work()
1961 dev_dbg(di->dev, "Vbat did cross threshold, curr: %d, new: %d," in ab8500_charger_check_vbat_work()
1962 " old: %d\n", di->max_usb_in_curr.usb_type_max, in ab8500_charger_check_vbat_work()
1963 di->vbat, di->old_vbat); in ab8500_charger_check_vbat_work()
1965 di->max_usb_in_curr.usb_type_max); in ab8500_charger_check_vbat_work()
1966 power_supply_changed(di->usb_chg.psy); in ab8500_charger_check_vbat_work()
1969 di->old_vbat = di->vbat; in ab8500_charger_check_vbat_work()
1975 if (di->vbat < (VBAT_TRESH_IP_CUR_RED + 100) && in ab8500_charger_check_vbat_work()
1976 (di->vbat > (VBAT_TRESH_IP_CUR_RED - 100))) in ab8500_charger_check_vbat_work()
1979 queue_delayed_work(di->charger_wq, &di->check_vbat_work, t * HZ); in ab8500_charger_check_vbat_work()
1983 * ab8500_charger_check_hw_failure_work() - check main charger failure
1986 * Work queue function for checking the main charger status
1997 if (di->flags.mainextchnotok) { in ab8500_charger_check_hw_failure_work()
1998 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_check_hw_failure_work()
2001 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_check_hw_failure_work()
2005 di->flags.mainextchnotok = false; in ab8500_charger_check_hw_failure_work()
2006 ab8500_power_supply_changed(di, di->ac_chg.psy); in ab8500_charger_check_hw_failure_work()
2009 if (di->flags.vbus_ovv) { in ab8500_charger_check_hw_failure_work()
2010 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_check_hw_failure_work()
2014 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_check_hw_failure_work()
2018 di->flags.vbus_ovv = false; in ab8500_charger_check_hw_failure_work()
2019 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_check_hw_failure_work()
2023 if (di->flags.mainextchnotok || di->flags.vbus_ovv) { in ab8500_charger_check_hw_failure_work()
2024 queue_delayed_work(di->charger_wq, in ab8500_charger_check_hw_failure_work()
2025 &di->check_hw_failure_work, round_jiffies(HZ)); in ab8500_charger_check_hw_failure_work()
2030 * ab8500_charger_kick_watchdog_work() - kick the watchdog
2033 * Work queue function for kicking the charger watchdog.
2036 * logic. That means we have to continuously kick the charger
2037 * watchdog even when no charger is connected. This is only
2038 * valid once the AC charger has been enabled. This is
2040 * watchdog have to be kicked by the charger driver
2041 * when the AC charger is disabled
2050 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_kick_watchdog_work()
2053 dev_err(di->dev, "Failed to kick WD!\n"); in ab8500_charger_kick_watchdog_work()
2056 queue_delayed_work(di->charger_wq, in ab8500_charger_kick_watchdog_work()
2057 &di->kick_wd_work, round_jiffies(WD_KICK_INTERVAL)); in ab8500_charger_kick_watchdog_work()
2061 * ab8500_charger_ac_work() - work to get and set main charger status
2064 * Work queue function for checking the main charger status
2075 * synchronously, we have the check if the main charger is in ab8500_charger_ac_work()
2083 di->ac.charger_connected = 1; in ab8500_charger_ac_work()
2084 di->ac_conn = true; in ab8500_charger_ac_work()
2086 di->ac.charger_connected = 0; in ab8500_charger_ac_work()
2089 ab8500_power_supply_changed(di, di->ac_chg.psy); in ab8500_charger_ac_work()
2090 sysfs_notify(&di->ac_chg.psy->dev.kobj, NULL, "present"); in ab8500_charger_ac_work()
2103 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_usb_attached_work()
2108 dev_err(di->dev, "ab8500 read failed %d\n", __LINE__); in ab8500_charger_usb_attached_work()
2117 ab8500_charger_usb_en(&di->usb_chg, 0, 0, 0); in ab8500_charger_usb_attached_work()
2119 mutex_lock(&di->charger_attached_mutex); in ab8500_charger_usb_attached_work()
2120 mutex_unlock(&di->charger_attached_mutex); in ab8500_charger_usb_attached_work()
2125 queue_delayed_work(di->charger_wq, in ab8500_charger_usb_attached_work()
2126 &di->usb_charger_attached_work, in ab8500_charger_usb_attached_work()
2142 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_ac_attached_work()
2147 dev_err(di->dev, "ab8500 read failed %d\n", __LINE__); in ab8500_charger_ac_attached_work()
2157 ab8500_charger_ac_en(&di->ac_chg, 0, 0, 0); in ab8500_charger_ac_attached_work()
2158 queue_work(di->charger_wq, &di->ac_work); in ab8500_charger_ac_attached_work()
2160 mutex_lock(&di->charger_attached_mutex); in ab8500_charger_ac_attached_work()
2161 mutex_unlock(&di->charger_attached_mutex); in ab8500_charger_ac_attached_work()
2166 queue_delayed_work(di->charger_wq, in ab8500_charger_ac_attached_work()
2167 &di->ac_charger_attached_work, in ab8500_charger_ac_attached_work()
2172 * ab8500_charger_detect_usb_type_work() - work to detect USB type
2194 dev_dbg(di->dev, "%s di->vbus_detected = false\n", __func__); in ab8500_charger_detect_usb_type_work()
2195 di->vbus_detected = false; in ab8500_charger_detect_usb_type_work()
2197 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_detect_usb_type_work()
2199 dev_dbg(di->dev, "%s di->vbus_detected = true\n", __func__); in ab8500_charger_detect_usb_type_work()
2200 di->vbus_detected = true; in ab8500_charger_detect_usb_type_work()
2202 if (is_ab8500_1p1_or_earlier(di->parent)) { in ab8500_charger_detect_usb_type_work()
2207 di->usb_chg.psy); in ab8500_charger_detect_usb_type_work()
2217 if (di->vbus_detected_start) { in ab8500_charger_detect_usb_type_work()
2218 di->vbus_detected_start = false; in ab8500_charger_detect_usb_type_work()
2224 di->usb_chg.psy); in ab8500_charger_detect_usb_type_work()
2232 * ab8500_charger_usb_link_attach_work() - work to detect USB type
2244 if (!di->usb.charger_online) { in ab8500_charger_usb_link_attach_work()
2246 di->max_usb_in_curr.usb_type_max); in ab8500_charger_usb_link_attach_work()
2252 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_usb_link_attach_work()
2256 * ab8500_charger_usb_link_status_work() - work to detect USB type
2286 if (is_ab8500(di->parent)) in ab8500_charger_usb_link_status_work()
2287 ret = abx500_get_register_interruptible(di->dev, AB8500_USB, in ab8500_charger_usb_link_status_work()
2290 ret = abx500_get_register_interruptible(di->dev, AB8500_USB, in ab8500_charger_usb_link_status_work()
2294 dev_dbg(di->dev, "UsbLineStatus register = 0x%02x\n", val); in ab8500_charger_usb_link_status_work()
2296 dev_dbg(di->dev, "Error reading USB link status\n"); in ab8500_charger_usb_link_status_work()
2298 if (is_ab8500(di->parent)) in ab8500_charger_usb_link_status_work()
2306 di->invalid_charger_detect_state == 0) { in ab8500_charger_usb_link_status_work()
2307 dev_dbg(di->dev, in ab8500_charger_usb_link_status_work()
2308 "Invalid charger detected, state= 0\n"); in ab8500_charger_usb_link_status_work()
2309 /*Enable charger*/ in ab8500_charger_usb_link_status_work()
2310 abx500_mask_and_set_register_interruptible(di->dev, in ab8500_charger_usb_link_status_work()
2313 /*Enable charger detection*/ in ab8500_charger_usb_link_status_work()
2314 abx500_mask_and_set_register_interruptible(di->dev, in ab8500_charger_usb_link_status_work()
2317 di->invalid_charger_detect_state = 1; in ab8500_charger_usb_link_status_work()
2322 if (di->invalid_charger_detect_state == 1) { in ab8500_charger_usb_link_status_work()
2323 dev_dbg(di->dev, in ab8500_charger_usb_link_status_work()
2324 "Invalid charger detected, state= 1\n"); in ab8500_charger_usb_link_status_work()
2325 /*Stop charger detection*/ in ab8500_charger_usb_link_status_work()
2326 abx500_mask_and_set_register_interruptible(di->dev, in ab8500_charger_usb_link_status_work()
2330 if (is_ab8500(di->parent)) in ab8500_charger_usb_link_status_work()
2331 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_usb_link_status_work()
2335 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_usb_link_status_work()
2339 dev_dbg(di->dev, "USB link status= 0x%02x\n", in ab8500_charger_usb_link_status_work()
2341 di->invalid_charger_detect_state = 2; in ab8500_charger_usb_link_status_work()
2344 di->invalid_charger_detect_state = 0; in ab8500_charger_usb_link_status_work()
2348 di->vbus_detected = false; in ab8500_charger_usb_link_status_work()
2350 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_usb_link_status_work()
2354 dev_dbg(di->dev,"%s di->vbus_detected = true\n",__func__); in ab8500_charger_usb_link_status_work()
2355 di->vbus_detected = true; in ab8500_charger_usb_link_status_work()
2358 if (ret == -ENXIO) { in ab8500_charger_usb_link_status_work()
2359 /* No valid charger type detected */ in ab8500_charger_usb_link_status_work()
2361 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_usb_link_status_work()
2366 if (di->usb_device_is_unrecognised) { in ab8500_charger_usb_link_status_work()
2367 dev_dbg(di->dev, in ab8500_charger_usb_link_status_work()
2368 "Potential Legacy Charger device. " in ab8500_charger_usb_link_status_work()
2372 queue_delayed_work(di->charger_wq, in ab8500_charger_usb_link_status_work()
2373 &di->attach_work, in ab8500_charger_usb_link_status_work()
2375 } else if (di->is_aca_rid == 1) { in ab8500_charger_usb_link_status_work()
2377 di->is_aca_rid++; in ab8500_charger_usb_link_status_work()
2378 dev_dbg(di->dev, in ab8500_charger_usb_link_status_work()
2381 queue_delayed_work(di->charger_wq, in ab8500_charger_usb_link_status_work()
2382 &di->attach_work, in ab8500_charger_usb_link_status_work()
2385 queue_delayed_work(di->charger_wq, in ab8500_charger_usb_link_status_work()
2386 &di->attach_work, in ab8500_charger_usb_link_status_work()
2399 if (!di->vbus_detected) { in ab8500_charger_usb_state_changed_work()
2400 dev_dbg(di->dev, in ab8500_charger_usb_state_changed_work()
2401 "%s !di->vbus_detected\n", in ab8500_charger_usb_state_changed_work()
2406 spin_lock_irqsave(&di->usb_state.usb_lock, flags); in ab8500_charger_usb_state_changed_work()
2407 di->usb_state.state = di->usb_state.state_tmp; in ab8500_charger_usb_state_changed_work()
2408 di->usb_state.usb_current = di->usb_state.usb_current_tmp; in ab8500_charger_usb_state_changed_work()
2409 spin_unlock_irqrestore(&di->usb_state.usb_lock, flags); in ab8500_charger_usb_state_changed_work()
2411 dev_dbg(di->dev, "%s USB state: 0x%02x mA: %d\n", in ab8500_charger_usb_state_changed_work()
2412 __func__, di->usb_state.state, di->usb_state.usb_current); in ab8500_charger_usb_state_changed_work()
2414 switch (di->usb_state.state) { in ab8500_charger_usb_state_changed_work()
2420 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_usb_state_changed_work()
2425 * when suspend->resume there should be delay in ab8500_charger_usb_state_changed_work()
2438 di->max_usb_in_curr.usb_type_max); in ab8500_charger_usb_state_changed_work()
2443 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_usb_state_changed_work()
2453 * ab8500_charger_check_usbchargernotok_work() - check USB chg not ok status
2456 * Work queue function for checking the USB charger Not OK status
2468 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_check_usbchargernotok_work()
2471 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_check_usbchargernotok_work()
2474 prev_status = di->flags.usbchargernotok; in ab8500_charger_check_usbchargernotok_work()
2477 di->flags.usbchargernotok = true; in ab8500_charger_check_usbchargernotok_work()
2479 queue_delayed_work(di->charger_wq, in ab8500_charger_check_usbchargernotok_work()
2480 &di->check_usbchgnotok_work, HZ); in ab8500_charger_check_usbchargernotok_work()
2482 di->flags.usbchargernotok = false; in ab8500_charger_check_usbchargernotok_work()
2483 di->flags.vbus_collapse = false; in ab8500_charger_check_usbchargernotok_work()
2486 if (prev_status != di->flags.usbchargernotok) in ab8500_charger_check_usbchargernotok_work()
2487 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_check_usbchargernotok_work()
2491 * ab8500_charger_check_main_thermal_prot_work() - check main thermal status
2506 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_check_main_thermal_prot_work()
2509 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_check_main_thermal_prot_work()
2513 di->flags.main_thermal_prot = true; in ab8500_charger_check_main_thermal_prot_work()
2515 di->flags.main_thermal_prot = false; in ab8500_charger_check_main_thermal_prot_work()
2517 ab8500_power_supply_changed(di, di->ac_chg.psy); in ab8500_charger_check_main_thermal_prot_work()
2521 * ab8500_charger_check_usb_thermal_prot_work() - check usb thermal status
2536 ret = abx500_get_register_interruptible(di->dev, in ab8500_charger_check_usb_thermal_prot_work()
2539 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_charger_check_usb_thermal_prot_work()
2543 di->flags.usb_thermal_prot = true; in ab8500_charger_check_usb_thermal_prot_work()
2545 di->flags.usb_thermal_prot = false; in ab8500_charger_check_usb_thermal_prot_work()
2547 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_check_usb_thermal_prot_work()
2551 * ab8500_charger_mainchunplugdet_handler() - main charger unplugged
2561 dev_dbg(di->dev, "Main charger unplugged\n"); in ab8500_charger_mainchunplugdet_handler()
2562 queue_work(di->charger_wq, &di->ac_work); in ab8500_charger_mainchunplugdet_handler()
2564 cancel_delayed_work_sync(&di->ac_charger_attached_work); in ab8500_charger_mainchunplugdet_handler()
2565 mutex_lock(&di->charger_attached_mutex); in ab8500_charger_mainchunplugdet_handler()
2566 mutex_unlock(&di->charger_attached_mutex); in ab8500_charger_mainchunplugdet_handler()
2572 * ab8500_charger_mainchplugdet_handler() - main charger plugged
2582 dev_dbg(di->dev, "Main charger plugged\n"); in ab8500_charger_mainchplugdet_handler()
2583 queue_work(di->charger_wq, &di->ac_work); in ab8500_charger_mainchplugdet_handler()
2585 mutex_lock(&di->charger_attached_mutex); in ab8500_charger_mainchplugdet_handler()
2586 mutex_unlock(&di->charger_attached_mutex); in ab8500_charger_mainchplugdet_handler()
2588 if (is_ab8500(di->parent)) in ab8500_charger_mainchplugdet_handler()
2589 queue_delayed_work(di->charger_wq, in ab8500_charger_mainchplugdet_handler()
2590 &di->ac_charger_attached_work, in ab8500_charger_mainchplugdet_handler()
2596 * ab8500_charger_mainextchnotok_handler() - main charger not ok
2606 dev_dbg(di->dev, "Main charger not ok\n"); in ab8500_charger_mainextchnotok_handler()
2607 di->flags.mainextchnotok = true; in ab8500_charger_mainextchnotok_handler()
2608 ab8500_power_supply_changed(di, di->ac_chg.psy); in ab8500_charger_mainextchnotok_handler()
2611 queue_delayed_work(di->charger_wq, &di->check_hw_failure_work, 0); in ab8500_charger_mainextchnotok_handler()
2617 * ab8500_charger_mainchthprotr_handler() - Die temp is above main charger
2628 dev_dbg(di->dev, in ab8500_charger_mainchthprotr_handler()
2629 "Die temp above Main charger thermal protection threshold\n"); in ab8500_charger_mainchthprotr_handler()
2630 queue_work(di->charger_wq, &di->check_main_thermal_prot_work); in ab8500_charger_mainchthprotr_handler()
2636 * ab8500_charger_mainchthprotf_handler() - Die temp is below main charger
2647 dev_dbg(di->dev, in ab8500_charger_mainchthprotf_handler()
2648 "Die temp ok for Main charger thermal protection threshold\n"); in ab8500_charger_mainchthprotf_handler()
2649 queue_work(di->charger_wq, &di->check_main_thermal_prot_work); in ab8500_charger_mainchthprotf_handler()
2661 di->flags.vbus_drop_end = false; in ab8500_charger_vbus_drop_end_work()
2664 abx500_set_register_interruptible(di->dev, in ab8500_charger_vbus_drop_end_work()
2667 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_vbus_drop_end_work()
2670 dev_err(di->dev, "%s read failed\n", __func__); in ab8500_charger_vbus_drop_end_work()
2674 curr = di->bm->chg_input_curr[ in ab8500_charger_vbus_drop_end_work()
2677 if (di->max_usb_in_curr.calculated_max != curr) { in ab8500_charger_vbus_drop_end_work()
2679 di->max_usb_in_curr.calculated_max = curr; in ab8500_charger_vbus_drop_end_work()
2680 dev_dbg(di->dev, in ab8500_charger_vbus_drop_end_work()
2682 di->max_usb_in_curr.calculated_max); in ab8500_charger_vbus_drop_end_work()
2688 di->max_usb_in_curr.set_max = in ab8500_charger_vbus_drop_end_work()
2689 di->max_usb_in_curr.calculated_max; in ab8500_charger_vbus_drop_end_work()
2690 dev_dbg(di->dev, in ab8500_charger_vbus_drop_end_work()
2692 di->max_usb_in_curr.set_max); in ab8500_charger_vbus_drop_end_work()
2695 if (di->usb.charger_connected) in ab8500_charger_vbus_drop_end_work()
2697 di->max_usb_in_curr.usb_type_max); in ab8500_charger_vbus_drop_end_work()
2701 * ab8500_charger_vbusdetf_handler() - VBUS falling detected
2711 di->vbus_detected = false; in ab8500_charger_vbusdetf_handler()
2712 dev_dbg(di->dev, "VBUS falling detected\n"); in ab8500_charger_vbusdetf_handler()
2713 queue_work(di->charger_wq, &di->detect_usb_type_work); in ab8500_charger_vbusdetf_handler()
2719 * ab8500_charger_vbusdetr_handler() - VBUS rising detected
2729 di->vbus_detected = true; in ab8500_charger_vbusdetr_handler()
2730 dev_dbg(di->dev, "VBUS rising detected\n"); in ab8500_charger_vbusdetr_handler()
2732 queue_work(di->charger_wq, &di->detect_usb_type_work); in ab8500_charger_vbusdetr_handler()
2738 * ab8500_charger_usblinkstatus_handler() - USB link status has changed
2748 dev_dbg(di->dev, "USB link status changed\n"); in ab8500_charger_usblinkstatus_handler()
2750 queue_work(di->charger_wq, &di->usb_link_status_work); in ab8500_charger_usblinkstatus_handler()
2756 * ab8500_charger_usbchthprotr_handler() - Die temp is above usb charger
2767 dev_dbg(di->dev, in ab8500_charger_usbchthprotr_handler()
2768 "Die temp above USB charger thermal protection threshold\n"); in ab8500_charger_usbchthprotr_handler()
2769 queue_work(di->charger_wq, &di->check_usb_thermal_prot_work); in ab8500_charger_usbchthprotr_handler()
2775 * ab8500_charger_usbchthprotf_handler() - Die temp is below usb charger
2786 dev_dbg(di->dev, in ab8500_charger_usbchthprotf_handler()
2787 "Die temp ok for USB charger thermal protection threshold\n"); in ab8500_charger_usbchthprotf_handler()
2788 queue_work(di->charger_wq, &di->check_usb_thermal_prot_work); in ab8500_charger_usbchthprotf_handler()
2794 * ab8500_charger_usbchargernotokr_handler() - USB charger not ok detected
2804 dev_dbg(di->dev, "Not allowed USB charger detected\n"); in ab8500_charger_usbchargernotokr_handler()
2805 queue_delayed_work(di->charger_wq, &di->check_usbchgnotok_work, 0); in ab8500_charger_usbchargernotokr_handler()
2811 * ab8500_charger_chwdexp_handler() - Charger watchdog expired
2821 dev_dbg(di->dev, "Charger watchdog expired\n"); in ab8500_charger_chwdexp_handler()
2824 * The charger that was online when the watchdog expired in ab8500_charger_chwdexp_handler()
2827 if (di->ac.charger_online) { in ab8500_charger_chwdexp_handler()
2828 di->ac.wd_expired = true; in ab8500_charger_chwdexp_handler()
2829 ab8500_power_supply_changed(di, di->ac_chg.psy); in ab8500_charger_chwdexp_handler()
2831 if (di->usb.charger_online) { in ab8500_charger_chwdexp_handler()
2832 di->usb.wd_expired = true; in ab8500_charger_chwdexp_handler()
2833 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_chwdexp_handler()
2840 * ab8500_charger_vbuschdropend_handler() - VBUS drop removed
2850 dev_dbg(di->dev, "VBUS charger drop ended\n"); in ab8500_charger_vbuschdropend_handler()
2851 di->flags.vbus_drop_end = true; in ab8500_charger_vbuschdropend_handler()
2857 queue_delayed_work(di->charger_wq, &di->vbus_drop_end_work, in ab8500_charger_vbuschdropend_handler()
2864 * ab8500_charger_vbusovv_handler() - VBUS overvoltage detected
2874 dev_dbg(di->dev, "VBUS overvoltage detected\n"); in ab8500_charger_vbusovv_handler()
2875 di->flags.vbus_ovv = true; in ab8500_charger_vbusovv_handler()
2876 ab8500_power_supply_changed(di, di->usb_chg.psy); in ab8500_charger_vbusovv_handler()
2879 queue_delayed_work(di->charger_wq, &di->check_hw_failure_work, 0); in ab8500_charger_vbusovv_handler()
2885 * ab8500_charger_ac_get_property() - get the ac/mains properties
2890 * This function gets called when an application tries to get the ac/mains
2892 * AC/Mains properties are online, present and voltage.
2893 * online: ac/mains charging is in progress or not
2894 * present: presence of the ac/mains
2895 * voltage: AC/Mains voltage
2909 if (di->flags.mainextchnotok) in ab8500_charger_ac_get_property()
2910 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; in ab8500_charger_ac_get_property()
2911 else if (di->ac.wd_expired || di->usb.wd_expired) in ab8500_charger_ac_get_property()
2912 val->intval = POWER_SUPPLY_HEALTH_DEAD; in ab8500_charger_ac_get_property()
2913 else if (di->flags.main_thermal_prot) in ab8500_charger_ac_get_property()
2914 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; in ab8500_charger_ac_get_property()
2916 val->intval = POWER_SUPPLY_HEALTH_GOOD; in ab8500_charger_ac_get_property()
2919 val->intval = di->ac.charger_online; in ab8500_charger_ac_get_property()
2922 val->intval = di->ac.charger_connected; in ab8500_charger_ac_get_property()
2927 di->ac.charger_voltage = ret; in ab8500_charger_ac_get_property()
2929 val->intval = di->ac.charger_voltage * 1000; in ab8500_charger_ac_get_property()
2934 * for the AC charger in ab8500_charger_ac_get_property()
2936 di->ac.cv_active = ab8500_charger_ac_cv(di); in ab8500_charger_ac_get_property()
2937 val->intval = di->ac.cv_active; in ab8500_charger_ac_get_property()
2942 di->ac.charger_current = ret; in ab8500_charger_ac_get_property()
2943 val->intval = di->ac.charger_current * 1000; in ab8500_charger_ac_get_property()
2946 return -EINVAL; in ab8500_charger_ac_get_property()
2952 * ab8500_charger_usb_get_property() - get the usb properties
2976 if (di->flags.usbchargernotok) in ab8500_charger_usb_get_property()
2977 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; in ab8500_charger_usb_get_property()
2978 else if (di->ac.wd_expired || di->usb.wd_expired) in ab8500_charger_usb_get_property()
2979 val->intval = POWER_SUPPLY_HEALTH_DEAD; in ab8500_charger_usb_get_property()
2980 else if (di->flags.usb_thermal_prot) in ab8500_charger_usb_get_property()
2981 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; in ab8500_charger_usb_get_property()
2982 else if (di->flags.vbus_ovv) in ab8500_charger_usb_get_property()
2983 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; in ab8500_charger_usb_get_property()
2985 val->intval = POWER_SUPPLY_HEALTH_GOOD; in ab8500_charger_usb_get_property()
2988 val->intval = di->usb.charger_online; in ab8500_charger_usb_get_property()
2991 val->intval = di->usb.charger_connected; in ab8500_charger_usb_get_property()
2996 di->usb.charger_voltage = ret; in ab8500_charger_usb_get_property()
2997 val->intval = di->usb.charger_voltage * 1000; in ab8500_charger_usb_get_property()
3002 * for the USB charger in ab8500_charger_usb_get_property()
3004 di->usb.cv_active = ab8500_charger_usb_cv(di); in ab8500_charger_usb_get_property()
3005 val->intval = di->usb.cv_active; in ab8500_charger_usb_get_property()
3010 di->usb.charger_current = ret; in ab8500_charger_usb_get_property()
3011 val->intval = di->usb.charger_current * 1000; in ab8500_charger_usb_get_property()
3016 * due to too high output current from the USB charger in ab8500_charger_usb_get_property()
3018 if (di->flags.vbus_collapse) in ab8500_charger_usb_get_property()
3019 val->intval = 1; in ab8500_charger_usb_get_property()
3021 val->intval = 0; in ab8500_charger_usb_get_property()
3024 return -EINVAL; in ab8500_charger_usb_get_property()
3030 * ab8500_charger_init_hw_registers() - Set up charger related registers
3033 * Set up charger OVV, watchdog and maximum voltage registers as well as
3040 /* Setup maximum charger current and voltage for ABB cut2.0 */ in ab8500_charger_init_hw_registers()
3041 if (!is_ab8500_1p1_or_earlier(di->parent)) { in ab8500_charger_init_hw_registers()
3042 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3046 dev_err(di->dev, in ab8500_charger_init_hw_registers()
3051 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3055 dev_err(di->dev, in ab8500_charger_init_hw_registers()
3061 if (is_ab8505_2p0(di->parent)) in ab8500_charger_init_hw_registers()
3062 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3071 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3076 dev_err(di->dev, in ab8500_charger_init_hw_registers()
3082 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3085 dev_err(di->dev, "failed to enable main WD in OTP\n"); in ab8500_charger_init_hw_registers()
3090 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3094 dev_err(di->dev, "failed to enable main watchdog\n"); in ab8500_charger_init_hw_registers()
3107 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3112 dev_err(di->dev, "failed to kick main watchdog\n"); in ab8500_charger_init_hw_registers()
3117 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3121 dev_err(di->dev, "failed to disable main watchdog\n"); in ab8500_charger_init_hw_registers()
3126 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_init_hw_registers()
3129 dev_err(di->dev, "failed to set charger watchdog timeout\n"); in ab8500_charger_init_hw_registers()
3135 dev_err(di->dev, "failed to disable LED\n"); in ab8500_charger_init_hw_registers()
3139 ret = abx500_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3142 (di->bm->bkup_bat_v & 0x3) | di->bm->bkup_bat_i); in ab8500_charger_init_hw_registers()
3144 dev_err(di->dev, "failed to setup backup battery charging\n"); in ab8500_charger_init_hw_registers()
3149 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_charger_init_hw_registers()
3153 dev_err(di->dev, "%s mask and set failed\n", __func__); in ab8500_charger_init_hw_registers()
3162 * ab8500 charger driver interrupts and their respective isr
3193 dev_dbg(di->dev, "not a standard host, returning\n"); in ab8500_charger_usb_notifier_call()
3197 /* TODO: State is fabricate here. See if charger really needs USB in ab8500_charger_usb_notifier_call()
3200 if ((di->usb_state.usb_current == 2) && (mA > 2)) in ab8500_charger_usb_notifier_call()
3211 dev_dbg(di->dev, "%s usb_state: 0x%02x mA: %d\n", in ab8500_charger_usb_notifier_call()
3214 spin_lock(&di->usb_state.usb_lock); in ab8500_charger_usb_notifier_call()
3215 di->usb_state.state_tmp = bm_usb_state; in ab8500_charger_usb_notifier_call()
3216 di->usb_state.usb_current_tmp = mA; in ab8500_charger_usb_notifier_call()
3217 spin_unlock(&di->usb_state.usb_lock); in ab8500_charger_usb_notifier_call()
3223 queue_delayed_work(di->charger_wq, &di->usb_state_changed_work, HZ/2); in ab8500_charger_usb_notifier_call()
3236 * logic. That means we have to continuously kick the charger in ab8500_charger_resume()
3237 * watchdog even when no charger is connected. This is only in ab8500_charger_resume()
3238 * valid once the AC charger has been enabled. This is in ab8500_charger_resume()
3240 * watchdog have to be kicked by the charger driver in ab8500_charger_resume()
3241 * when the AC charger is disabled in ab8500_charger_resume()
3243 if (di->ac_conn && is_ab8500_1p1_or_earlier(di->parent)) { in ab8500_charger_resume()
3244 ret = abx500_set_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_charger_resume()
3247 dev_err(di->dev, "Failed to kick WD!\n"); in ab8500_charger_resume()
3250 queue_delayed_work(di->charger_wq, &di->kick_wd_work, in ab8500_charger_resume()
3255 if (di->flags.mainextchnotok || di->flags.vbus_ovv) { in ab8500_charger_resume()
3256 queue_delayed_work(di->charger_wq, in ab8500_charger_resume()
3257 &di->check_hw_failure_work, 0); in ab8500_charger_resume()
3260 if (di->flags.vbus_drop_end) in ab8500_charger_resume()
3261 queue_delayed_work(di->charger_wq, &di->vbus_drop_end_work, 0); in ab8500_charger_resume()
3272 cancel_delayed_work(&di->check_hw_failure_work); in ab8500_charger_suspend()
3273 cancel_delayed_work(&di->vbus_drop_end_work); in ab8500_charger_suspend()
3275 flush_delayed_work(&di->attach_work); in ab8500_charger_suspend()
3276 flush_delayed_work(&di->usb_charger_attached_work); in ab8500_charger_suspend()
3277 flush_delayed_work(&di->ac_charger_attached_work); in ab8500_charger_suspend()
3278 flush_delayed_work(&di->check_usbchgnotok_work); in ab8500_charger_suspend()
3279 flush_delayed_work(&di->check_vbat_work); in ab8500_charger_suspend()
3280 flush_delayed_work(&di->kick_wd_work); in ab8500_charger_suspend()
3282 flush_work(&di->usb_link_status_work); in ab8500_charger_suspend()
3283 flush_work(&di->ac_work); in ab8500_charger_suspend()
3284 flush_work(&di->detect_usb_type_work); in ab8500_charger_suspend()
3286 if (atomic_read(&di->current_stepping_sessions)) in ab8500_charger_suspend()
3287 return -EAGAIN; in ab8500_charger_suspend()
3305 /* Disable AC charging */ in ab8500_charger_remove()
3306 ab8500_charger_ac_en(&di->ac_chg, false, 0, 0); in ab8500_charger_remove()
3309 ab8500_charger_usb_en(&di->usb_chg, false, 0, 0); in ab8500_charger_remove()
3318 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_charger_remove()
3321 dev_err(di->dev, "%s mask and set failed\n", __func__); in ab8500_charger_remove()
3323 usb_unregister_notifier(di->usb_phy, &di->nb); in ab8500_charger_remove()
3324 usb_put_phy(di->usb_phy); in ab8500_charger_remove()
3327 destroy_workqueue(di->charger_wq); in ab8500_charger_remove()
3329 /* Unregister external charger enable notifier */ in ab8500_charger_remove()
3330 if (!di->ac_chg.enabled) in ab8500_charger_remove()
3335 if (di->usb_chg.enabled) in ab8500_charger_remove()
3336 power_supply_unregister(di->usb_chg.psy); in ab8500_charger_remove()
3338 if (di->ac_chg.enabled && !di->ac_chg.external) in ab8500_charger_remove()
3339 power_supply_unregister(di->ac_chg.psy); in ab8500_charger_remove()
3368 struct device_node *np = pdev->dev.of_node; in ab8500_charger_probe()
3369 struct abx500_bm_data *plat = pdev->dev.platform_data; in ab8500_charger_probe()
3374 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); in ab8500_charger_probe()
3376 dev_err(&pdev->dev, "%s no mem for ab8500_charger\n", __func__); in ab8500_charger_probe()
3377 return -ENOMEM; in ab8500_charger_probe()
3381 dev_err(&pdev->dev, "no battery management data supplied\n"); in ab8500_charger_probe()
3382 return -EINVAL; in ab8500_charger_probe()
3384 di->bm = plat; in ab8500_charger_probe()
3387 ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm); in ab8500_charger_probe()
3389 dev_err(&pdev->dev, "failed to get battery information\n"); in ab8500_charger_probe()
3392 di->autopower_cfg = of_property_read_bool(np, "autopower_cfg"); in ab8500_charger_probe()
3394 di->autopower_cfg = false; in ab8500_charger_probe()
3397 di->dev = &pdev->dev; in ab8500_charger_probe()
3398 di->parent = dev_get_drvdata(pdev->dev.parent); in ab8500_charger_probe()
3401 di->adc_main_charger_v = devm_iio_channel_get(&pdev->dev, in ab8500_charger_probe()
3403 if (IS_ERR(di->adc_main_charger_v)) { in ab8500_charger_probe()
3404 if (PTR_ERR(di->adc_main_charger_v) == -ENODEV) in ab8500_charger_probe()
3405 return -EPROBE_DEFER; in ab8500_charger_probe()
3406 dev_err(&pdev->dev, "failed to get ADC main charger voltage\n"); in ab8500_charger_probe()
3407 return PTR_ERR(di->adc_main_charger_v); in ab8500_charger_probe()
3409 di->adc_main_charger_c = devm_iio_channel_get(&pdev->dev, in ab8500_charger_probe()
3411 if (IS_ERR(di->adc_main_charger_c)) { in ab8500_charger_probe()
3412 if (PTR_ERR(di->adc_main_charger_c) == -ENODEV) in ab8500_charger_probe()
3413 return -EPROBE_DEFER; in ab8500_charger_probe()
3414 dev_err(&pdev->dev, "failed to get ADC main charger current\n"); in ab8500_charger_probe()
3415 return PTR_ERR(di->adc_main_charger_c); in ab8500_charger_probe()
3417 di->adc_vbus_v = devm_iio_channel_get(&pdev->dev, "vbus_v"); in ab8500_charger_probe()
3418 if (IS_ERR(di->adc_vbus_v)) { in ab8500_charger_probe()
3419 if (PTR_ERR(di->adc_vbus_v) == -ENODEV) in ab8500_charger_probe()
3420 return -EPROBE_DEFER; in ab8500_charger_probe()
3421 dev_err(&pdev->dev, "failed to get ADC USB charger voltage\n"); in ab8500_charger_probe()
3422 return PTR_ERR(di->adc_vbus_v); in ab8500_charger_probe()
3424 di->adc_usb_charger_c = devm_iio_channel_get(&pdev->dev, in ab8500_charger_probe()
3426 if (IS_ERR(di->adc_usb_charger_c)) { in ab8500_charger_probe()
3427 if (PTR_ERR(di->adc_usb_charger_c) == -ENODEV) in ab8500_charger_probe()
3428 return -EPROBE_DEFER; in ab8500_charger_probe()
3429 dev_err(&pdev->dev, "failed to get ADC USB charger current\n"); in ab8500_charger_probe()
3430 return PTR_ERR(di->adc_usb_charger_c); in ab8500_charger_probe()
3434 spin_lock_init(&di->usb_state.usb_lock); in ab8500_charger_probe()
3435 mutex_init(&di->usb_ipt_crnt_lock); in ab8500_charger_probe()
3437 di->autopower = false; in ab8500_charger_probe()
3438 di->invalid_charger_detect_state = 0; in ab8500_charger_probe()
3440 /* AC and USB supply config */ in ab8500_charger_probe()
3443 ac_psy_cfg.drv_data = &di->ac_chg; in ab8500_charger_probe()
3446 usb_psy_cfg.drv_data = &di->usb_chg; in ab8500_charger_probe()
3448 /* AC supply */ in ab8500_charger_probe()
3449 /* ux500_charger sub-class */ in ab8500_charger_probe()
3450 di->ac_chg.ops.enable = &ab8500_charger_ac_en; in ab8500_charger_probe()
3451 di->ac_chg.ops.check_enable = &ab8500_charger_ac_check_enable; in ab8500_charger_probe()
3452 di->ac_chg.ops.kick_wd = &ab8500_charger_watchdog_kick; in ab8500_charger_probe()
3453 di->ac_chg.ops.update_curr = &ab8500_charger_update_charger_current; in ab8500_charger_probe()
3454 di->ac_chg.max_out_volt = ab8500_charger_voltage_map[ in ab8500_charger_probe()
3455 ARRAY_SIZE(ab8500_charger_voltage_map) - 1]; in ab8500_charger_probe()
3456 di->ac_chg.max_out_curr = in ab8500_charger_probe()
3457 di->bm->chg_output_curr[di->bm->n_chg_out_curr - 1]; in ab8500_charger_probe()
3458 di->ac_chg.wdt_refresh = CHG_WD_INTERVAL; in ab8500_charger_probe()
3459 di->ac_chg.enabled = di->bm->ac_enabled; in ab8500_charger_probe()
3460 di->ac_chg.external = false; in ab8500_charger_probe()
3462 /*notifier for external charger enabling*/ in ab8500_charger_probe()
3463 if (!di->ac_chg.enabled) in ab8500_charger_probe()
3468 /* ux500_charger sub-class */ in ab8500_charger_probe()
3469 di->usb_chg.ops.enable = &ab8500_charger_usb_en; in ab8500_charger_probe()
3470 di->usb_chg.ops.check_enable = &ab8500_charger_usb_check_enable; in ab8500_charger_probe()
3471 di->usb_chg.ops.kick_wd = &ab8500_charger_watchdog_kick; in ab8500_charger_probe()
3472 di->usb_chg.ops.update_curr = &ab8500_charger_update_charger_current; in ab8500_charger_probe()
3473 di->usb_chg.max_out_volt = ab8500_charger_voltage_map[ in ab8500_charger_probe()
3474 ARRAY_SIZE(ab8500_charger_voltage_map) - 1]; in ab8500_charger_probe()
3475 di->usb_chg.max_out_curr = in ab8500_charger_probe()
3476 di->bm->chg_output_curr[di->bm->n_chg_out_curr - 1]; in ab8500_charger_probe()
3477 di->usb_chg.wdt_refresh = CHG_WD_INTERVAL; in ab8500_charger_probe()
3478 di->usb_chg.enabled = di->bm->usb_enabled; in ab8500_charger_probe()
3479 di->usb_chg.external = false; in ab8500_charger_probe()
3480 di->usb_state.usb_current = -1; in ab8500_charger_probe()
3482 /* Create a work queue for the charger */ in ab8500_charger_probe()
3483 di->charger_wq = alloc_ordered_workqueue("ab8500_charger_wq", in ab8500_charger_probe()
3485 if (di->charger_wq == NULL) { in ab8500_charger_probe()
3486 dev_err(di->dev, "failed to create work queue\n"); in ab8500_charger_probe()
3487 return -ENOMEM; in ab8500_charger_probe()
3490 mutex_init(&di->charger_attached_mutex); in ab8500_charger_probe()
3493 INIT_DEFERRABLE_WORK(&di->check_hw_failure_work, in ab8500_charger_probe()
3495 INIT_DEFERRABLE_WORK(&di->check_usbchgnotok_work, in ab8500_charger_probe()
3498 INIT_DELAYED_WORK(&di->ac_charger_attached_work, in ab8500_charger_probe()
3500 INIT_DELAYED_WORK(&di->usb_charger_attached_work, in ab8500_charger_probe()
3505 * logic. That means we have to continuously kick the charger in ab8500_charger_probe()
3506 * watchdog even when no charger is connected. This is only in ab8500_charger_probe()
3507 * valid once the AC charger has been enabled. This is in ab8500_charger_probe()
3509 * watchdog have to be kicked by the charger driver in ab8500_charger_probe()
3510 * when the AC charger is disabled in ab8500_charger_probe()
3512 INIT_DEFERRABLE_WORK(&di->kick_wd_work, in ab8500_charger_probe()
3515 INIT_DEFERRABLE_WORK(&di->check_vbat_work, in ab8500_charger_probe()
3518 INIT_DELAYED_WORK(&di->attach_work, in ab8500_charger_probe()
3521 INIT_DELAYED_WORK(&di->usb_state_changed_work, in ab8500_charger_probe()
3524 INIT_DELAYED_WORK(&di->vbus_drop_end_work, in ab8500_charger_probe()
3527 /* Init work for charger detection */ in ab8500_charger_probe()
3528 INIT_WORK(&di->usb_link_status_work, in ab8500_charger_probe()
3530 INIT_WORK(&di->ac_work, ab8500_charger_ac_work); in ab8500_charger_probe()
3531 INIT_WORK(&di->detect_usb_type_work, in ab8500_charger_probe()
3535 INIT_WORK(&di->check_main_thermal_prot_work, in ab8500_charger_probe()
3537 INIT_WORK(&di->check_usb_thermal_prot_work, in ab8500_charger_probe()
3542 * is a charger connected to avoid erroneous BTEMP_HIGH/LOW in ab8500_charger_probe()
3545 di->regu = devm_regulator_get(di->dev, "vddadc"); in ab8500_charger_probe()
3546 if (IS_ERR(di->regu)) { in ab8500_charger_probe()
3547 ret = PTR_ERR(di->regu); in ab8500_charger_probe()
3548 dev_err(di->dev, "failed to get vddadc regulator\n"); in ab8500_charger_probe()
3556 dev_err(di->dev, "failed to initialize ABB registers\n"); in ab8500_charger_probe()
3560 /* Register AC charger class */ in ab8500_charger_probe()
3561 if (di->ac_chg.enabled) { in ab8500_charger_probe()
3562 di->ac_chg.psy = power_supply_register(di->dev, in ab8500_charger_probe()
3565 if (IS_ERR(di->ac_chg.psy)) { in ab8500_charger_probe()
3566 dev_err(di->dev, "failed to register AC charger\n"); in ab8500_charger_probe()
3567 ret = PTR_ERR(di->ac_chg.psy); in ab8500_charger_probe()
3572 /* Register USB charger class */ in ab8500_charger_probe()
3573 if (di->usb_chg.enabled) { in ab8500_charger_probe()
3574 di->usb_chg.psy = power_supply_register(di->dev, in ab8500_charger_probe()
3577 if (IS_ERR(di->usb_chg.psy)) { in ab8500_charger_probe()
3578 dev_err(di->dev, "failed to register USB charger\n"); in ab8500_charger_probe()
3579 ret = PTR_ERR(di->usb_chg.psy); in ab8500_charger_probe()
3584 di->usb_phy = usb_get_phy(USB_PHY_TYPE_USB2); in ab8500_charger_probe()
3585 if (IS_ERR_OR_NULL(di->usb_phy)) { in ab8500_charger_probe()
3586 dev_err(di->dev, "failed to get usb transceiver\n"); in ab8500_charger_probe()
3587 ret = -EINVAL; in ab8500_charger_probe()
3590 di->nb.notifier_call = ab8500_charger_usb_notifier_call; in ab8500_charger_probe()
3591 ret = usb_register_notifier(di->usb_phy, &di->nb); in ab8500_charger_probe()
3593 dev_err(di->dev, "failed to register usb notifier\n"); in ab8500_charger_probe()
3597 /* Identify the connected charger types during startup */ in ab8500_charger_probe()
3600 di->ac.charger_connected = 1; in ab8500_charger_probe()
3601 di->ac_conn = true; in ab8500_charger_probe()
3602 ab8500_power_supply_changed(di, di->ac_chg.psy); in ab8500_charger_probe()
3603 sysfs_notify(&di->ac_chg.psy->dev.kobj, NULL, "present"); in ab8500_charger_probe()
3607 di->vbus_detected = true; in ab8500_charger_probe()
3608 di->vbus_detected_start = true; in ab8500_charger_probe()
3609 queue_work(di->charger_wq, in ab8500_charger_probe()
3610 &di->detect_usb_type_work); in ab8500_charger_probe()
3626 dev_err(di->dev, "failed to request %s IRQ %d: %d\n" in ab8500_charger_probe()
3630 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n", in ab8500_charger_probe()
3636 mutex_lock(&di->charger_attached_mutex); in ab8500_charger_probe()
3641 if (is_ab8500(di->parent)) in ab8500_charger_probe()
3642 queue_delayed_work(di->charger_wq, in ab8500_charger_probe()
3643 &di->ac_charger_attached_work, in ab8500_charger_probe()
3647 if (is_ab8500(di->parent)) in ab8500_charger_probe()
3648 queue_delayed_work(di->charger_wq, in ab8500_charger_probe()
3649 &di->usb_charger_attached_work, in ab8500_charger_probe()
3653 mutex_unlock(&di->charger_attached_mutex); in ab8500_charger_probe()
3658 usb_unregister_notifier(di->usb_phy, &di->nb); in ab8500_charger_probe()
3661 for (i = i - 1; i >= 0; i--) { in ab8500_charger_probe()
3666 usb_put_phy(di->usb_phy); in ab8500_charger_probe()
3668 if (di->usb_chg.enabled) in ab8500_charger_probe()
3669 power_supply_unregister(di->usb_chg.psy); in ab8500_charger_probe()
3671 if (di->ac_chg.enabled) in ab8500_charger_probe()
3672 power_supply_unregister(di->ac_chg.psy); in ab8500_charger_probe()
3674 destroy_workqueue(di->charger_wq); in ab8500_charger_probe()
3679 { .compatible = "stericsson,ab8500-charger", },
3690 .name = "ab8500-charger",
3710 MODULE_ALIAS("platform:ab8500-charger");
3711 MODULE_DESCRIPTION("AB8500 charger management driver");