• Home
  • Raw
  • Download

Lines Matching refs:cm

97 static bool is_batt_present(struct charger_manager *cm)  in is_batt_present()  argument
104 switch (cm->desc->battery_present) { in is_batt_present()
111 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()
151 static bool is_ext_pwr_online(struct charger_manager *cm) in is_ext_pwr_online() argument
159 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_ext_pwr_online()
160 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); in is_ext_pwr_online()
162 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_ext_pwr_online()
163 cm->desc->psy_charger_stat[i]); in is_ext_pwr_online()
185 static int get_batt_uV(struct charger_manager *cm, int *uV) in get_batt_uV() argument
191 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in get_batt_uV()
208 static bool is_charging(struct charger_manager *cm) in is_charging() argument
216 if (!is_batt_present(cm)) in is_charging()
220 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_charging()
222 if (cm->emergency_stop) in is_charging()
224 if (!cm->charger_enabled) in is_charging()
227 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); in is_charging()
229 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_charging()
230 cm->desc->psy_charger_stat[i]); in is_charging()
237 dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", in is_charging()
238 cm->desc->psy_charger_stat[i]); in is_charging()
250 dev_warn(cm->dev, "Cannot read STATUS value from %s\n", in is_charging()
251 cm->desc->psy_charger_stat[i]); in is_charging()
271 static bool is_full_charged(struct charger_manager *cm) in is_full_charged() argument
273 struct charger_desc *desc = cm->desc; in is_full_charged()
280 if (!is_batt_present(cm)) in is_full_charged()
283 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in is_full_charged()
299 ret = get_batt_uV(cm, &uV); in is_full_charged()
321 static bool is_polling_required(struct charger_manager *cm) in is_polling_required() argument
323 switch (cm->desc->polling_mode) { in is_polling_required()
329 return is_ext_pwr_online(cm); in is_polling_required()
331 return is_charging(cm); in is_polling_required()
333 dev_warn(cm->dev, "Incorrect polling_mode (%d)\n", in is_polling_required()
334 cm->desc->polling_mode); in is_polling_required()
350 static int try_charger_enable(struct charger_manager *cm, bool enable) in try_charger_enable() argument
353 struct charger_desc *desc = cm->desc; in try_charger_enable()
356 if (enable == cm->charger_enabled) in try_charger_enable()
360 if (cm->emergency_stop) in try_charger_enable()
367 cm->charging_start_time = ktime_to_ms(ktime_get()); in try_charger_enable()
368 cm->charging_end_time = 0; in try_charger_enable()
376 dev_warn(cm->dev, "Cannot enable %s regulator\n", in try_charger_enable()
385 cm->charging_start_time = 0; in try_charger_enable()
386 cm->charging_end_time = ktime_to_ms(ktime_get()); in try_charger_enable()
394 dev_warn(cm->dev, "Cannot disable %s regulator\n", in try_charger_enable()
408 dev_warn(cm->dev, "Disable regulator(%s) forcibly\n", in try_charger_enable()
415 cm->charger_enabled = enable; in try_charger_enable()
426 static int try_charger_restart(struct charger_manager *cm) in try_charger_restart() argument
430 if (cm->emergency_stop) in try_charger_restart()
433 err = try_charger_enable(cm, false); in try_charger_restart()
437 return try_charger_enable(cm, true); in try_charger_restart()
452 static void uevent_notify(struct charger_manager *cm, const char *event) in uevent_notify() argument
478 kobject_uevent(&cm->dev->kobj, KOBJ_CHANGE); in uevent_notify()
490 kobject_uevent(&cm->dev->kobj, KOBJ_CHANGE); in uevent_notify()
492 dev_info(cm->dev, "%s\n", event); in uevent_notify()
507 struct charger_manager *cm = container_of(dwork, in fullbatt_vchk() local
509 struct charger_desc *desc = cm->desc; in fullbatt_vchk()
513 cm->fullbatt_vchk_jiffies_at = 0; in fullbatt_vchk()
518 err = get_batt_uV(cm, &batt_uV); in fullbatt_vchk()
520 dev_err(cm->dev, "%s: get_batt_uV error(%d)\n", __func__, err); in fullbatt_vchk()
528 dev_info(cm->dev, "VBATT dropped %duV after full-batt\n", diff); in fullbatt_vchk()
531 try_charger_restart(cm); in fullbatt_vchk()
532 uevent_notify(cm, "Recharging"); in fullbatt_vchk()
546 static int check_charging_duration(struct charger_manager *cm) in check_charging_duration() argument
548 struct charger_desc *desc = cm->desc; in check_charging_duration()
557 if (cm->charger_enabled) { in check_charging_duration()
558 duration = curr - cm->charging_start_time; in check_charging_duration()
561 dev_info(cm->dev, "Charging duration exceed %ums\n", in check_charging_duration()
563 uevent_notify(cm, "Discharging"); in check_charging_duration()
564 try_charger_enable(cm, false); in check_charging_duration()
567 } else if (is_ext_pwr_online(cm) && !cm->charger_enabled) { in check_charging_duration()
568 duration = curr - cm->charging_end_time; in check_charging_duration()
571 is_ext_pwr_online(cm)) { in check_charging_duration()
572 dev_info(cm->dev, "Discharging duration exceed %ums\n", in check_charging_duration()
574 uevent_notify(cm, "Recharging"); in check_charging_duration()
575 try_charger_enable(cm, true); in check_charging_duration()
583 static int cm_get_battery_temperature_by_psy(struct charger_manager *cm, in cm_get_battery_temperature_by_psy() argument
588 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in cm_get_battery_temperature_by_psy()
597 static int cm_get_battery_temperature(struct charger_manager *cm, in cm_get_battery_temperature() argument
602 if (!cm->desc->measure_battery_temp) in cm_get_battery_temperature()
606 if (cm->tzd_batt) { in cm_get_battery_temperature()
607 ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp); in cm_get_battery_temperature()
615 ret = cm_get_battery_temperature_by_psy(cm, temp); in cm_get_battery_temperature()
621 static int cm_check_thermal_status(struct charger_manager *cm) in cm_check_thermal_status() argument
623 struct charger_desc *desc = cm->desc; in cm_check_thermal_status()
627 ret = cm_get_battery_temperature(cm, &temp); in cm_check_thermal_status()
634 dev_err(cm->dev, "Failed to get battery temperature\n"); in cm_check_thermal_status()
641 if (cm->emergency_stop) { in cm_check_thermal_status()
661 static bool _cm_monitor(struct charger_manager *cm) in _cm_monitor() argument
665 temp_alrt = cm_check_thermal_status(cm); in _cm_monitor()
668 if (temp_alrt && cm->emergency_stop) in _cm_monitor()
676 cm->emergency_stop = temp_alrt; in _cm_monitor()
677 if (!try_charger_enable(cm, false)) in _cm_monitor()
678 uevent_notify(cm, default_event_names[temp_alrt]); in _cm_monitor()
684 } else if (!cm->emergency_stop && check_charging_duration(cm)) { in _cm_monitor()
685 dev_dbg(cm->dev, in _cm_monitor()
692 } else if (!cm->emergency_stop && is_ext_pwr_online(cm) && in _cm_monitor()
693 !cm->charger_enabled) { in _cm_monitor()
694 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in _cm_monitor()
700 } else if (!cm->emergency_stop && is_full_charged(cm) && in _cm_monitor()
701 cm->charger_enabled) { in _cm_monitor()
702 dev_info(cm->dev, "EVENT_HANDLE: Battery Fully Charged\n"); in _cm_monitor()
703 uevent_notify(cm, default_event_names[CM_EVENT_BATT_FULL]); in _cm_monitor()
705 try_charger_enable(cm, false); in _cm_monitor()
707 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in _cm_monitor()
709 cm->emergency_stop = 0; in _cm_monitor()
710 if (is_ext_pwr_online(cm)) { in _cm_monitor()
711 if (!try_charger_enable(cm, true)) in _cm_monitor()
712 uevent_notify(cm, "CHARGING"); in _cm_monitor()
728 struct charger_manager *cm; in cm_monitor() local
732 list_for_each_entry(cm, &cm_list, entry) { in cm_monitor()
733 if (_cm_monitor(cm)) in cm_monitor()
749 struct charger_manager *cm; in _setup_polling() local
755 list_for_each_entry(cm, &cm_list, entry) { in _setup_polling()
756 if (is_polling_required(cm) && cm->desc->polling_interval_ms) { in _setup_polling()
759 if (min > cm->desc->polling_interval_ms) in _setup_polling()
760 min = cm->desc->polling_interval_ms; in _setup_polling()
813 static void fullbatt_handler(struct charger_manager *cm) in fullbatt_handler() argument
815 struct charger_desc *desc = cm->desc; in fullbatt_handler()
821 device_set_wakeup_capable(cm->dev, true); in fullbatt_handler()
823 mod_delayed_work(cm_wq, &cm->fullbatt_vchk_work, in fullbatt_handler()
825 cm->fullbatt_vchk_jiffies_at = jiffies + msecs_to_jiffies( in fullbatt_handler()
828 if (cm->fullbatt_vchk_jiffies_at == 0) in fullbatt_handler()
829 cm->fullbatt_vchk_jiffies_at = 1; in fullbatt_handler()
832 dev_info(cm->dev, "EVENT_HANDLE: Battery Fully Charged\n"); in fullbatt_handler()
833 uevent_notify(cm, default_event_names[CM_EVENT_BATT_FULL]); in fullbatt_handler()
840 static void battout_handler(struct charger_manager *cm) in battout_handler() argument
843 device_set_wakeup_capable(cm->dev, true); in battout_handler()
845 if (!is_batt_present(cm)) { in battout_handler()
846 dev_emerg(cm->dev, "Battery Pulled Out!\n"); in battout_handler()
847 uevent_notify(cm, default_event_names[CM_EVENT_BATT_OUT]); in battout_handler()
849 uevent_notify(cm, "Battery Reinserted?"); in battout_handler()
858 static void misc_event_handler(struct charger_manager *cm, in misc_event_handler() argument
862 device_set_wakeup_capable(cm->dev, true); in misc_event_handler()
864 if (is_polling_required(cm) && cm->desc->polling_interval_ms) in misc_event_handler()
866 uevent_notify(cm, default_event_names[type]); in misc_event_handler()
873 struct charger_manager *cm = container_of(psy, in charger_get_property() local
875 struct charger_desc *desc = cm->desc; in charger_get_property()
882 if (is_charging(cm)) in charger_get_property()
884 else if (is_ext_pwr_online(cm)) in charger_get_property()
890 if (cm->emergency_stop > 0) in charger_get_property()
892 else if (cm->emergency_stop < 0) in charger_get_property()
898 if (is_batt_present(cm)) in charger_get_property()
904 ret = get_batt_uV(cm, &val->intval); in charger_get_property()
907 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
917 return cm_get_battery_temperature(cm, &val->intval); in charger_get_property()
919 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
925 if (!is_batt_present(cm)) { in charger_get_property()
944 if (is_charging(cm)) in charger_get_property()
951 ret = get_batt_uV(cm, &uV); in charger_get_property()
959 !is_charging(cm)) { in charger_get_property()
966 if (is_ext_pwr_online(cm)) in charger_get_property()
972 if (is_full_charged(cm)) in charger_get_property()
979 if (is_charging(cm)) { in charger_get_property()
981 cm->desc->psy_fuel_gauge); in charger_get_property()
1048 struct charger_manager *cm; in cm_setup_timer() local
1054 list_for_each_entry(cm, &cm_list, entry) { in cm_setup_timer()
1058 if (cm->fullbatt_vchk_jiffies_at) { in cm_setup_timer()
1059 fbchk_ms = jiffies_to_msecs(cm->fullbatt_vchk_jiffies_at in cm_setup_timer()
1062 cm->fullbatt_vchk_jiffies_at) || in cm_setup_timer()
1064 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in cm_setup_timer()
1071 if (!is_polling_required(cm) && !cm->emergency_stop) in cm_setup_timer()
1073 if (cm->desc->polling_interval_ms == 0) in cm_setup_timer()
1075 CM_MIN_VALID(wakeup_ms, cm->desc->polling_interval_ms); in cm_setup_timer()
1128 static void _cm_fbchk_in_suspend(struct charger_manager *cm) in _cm_fbchk_in_suspend() argument
1132 if (!cm->fullbatt_vchk_jiffies_at) in _cm_fbchk_in_suspend()
1141 if (time_after_eq(jiffy_now, cm->fullbatt_vchk_jiffies_at)) in _cm_fbchk_in_suspend()
1142 fullbatt_vchk(&cm->fullbatt_vchk_work.work); in _cm_fbchk_in_suspend()
1153 struct charger_manager *cm; in cm_suspend_again() local
1165 list_for_each_entry(cm, &cm_list, entry) { in cm_suspend_again()
1166 _cm_fbchk_in_suspend(cm); in cm_suspend_again()
1168 if (cm->status_save_ext_pwr_inserted != is_ext_pwr_online(cm) || in cm_suspend_again()
1169 cm->status_save_batt != is_batt_present(cm)) { in cm_suspend_again()
1255 try_charger_enable(cable->cm, cable->attached); in charger_extcon_work()
1282 if (cable->attached && is_polling_required(cable->cm)) { in charger_extcon_notifier()
1303 static int charger_extcon_init(struct charger_manager *cm, in charger_extcon_init() argument
1336 static int charger_manager_register_extcon(struct charger_manager *cm) in charger_manager_register_extcon() argument
1338 struct charger_desc *desc = cm->desc; in charger_manager_register_extcon()
1347 charger->consumer = regulator_get(cm->dev, in charger_manager_register_extcon()
1350 dev_err(cm->dev, "Cannot find charger(%s)\n", in charger_manager_register_extcon()
1354 charger->cm = cm; in charger_manager_register_extcon()
1359 ret = charger_extcon_init(cm, cable); in charger_manager_register_extcon()
1361 dev_err(cm->dev, "Cannot initialize charger(%s)\n", in charger_manager_register_extcon()
1366 cable->cm = cm; in charger_manager_register_extcon()
1413 struct charger_manager *cm = charger->cm; in charger_externally_control_store() local
1414 struct charger_desc *desc = cm->desc; in charger_externally_control_store()
1444 if (cm->charger_enabled) { in charger_externally_control_store()
1445 try_charger_enable(charger->cm, false); in charger_externally_control_store()
1447 try_charger_enable(charger->cm, true); in charger_externally_control_store()
1452 dev_warn(cm->dev, in charger_externally_control_store()
1473 static int charger_manager_register_sysfs(struct charger_manager *cm) in charger_manager_register_sysfs() argument
1475 struct charger_desc *desc = cm->desc; in charger_manager_register_sysfs()
1488 str = devm_kzalloc(cm->dev, in charger_manager_register_sysfs()
1526 dev_info(cm->dev, "'%s' regulator's externally_control is %d\n", in charger_manager_register_sysfs()
1529 ret = sysfs_create_group(&cm->charger_psy.dev->kobj, in charger_manager_register_sysfs()
1532 dev_err(cm->dev, "Cannot create sysfs entry of %s regulator\n", in charger_manager_register_sysfs()
1540 …dev_err(cm->dev, "Cannot register regulator because charger-manager must need at least one charger… in charger_manager_register_sysfs()
1549 static int cm_init_thermal_data(struct charger_manager *cm, in cm_init_thermal_data() argument
1552 struct charger_desc *desc = cm->desc; in cm_init_thermal_data()
1561 cm->charger_psy.properties[cm->charger_psy.num_properties] = in cm_init_thermal_data()
1563 cm->charger_psy.num_properties++; in cm_init_thermal_data()
1564 cm->desc->measure_battery_temp = true; in cm_init_thermal_data()
1568 cm->tzd_batt = in cm_init_thermal_data()
1570 if (IS_ERR(cm->tzd_batt)) in cm_init_thermal_data()
1571 return PTR_ERR(cm->tzd_batt); in cm_init_thermal_data()
1574 cm->charger_psy.properties[cm->charger_psy.num_properties] = in cm_init_thermal_data()
1576 cm->charger_psy.num_properties++; in cm_init_thermal_data()
1577 cm->desc->measure_battery_temp = true; in cm_init_thermal_data()
1581 if (cm->desc->measure_battery_temp) { in cm_init_thermal_data()
1725 struct charger_manager *cm; in charger_manager_probe() local
1746 cm = devm_kzalloc(&pdev->dev, in charger_manager_probe()
1748 if (!cm) in charger_manager_probe()
1752 cm->dev = &pdev->dev; in charger_manager_probe()
1753 cm->desc = desc; in charger_manager_probe()
1825 platform_set_drvdata(pdev, cm); in charger_manager_probe()
1827 memcpy(&cm->charger_psy, &psy_default, sizeof(psy_default)); in charger_manager_probe()
1830 strncpy(cm->psy_name_buf, psy_default.name, PSY_NAME_MAX); in charger_manager_probe()
1832 strncpy(cm->psy_name_buf, desc->psy_name, PSY_NAME_MAX); in charger_manager_probe()
1833 cm->charger_psy.name = cm->psy_name_buf; in charger_manager_probe()
1836 cm->charger_psy.properties = devm_kzalloc(&pdev->dev, in charger_manager_probe()
1840 if (!cm->charger_psy.properties) in charger_manager_probe()
1843 memcpy(cm->charger_psy.properties, default_charger_props, in charger_manager_probe()
1846 cm->charger_psy.num_properties = psy_default.num_properties; in charger_manager_probe()
1851 cm->charger_psy.properties[cm->charger_psy.num_properties] = in charger_manager_probe()
1853 cm->charger_psy.num_properties++; in charger_manager_probe()
1858 cm->charger_psy.properties[cm->charger_psy.num_properties] = in charger_manager_probe()
1860 cm->charger_psy.num_properties++; in charger_manager_probe()
1863 ret = cm_init_thermal_data(cm, fuel_gauge); in charger_manager_probe()
1866 cm->desc->measure_battery_temp = false; in charger_manager_probe()
1869 INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk); in charger_manager_probe()
1871 ret = power_supply_register(NULL, &cm->charger_psy); in charger_manager_probe()
1874 cm->charger_psy.name); in charger_manager_probe()
1879 ret = charger_manager_register_extcon(cm); in charger_manager_probe()
1886 ret = charger_manager_register_sysfs(cm); in charger_manager_probe()
1895 list_add(&cm->entry, &cm_list); in charger_manager_probe()
1921 sysfs_remove_group(&cm->charger_psy.dev->kobj, in charger_manager_probe()
1939 power_supply_unregister(&cm->charger_psy); in charger_manager_probe()
1946 struct charger_manager *cm = platform_get_drvdata(pdev); in charger_manager_remove() local
1947 struct charger_desc *desc = cm->desc; in charger_manager_remove()
1953 list_del(&cm->entry); in charger_manager_remove()
1971 power_supply_unregister(&cm->charger_psy); in charger_manager_remove()
1973 try_charger_enable(cm, false); in charger_manager_remove()
1998 struct charger_manager *cm = dev_get_drvdata(dev); in cm_suspend_prepare() local
2021 cancel_delayed_work(&cm->fullbatt_vchk_work); in cm_suspend_prepare()
2022 cm->status_save_ext_pwr_inserted = is_ext_pwr_online(cm); in cm_suspend_prepare()
2023 cm->status_save_batt = is_batt_present(cm); in cm_suspend_prepare()
2035 struct charger_manager *cm = dev_get_drvdata(dev); in cm_suspend_complete() local
2050 if (cm->fullbatt_vchk_jiffies_at) { in cm_suspend_complete()
2054 if (time_after_eq(now, cm->fullbatt_vchk_jiffies_at)) { in cm_suspend_complete()
2056 - (long)(cm->fullbatt_vchk_jiffies_at)); in cm_suspend_complete()
2073 queue_delayed_work(cm_wq, &cm->fullbatt_vchk_work, in cm_suspend_complete()
2076 device_set_wakeup_capable(cm->dev, false); in cm_suspend_complete()
2077 uevent_notify(cm, NULL); in cm_suspend_complete()
2121 static bool find_power_supply(struct charger_manager *cm, in find_power_supply() argument
2127 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in find_power_supply()
2128 if (!strcmp(psy->name, cm->desc->psy_charger_stat[i])) { in find_power_supply()
2146 struct charger_manager *cm; in cm_notify_event() local
2153 list_for_each_entry(cm, &cm_list, entry) { in cm_notify_event()
2154 found_power_supply = find_power_supply(cm, psy); in cm_notify_event()
2165 fullbatt_handler(cm); in cm_notify_event()
2168 battout_handler(cm); in cm_notify_event()
2172 misc_event_handler(cm, type); in cm_notify_event()
2176 uevent_notify(cm, msg ? msg : default_event_names[type]); in cm_notify_event()
2179 dev_err(cm->dev, "%s: type not specified\n", __func__); in cm_notify_event()