Lines Matching refs:cm
84 static bool is_batt_present(struct charger_manager *cm) in is_batt_present() argument
90 switch (cm->desc->battery_present) { in is_batt_present()
97 ret = cm->fuel_gauge->get_property(cm->fuel_gauge, in is_batt_present()
103 for (i = 0; cm->charger_stat[i]; i++) { in is_batt_present()
104 ret = cm->charger_stat[i]->get_property( in is_batt_present()
105 cm->charger_stat[i], in is_batt_present()
126 static bool is_ext_pwr_online(struct charger_manager *cm) in is_ext_pwr_online() argument
133 for (i = 0; cm->charger_stat[i]; i++) { in is_ext_pwr_online()
134 ret = cm->charger_stat[i]->get_property( in is_ext_pwr_online()
135 cm->charger_stat[i], in is_ext_pwr_online()
154 static int get_batt_uV(struct charger_manager *cm, int *uV) in get_batt_uV() argument
159 if (!cm->fuel_gauge) in get_batt_uV()
162 ret = cm->fuel_gauge->get_property(cm->fuel_gauge, in get_batt_uV()
175 static bool is_charging(struct charger_manager *cm) in is_charging() argument
182 if (!is_batt_present(cm)) in is_charging()
186 for (i = 0; cm->charger_stat[i]; i++) { in is_charging()
188 if (cm->emergency_stop) in is_charging()
190 if (!cm->charger_enabled) in is_charging()
194 ret = cm->charger_stat[i]->get_property( in is_charging()
195 cm->charger_stat[i], in is_charging()
198 dev_warn(cm->dev, "Cannot read ONLINE value from %s.\n", in is_charging()
199 cm->desc->psy_charger_stat[i]); in is_charging()
209 ret = cm->charger_stat[i]->get_property( in is_charging()
210 cm->charger_stat[i], in is_charging()
213 dev_warn(cm->dev, "Cannot read STATUS value from %s.\n", in is_charging()
214 cm->desc->psy_charger_stat[i]); in is_charging()
234 static bool is_full_charged(struct charger_manager *cm) in is_full_charged() argument
236 struct charger_desc *desc = cm->desc; in is_full_charged()
242 if (!is_batt_present(cm)) in is_full_charged()
245 if (cm->fuel_gauge && desc->fullbatt_full_capacity > 0) { in is_full_charged()
249 ret = cm->fuel_gauge->get_property(cm->fuel_gauge, in is_full_charged()
257 ret = get_batt_uV(cm, &uV); in is_full_charged()
263 if (cm->fuel_gauge && desc->fullbatt_soc > 0) { in is_full_charged()
266 ret = cm->fuel_gauge->get_property(cm->fuel_gauge, in is_full_charged()
279 static bool is_polling_required(struct charger_manager *cm) in is_polling_required() argument
281 switch (cm->desc->polling_mode) { in is_polling_required()
287 return is_ext_pwr_online(cm); in is_polling_required()
289 return is_charging(cm); in is_polling_required()
291 dev_warn(cm->dev, "Incorrect polling_mode (%d)\n", in is_polling_required()
292 cm->desc->polling_mode); in is_polling_required()
308 static int try_charger_enable(struct charger_manager *cm, bool enable) in try_charger_enable() argument
311 struct charger_desc *desc = cm->desc; in try_charger_enable()
314 if (enable == cm->charger_enabled) in try_charger_enable()
318 if (cm->emergency_stop) in try_charger_enable()
325 cm->charging_start_time = ktime_to_ms(ktime_get()); in try_charger_enable()
326 cm->charging_end_time = 0; in try_charger_enable()
334 dev_warn(cm->dev, in try_charger_enable()
344 cm->charging_start_time = 0; in try_charger_enable()
345 cm->charging_end_time = ktime_to_ms(ktime_get()); in try_charger_enable()
353 dev_warn(cm->dev, in try_charger_enable()
368 dev_warn(cm->dev, in try_charger_enable()
376 cm->charger_enabled = enable; in try_charger_enable()
387 static int try_charger_restart(struct charger_manager *cm) in try_charger_restart() argument
391 if (cm->emergency_stop) in try_charger_restart()
394 err = try_charger_enable(cm, false); in try_charger_restart()
398 return try_charger_enable(cm, true); in try_charger_restart()
413 static void uevent_notify(struct charger_manager *cm, const char *event) in uevent_notify() argument
439 kobject_uevent(&cm->dev->kobj, KOBJ_CHANGE); in uevent_notify()
451 kobject_uevent(&cm->dev->kobj, KOBJ_CHANGE); in uevent_notify()
453 dev_info(cm->dev, event); in uevent_notify()
468 struct charger_manager *cm = container_of(dwork, in fullbatt_vchk() local
470 struct charger_desc *desc = cm->desc; in fullbatt_vchk()
474 cm->fullbatt_vchk_jiffies_at = 0; in fullbatt_vchk()
479 err = get_batt_uV(cm, &batt_uV); in fullbatt_vchk()
481 dev_err(cm->dev, "%s: get_batt_uV error(%d).\n", __func__, err); in fullbatt_vchk()
489 dev_info(cm->dev, "VBATT dropped %duV after full-batt.\n", diff); in fullbatt_vchk()
492 try_charger_restart(cm); in fullbatt_vchk()
493 uevent_notify(cm, "Recharging"); in fullbatt_vchk()
507 static int check_charging_duration(struct charger_manager *cm) in check_charging_duration() argument
509 struct charger_desc *desc = cm->desc; in check_charging_duration()
518 if (cm->charger_enabled) { in check_charging_duration()
519 duration = curr - cm->charging_start_time; in check_charging_duration()
522 dev_info(cm->dev, "Charging duration exceed %lldms", in check_charging_duration()
524 uevent_notify(cm, "Discharging"); in check_charging_duration()
525 try_charger_enable(cm, false); in check_charging_duration()
528 } else if (is_ext_pwr_online(cm) && !cm->charger_enabled) { in check_charging_duration()
529 duration = curr - cm->charging_end_time; in check_charging_duration()
532 is_ext_pwr_online(cm)) { in check_charging_duration()
533 dev_info(cm->dev, "DisCharging duration exceed %lldms", in check_charging_duration()
535 uevent_notify(cm, "Recharing"); in check_charging_duration()
536 try_charger_enable(cm, true); in check_charging_duration()
551 static bool _cm_monitor(struct charger_manager *cm) in _cm_monitor() argument
553 struct charger_desc *desc = cm->desc; in _cm_monitor()
554 int temp = desc->temperature_out_of_range(&cm->last_temp_mC); in _cm_monitor()
556 dev_dbg(cm->dev, "monitoring (%2.2d.%3.3dC)\n", in _cm_monitor()
557 cm->last_temp_mC / 1000, cm->last_temp_mC % 1000); in _cm_monitor()
560 if (temp && cm->emergency_stop) in _cm_monitor()
568 cm->emergency_stop = temp; in _cm_monitor()
569 if (!try_charger_enable(cm, false)) { in _cm_monitor()
571 uevent_notify(cm, "OVERHEAT"); in _cm_monitor()
573 uevent_notify(cm, "COLD"); in _cm_monitor()
580 } else if (!cm->emergency_stop && check_charging_duration(cm)) { in _cm_monitor()
581 dev_dbg(cm->dev, in _cm_monitor()
588 } else if (!cm->emergency_stop && is_ext_pwr_online(cm) && in _cm_monitor()
589 !cm->charger_enabled) { in _cm_monitor()
590 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in _cm_monitor()
596 } else if (!cm->emergency_stop && is_full_charged(cm) && in _cm_monitor()
597 cm->charger_enabled) { in _cm_monitor()
598 dev_info(cm->dev, "EVENT_HANDLE: Battery Fully Charged.\n"); in _cm_monitor()
599 uevent_notify(cm, default_event_names[CM_EVENT_BATT_FULL]); in _cm_monitor()
601 try_charger_enable(cm, false); in _cm_monitor()
603 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in _cm_monitor()
605 cm->emergency_stop = 0; in _cm_monitor()
606 if (is_ext_pwr_online(cm)) { in _cm_monitor()
607 if (!try_charger_enable(cm, true)) in _cm_monitor()
608 uevent_notify(cm, "CHARGING"); in _cm_monitor()
624 struct charger_manager *cm; in cm_monitor() local
628 list_for_each_entry(cm, &cm_list, entry) { in cm_monitor()
629 if (_cm_monitor(cm)) in cm_monitor()
645 struct charger_manager *cm; in _setup_polling() local
651 list_for_each_entry(cm, &cm_list, entry) { in _setup_polling()
652 if (is_polling_required(cm) && cm->desc->polling_interval_ms) { in _setup_polling()
655 if (min > cm->desc->polling_interval_ms) in _setup_polling()
656 min = cm->desc->polling_interval_ms; in _setup_polling()
709 static void fullbatt_handler(struct charger_manager *cm) in fullbatt_handler() argument
711 struct charger_desc *desc = cm->desc; in fullbatt_handler()
717 device_set_wakeup_capable(cm->dev, true); in fullbatt_handler()
719 mod_delayed_work(cm_wq, &cm->fullbatt_vchk_work, in fullbatt_handler()
721 cm->fullbatt_vchk_jiffies_at = jiffies + msecs_to_jiffies( in fullbatt_handler()
724 if (cm->fullbatt_vchk_jiffies_at == 0) in fullbatt_handler()
725 cm->fullbatt_vchk_jiffies_at = 1; in fullbatt_handler()
728 dev_info(cm->dev, "EVENT_HANDLE: Battery Fully Charged.\n"); in fullbatt_handler()
729 uevent_notify(cm, default_event_names[CM_EVENT_BATT_FULL]); in fullbatt_handler()
736 static void battout_handler(struct charger_manager *cm) in battout_handler() argument
739 device_set_wakeup_capable(cm->dev, true); in battout_handler()
741 if (!is_batt_present(cm)) { in battout_handler()
742 dev_emerg(cm->dev, "Battery Pulled Out!\n"); in battout_handler()
743 uevent_notify(cm, default_event_names[CM_EVENT_BATT_OUT]); in battout_handler()
745 uevent_notify(cm, "Battery Reinserted?"); in battout_handler()
754 static void misc_event_handler(struct charger_manager *cm, in misc_event_handler() argument
758 device_set_wakeup_capable(cm->dev, true); in misc_event_handler()
760 if (is_polling_required(cm) && cm->desc->polling_interval_ms) in misc_event_handler()
762 uevent_notify(cm, default_event_names[type]); in misc_event_handler()
769 struct charger_manager *cm = container_of(psy, in charger_get_property() local
771 struct charger_desc *desc = cm->desc; in charger_get_property()
777 if (is_charging(cm)) in charger_get_property()
779 else if (is_ext_pwr_online(cm)) in charger_get_property()
785 if (cm->emergency_stop > 0) in charger_get_property()
787 else if (cm->emergency_stop < 0) in charger_get_property()
793 if (is_batt_present(cm)) in charger_get_property()
799 ret = get_batt_uV(cm, &val->intval); in charger_get_property()
802 ret = cm->fuel_gauge->get_property(cm->fuel_gauge, in charger_get_property()
807 if (cm->last_temp_mC == INT_MIN) in charger_get_property()
808 desc->temperature_out_of_range(&cm->last_temp_mC); in charger_get_property()
809 val->intval = cm->last_temp_mC / 100; in charger_get_property()
815 if (cm->last_temp_mC == INT_MIN) in charger_get_property()
816 desc->temperature_out_of_range(&cm->last_temp_mC); in charger_get_property()
817 val->intval = cm->last_temp_mC / 100; in charger_get_property()
822 if (!cm->fuel_gauge) { in charger_get_property()
827 if (!is_batt_present(cm)) { in charger_get_property()
833 ret = cm->fuel_gauge->get_property(cm->fuel_gauge, in charger_get_property()
846 if (is_charging(cm)) in charger_get_property()
853 ret = get_batt_uV(cm, &uV); in charger_get_property()
861 !is_charging(cm)) { in charger_get_property()
868 if (is_ext_pwr_online(cm)) in charger_get_property()
874 if (is_full_charged(cm)) in charger_get_property()
881 if (is_charging(cm)) { in charger_get_property()
882 ret = cm->fuel_gauge->get_property(cm->fuel_gauge, in charger_get_property()
942 struct charger_manager *cm; in cm_setup_timer() local
948 list_for_each_entry(cm, &cm_list, entry) { in cm_setup_timer()
952 if (cm->fullbatt_vchk_jiffies_at) { in cm_setup_timer()
953 fbchk_ms = jiffies_to_msecs(cm->fullbatt_vchk_jiffies_at in cm_setup_timer()
956 cm->fullbatt_vchk_jiffies_at) || in cm_setup_timer()
958 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in cm_setup_timer()
965 if (!is_polling_required(cm) && !cm->emergency_stop) in cm_setup_timer()
967 if (cm->desc->polling_interval_ms == 0) in cm_setup_timer()
969 CM_MIN_VALID(wakeup_ms, cm->desc->polling_interval_ms); in cm_setup_timer()
1023 static void _cm_fbchk_in_suspend(struct charger_manager *cm) in _cm_fbchk_in_suspend() argument
1027 if (!cm->fullbatt_vchk_jiffies_at) in _cm_fbchk_in_suspend()
1036 if (time_after_eq(jiffy_now, cm->fullbatt_vchk_jiffies_at)) in _cm_fbchk_in_suspend()
1037 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in _cm_fbchk_in_suspend()
1048 struct charger_manager *cm; in cm_suspend_again() local
1060 list_for_each_entry(cm, &cm_list, entry) { in cm_suspend_again()
1061 _cm_fbchk_in_suspend(cm); in cm_suspend_again()
1063 if (cm->status_save_ext_pwr_inserted != is_ext_pwr_online(cm) || in cm_suspend_again()
1064 cm->status_save_batt != is_batt_present(cm)) { in cm_suspend_again()
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
1232 static int charger_manager_register_extcon(struct charger_manager *cm) in charger_manager_register_extcon() argument
1234 struct charger_desc *desc = cm->desc; in charger_manager_register_extcon()
1243 charger->consumer = regulator_get(cm->dev, in charger_manager_register_extcon()
1246 dev_err(cm->dev, "Cannot find charger(%s)n", in charger_manager_register_extcon()
1251 charger->cm = cm; in charger_manager_register_extcon()
1256 ret = charger_extcon_init(cm, cable); in charger_manager_register_extcon()
1258 dev_err(cm->dev, "Cannot initialize charger(%s)n", in charger_manager_register_extcon()
1263 cable->cm = cm; in charger_manager_register_extcon()
1310 struct charger_manager *cm = charger->cm; in charger_externally_control_store() local
1311 struct charger_desc *desc = cm->desc; in charger_externally_control_store()
1341 if (cm->charger_enabled) { in charger_externally_control_store()
1342 try_charger_enable(charger->cm, false); in charger_externally_control_store()
1344 try_charger_enable(charger->cm, true); in charger_externally_control_store()
1349 dev_warn(cm->dev, in charger_externally_control_store()
1372 static int charger_manager_register_sysfs(struct charger_manager *cm) in charger_manager_register_sysfs() argument
1374 struct charger_desc *desc = cm->desc; in charger_manager_register_sysfs()
1389 dev_err(cm->dev, "Cannot allocate memory: %s\n", in charger_manager_register_sysfs()
1426 dev_info(cm->dev, "'%s' regulator's externally_control" in charger_manager_register_sysfs()
1430 ret = sysfs_create_group(&cm->charger_psy.dev->kobj, in charger_manager_register_sysfs()
1433 dev_err(cm->dev, "Cannot create sysfs entry" in charger_manager_register_sysfs()
1442 dev_err(cm->dev, "Cannot register regulator because " in charger_manager_register_sysfs()
1457 struct charger_manager *cm; in charger_manager_probe() local
1479 cm = kzalloc(sizeof(struct charger_manager), GFP_KERNEL); in charger_manager_probe()
1480 if (!cm) { in charger_manager_probe()
1487 cm->dev = &pdev->dev; in charger_manager_probe()
1488 cm->desc = kmemdup(desc, sizeof(struct charger_desc), GFP_KERNEL); in charger_manager_probe()
1489 if (!cm->desc) { in charger_manager_probe()
1494 cm->last_temp_mC = INT_MIN; /* denotes "unmeasured, yet" */ in charger_manager_probe()
1536 cm->charger_stat = kzalloc(sizeof(struct power_supply *) * (i + 1), in charger_manager_probe()
1538 if (!cm->charger_stat) { in charger_manager_probe()
1544 cm->charger_stat[i] = power_supply_get_by_name( in charger_manager_probe()
1546 if (!cm->charger_stat[i]) { in charger_manager_probe()
1555 cm->fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge); in charger_manager_probe()
1556 if (!cm->fuel_gauge) { in charger_manager_probe()
1585 platform_set_drvdata(pdev, cm); in charger_manager_probe()
1587 memcpy(&cm->charger_psy, &psy_default, sizeof(psy_default)); in charger_manager_probe()
1590 strncpy(cm->psy_name_buf, psy_default.name, PSY_NAME_MAX); in charger_manager_probe()
1592 strncpy(cm->psy_name_buf, desc->psy_name, PSY_NAME_MAX); in charger_manager_probe()
1593 cm->charger_psy.name = cm->psy_name_buf; in charger_manager_probe()
1596 cm->charger_psy.properties = kzalloc(sizeof(enum power_supply_property) in charger_manager_probe()
1600 if (!cm->charger_psy.properties) { in charger_manager_probe()
1605 memcpy(cm->charger_psy.properties, default_charger_props, in charger_manager_probe()
1608 cm->charger_psy.num_properties = psy_default.num_properties; in charger_manager_probe()
1611 if (!cm->fuel_gauge->get_property(cm->fuel_gauge, in charger_manager_probe()
1613 cm->charger_psy.properties[cm->charger_psy.num_properties] = in charger_manager_probe()
1615 cm->charger_psy.num_properties++; in charger_manager_probe()
1617 if (!cm->fuel_gauge->get_property(cm->fuel_gauge, in charger_manager_probe()
1620 cm->charger_psy.properties[cm->charger_psy.num_properties] = in charger_manager_probe()
1622 cm->charger_psy.num_properties++; in charger_manager_probe()
1626 cm->charger_psy.properties[cm->charger_psy.num_properties] = in charger_manager_probe()
1628 cm->charger_psy.num_properties++; in charger_manager_probe()
1630 cm->charger_psy.properties[cm->charger_psy.num_properties] = in charger_manager_probe()
1632 cm->charger_psy.num_properties++; in charger_manager_probe()
1635 INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk); in charger_manager_probe()
1637 ret = power_supply_register(NULL, &cm->charger_psy); in charger_manager_probe()
1640 " name \"%s\".\n", cm->charger_psy.name); in charger_manager_probe()
1645 ret = charger_manager_register_extcon(cm); in charger_manager_probe()
1652 ret = charger_manager_register_sysfs(cm); in charger_manager_probe()
1661 list_add(&cm->entry, &cm_list); in charger_manager_probe()
1680 sysfs_remove_group(&cm->charger_psy.dev->kobj, in charger_manager_probe()
1698 power_supply_unregister(&cm->charger_psy); in charger_manager_probe()
1700 kfree(cm->charger_psy.properties); in charger_manager_probe()
1702 kfree(cm->charger_stat); in charger_manager_probe()
1705 kfree(cm->desc); in charger_manager_probe()
1707 kfree(cm); in charger_manager_probe()
1714 struct charger_manager *cm = platform_get_drvdata(pdev); in charger_manager_remove() local
1715 struct charger_desc *desc = cm->desc; in charger_manager_remove()
1721 list_del(&cm->entry); in charger_manager_remove()
1739 power_supply_unregister(&cm->charger_psy); in charger_manager_remove()
1741 try_charger_enable(cm, false); in charger_manager_remove()
1743 kfree(cm->charger_psy.properties); in charger_manager_remove()
1744 kfree(cm->charger_stat); in charger_manager_remove()
1745 kfree(cm->desc); in charger_manager_remove()
1746 kfree(cm); in charger_manager_remove()
1771 struct charger_manager *cm = dev_get_drvdata(dev); in cm_suspend_prepare() local
1794 cancel_delayed_work(&cm->fullbatt_vchk_work); in cm_suspend_prepare()
1795 cm->status_save_ext_pwr_inserted = is_ext_pwr_online(cm); in cm_suspend_prepare()
1796 cm->status_save_batt = is_batt_present(cm); in cm_suspend_prepare()
1808 struct charger_manager *cm = dev_get_drvdata(dev); in cm_suspend_complete() local
1823 if (cm->fullbatt_vchk_jiffies_at) { in cm_suspend_complete()
1827 if (time_after_eq(now, cm->fullbatt_vchk_jiffies_at)) { in cm_suspend_complete()
1829 - (long)(cm->fullbatt_vchk_jiffies_at)); in cm_suspend_complete()
1846 queue_delayed_work(cm_wq, &cm->fullbatt_vchk_work, in cm_suspend_complete()
1849 device_set_wakeup_capable(cm->dev, false); in cm_suspend_complete()
1850 uevent_notify(cm, NULL); in cm_suspend_complete()
1893 static bool find_power_supply(struct charger_manager *cm, in find_power_supply() argument
1899 for (i = 0; cm->charger_stat[i]; i++) { in find_power_supply()
1900 if (psy == cm->charger_stat[i]) { in find_power_supply()
1918 struct charger_manager *cm; in cm_notify_event() local
1925 list_for_each_entry(cm, &cm_list, entry) { in cm_notify_event()
1926 found_power_supply = find_power_supply(cm, psy); in cm_notify_event()
1937 fullbatt_handler(cm); in cm_notify_event()
1940 battout_handler(cm); in cm_notify_event()
1944 misc_event_handler(cm, type); in cm_notify_event()
1948 uevent_notify(cm, msg ? msg : default_event_names[type]); in cm_notify_event()
1951 dev_err(cm->dev, "%s type not specified.\n", __func__); in cm_notify_event()