Lines Matching refs:cm

93  * @cm: the Charger Manager representing the battery.
95 static bool is_batt_present(struct charger_manager *cm)
102 switch (cm->desc->battery_present) {
109 psy = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
120 for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
122 cm->desc->psy_charger_stat[i]);
124 dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
125 cm->desc->psy_charger_stat[i]);
145 * @cm: the Charger Manager representing the battery.
151 static bool is_ext_pwr_online(struct charger_manager *cm)
159 for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
160 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]);
162 dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
163 cm->desc->psy_charger_stat[i]);
181 * @cm: the Charger Manager representing the battery.
187 static int get_batt_uV(struct charger_manager *cm, int *uV)
193 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
209 * @cm: the Charger Manager representing the battery.
211 static bool is_charging(struct charger_manager *cm)
219 if (!is_batt_present(cm))
223 for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
225 if (cm->emergency_stop)
227 if (!cm->charger_enabled)
230 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]);
232 dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
233 cm->desc->psy_charger_stat[i]);
241 dev_warn(cm->dev, "Cannot read ONLINE value from %s\n",
242 cm->desc->psy_charger_stat[i]);
259 dev_warn(cm->dev, "Cannot read STATUS value from %s\n",
260 cm->desc->psy_charger_stat[i]);
278 * @cm: the Charger Manager representing the battery.
280 static bool is_full_charged(struct charger_manager *cm)
282 struct charger_desc *desc = cm->desc;
290 if (!is_batt_present(cm))
293 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
299 ret = get_batt_uV(cm, &uV);
302 if (cm->battery_status == POWER_SUPPLY_STATUS_FULL
341 * @cm: the Charger Manager representing the battery.
343 static bool is_polling_required(struct charger_manager *cm)
345 switch (cm->desc->polling_mode) {
351 return is_ext_pwr_online(cm);
353 return is_charging(cm);
355 dev_warn(cm->dev, "Incorrect polling_mode (%d)\n",
356 cm->desc->polling_mode);
364 * @cm: the Charger Manager representing the battery.
372 static int try_charger_enable(struct charger_manager *cm, bool enable)
375 struct charger_desc *desc = cm->desc;
378 if (enable == cm->charger_enabled)
382 if (cm->emergency_stop)
389 cm->charging_start_time = ktime_to_ms(ktime_get());
390 cm->charging_end_time = 0;
398 dev_warn(cm->dev, "Cannot enable %s regulator\n",
407 cm->charging_start_time = 0;
408 cm->charging_end_time = ktime_to_ms(ktime_get());
416 dev_warn(cm->dev, "Cannot disable %s regulator\n",
430 dev_warn(cm->dev, "Disable regulator(%s) forcibly\n",
437 cm->charger_enabled = enable;
444 * @cm: the Charger Manager representing the battery.
447 * cm stop charging to prevent overcharge/overheat. If discharging
449 * attached, after full-batt, cm start charging to maintain fully
452 static int check_charging_duration(struct charger_manager *cm)
454 struct charger_desc *desc = cm->desc;
463 if (cm->charger_enabled) {
464 duration = curr - cm->charging_start_time;
467 dev_info(cm->dev, "Charging duration exceed %ums\n",
471 } else if (cm->battery_status == POWER_SUPPLY_STATUS_NOT_CHARGING) {
472 duration = curr - cm->charging_end_time;
475 dev_info(cm->dev, "Discharging duration exceed %ums\n",
484 static int cm_get_battery_temperature_by_psy(struct charger_manager *cm,
490 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
502 static int cm_get_battery_temperature(struct charger_manager *cm,
507 if (!cm->desc->measure_battery_temp)
511 if (cm->tzd_batt) {
512 ret = thermal_zone_get_temp(cm->tzd_batt, temp);
520 ret = cm_get_battery_temperature_by_psy(cm, temp);
526 static int cm_check_thermal_status(struct charger_manager *cm)
528 struct charger_desc *desc = cm->desc;
532 ret = cm_get_battery_temperature(cm, &temp);
539 dev_err(cm->dev, "Failed to get battery temperature\n");
546 if (cm->emergency_stop) {
558 cm->emergency_stop = ret;
565 * @cm: the Charger Manager representing the battery.
567 static int cm_get_target_status(struct charger_manager *cm)
569 if (!is_ext_pwr_online(cm))
572 if (cm_check_thermal_status(cm)) {
574 if (check_charging_duration(cm))
579 switch (cm->battery_status) {
582 if (check_charging_duration(cm))
586 if (is_full_charged(cm))
600 * @cm: the Charger Manager representing the battery.
605 static bool _cm_monitor(struct charger_manager *cm)
609 target = cm_get_target_status(cm);
611 try_charger_enable(cm, (target == POWER_SUPPLY_STATUS_CHARGING));
613 if (cm->battery_status != target) {
614 cm->battery_status = target;
615 power_supply_changed(cm->charger_psy);
618 return (cm->battery_status == POWER_SUPPLY_STATUS_NOT_CHARGING);
630 struct charger_manager *cm;
634 list_for_each_entry(cm, &cm_list, entry) {
635 if (_cm_monitor(cm))
651 struct charger_manager *cm;
657 list_for_each_entry(cm, &cm_list, entry) {
658 if (is_polling_required(cm) && cm->desc->polling_interval_ms) {
661 if (min > cm->desc->polling_interval_ms)
662 min = cm->desc->polling_interval_ms;
715 struct charger_manager *cm = power_supply_get_drvdata(psy);
716 struct charger_desc *desc = cm->desc;
723 val->intval = cm->battery_status;
726 if (cm->emergency_stop == CM_BATT_OVERHEAT)
728 else if (cm->emergency_stop == CM_BATT_COLD)
734 if (is_batt_present(cm))
740 ret = get_batt_uV(cm, &val->intval);
743 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
752 return cm_get_battery_temperature(cm, &val->intval);
754 if (!is_batt_present(cm)) {
760 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
779 if (is_charging(cm))
786 ret = get_batt_uV(cm, &uV);
794 !is_charging(cm)) {
801 if (is_ext_pwr_online(cm))
808 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
862 struct charger_manager *cm;
871 list_for_each_entry(cm, &cm_list, entry) {
873 if (!is_polling_required(cm) && !cm->emergency_stop)
876 if (cm->desc->polling_interval_ms == 0)
878 CM_MIN_VALID(wakeup_ms, cm->desc->polling_interval_ms);
970 * @cm: the Charger Manager representing the battery.
973 static int charger_extcon_init(struct charger_manager *cm,
1007 ret = devm_extcon_register_notifier(cm->dev, cable->extcon_dev,
1021 * @cm: the Charger Manager representing the battery.
1028 static int charger_manager_register_extcon(struct charger_manager *cm)
1030 struct charger_desc *desc = cm->desc;
1040 charger->consumer = regulator_get(cm->dev,
1043 dev_err(cm->dev, "Cannot find charger(%s)\n",
1047 charger->cm = cm;
1052 ret = charger_extcon_init(cm, cable);
1054 dev_err(cm->dev, "Cannot initialize charger(%s)\n",
1059 cable->cm = cm;
1110 struct charger_manager *cm = charger->cm;
1111 struct charger_desc *desc = cm->desc;
1141 if (cm->charger_enabled) {
1142 try_charger_enable(charger->cm, false);
1144 try_charger_enable(charger->cm, true);
1149 dev_warn(cm->dev,
1159 * @cm: the Charger Manager representing the battery.
1170 static int charger_manager_prepare_sysfs(struct charger_manager *cm)
1172 struct charger_desc *desc = cm->desc;
1182 name = devm_kasprintf(cm->dev, GFP_KERNEL, "charger.%d", i);
1218 dev_info(cm->dev, "'%s' regulator's externally_control is %d\n",
1223 dev_err(cm->dev, "Cannot register regulator because charger-manager must need at least one charger for charging battery\n");
1230 static int cm_init_thermal_data(struct charger_manager *cm,
1235 struct charger_desc *desc = cm->desc;
1246 cm->desc->measure_battery_temp = true;
1250 cm->tzd_batt =
1252 if (IS_ERR(cm->tzd_batt))
1253 return PTR_ERR(cm->tzd_batt);
1258 cm->desc->measure_battery_temp = true;
1262 if (cm->desc->measure_battery_temp) {
1293 of_property_read_string(np, "cm-name", &desc->psy_name);
1295 of_property_read_u32(np, "cm-poll-mode", &poll_mode);
1298 of_property_read_u32(np, "cm-poll-interval",
1301 of_property_read_u32(np, "cm-fullbatt-vchkdrop-volt",
1303 of_property_read_u32(np, "cm-fullbatt-voltage", &desc->fullbatt_uV);
1304 of_property_read_u32(np, "cm-fullbatt-soc", &desc->fullbatt_soc);
1305 of_property_read_u32(np, "cm-fullbatt-capacity",
1308 of_property_read_u32(np, "cm-battery-stat", &battery_stat);
1312 num_chgs = of_property_count_strings(np, "cm-chargers");
1325 of_property_read_string_index(np, "cm-chargers",
1329 of_property_read_string(np, "cm-fuel-gauge", &desc->psy_fuel_gauge);
1331 of_property_read_string(np, "cm-thermal-zone", &desc->thermal_zone);
1333 of_property_read_u32(np, "cm-battery-cold", &desc->temp_min);
1334 if (of_property_read_bool(np, "cm-battery-cold-in-minus"))
1336 of_property_read_u32(np, "cm-battery-hot", &desc->temp_max);
1337 of_property_read_u32(np, "cm-battery-temp-diff", &desc->temp_diff);
1339 of_property_read_u32(np, "cm-charging-max",
1341 of_property_read_u32(np, "cm-discharging-max",
1370 of_property_read_string(child, "cm-regulator-name",
1389 "cm-cable-name", &cables->name);
1391 "cm-cable-extcon",
1394 "cm-cable-min",
1397 "cm-cable-max",
1424 struct charger_manager *cm;
1437 cm = devm_kzalloc(&pdev->dev, sizeof(*cm), GFP_KERNEL);
1438 if (!cm)
1442 cm->dev = &pdev->dev;
1443 cm->desc = desc;
1444 psy_cfg.drv_data = cm;
1448 cm_timer = devm_kzalloc(cm->dev, sizeof(*cm_timer), GFP_KERNEL);
1500 if (cm->desc->polling_mode != CM_POLL_DISABLE &&
1514 platform_set_drvdata(pdev, cm);
1516 memcpy(&cm->charger_psy_desc, &psy_default, sizeof(psy_default));
1519 strscpy(cm->psy_name_buf, psy_default.name,
1520 sizeof(cm->psy_name_buf));
1522 strscpy(cm->psy_name_buf, desc->psy_name,
1523 sizeof(cm->psy_name_buf));
1524 cm->charger_psy_desc.name = cm->psy_name_buf;
1566 ret = cm_init_thermal_data(cm, fuel_gauge, properties, &num_properties);
1569 cm->desc->measure_battery_temp = false;
1573 cm->charger_psy_desc.properties = properties;
1574 cm->charger_psy_desc.num_properties = num_properties;
1577 ret = charger_manager_prepare_sysfs(cm);
1585 cm->charger_psy = power_supply_register(&pdev->dev,
1586 &cm->charger_psy_desc,
1588 if (IS_ERR(cm->charger_psy)) {
1590 cm->charger_psy_desc.name);
1591 return PTR_ERR(cm->charger_psy);
1595 ret = charger_manager_register_extcon(cm);
1603 list_add(&cm->entry, &cm_list);
1628 power_supply_unregister(cm->charger_psy);
1635 struct charger_manager *cm = platform_get_drvdata(pdev);
1636 struct charger_desc *desc = cm->desc;
1641 list_del(&cm->entry);
1650 power_supply_unregister(cm->charger_psy);
1652 try_charger_enable(cm, false);
1673 struct charger_manager *cm;
1679 list_for_each_entry(cm, &cm_list, entry) {
1680 if (is_charging(cm)) {
1710 struct charger_manager *cm = dev_get_drvdata(dev);
1725 _cm_monitor(cm);
1727 device_set_wakeup_capable(cm->dev, false);