Lines Matching refs:cm
88 static bool is_batt_present(struct charger_manager *cm) in is_batt_present() argument
95 switch (cm->desc->battery_present) { in is_batt_present()
102 psy = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in is_batt_present()
113 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_batt_present()
115 cm->desc->psy_charger_stat[i]); in is_batt_present()
117 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_batt_present()
118 cm->desc->psy_charger_stat[i]); in is_batt_present()
144 static bool is_ext_pwr_online(struct charger_manager *cm) in is_ext_pwr_online() argument
152 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_ext_pwr_online()
153 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); in is_ext_pwr_online()
155 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_ext_pwr_online()
156 cm->desc->psy_charger_stat[i]); in is_ext_pwr_online()
180 static int get_batt_uV(struct charger_manager *cm, int *uV) in get_batt_uV() argument
186 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in get_batt_uV()
204 static bool is_charging(struct charger_manager *cm) in is_charging() argument
212 if (!is_batt_present(cm)) in is_charging()
216 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_charging()
218 if (cm->emergency_stop) in is_charging()
220 if (!cm->charger_enabled) in is_charging()
223 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); in is_charging()
225 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_charging()
226 cm->desc->psy_charger_stat[i]); in is_charging()
234 dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", in is_charging()
235 cm->desc->psy_charger_stat[i]); in is_charging()
252 dev_warn(cm->dev, "Cannot read STATUS value from %s\n", in is_charging()
253 cm->desc->psy_charger_stat[i]); in is_charging()
273 static bool is_full_charged(struct charger_manager *cm) in is_full_charged() argument
275 struct charger_desc *desc = cm->desc; in is_full_charged()
283 if (!is_batt_present(cm)) in is_full_charged()
286 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in is_full_charged()
304 ret = get_batt_uV(cm, &uV); in is_full_charged()
332 static bool is_polling_required(struct charger_manager *cm) in is_polling_required() argument
334 switch (cm->desc->polling_mode) { in is_polling_required()
340 return is_ext_pwr_online(cm); in is_polling_required()
342 return is_charging(cm); in is_polling_required()
344 dev_warn(cm->dev, "Incorrect polling_mode (%d)\n", in is_polling_required()
345 cm->desc->polling_mode); in is_polling_required()
361 static int try_charger_enable(struct charger_manager *cm, bool enable) in try_charger_enable() argument
364 struct charger_desc *desc = cm->desc; in try_charger_enable()
367 if (enable == cm->charger_enabled) in try_charger_enable()
371 if (cm->emergency_stop) in try_charger_enable()
378 cm->charging_start_time = ktime_to_ms(ktime_get()); in try_charger_enable()
379 cm->charging_end_time = 0; in try_charger_enable()
387 dev_warn(cm->dev, "Cannot enable %s regulator\n", in try_charger_enable()
396 cm->charging_start_time = 0; in try_charger_enable()
397 cm->charging_end_time = ktime_to_ms(ktime_get()); in try_charger_enable()
405 dev_warn(cm->dev, "Cannot disable %s regulator\n", in try_charger_enable()
419 dev_warn(cm->dev, "Disable regulator(%s) forcibly\n", in try_charger_enable()
426 cm->charger_enabled = enable; in try_charger_enable()
437 static int try_charger_restart(struct charger_manager *cm) in try_charger_restart() argument
441 if (cm->emergency_stop) in try_charger_restart()
444 err = try_charger_enable(cm, false); in try_charger_restart()
448 return try_charger_enable(cm, true); in try_charger_restart()
463 static void uevent_notify(struct charger_manager *cm, const char *event) in uevent_notify() argument
489 kobject_uevent(&cm->dev->kobj, KOBJ_CHANGE); in uevent_notify()
501 kobject_uevent(&cm->dev->kobj, KOBJ_CHANGE); in uevent_notify()
503 dev_info(cm->dev, "%s\n", event); in uevent_notify()
518 struct charger_manager *cm = container_of(dwork, in fullbatt_vchk() local
520 struct charger_desc *desc = cm->desc; in fullbatt_vchk()
524 cm->fullbatt_vchk_jiffies_at = 0; in fullbatt_vchk()
529 err = get_batt_uV(cm, &batt_uV); in fullbatt_vchk()
531 dev_err(cm->dev, "%s: get_batt_uV error(%d)\n", __func__, err); in fullbatt_vchk()
539 dev_info(cm->dev, "VBATT dropped %duV after full-batt\n", diff); in fullbatt_vchk()
542 try_charger_restart(cm); in fullbatt_vchk()
543 uevent_notify(cm, "Recharging"); in fullbatt_vchk()
557 static int check_charging_duration(struct charger_manager *cm) in check_charging_duration() argument
559 struct charger_desc *desc = cm->desc; in check_charging_duration()
568 if (cm->charger_enabled) { in check_charging_duration()
569 duration = curr - cm->charging_start_time; in check_charging_duration()
572 dev_info(cm->dev, "Charging duration exceed %ums\n", in check_charging_duration()
574 uevent_notify(cm, "Discharging"); in check_charging_duration()
575 try_charger_enable(cm, false); in check_charging_duration()
578 } else if (is_ext_pwr_online(cm) && !cm->charger_enabled) { in check_charging_duration()
579 duration = curr - cm->charging_end_time; in check_charging_duration()
582 is_ext_pwr_online(cm)) { in check_charging_duration()
583 dev_info(cm->dev, "Discharging duration exceed %ums\n", in check_charging_duration()
585 uevent_notify(cm, "Recharging"); in check_charging_duration()
586 try_charger_enable(cm, true); in check_charging_duration()
594 static int cm_get_battery_temperature_by_psy(struct charger_manager *cm, in cm_get_battery_temperature_by_psy() argument
600 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in cm_get_battery_temperature_by_psy()
612 static int cm_get_battery_temperature(struct charger_manager *cm, in cm_get_battery_temperature() argument
617 if (!cm->desc->measure_battery_temp) in cm_get_battery_temperature()
621 if (cm->tzd_batt) { in cm_get_battery_temperature()
622 ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp); in cm_get_battery_temperature()
630 ret = cm_get_battery_temperature_by_psy(cm, temp); in cm_get_battery_temperature()
636 static int cm_check_thermal_status(struct charger_manager *cm) in cm_check_thermal_status() argument
638 struct charger_desc *desc = cm->desc; in cm_check_thermal_status()
642 ret = cm_get_battery_temperature(cm, &temp); in cm_check_thermal_status()
649 dev_err(cm->dev, "Failed to get battery temperature\n"); in cm_check_thermal_status()
656 if (cm->emergency_stop) { in cm_check_thermal_status()
676 static bool _cm_monitor(struct charger_manager *cm) in _cm_monitor() argument
680 temp_alrt = cm_check_thermal_status(cm); in _cm_monitor()
683 if (temp_alrt && cm->emergency_stop) in _cm_monitor()
691 cm->emergency_stop = temp_alrt; in _cm_monitor()
692 if (!try_charger_enable(cm, false)) in _cm_monitor()
693 uevent_notify(cm, default_event_names[temp_alrt]); in _cm_monitor()
699 } else if (!cm->emergency_stop && check_charging_duration(cm)) { in _cm_monitor()
700 dev_dbg(cm->dev, in _cm_monitor()
707 } else if (!cm->emergency_stop && is_ext_pwr_online(cm) && in _cm_monitor()
708 !cm->charger_enabled) { in _cm_monitor()
709 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in _cm_monitor()
715 } else if (!cm->emergency_stop && is_full_charged(cm) && in _cm_monitor()
716 cm->charger_enabled) { in _cm_monitor()
717 dev_info(cm->dev, "EVENT_HANDLE: Battery Fully Charged\n"); in _cm_monitor()
718 uevent_notify(cm, default_event_names[CM_EVENT_BATT_FULL]); in _cm_monitor()
720 try_charger_enable(cm, false); in _cm_monitor()
722 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in _cm_monitor()
724 cm->emergency_stop = 0; in _cm_monitor()
725 if (is_ext_pwr_online(cm)) { in _cm_monitor()
726 if (!try_charger_enable(cm, true)) in _cm_monitor()
727 uevent_notify(cm, "CHARGING"); in _cm_monitor()
743 struct charger_manager *cm; in cm_monitor() local
747 list_for_each_entry(cm, &cm_list, entry) { in cm_monitor()
748 if (_cm_monitor(cm)) in cm_monitor()
764 struct charger_manager *cm; in _setup_polling() local
770 list_for_each_entry(cm, &cm_list, entry) { in _setup_polling()
771 if (is_polling_required(cm) && cm->desc->polling_interval_ms) { in _setup_polling()
774 if (min > cm->desc->polling_interval_ms) in _setup_polling()
775 min = cm->desc->polling_interval_ms; in _setup_polling()
828 static void fullbatt_handler(struct charger_manager *cm) in fullbatt_handler() argument
830 struct charger_desc *desc = cm->desc; in fullbatt_handler()
836 device_set_wakeup_capable(cm->dev, true); in fullbatt_handler()
838 mod_delayed_work(cm_wq, &cm->fullbatt_vchk_work, in fullbatt_handler()
840 cm->fullbatt_vchk_jiffies_at = jiffies + msecs_to_jiffies( in fullbatt_handler()
843 if (cm->fullbatt_vchk_jiffies_at == 0) in fullbatt_handler()
844 cm->fullbatt_vchk_jiffies_at = 1; in fullbatt_handler()
847 dev_info(cm->dev, "EVENT_HANDLE: Battery Fully Charged\n"); in fullbatt_handler()
848 uevent_notify(cm, default_event_names[CM_EVENT_BATT_FULL]); in fullbatt_handler()
855 static void battout_handler(struct charger_manager *cm) in battout_handler() argument
858 device_set_wakeup_capable(cm->dev, true); in battout_handler()
860 if (!is_batt_present(cm)) { in battout_handler()
861 dev_emerg(cm->dev, "Battery Pulled Out!\n"); in battout_handler()
862 uevent_notify(cm, default_event_names[CM_EVENT_BATT_OUT]); in battout_handler()
864 uevent_notify(cm, "Battery Reinserted?"); in battout_handler()
873 static void misc_event_handler(struct charger_manager *cm, in misc_event_handler() argument
877 device_set_wakeup_capable(cm->dev, true); in misc_event_handler()
879 if (is_polling_required(cm) && cm->desc->polling_interval_ms) in misc_event_handler()
881 uevent_notify(cm, default_event_names[type]); in misc_event_handler()
888 struct charger_manager *cm = power_supply_get_drvdata(psy); in charger_get_property() local
889 struct charger_desc *desc = cm->desc; in charger_get_property()
896 if (is_charging(cm)) in charger_get_property()
898 else if (is_ext_pwr_online(cm)) in charger_get_property()
904 if (cm->emergency_stop > 0) in charger_get_property()
906 else if (cm->emergency_stop < 0) in charger_get_property()
912 if (is_batt_present(cm)) in charger_get_property()
918 ret = get_batt_uV(cm, &val->intval); in charger_get_property()
921 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
931 return cm_get_battery_temperature(cm, &val->intval); in charger_get_property()
933 if (!is_batt_present(cm)) { in charger_get_property()
939 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
958 if (is_charging(cm)) in charger_get_property()
965 ret = get_batt_uV(cm, &uV); in charger_get_property()
973 !is_charging(cm)) { in charger_get_property()
980 if (is_ext_pwr_online(cm)) in charger_get_property()
986 if (is_full_charged(cm)) in charger_get_property()
993 if (is_charging(cm)) { in charger_get_property()
995 cm->desc->psy_fuel_gauge); in charger_get_property()
1064 struct charger_manager *cm; in cm_setup_timer() local
1073 list_for_each_entry(cm, &cm_list, entry) { in cm_setup_timer()
1077 if (cm->fullbatt_vchk_jiffies_at) { in cm_setup_timer()
1078 fbchk_ms = jiffies_to_msecs(cm->fullbatt_vchk_jiffies_at in cm_setup_timer()
1081 cm->fullbatt_vchk_jiffies_at) || in cm_setup_timer()
1083 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in cm_setup_timer()
1090 if (!is_polling_required(cm) && !cm->emergency_stop) in cm_setup_timer()
1093 if (cm->desc->polling_interval_ms == 0) in cm_setup_timer()
1095 CM_MIN_VALID(wakeup_ms, cm->desc->polling_interval_ms); in cm_setup_timer()
1150 try_charger_enable(cable->cm, cable->attached); in charger_extcon_work()
1177 if (cable->attached && is_polling_required(cable->cm)) { in charger_extcon_notifier()
1198 static int charger_extcon_init(struct charger_manager *cm, in charger_extcon_init() argument
1231 static int charger_manager_register_extcon(struct charger_manager *cm) in charger_manager_register_extcon() argument
1233 struct charger_desc *desc = cm->desc; in charger_manager_register_extcon()
1242 charger->consumer = regulator_get(cm->dev, in charger_manager_register_extcon()
1245 dev_err(cm->dev, "Cannot find charger(%s)\n", in charger_manager_register_extcon()
1249 charger->cm = cm; in charger_manager_register_extcon()
1254 ret = charger_extcon_init(cm, cable); in charger_manager_register_extcon()
1256 dev_err(cm->dev, "Cannot initialize charger(%s)\n", in charger_manager_register_extcon()
1261 cable->cm = cm; in charger_manager_register_extcon()
1308 struct charger_manager *cm = charger->cm; in charger_externally_control_store() local
1309 struct charger_desc *desc = cm->desc; in charger_externally_control_store()
1339 if (cm->charger_enabled) { in charger_externally_control_store()
1340 try_charger_enable(charger->cm, false); in charger_externally_control_store()
1342 try_charger_enable(charger->cm, true); in charger_externally_control_store()
1347 dev_warn(cm->dev, in charger_externally_control_store()
1368 static int charger_manager_register_sysfs(struct charger_manager *cm) in charger_manager_register_sysfs() argument
1370 struct charger_desc *desc = cm->desc; in charger_manager_register_sysfs()
1383 str = devm_kzalloc(cm->dev, in charger_manager_register_sysfs()
1421 dev_info(cm->dev, "'%s' regulator's externally_control is %d\n", in charger_manager_register_sysfs()
1424 ret = sysfs_create_group(&cm->charger_psy->dev.kobj, in charger_manager_register_sysfs()
1427 dev_err(cm->dev, "Cannot create sysfs entry of %s regulator\n", in charger_manager_register_sysfs()
1435 …dev_err(cm->dev, "Cannot register regulator because charger-manager must need at least one charger… in charger_manager_register_sysfs()
1444 static int cm_init_thermal_data(struct charger_manager *cm, in cm_init_thermal_data() argument
1447 struct charger_desc *desc = cm->desc; in cm_init_thermal_data()
1456 cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = in cm_init_thermal_data()
1458 cm->charger_psy_desc.num_properties++; in cm_init_thermal_data()
1459 cm->desc->measure_battery_temp = true; in cm_init_thermal_data()
1463 cm->tzd_batt = in cm_init_thermal_data()
1465 if (IS_ERR(cm->tzd_batt)) in cm_init_thermal_data()
1466 return PTR_ERR(cm->tzd_batt); in cm_init_thermal_data()
1469 cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = in cm_init_thermal_data()
1471 cm->charger_psy_desc.num_properties++; in cm_init_thermal_data()
1472 cm->desc->measure_battery_temp = true; in cm_init_thermal_data()
1476 if (cm->desc->measure_battery_temp) { in cm_init_thermal_data()
1626 struct charger_manager *cm; in charger_manager_probe() local
1638 cm = devm_kzalloc(&pdev->dev, in charger_manager_probe()
1640 if (!cm) in charger_manager_probe()
1644 cm->dev = &pdev->dev; in charger_manager_probe()
1645 cm->desc = desc; in charger_manager_probe()
1646 psy_cfg.drv_data = cm; in charger_manager_probe()
1650 cm_timer = devm_kzalloc(cm->dev, sizeof(*cm_timer), GFP_KERNEL); in charger_manager_probe()
1718 platform_set_drvdata(pdev, cm); in charger_manager_probe()
1720 memcpy(&cm->charger_psy_desc, &psy_default, sizeof(psy_default)); in charger_manager_probe()
1723 strncpy(cm->psy_name_buf, psy_default.name, PSY_NAME_MAX); in charger_manager_probe()
1725 strncpy(cm->psy_name_buf, desc->psy_name, PSY_NAME_MAX); in charger_manager_probe()
1726 cm->charger_psy_desc.name = cm->psy_name_buf; in charger_manager_probe()
1729 cm->charger_psy_desc.properties = devm_kzalloc(&pdev->dev, in charger_manager_probe()
1733 if (!cm->charger_psy_desc.properties) in charger_manager_probe()
1736 memcpy(cm->charger_psy_desc.properties, default_charger_props, in charger_manager_probe()
1739 cm->charger_psy_desc.num_properties = psy_default.num_properties; in charger_manager_probe()
1750 cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = in charger_manager_probe()
1752 cm->charger_psy_desc.num_properties++; in charger_manager_probe()
1757 cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = in charger_manager_probe()
1759 cm->charger_psy_desc.num_properties++; in charger_manager_probe()
1762 ret = cm_init_thermal_data(cm, fuel_gauge); in charger_manager_probe()
1765 cm->desc->measure_battery_temp = false; in charger_manager_probe()
1769 INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk); in charger_manager_probe()
1771 cm->charger_psy = power_supply_register(NULL, &cm->charger_psy_desc, in charger_manager_probe()
1773 if (IS_ERR(cm->charger_psy)) { in charger_manager_probe()
1775 cm->charger_psy_desc.name); in charger_manager_probe()
1776 return PTR_ERR(cm->charger_psy); in charger_manager_probe()
1780 ret = charger_manager_register_extcon(cm); in charger_manager_probe()
1787 ret = charger_manager_register_sysfs(cm); in charger_manager_probe()
1796 list_add(&cm->entry, &cm_list); in charger_manager_probe()
1822 sysfs_remove_group(&cm->charger_psy->dev.kobj, in charger_manager_probe()
1840 power_supply_unregister(cm->charger_psy); in charger_manager_probe()
1847 struct charger_manager *cm = platform_get_drvdata(pdev); in charger_manager_remove() local
1848 struct charger_desc *desc = cm->desc; in charger_manager_remove()
1854 list_del(&cm->entry); in charger_manager_remove()
1872 power_supply_unregister(cm->charger_psy); in charger_manager_remove()
1874 try_charger_enable(cm, false); in charger_manager_remove()
1899 struct charger_manager *cm; in cm_need_to_awake() local
1905 list_for_each_entry(cm, &cm_list, entry) { in cm_need_to_awake()
1906 if (is_charging(cm)) { in cm_need_to_awake()
1918 struct charger_manager *cm = dev_get_drvdata(dev); in cm_suspend_prepare() local
1931 cancel_delayed_work(&cm->fullbatt_vchk_work); in cm_suspend_prepare()
1939 struct charger_manager *cm = dev_get_drvdata(dev); in cm_suspend_complete() local
1954 _cm_monitor(cm); in cm_suspend_complete()
1957 if (cm->fullbatt_vchk_jiffies_at) { in cm_suspend_complete()
1961 if (time_after_eq(now, cm->fullbatt_vchk_jiffies_at)) { in cm_suspend_complete()
1963 - (long)(cm->fullbatt_vchk_jiffies_at)); in cm_suspend_complete()
1978 queue_delayed_work(cm_wq, &cm->fullbatt_vchk_work, in cm_suspend_complete()
1981 device_set_wakeup_capable(cm->dev, false); in cm_suspend_complete()
2024 static bool find_power_supply(struct charger_manager *cm, in find_power_supply() argument
2030 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in find_power_supply()
2031 if (!strcmp(psy->desc->name, cm->desc->psy_charger_stat[i])) { in find_power_supply()
2049 struct charger_manager *cm; in cm_notify_event() local
2056 list_for_each_entry(cm, &cm_list, entry) { in cm_notify_event()
2057 found_power_supply = find_power_supply(cm, psy); in cm_notify_event()
2068 fullbatt_handler(cm); in cm_notify_event()
2071 battout_handler(cm); in cm_notify_event()
2075 misc_event_handler(cm, type); in cm_notify_event()
2079 uevent_notify(cm, msg ? msg : default_event_names[type]); in cm_notify_event()
2082 dev_err(cm->dev, "%s: type not specified\n", __func__); in cm_notify_event()