Lines Matching defs:cm

94  * @cm: the Charger Manager representing the battery.
96 static bool is_batt_present(struct charger_manager *cm)
103 switch (cm->desc->battery_present) {
110 psy = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
121 for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
123 cm->desc->psy_charger_stat[i]);
125 dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
126 cm->desc->psy_charger_stat[i]);
146 * @cm: the Charger Manager representing the battery.
152 static bool is_ext_pwr_online(struct charger_manager *cm)
160 for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
161 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]);
163 dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
164 cm->desc->psy_charger_stat[i]);
182 * @cm: the Charger Manager representing the battery.
188 static int get_batt_uV(struct charger_manager *cm, int *uV)
194 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
210 * @cm: the Charger Manager representing the battery.
212 static bool is_charging(struct charger_manager *cm)
220 if (!is_batt_present(cm))
224 for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
226 if (cm->emergency_stop)
228 if (!cm->charger_enabled)
231 psy = power_supply_get_by_name(cm->desc->psy_charger_stat[i]);
233 dev_err(cm->dev, "Cannot find power supply \"%s\"\n",
234 cm->desc->psy_charger_stat[i]);
242 dev_warn(cm->dev, "Cannot read ONLINE value from %s\n",
243 cm->desc->psy_charger_stat[i]);
260 dev_warn(cm->dev, "Cannot read STATUS value from %s\n",
261 cm->desc->psy_charger_stat[i]);
279 * @cm: the Charger Manager representing the battery.
281 static bool is_full_charged(struct charger_manager *cm)
283 struct charger_desc *desc = cm->desc;
291 if (!is_batt_present(cm))
294 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
300 ret = get_batt_uV(cm, &uV);
303 if (cm->battery_status == POWER_SUPPLY_STATUS_FULL
342 * @cm: the Charger Manager representing the battery.
344 static bool is_polling_required(struct charger_manager *cm)
346 switch (cm->desc->polling_mode) {
352 return is_ext_pwr_online(cm);
354 return is_charging(cm);
356 dev_warn(cm->dev, "Incorrect polling_mode (%d)\n",
357 cm->desc->polling_mode);
365 * @cm: the Charger Manager representing the battery.
373 static int try_charger_enable(struct charger_manager *cm, bool enable)
376 struct charger_desc *desc = cm->desc;
379 if (enable == cm->charger_enabled)
383 if (cm->emergency_stop)
390 cm->charging_start_time = ktime_to_ms(ktime_get());
391 cm->charging_end_time = 0;
399 dev_warn(cm->dev, "Cannot enable %s regulator\n",
408 cm->charging_start_time = 0;
409 cm->charging_end_time = ktime_to_ms(ktime_get());
417 dev_warn(cm->dev, "Cannot disable %s regulator\n",
431 dev_warn(cm->dev, "Disable regulator(%s) forcibly\n",
438 cm->charger_enabled = enable;
445 * @cm: the Charger Manager representing the battery.
448 * cm stop charging to prevent overcharge/overheat. If discharging
450 * attached, after full-batt, cm start charging to maintain fully
453 static int check_charging_duration(struct charger_manager *cm)
455 struct charger_desc *desc = cm->desc;
464 if (cm->charger_enabled) {
465 duration = curr - cm->charging_start_time;
468 dev_info(cm->dev, "Charging duration exceed %ums\n",
472 } else if (cm->battery_status == POWER_SUPPLY_STATUS_NOT_CHARGING) {
473 duration = curr - cm->charging_end_time;
476 dev_info(cm->dev, "Discharging duration exceed %ums\n",
485 static int cm_get_battery_temperature_by_psy(struct charger_manager *cm,
491 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
503 static int cm_get_battery_temperature(struct charger_manager *cm,
508 if (!cm->desc->measure_battery_temp)
512 if (cm->tzd_batt) {
513 ret = thermal_zone_get_temp(cm->tzd_batt, temp);
521 ret = cm_get_battery_temperature_by_psy(cm, temp);
527 static int cm_check_thermal_status(struct charger_manager *cm)
529 struct charger_desc *desc = cm->desc;
533 ret = cm_get_battery_temperature(cm, &temp);
540 dev_err(cm->dev, "Failed to get battery temperature\n");
547 if (cm->emergency_stop) {
559 cm->emergency_stop = ret;
566 * @cm: the Charger Manager representing the battery.
568 static int cm_get_target_status(struct charger_manager *cm)
570 if (!is_ext_pwr_online(cm))
573 if (cm_check_thermal_status(cm)) {
575 if (check_charging_duration(cm))
580 switch (cm->battery_status) {
583 if (check_charging_duration(cm))
587 if (is_full_charged(cm))
601 * @cm: the Charger Manager representing the battery.
606 static bool _cm_monitor(struct charger_manager *cm)
610 target = cm_get_target_status(cm);
612 try_charger_enable(cm, (target == POWER_SUPPLY_STATUS_CHARGING));
614 if (cm->battery_status != target) {
615 cm->battery_status = target;
616 power_supply_changed(cm->charger_psy);
619 return (cm->battery_status == POWER_SUPPLY_STATUS_NOT_CHARGING);
631 struct charger_manager *cm;
635 list_for_each_entry(cm, &cm_list, entry) {
636 if (_cm_monitor(cm))
652 struct charger_manager *cm;
658 list_for_each_entry(cm, &cm_list, entry) {
659 if (is_polling_required(cm) && cm->desc->polling_interval_ms) {
662 if (min > cm->desc->polling_interval_ms)
663 min = cm->desc->polling_interval_ms;
716 struct charger_manager *cm = power_supply_get_drvdata(psy);
717 struct charger_desc *desc = cm->desc;
724 val->intval = cm->battery_status;
727 if (cm->emergency_stop == CM_BATT_OVERHEAT)
729 else if (cm->emergency_stop == CM_BATT_COLD)
735 if (is_batt_present(cm))
741 ret = get_batt_uV(cm, &val->intval);
744 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
753 return cm_get_battery_temperature(cm, &val->intval);
755 if (!is_batt_present(cm)) {
761 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
780 if (is_charging(cm))
787 ret = get_batt_uV(cm, &uV);
795 !is_charging(cm)) {
802 if (is_ext_pwr_online(cm))
809 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
863 struct charger_manager *cm;
872 list_for_each_entry(cm, &cm_list, entry) {
874 if (!is_polling_required(cm) && !cm->emergency_stop)
877 if (cm->desc->polling_interval_ms == 0)
879 CM_MIN_VALID(wakeup_ms, cm->desc->polling_interval_ms);
971 * @cm: the Charger Manager representing the battery.
974 static int charger_extcon_init(struct charger_manager *cm,
1008 ret = devm_extcon_register_notifier(cm->dev, cable->extcon_dev,
1022 * @cm: the Charger Manager representing the battery.
1029 static int charger_manager_register_extcon(struct charger_manager *cm)
1031 struct charger_desc *desc = cm->desc;
1041 charger->consumer = regulator_get(cm->dev,
1044 dev_err(cm->dev, "Cannot find charger(%s)\n",
1048 charger->cm = cm;
1053 ret = charger_extcon_init(cm, cable);
1055 dev_err(cm->dev, "Cannot initialize charger(%s)\n",
1060 cable->cm = cm;
1111 struct charger_manager *cm = charger->cm;
1112 struct charger_desc *desc = cm->desc;
1142 if (cm->charger_enabled) {
1143 try_charger_enable(charger->cm, false);
1145 try_charger_enable(charger->cm, true);
1150 dev_warn(cm->dev,
1160 * @cm: the Charger Manager representing the battery.
1171 static int charger_manager_prepare_sysfs(struct charger_manager *cm)
1173 struct charger_desc *desc = cm->desc;
1183 name = devm_kasprintf(cm->dev, GFP_KERNEL, "charger.%d", i);
1219 dev_info(cm->dev, "'%s' regulator's externally_control is %d\n",
1224 dev_err(cm->dev, "Cannot register regulator because charger-manager must need at least one charger for charging battery\n");
1231 static int cm_init_thermal_data(struct charger_manager *cm,
1236 struct charger_desc *desc = cm->desc;
1247 cm->desc->measure_battery_temp = true;
1251 cm->tzd_batt =
1253 if (IS_ERR(cm->tzd_batt))
1254 return PTR_ERR(cm->tzd_batt);
1259 cm->desc->measure_battery_temp = true;
1263 if (cm->desc->measure_battery_temp) {
1294 of_property_read_string(np, "cm-name", &desc->psy_name);
1296 of_property_read_u32(np, "cm-poll-mode", &poll_mode);
1299 of_property_read_u32(np, "cm-poll-interval",
1302 of_property_read_u32(np, "cm-fullbatt-vchkdrop-volt",
1304 of_property_read_u32(np, "cm-fullbatt-voltage", &desc->fullbatt_uV);
1305 of_property_read_u32(np, "cm-fullbatt-soc", &desc->fullbatt_soc);
1306 of_property_read_u32(np, "cm-fullbatt-capacity",
1309 of_property_read_u32(np, "cm-battery-stat", &battery_stat);
1313 num_chgs = of_property_count_strings(np, "cm-chargers");
1326 of_property_read_string_index(np, "cm-chargers",
1330 of_property_read_string(np, "cm-fuel-gauge", &desc->psy_fuel_gauge);
1332 of_property_read_string(np, "cm-thermal-zone", &desc->thermal_zone);
1334 of_property_read_u32(np, "cm-battery-cold", &desc->temp_min);
1335 if (of_property_read_bool(np, "cm-battery-cold-in-minus"))
1337 of_property_read_u32(np, "cm-battery-hot", &desc->temp_max);
1338 of_property_read_u32(np, "cm-battery-temp-diff", &desc->temp_diff);
1340 of_property_read_u32(np, "cm-charging-max",
1342 of_property_read_u32(np, "cm-discharging-max",
1371 of_property_read_string(child, "cm-regulator-name",
1390 "cm-cable-name", &cables->name);
1392 "cm-cable-extcon",
1395 "cm-cable-min",
1398 "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);