Lines Matching +full:power +full:- +full:manager
1 // SPDX-License-Identifier: GPL-2.0-only
7 * during suspend-to-mem.
8 * Charger manager depends on other devices. Register this later than
23 #include <linux/power/charger-manager.h>
36 { "USB-HOST", EXTCON_USB_HOST },
41 { "FAST-CHARGER", EXTCON_CHG_USB_FAST },
42 { "SLOW-CHARGER", EXTCON_CHG_USB_SLOW },
50 { "CHARGE-DOWNSTREAM", EXTCON_CHG_USB_CDP },
79 /* About in-suspend (suspend-again) monitoring */
93 * is_batt_present - See if the battery presents in place.
94 * @cm: the Charger Manager representing the battery.
103 switch (cm->desc->battery_present) { in is_batt_present()
110 psy = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in is_batt_present()
121 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_batt_present()
123 cm->desc->psy_charger_stat[i]); in is_batt_present()
125 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_batt_present()
126 cm->desc->psy_charger_stat[i]); in is_batt_present()
145 * is_ext_pwr_online - See if an external power source is attached to charge
146 * @cm: the Charger Manager representing the battery.
149 * power source attached to charge the battery regardless of whether it is
160 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_ext_pwr_online()
161 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); in is_ext_pwr_online()
163 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_ext_pwr_online()
164 cm->desc->psy_charger_stat[i]); in is_ext_pwr_online()
181 * get_batt_uV - Get the voltage level of the battery
182 * @cm: the Charger Manager representing the battery.
194 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in get_batt_uV()
196 return -ENODEV; in get_batt_uV()
209 * is_charging - Returns true if the battery is being charged.
210 * @cm: the Charger Manager representing the battery.
224 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_charging()
226 if (cm->emergency_stop) in is_charging()
228 if (!cm->charger_enabled) in is_charging()
231 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); in is_charging()
233 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_charging()
234 cm->desc->psy_charger_stat[i]); in is_charging()
238 /* 2. The charger should be online (ext-power) */ in is_charging()
242 dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", in is_charging()
243 cm->desc->psy_charger_stat[i]); in is_charging()
260 dev_warn(cm->dev, "Cannot read STATUS value from %s\n", in is_charging()
261 cm->desc->psy_charger_stat[i]); in is_charging()
278 * is_full_charged - Returns true if the battery is fully charged.
279 * @cm: the Charger Manager representing the battery.
283 struct charger_desc *desc = cm->desc; in is_full_charged()
294 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in is_full_charged()
299 if (desc->fullbatt_uV > 0) { in is_full_charged()
303 if (cm->battery_status == POWER_SUPPLY_STATUS_FULL in is_full_charged()
304 && desc->fullbatt_vchkdrop_uV) in is_full_charged()
305 uV += desc->fullbatt_vchkdrop_uV; in is_full_charged()
306 if (uV >= desc->fullbatt_uV) in is_full_charged()
311 if (desc->fullbatt_full_capacity > 0) { in is_full_charged()
317 if (!ret && val.intval > desc->fullbatt_full_capacity) { in is_full_charged()
324 if (desc->fullbatt_soc > 0) { in is_full_charged()
329 if (!ret && val.intval >= desc->fullbatt_soc) { in is_full_charged()
341 * is_polling_required - Return true if need to continue polling for this CM.
342 * @cm: the Charger Manager representing the battery.
346 switch (cm->desc->polling_mode) { in is_polling_required()
356 dev_warn(cm->dev, "Incorrect polling_mode (%d)\n", in is_polling_required()
357 cm->desc->polling_mode); in is_polling_required()
364 * try_charger_enable - Enable/Disable chargers altogether
365 * @cm: the Charger Manager representing the battery.
368 * Note that Charger Manager keeps the charger enabled regardless whether
370 * power source exists) except when CM needs to disable chargers forcibly
376 struct charger_desc *desc = cm->desc; in try_charger_enable()
379 if (enable == cm->charger_enabled) in try_charger_enable()
383 if (cm->emergency_stop) in try_charger_enable()
384 return -EAGAIN; in try_charger_enable()
390 cm->charging_start_time = ktime_to_ms(ktime_get()); in try_charger_enable()
391 cm->charging_end_time = 0; in try_charger_enable()
393 for (i = 0 ; i < desc->num_charger_regulators ; i++) { in try_charger_enable()
394 if (desc->charger_regulators[i].externally_control) in try_charger_enable()
397 err = regulator_enable(desc->charger_regulators[i].consumer); in try_charger_enable()
399 dev_warn(cm->dev, "Cannot enable %s regulator\n", in try_charger_enable()
400 desc->charger_regulators[i].regulator_name); in try_charger_enable()
406 * of battery after full-batt. in try_charger_enable()
408 cm->charging_start_time = 0; in try_charger_enable()
409 cm->charging_end_time = ktime_to_ms(ktime_get()); in try_charger_enable()
411 for (i = 0 ; i < desc->num_charger_regulators ; i++) { in try_charger_enable()
412 if (desc->charger_regulators[i].externally_control) in try_charger_enable()
415 err = regulator_disable(desc->charger_regulators[i].consumer); in try_charger_enable()
417 dev_warn(cm->dev, "Cannot disable %s regulator\n", in try_charger_enable()
418 desc->charger_regulators[i].regulator_name); in try_charger_enable()
423 * Abnormal battery state - Stop charging forcibly, in try_charger_enable()
426 for (i = 0; i < desc->num_charger_regulators; i++) { in try_charger_enable()
428 desc->charger_regulators[i].consumer)) { in try_charger_enable()
430 desc->charger_regulators[i].consumer); in try_charger_enable()
431 dev_warn(cm->dev, "Disable regulator(%s) forcibly\n", in try_charger_enable()
432 desc->charger_regulators[i].regulator_name); in try_charger_enable()
438 cm->charger_enabled = enable; in try_charger_enable()
444 * check_charging_duration - Monitor charging/discharging duration
445 * @cm: the Charger Manager representing the battery.
450 * attached, after full-batt, cm start charging to maintain fully
455 struct charger_desc *desc = cm->desc; in check_charging_duration()
460 if (!desc->charging_max_duration_ms && in check_charging_duration()
461 !desc->discharging_max_duration_ms) in check_charging_duration()
464 if (cm->charger_enabled) { in check_charging_duration()
465 duration = curr - cm->charging_start_time; in check_charging_duration()
467 if (duration > desc->charging_max_duration_ms) { in check_charging_duration()
468 dev_info(cm->dev, "Charging duration exceed %ums\n", in check_charging_duration()
469 desc->charging_max_duration_ms); in check_charging_duration()
472 } else if (cm->battery_status == POWER_SUPPLY_STATUS_NOT_CHARGING) { in check_charging_duration()
473 duration = curr - cm->charging_end_time; in check_charging_duration()
475 if (duration > desc->discharging_max_duration_ms) { in check_charging_duration()
476 dev_info(cm->dev, "Discharging duration exceed %ums\n", in check_charging_duration()
477 desc->discharging_max_duration_ms); in check_charging_duration()
491 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in cm_get_battery_temperature_by_psy()
493 return -ENODEV; in cm_get_battery_temperature_by_psy()
508 if (!cm->desc->measure_battery_temp) in cm_get_battery_temperature()
509 return -ENODEV; in cm_get_battery_temperature()
512 if (cm->tzd_batt) { in cm_get_battery_temperature()
513 ret = thermal_zone_get_temp(cm->tzd_batt, temp); in cm_get_battery_temperature()
520 /* if-else continued from CONFIG_THERMAL */ in cm_get_battery_temperature()
529 struct charger_desc *desc = cm->desc; in cm_check_thermal_status()
540 dev_err(cm->dev, "Failed to get battery temperature\n"); in cm_check_thermal_status()
544 upper_limit = desc->temp_max; in cm_check_thermal_status()
545 lower_limit = desc->temp_min; in cm_check_thermal_status()
547 if (cm->emergency_stop) { in cm_check_thermal_status()
548 upper_limit -= desc->temp_diff; in cm_check_thermal_status()
549 lower_limit += desc->temp_diff; in cm_check_thermal_status()
559 cm->emergency_stop = ret; in cm_check_thermal_status()
565 * cm_get_target_status - Check current status and get next target status.
566 * @cm: the Charger Manager representing the battery.
580 switch (cm->battery_status) { in cm_get_target_status()
600 * _cm_monitor - Monitor the temperature and return true for exceptions.
601 * @cm: the Charger Manager representing the battery.
614 if (cm->battery_status != target) { in _cm_monitor()
615 cm->battery_status = target; in _cm_monitor()
616 power_supply_changed(cm->charger_psy); in _cm_monitor()
619 return (cm->battery_status == POWER_SUPPLY_STATUS_NOT_CHARGING); in _cm_monitor()
623 * cm_monitor - Monitor every battery.
646 * _setup_polling - Setup the next instance of polling.
659 if (is_polling_required(cm) && cm->desc->polling_interval_ms) { in _setup_polling()
662 if (min > cm->desc->polling_interval_ms) in _setup_polling()
663 min = cm->desc->polling_interval_ms; in _setup_polling()
676 WARN(cm_wq == NULL, "charger-manager: workqueue not initialized" in _setup_polling()
700 * cm_monitor_poller - The Monitor / Poller.
703 * During non-suspended state, cm_monitor_poller is used to poll and monitor
717 struct charger_desc *desc = cm->desc; in charger_get_property()
724 val->intval = cm->battery_status; in charger_get_property()
727 if (cm->emergency_stop == CM_BATT_OVERHEAT) in charger_get_property()
728 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; in charger_get_property()
729 else if (cm->emergency_stop == CM_BATT_COLD) in charger_get_property()
730 val->intval = POWER_SUPPLY_HEALTH_COLD; in charger_get_property()
732 val->intval = POWER_SUPPLY_HEALTH_GOOD; in charger_get_property()
736 val->intval = 1; in charger_get_property()
738 val->intval = 0; in charger_get_property()
741 ret = get_batt_uV(cm, &val->intval); in charger_get_property()
744 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
746 ret = -ENODEV; in charger_get_property()
753 return cm_get_battery_temperature(cm, &val->intval); in charger_get_property()
757 val->intval = 100; in charger_get_property()
761 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
763 ret = -ENODEV; in charger_get_property()
772 if (val->intval > 100) { in charger_get_property()
773 val->intval = 100; in charger_get_property()
776 if (val->intval < 0) in charger_get_property()
777 val->intval = 0; in charger_get_property()
794 if (desc->fullbatt_uV > 0 && uV >= desc->fullbatt_uV && in charger_get_property()
796 val->intval = 100; in charger_get_property()
803 val->intval = 1; in charger_get_property()
805 val->intval = 0; in charger_get_property()
809 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
811 ret = -ENODEV; in charger_get_property()
817 return -EINVAL; in charger_get_property()
852 * cm_setup_timer - For in-suspend monitoring setup wakeup alarm
855 * Returns true if the alarm is set for Charger Manager to use.
858 * cm_setup_timer does not need to set an alarm for Charger Manager,
869 jiffies_to_msecs(next_polling - jiffies)); in cm_setup_timer()
874 if (!is_polling_required(cm) && !cm->emergency_stop) in cm_setup_timer()
877 if (cm->desc->polling_interval_ms == 0) in cm_setup_timer()
879 CM_MIN_VALID(wakeup_ms, cm->desc->polling_interval_ms); in cm_setup_timer()
894 pr_info("Charger Manager wakeup timer: %u ms\n", wakeup_ms); in cm_setup_timer()
909 * charger_extcon_work - enable/diable charger according to the state
920 if (cable->attached && cable->min_uA != 0 && cable->max_uA != 0) { in charger_extcon_work()
921 ret = regulator_set_current_limit(cable->charger->consumer, in charger_extcon_work()
922 cable->min_uA, cable->max_uA); in charger_extcon_work()
925 cable->charger->regulator_name, cable->name); in charger_extcon_work()
930 cable->charger->regulator_name, in charger_extcon_work()
931 cable->min_uA, cable->max_uA); in charger_extcon_work()
939 * charger_extcon_notifier - receive the state of charger cable
954 * If cable is attached, cable->attached is true. in charger_extcon_notifier()
956 cable->attached = event; in charger_extcon_notifier()
962 schedule_work(&cable->wq); in charger_extcon_notifier()
968 * charger_extcon_init - register external connector to use it
971 * @cm: the Charger Manager representing the battery.
981 * Charger manager use Extcon framework to identify in charger_extcon_init()
985 INIT_WORK(&cable->wq, charger_extcon_work); in charger_extcon_init()
986 cable->nb.notifier_call = charger_extcon_notifier; in charger_extcon_init()
988 cable->extcon_dev = extcon_get_extcon_dev(cable->extcon_name); in charger_extcon_init()
989 if (IS_ERR(cable->extcon_dev)) { in charger_extcon_init()
991 cable->extcon_name, cable->name); in charger_extcon_init()
992 return PTR_ERR(cable->extcon_dev); in charger_extcon_init()
996 if (!strcmp(cable->name, extcon_mapping[i].name)) { in charger_extcon_init()
1002 pr_err("Cannot find cable for type %s", cable->name); in charger_extcon_init()
1003 return -EINVAL; in charger_extcon_init()
1006 cable->extcon_type = extcon_type; in charger_extcon_init()
1008 ret = devm_extcon_register_notifier(cm->dev, cable->extcon_dev, in charger_extcon_init()
1009 cable->extcon_type, &cable->nb); in charger_extcon_init()
1012 cable->extcon_name, cable->name); in charger_extcon_init()
1020 * charger_manager_register_extcon - Register extcon device to receive state
1022 * @cm: the Charger Manager representing the battery.
1031 struct charger_desc *desc = cm->desc; in charger_manager_register_extcon()
1038 for (i = 0; i < desc->num_charger_regulators; i++) { in charger_manager_register_extcon()
1039 charger = &desc->charger_regulators[i]; in charger_manager_register_extcon()
1041 charger->consumer = regulator_get(cm->dev, in charger_manager_register_extcon()
1042 charger->regulator_name); in charger_manager_register_extcon()
1043 if (IS_ERR(charger->consumer)) { in charger_manager_register_extcon()
1044 dev_err(cm->dev, "Cannot find charger(%s)\n", in charger_manager_register_extcon()
1045 charger->regulator_name); in charger_manager_register_extcon()
1046 return PTR_ERR(charger->consumer); in charger_manager_register_extcon()
1048 charger->cm = cm; in charger_manager_register_extcon()
1050 for (j = 0; j < charger->num_cables; j++) { in charger_manager_register_extcon()
1051 struct charger_cable *cable = &charger->cables[j]; in charger_manager_register_extcon()
1055 dev_err(cm->dev, "Cannot initialize charger(%s)\n", in charger_manager_register_extcon()
1056 charger->regulator_name); in charger_manager_register_extcon()
1059 cable->charger = charger; in charger_manager_register_extcon()
1060 cable->cm = cm; in charger_manager_register_extcon()
1062 event = extcon_get_state(cable->extcon_dev, in charger_manager_register_extcon()
1063 cable->extcon_type); in charger_manager_register_extcon()
1064 charger_extcon_notifier(&cable->nb, in charger_manager_register_extcon()
1079 return sysfs_emit(buf, "%s\n", charger->regulator_name); in charger_name_show()
1089 if (!charger->externally_control) in charger_state_show()
1090 state = regulator_is_enabled(charger->consumer); in charger_state_show()
1101 return sysfs_emit(buf, "%d\n", charger->externally_control); in charger_externally_control_show()
1111 struct charger_manager *cm = charger->cm; in charger_externally_control_store()
1112 struct charger_desc *desc = cm->desc; in charger_externally_control_store()
1120 ret = -EINVAL; in charger_externally_control_store()
1125 charger->externally_control = 0; in charger_externally_control_store()
1129 for (i = 0; i < desc->num_charger_regulators; i++) { in charger_externally_control_store()
1130 if (&desc->charger_regulators[i] != charger && in charger_externally_control_store()
1131 !desc->charger_regulators[i].externally_control) { in charger_externally_control_store()
1134 * charger-manager in charger_externally_control_store()
1142 if (cm->charger_enabled) { in charger_externally_control_store()
1143 try_charger_enable(charger->cm, false); in charger_externally_control_store()
1144 charger->externally_control = externally_control; in charger_externally_control_store()
1145 try_charger_enable(charger->cm, true); in charger_externally_control_store()
1147 charger->externally_control = externally_control; in charger_externally_control_store()
1150 dev_warn(cm->dev, in charger_externally_control_store()
1151 …"'%s' regulator should be controlled in charger-manager because charger-manager must need at least… in charger_externally_control_store()
1152 charger->regulator_name); in charger_externally_control_store()
1159 * charger_manager_prepare_sysfs - Prepare sysfs entry for each charger
1160 * @cm: the Charger Manager representing the battery.
1163 * user-space. If some development board use one more chargers for charging
1168 * externally_control, this charger isn't controlled from charger-manager and
1173 struct charger_desc *desc = cm->desc; in charger_manager_prepare_sysfs()
1180 for (i = 0; i < desc->num_charger_regulators; i++) { in charger_manager_prepare_sysfs()
1181 charger = &desc->charger_regulators[i]; in charger_manager_prepare_sysfs()
1183 name = devm_kasprintf(cm->dev, GFP_KERNEL, "charger.%d", i); in charger_manager_prepare_sysfs()
1185 return -ENOMEM; in charger_manager_prepare_sysfs()
1187 charger->attrs[0] = &charger->attr_name.attr; in charger_manager_prepare_sysfs()
1188 charger->attrs[1] = &charger->attr_state.attr; in charger_manager_prepare_sysfs()
1189 charger->attrs[2] = &charger->attr_externally_control.attr; in charger_manager_prepare_sysfs()
1190 charger->attrs[3] = NULL; in charger_manager_prepare_sysfs()
1192 charger->attr_grp.name = name; in charger_manager_prepare_sysfs()
1193 charger->attr_grp.attrs = charger->attrs; in charger_manager_prepare_sysfs()
1194 desc->sysfs_groups[i] = &charger->attr_grp; in charger_manager_prepare_sysfs()
1196 sysfs_attr_init(&charger->attr_name.attr); in charger_manager_prepare_sysfs()
1197 charger->attr_name.attr.name = "name"; in charger_manager_prepare_sysfs()
1198 charger->attr_name.attr.mode = 0444; in charger_manager_prepare_sysfs()
1199 charger->attr_name.show = charger_name_show; in charger_manager_prepare_sysfs()
1201 sysfs_attr_init(&charger->attr_state.attr); in charger_manager_prepare_sysfs()
1202 charger->attr_state.attr.name = "state"; in charger_manager_prepare_sysfs()
1203 charger->attr_state.attr.mode = 0444; in charger_manager_prepare_sysfs()
1204 charger->attr_state.show = charger_state_show; in charger_manager_prepare_sysfs()
1206 sysfs_attr_init(&charger->attr_externally_control.attr); in charger_manager_prepare_sysfs()
1207 charger->attr_externally_control.attr.name in charger_manager_prepare_sysfs()
1209 charger->attr_externally_control.attr.mode = 0644; in charger_manager_prepare_sysfs()
1210 charger->attr_externally_control.show in charger_manager_prepare_sysfs()
1212 charger->attr_externally_control.store in charger_manager_prepare_sysfs()
1215 if (!desc->charger_regulators[i].externally_control || in charger_manager_prepare_sysfs()
1219 dev_info(cm->dev, "'%s' regulator's externally_control is %d\n", in charger_manager_prepare_sysfs()
1220 charger->regulator_name, charger->externally_control); in charger_manager_prepare_sysfs()
1224 …dev_err(cm->dev, "Cannot register regulator because charger-manager must need at least one charger… in charger_manager_prepare_sysfs()
1225 return -EINVAL; in charger_manager_prepare_sysfs()
1236 struct charger_desc *desc = cm->desc; in cm_init_thermal_data()
1247 cm->desc->measure_battery_temp = true; in cm_init_thermal_data()
1250 if (ret && desc->thermal_zone) { in cm_init_thermal_data()
1251 cm->tzd_batt = in cm_init_thermal_data()
1252 thermal_zone_get_zone_by_name(desc->thermal_zone); in cm_init_thermal_data()
1253 if (IS_ERR(cm->tzd_batt)) in cm_init_thermal_data()
1254 return PTR_ERR(cm->tzd_batt); in cm_init_thermal_data()
1259 cm->desc->measure_battery_temp = true; in cm_init_thermal_data()
1263 if (cm->desc->measure_battery_temp) { in cm_init_thermal_data()
1265 if (!desc->temp_max) in cm_init_thermal_data()
1266 desc->temp_max = CM_DEFAULT_CHARGE_TEMP_MAX; in cm_init_thermal_data()
1267 if (!desc->temp_diff) in cm_init_thermal_data()
1268 desc->temp_diff = CM_DEFAULT_RECHARGE_TEMP_DIFF; in cm_init_thermal_data()
1276 .compatible = "charger-manager",
1285 struct device_node *np = dev->of_node; in of_cm_parse_desc()
1292 return ERR_PTR(-ENOMEM); in of_cm_parse_desc()
1294 of_property_read_string(np, "cm-name", &desc->psy_name); in of_cm_parse_desc()
1296 of_property_read_u32(np, "cm-poll-mode", &poll_mode); in of_cm_parse_desc()
1297 desc->polling_mode = poll_mode; in of_cm_parse_desc()
1299 of_property_read_u32(np, "cm-poll-interval", in of_cm_parse_desc()
1300 &desc->polling_interval_ms); in of_cm_parse_desc()
1302 of_property_read_u32(np, "cm-fullbatt-vchkdrop-volt", in of_cm_parse_desc()
1303 &desc->fullbatt_vchkdrop_uV); in of_cm_parse_desc()
1304 of_property_read_u32(np, "cm-fullbatt-voltage", &desc->fullbatt_uV); in of_cm_parse_desc()
1305 of_property_read_u32(np, "cm-fullbatt-soc", &desc->fullbatt_soc); in of_cm_parse_desc()
1306 of_property_read_u32(np, "cm-fullbatt-capacity", in of_cm_parse_desc()
1307 &desc->fullbatt_full_capacity); in of_cm_parse_desc()
1309 of_property_read_u32(np, "cm-battery-stat", &battery_stat); in of_cm_parse_desc()
1310 desc->battery_present = battery_stat; in of_cm_parse_desc()
1313 num_chgs = of_property_count_strings(np, "cm-chargers"); in of_cm_parse_desc()
1318 desc->psy_charger_stat = devm_kcalloc(dev, in of_cm_parse_desc()
1322 if (!desc->psy_charger_stat) in of_cm_parse_desc()
1323 return ERR_PTR(-ENOMEM); in of_cm_parse_desc()
1326 of_property_read_string_index(np, "cm-chargers", in of_cm_parse_desc()
1327 i, &desc->psy_charger_stat[i]); in of_cm_parse_desc()
1330 of_property_read_string(np, "cm-fuel-gauge", &desc->psy_fuel_gauge); in of_cm_parse_desc()
1332 of_property_read_string(np, "cm-thermal-zone", &desc->thermal_zone); in of_cm_parse_desc()
1334 of_property_read_u32(np, "cm-battery-cold", &desc->temp_min); in of_cm_parse_desc()
1335 if (of_property_read_bool(np, "cm-battery-cold-in-minus")) in of_cm_parse_desc()
1336 desc->temp_min *= -1; in of_cm_parse_desc()
1337 of_property_read_u32(np, "cm-battery-hot", &desc->temp_max); in of_cm_parse_desc()
1338 of_property_read_u32(np, "cm-battery-temp-diff", &desc->temp_diff); in of_cm_parse_desc()
1340 of_property_read_u32(np, "cm-charging-max", in of_cm_parse_desc()
1341 &desc->charging_max_duration_ms); in of_cm_parse_desc()
1342 of_property_read_u32(np, "cm-discharging-max", in of_cm_parse_desc()
1343 &desc->discharging_max_duration_ms); in of_cm_parse_desc()
1346 desc->num_charger_regulators = of_get_child_count(np); in of_cm_parse_desc()
1347 if (desc->num_charger_regulators) { in of_cm_parse_desc()
1352 desc->num_charger_regulators, in of_cm_parse_desc()
1356 return ERR_PTR(-ENOMEM); in of_cm_parse_desc()
1358 desc->charger_regulators = chg_regs; in of_cm_parse_desc()
1360 desc->sysfs_groups = devm_kcalloc(dev, in of_cm_parse_desc()
1361 desc->num_charger_regulators + 1, in of_cm_parse_desc()
1362 sizeof(*desc->sysfs_groups), in of_cm_parse_desc()
1364 if (!desc->sysfs_groups) in of_cm_parse_desc()
1365 return ERR_PTR(-ENOMEM); in of_cm_parse_desc()
1371 of_property_read_string(child, "cm-regulator-name", in of_cm_parse_desc()
1372 &chg_regs->regulator_name); in of_cm_parse_desc()
1375 chg_regs->num_cables = of_get_child_count(child); in of_cm_parse_desc()
1376 if (chg_regs->num_cables) { in of_cm_parse_desc()
1378 chg_regs->num_cables, in of_cm_parse_desc()
1383 return ERR_PTR(-ENOMEM); in of_cm_parse_desc()
1386 chg_regs->cables = cables; in of_cm_parse_desc()
1390 "cm-cable-name", &cables->name); in of_cm_parse_desc()
1392 "cm-cable-extcon", in of_cm_parse_desc()
1393 &cables->extcon_name); in of_cm_parse_desc()
1395 "cm-cable-min", in of_cm_parse_desc()
1396 &cables->min_uA); in of_cm_parse_desc()
1398 "cm-cable-max", in of_cm_parse_desc()
1399 &cables->max_uA); in of_cm_parse_desc()
1411 if (pdev->dev.of_node) in cm_get_drv_data()
1412 return of_cm_parse_desc(&pdev->dev); in cm_get_drv_data()
1413 return dev_get_platdata(&pdev->dev); in cm_get_drv_data()
1433 dev_err(&pdev->dev, "No platform data (desc) found\n"); in charger_manager_probe()
1437 cm = devm_kzalloc(&pdev->dev, sizeof(*cm), GFP_KERNEL); in charger_manager_probe()
1439 return -ENOMEM; in charger_manager_probe()
1442 cm->dev = &pdev->dev; in charger_manager_probe()
1443 cm->desc = desc; in charger_manager_probe()
1448 cm_timer = devm_kzalloc(cm->dev, sizeof(*cm_timer), GFP_KERNEL); in charger_manager_probe()
1450 return -ENOMEM; in charger_manager_probe()
1458 if (desc->fullbatt_uV == 0) { in charger_manager_probe()
1459 dev_info(&pdev->dev, "Ignoring full-battery voltage threshold as it is not supplied\n"); in charger_manager_probe()
1461 if (!desc->fullbatt_vchkdrop_uV) { in charger_manager_probe()
1462 …dev_info(&pdev->dev, "Disabling full-battery voltage drop checking mechanism as it is not supplied… in charger_manager_probe()
1463 desc->fullbatt_vchkdrop_uV = 0; in charger_manager_probe()
1465 if (desc->fullbatt_soc == 0) { in charger_manager_probe()
1466 …dev_info(&pdev->dev, "Ignoring full-battery soc(state of charge) threshold as it is not supplied\n… in charger_manager_probe()
1468 if (desc->fullbatt_full_capacity == 0) { in charger_manager_probe()
1469 dev_info(&pdev->dev, "Ignoring full-battery full capacity threshold as it is not supplied\n"); in charger_manager_probe()
1472 if (!desc->charger_regulators || desc->num_charger_regulators < 1) { in charger_manager_probe()
1473 dev_err(&pdev->dev, "charger_regulators undefined\n"); in charger_manager_probe()
1474 return -EINVAL; in charger_manager_probe()
1477 if (!desc->psy_charger_stat || !desc->psy_charger_stat[0]) { in charger_manager_probe()
1478 dev_err(&pdev->dev, "No power supply defined\n"); in charger_manager_probe()
1479 return -EINVAL; in charger_manager_probe()
1482 if (!desc->psy_fuel_gauge) { in charger_manager_probe()
1483 dev_err(&pdev->dev, "No fuel gauge power supply defined\n"); in charger_manager_probe()
1484 return -EINVAL; in charger_manager_probe()
1488 for (i = 0; desc->psy_charger_stat[i]; i++) { in charger_manager_probe()
1491 psy = power_supply_get_by_name(desc->psy_charger_stat[i]); in charger_manager_probe()
1493 dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", in charger_manager_probe()
1494 desc->psy_charger_stat[i]); in charger_manager_probe()
1495 return -ENODEV; in charger_manager_probe()
1500 if (cm->desc->polling_mode != CM_POLL_DISABLE && in charger_manager_probe()
1501 (desc->polling_interval_ms == 0 || in charger_manager_probe()
1502 msecs_to_jiffies(desc->polling_interval_ms) <= CM_JIFFIES_SMALL)) { in charger_manager_probe()
1503 dev_err(&pdev->dev, "polling_interval_ms is too small\n"); in charger_manager_probe()
1504 return -EINVAL; in charger_manager_probe()
1507 if (!desc->charging_max_duration_ms || in charger_manager_probe()
1508 !desc->discharging_max_duration_ms) { in charger_manager_probe()
1509 …dev_info(&pdev->dev, "Cannot limit charging duration checking mechanism to prevent overcharge/over… in charger_manager_probe()
1510 desc->charging_max_duration_ms = 0; in charger_manager_probe()
1511 desc->discharging_max_duration_ms = 0; in charger_manager_probe()
1516 memcpy(&cm->charger_psy_desc, &psy_default, sizeof(psy_default)); in charger_manager_probe()
1518 if (!desc->psy_name) in charger_manager_probe()
1519 strscpy(cm->psy_name_buf, psy_default.name, in charger_manager_probe()
1520 sizeof(cm->psy_name_buf)); in charger_manager_probe()
1522 strscpy(cm->psy_name_buf, desc->psy_name, in charger_manager_probe()
1523 sizeof(cm->psy_name_buf)); in charger_manager_probe()
1524 cm->charger_psy_desc.name = cm->psy_name_buf; in charger_manager_probe()
1527 properties = devm_kcalloc(&pdev->dev, in charger_manager_probe()
1532 return -ENOMEM; in charger_manager_probe()
1539 /* Find which optional psy-properties are available */ in charger_manager_probe()
1540 fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge); in charger_manager_probe()
1542 dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", in charger_manager_probe()
1543 desc->psy_fuel_gauge); in charger_manager_probe()
1544 return -ENODEV; in charger_manager_probe()
1568 dev_err(&pdev->dev, "Failed to initialize thermal data\n"); in charger_manager_probe()
1569 cm->desc->measure_battery_temp = false; in charger_manager_probe()
1573 cm->charger_psy_desc.properties = properties; in charger_manager_probe()
1574 cm->charger_psy_desc.num_properties = num_properties; in charger_manager_probe()
1579 dev_err(&pdev->dev, in charger_manager_probe()
1583 psy_cfg.attr_grp = desc->sysfs_groups; in charger_manager_probe()
1585 cm->charger_psy = power_supply_register(&pdev->dev, in charger_manager_probe()
1586 &cm->charger_psy_desc, in charger_manager_probe()
1588 if (IS_ERR(cm->charger_psy)) { in charger_manager_probe()
1589 dev_err(&pdev->dev, "Cannot register charger-manager with name \"%s\"\n", in charger_manager_probe()
1590 cm->charger_psy_desc.name); in charger_manager_probe()
1591 return PTR_ERR(cm->charger_psy); in charger_manager_probe()
1597 dev_err(&pdev->dev, "Cannot initialize extcon device\n"); in charger_manager_probe()
1603 list_add(&cm->entry, &cm_list); in charger_manager_probe()
1607 * Charger-manager is capable of waking up the system from sleep in charger_manager_probe()
1610 device_init_wakeup(&pdev->dev, true); in charger_manager_probe()
1611 device_set_wakeup_capable(&pdev->dev, false); in charger_manager_probe()
1614 * Charger-manager have to check the charging state right after in charger_manager_probe()
1615 * initialization of charger-manager and then update current charging in charger_manager_probe()
1625 for (i = 0; i < desc->num_charger_regulators; i++) in charger_manager_probe()
1626 regulator_put(desc->charger_regulators[i].consumer); in charger_manager_probe()
1628 power_supply_unregister(cm->charger_psy); in charger_manager_probe()
1636 struct charger_desc *desc = cm->desc; in charger_manager_remove()
1641 list_del(&cm->entry); in charger_manager_remove()
1647 for (i = 0 ; i < desc->num_charger_regulators ; i++) in charger_manager_remove()
1648 regulator_put(desc->charger_regulators[i].consumer); in charger_manager_remove()
1650 power_supply_unregister(cm->charger_psy); in charger_manager_remove()
1656 { "charger-manager", 0 },
1665 return -EAGAIN; in cm_suspend_noirq()
1693 return -EBUSY; in cm_suspend_prepare()
1721 cm_suspend_duration_ms -= ktime_to_ms(remain); in cm_suspend_complete()
1727 device_set_wakeup_capable(cm->dev, false); in cm_suspend_complete()
1738 .name = "charger-manager",
1751 return -ENOMEM; in charger_manager_init()
1769 MODULE_DESCRIPTION("Charger Manager");