Lines Matching refs:cm

95 static bool is_batt_present(struct charger_manager *cm)  in is_batt_present()  argument
102 switch (cm->desc->battery_present) { in is_batt_present()
109 psy = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in is_batt_present()
120 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_batt_present()
122 cm->desc->psy_charger_stat[i]); in is_batt_present()
124 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_batt_present()
125 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()
187 static int get_batt_uV(struct charger_manager *cm, int *uV) in get_batt_uV() argument
193 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in get_batt_uV()
211 static bool is_charging(struct charger_manager *cm) in is_charging() argument
219 if (!is_batt_present(cm)) in is_charging()
223 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { in is_charging()
225 if (cm->emergency_stop) in is_charging()
227 if (!cm->charger_enabled) in is_charging()
230 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]); in is_charging()
232 dev_err(cm->dev, "Cannot find power supply \"%s\"\n", in is_charging()
233 cm->desc->psy_charger_stat[i]); in is_charging()
241 dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", in is_charging()
242 cm->desc->psy_charger_stat[i]); in is_charging()
259 dev_warn(cm->dev, "Cannot read STATUS value from %s\n", in is_charging()
260 cm->desc->psy_charger_stat[i]); in is_charging()
280 static bool is_full_charged(struct charger_manager *cm) in is_full_charged() argument
282 struct charger_desc *desc = cm->desc; in is_full_charged()
290 if (!is_batt_present(cm)) in is_full_charged()
293 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()
302 if (cm->battery_status == POWER_SUPPLY_STATUS_FULL in is_full_charged()
343 static bool is_polling_required(struct charger_manager *cm) in is_polling_required() argument
345 switch (cm->desc->polling_mode) { in is_polling_required()
351 return is_ext_pwr_online(cm); in is_polling_required()
353 return is_charging(cm); in is_polling_required()
355 dev_warn(cm->dev, "Incorrect polling_mode (%d)\n", in is_polling_required()
356 cm->desc->polling_mode); in is_polling_required()
372 static int try_charger_enable(struct charger_manager *cm, bool enable) in try_charger_enable() argument
375 struct charger_desc *desc = cm->desc; in try_charger_enable()
378 if (enable == cm->charger_enabled) in try_charger_enable()
382 if (cm->emergency_stop) in try_charger_enable()
389 cm->charging_start_time = ktime_to_ms(ktime_get()); in try_charger_enable()
390 cm->charging_end_time = 0; in try_charger_enable()
398 dev_warn(cm->dev, "Cannot enable %s regulator\n", in try_charger_enable()
407 cm->charging_start_time = 0; in try_charger_enable()
408 cm->charging_end_time = ktime_to_ms(ktime_get()); in try_charger_enable()
416 dev_warn(cm->dev, "Cannot disable %s regulator\n", in try_charger_enable()
430 dev_warn(cm->dev, "Disable regulator(%s) forcibly\n", in try_charger_enable()
437 cm->charger_enabled = enable; in try_charger_enable()
452 static int check_charging_duration(struct charger_manager *cm) in check_charging_duration() argument
454 struct charger_desc *desc = cm->desc; in check_charging_duration()
463 if (cm->charger_enabled) { in check_charging_duration()
464 duration = curr - cm->charging_start_time; in check_charging_duration()
467 dev_info(cm->dev, "Charging duration exceed %ums\n", in check_charging_duration()
471 } else if (cm->battery_status == POWER_SUPPLY_STATUS_NOT_CHARGING) { in check_charging_duration()
472 duration = curr - cm->charging_end_time; in check_charging_duration()
475 dev_info(cm->dev, "Discharging duration exceed %ums\n", in check_charging_duration()
484 static int cm_get_battery_temperature_by_psy(struct charger_manager *cm, in cm_get_battery_temperature_by_psy() argument
490 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in cm_get_battery_temperature_by_psy()
502 static int cm_get_battery_temperature(struct charger_manager *cm, in cm_get_battery_temperature() argument
507 if (!cm->desc->measure_battery_temp) in cm_get_battery_temperature()
511 if (cm->tzd_batt) { in cm_get_battery_temperature()
512 ret = thermal_zone_get_temp(cm->tzd_batt, temp); in cm_get_battery_temperature()
520 ret = cm_get_battery_temperature_by_psy(cm, temp); in cm_get_battery_temperature()
526 static int cm_check_thermal_status(struct charger_manager *cm) in cm_check_thermal_status() argument
528 struct charger_desc *desc = cm->desc; in cm_check_thermal_status()
532 ret = cm_get_battery_temperature(cm, &temp); in cm_check_thermal_status()
539 dev_err(cm->dev, "Failed to get battery temperature\n"); in cm_check_thermal_status()
546 if (cm->emergency_stop) { in cm_check_thermal_status()
558 cm->emergency_stop = ret; in cm_check_thermal_status()
567 static int cm_get_target_status(struct charger_manager *cm) in cm_get_target_status() argument
569 if (!is_ext_pwr_online(cm)) in cm_get_target_status()
572 if (cm_check_thermal_status(cm)) { in cm_get_target_status()
574 if (check_charging_duration(cm)) in cm_get_target_status()
579 switch (cm->battery_status) { in cm_get_target_status()
582 if (check_charging_duration(cm)) in cm_get_target_status()
586 if (is_full_charged(cm)) in cm_get_target_status()
605 static bool _cm_monitor(struct charger_manager *cm) in _cm_monitor() argument
609 target = cm_get_target_status(cm); in _cm_monitor()
611 try_charger_enable(cm, (target == POWER_SUPPLY_STATUS_CHARGING)); in _cm_monitor()
613 if (cm->battery_status != target) { in _cm_monitor()
614 cm->battery_status = target; in _cm_monitor()
615 power_supply_changed(cm->charger_psy); in _cm_monitor()
618 return (cm->battery_status == POWER_SUPPLY_STATUS_NOT_CHARGING); in _cm_monitor()
630 struct charger_manager *cm; in cm_monitor() local
634 list_for_each_entry(cm, &cm_list, entry) { in cm_monitor()
635 if (_cm_monitor(cm)) in cm_monitor()
651 struct charger_manager *cm; in _setup_polling() local
657 list_for_each_entry(cm, &cm_list, entry) { in _setup_polling()
658 if (is_polling_required(cm) && cm->desc->polling_interval_ms) { in _setup_polling()
661 if (min > cm->desc->polling_interval_ms) in _setup_polling()
662 min = cm->desc->polling_interval_ms; in _setup_polling()
715 struct charger_manager *cm = power_supply_get_drvdata(psy); in charger_get_property() local
716 struct charger_desc *desc = cm->desc; in charger_get_property()
723 val->intval = cm->battery_status; in charger_get_property()
726 if (cm->emergency_stop == CM_BATT_OVERHEAT) in charger_get_property()
728 else if (cm->emergency_stop == CM_BATT_COLD) in charger_get_property()
734 if (is_batt_present(cm)) in charger_get_property()
740 ret = get_batt_uV(cm, &val->intval); in charger_get_property()
743 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
752 return cm_get_battery_temperature(cm, &val->intval); in charger_get_property()
754 if (!is_batt_present(cm)) { in charger_get_property()
760 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
779 if (is_charging(cm)) in charger_get_property()
786 ret = get_batt_uV(cm, &uV); in charger_get_property()
794 !is_charging(cm)) { in charger_get_property()
801 if (is_ext_pwr_online(cm)) in charger_get_property()
808 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); in charger_get_property()
862 struct charger_manager *cm; in cm_setup_timer() local
871 list_for_each_entry(cm, &cm_list, entry) { in cm_setup_timer()
873 if (!is_polling_required(cm) && !cm->emergency_stop) in cm_setup_timer()
876 if (cm->desc->polling_interval_ms == 0) in cm_setup_timer()
878 CM_MIN_VALID(wakeup_ms, cm->desc->polling_interval_ms); in cm_setup_timer()
973 static int charger_extcon_init(struct charger_manager *cm, in charger_extcon_init() argument
1007 ret = devm_extcon_register_notifier(cm->dev, cable->extcon_dev, in charger_extcon_init()
1028 static int charger_manager_register_extcon(struct charger_manager *cm) in charger_manager_register_extcon() argument
1030 struct charger_desc *desc = cm->desc; in charger_manager_register_extcon()
1040 charger->consumer = regulator_get(cm->dev, in charger_manager_register_extcon()
1043 dev_err(cm->dev, "Cannot find charger(%s)\n", in charger_manager_register_extcon()
1047 charger->cm = cm; in charger_manager_register_extcon()
1052 ret = charger_extcon_init(cm, cable); in charger_manager_register_extcon()
1054 dev_err(cm->dev, "Cannot initialize charger(%s)\n", in charger_manager_register_extcon()
1059 cable->cm = cm; in charger_manager_register_extcon()
1110 struct charger_manager *cm = charger->cm; in charger_externally_control_store() local
1111 struct charger_desc *desc = cm->desc; in charger_externally_control_store()
1141 if (cm->charger_enabled) { in charger_externally_control_store()
1142 try_charger_enable(charger->cm, false); in charger_externally_control_store()
1144 try_charger_enable(charger->cm, true); in charger_externally_control_store()
1149 dev_warn(cm->dev, in charger_externally_control_store()
1170 static int charger_manager_prepare_sysfs(struct charger_manager *cm) in charger_manager_prepare_sysfs() argument
1172 struct charger_desc *desc = cm->desc; in charger_manager_prepare_sysfs()
1182 name = devm_kasprintf(cm->dev, GFP_KERNEL, "charger.%d", i); in charger_manager_prepare_sysfs()
1218 dev_info(cm->dev, "'%s' regulator's externally_control is %d\n", in charger_manager_prepare_sysfs()
1223 …dev_err(cm->dev, "Cannot register regulator because charger-manager must need at least one charger… in charger_manager_prepare_sysfs()
1230 static int cm_init_thermal_data(struct charger_manager *cm, in cm_init_thermal_data() argument
1235 struct charger_desc *desc = cm->desc; in cm_init_thermal_data()
1246 cm->desc->measure_battery_temp = true; in cm_init_thermal_data()
1250 cm->tzd_batt = in cm_init_thermal_data()
1252 if (IS_ERR(cm->tzd_batt)) in cm_init_thermal_data()
1253 return PTR_ERR(cm->tzd_batt); in cm_init_thermal_data()
1258 cm->desc->measure_battery_temp = true; in cm_init_thermal_data()
1262 if (cm->desc->measure_battery_temp) { in cm_init_thermal_data()
1424 struct charger_manager *cm; in charger_manager_probe() local
1437 cm = devm_kzalloc(&pdev->dev, sizeof(*cm), GFP_KERNEL); in charger_manager_probe()
1438 if (!cm) in charger_manager_probe()
1442 cm->dev = &pdev->dev; in charger_manager_probe()
1443 cm->desc = desc; in charger_manager_probe()
1444 psy_cfg.drv_data = cm; in charger_manager_probe()
1448 cm_timer = devm_kzalloc(cm->dev, sizeof(*cm_timer), GFP_KERNEL); in charger_manager_probe()
1500 if (cm->desc->polling_mode != CM_POLL_DISABLE && in charger_manager_probe()
1514 platform_set_drvdata(pdev, cm); in charger_manager_probe()
1516 memcpy(&cm->charger_psy_desc, &psy_default, sizeof(psy_default)); in charger_manager_probe()
1519 strncpy(cm->psy_name_buf, psy_default.name, PSY_NAME_MAX); in charger_manager_probe()
1521 strncpy(cm->psy_name_buf, desc->psy_name, PSY_NAME_MAX); in charger_manager_probe()
1522 cm->charger_psy_desc.name = cm->psy_name_buf; in charger_manager_probe()
1564 ret = cm_init_thermal_data(cm, fuel_gauge, properties, &num_properties); in charger_manager_probe()
1567 cm->desc->measure_battery_temp = false; in charger_manager_probe()
1571 cm->charger_psy_desc.properties = properties; in charger_manager_probe()
1572 cm->charger_psy_desc.num_properties = num_properties; in charger_manager_probe()
1575 ret = charger_manager_prepare_sysfs(cm); in charger_manager_probe()
1583 cm->charger_psy = power_supply_register(&pdev->dev, in charger_manager_probe()
1584 &cm->charger_psy_desc, in charger_manager_probe()
1586 if (IS_ERR(cm->charger_psy)) { in charger_manager_probe()
1588 cm->charger_psy_desc.name); in charger_manager_probe()
1589 return PTR_ERR(cm->charger_psy); in charger_manager_probe()
1593 ret = charger_manager_register_extcon(cm); in charger_manager_probe()
1601 list_add(&cm->entry, &cm_list); in charger_manager_probe()
1626 power_supply_unregister(cm->charger_psy); in charger_manager_probe()
1633 struct charger_manager *cm = platform_get_drvdata(pdev); in charger_manager_remove() local
1634 struct charger_desc *desc = cm->desc; in charger_manager_remove()
1639 list_del(&cm->entry); in charger_manager_remove()
1648 power_supply_unregister(cm->charger_psy); in charger_manager_remove()
1650 try_charger_enable(cm, false); in charger_manager_remove()
1673 struct charger_manager *cm; in cm_need_to_awake() local
1679 list_for_each_entry(cm, &cm_list, entry) { in cm_need_to_awake()
1680 if (is_charging(cm)) { in cm_need_to_awake()
1710 struct charger_manager *cm = dev_get_drvdata(dev); in cm_suspend_complete() local
1725 _cm_monitor(cm); in cm_suspend_complete()
1727 device_set_wakeup_capable(cm->dev, false); in cm_suspend_complete()