Lines Matching refs:battmgr
316 static int qcom_battmgr_request(struct qcom_battmgr *battmgr, void *data, size_t len)
321 reinit_completion(&battmgr->ack);
323 battmgr->error = 0;
325 ret = pmic_glink_send(battmgr->client, data, len);
329 left = wait_for_completion_timeout(&battmgr->ack, HZ);
333 return battmgr->error;
336 static int qcom_battmgr_request_property(struct qcom_battmgr *battmgr, int opcode,
348 return qcom_battmgr_request(battmgr, &request, sizeof(request));
351 static int qcom_battmgr_update_status(struct qcom_battmgr *battmgr)
360 return qcom_battmgr_request(battmgr, &request, sizeof(request));
363 static int qcom_battmgr_update_info(struct qcom_battmgr *battmgr)
372 return qcom_battmgr_request(battmgr, &request, sizeof(request));
375 static int qcom_battmgr_update_charge_time(struct qcom_battmgr *battmgr)
385 return qcom_battmgr_request(battmgr, &request, sizeof(request));
388 static int qcom_battmgr_update_discharge_time(struct qcom_battmgr *battmgr)
398 return qcom_battmgr_request(battmgr, &request, sizeof(request));
423 static int qcom_battmgr_bat_sm8350_update(struct qcom_battmgr *battmgr,
434 mutex_lock(&battmgr->lock);
435 ret = qcom_battmgr_request_property(battmgr, BATTMGR_BAT_PROPERTY_GET, prop, 0);
436 mutex_unlock(&battmgr->lock);
441 static int qcom_battmgr_bat_sc8280xp_update(struct qcom_battmgr *battmgr,
446 mutex_lock(&battmgr->lock);
448 if (!battmgr->info.valid) {
449 ret = qcom_battmgr_update_info(battmgr);
452 battmgr->info.valid = true;
455 ret = qcom_battmgr_update_status(battmgr);
460 ret = qcom_battmgr_update_charge_time(battmgr);
468 ret = qcom_battmgr_update_discharge_time(battmgr);
476 mutex_unlock(&battmgr->lock);
484 struct qcom_battmgr *battmgr = power_supply_get_drvdata(psy);
485 enum qcom_battmgr_unit unit = battmgr->unit;
488 if (!battmgr->service_up)
491 if (battmgr->variant == QCOM_BATTMGR_SC8280XP)
492 ret = qcom_battmgr_bat_sc8280xp_update(battmgr, psp);
494 ret = qcom_battmgr_bat_sm8350_update(battmgr, psp);
500 val->intval = battmgr->status.status;
503 val->intval = battmgr->info.charge_type;
506 val->intval = battmgr->status.health;
509 val->intval = battmgr->info.present;
512 val->intval = battmgr->info.technology;
515 val->intval = battmgr->info.cycle_count;
518 val->intval = battmgr->info.voltage_max_design;
521 val->intval = battmgr->info.voltage_max;
524 val->intval = battmgr->status.voltage_now;
527 val->intval = battmgr->status.voltage_ocv;
530 val->intval = battmgr->status.current_now;
533 val->intval = battmgr->status.power_now;
538 val->intval = battmgr->info.design_capacity;
543 val->intval = battmgr->info.last_full_capacity;
548 val->intval = battmgr->info.capacity_low;
553 val->intval = battmgr->status.capacity;
556 val->intval = battmgr->info.charge_count;
561 val->intval = battmgr->info.design_capacity;
566 val->intval = battmgr->info.last_full_capacity;
571 val->intval = battmgr->info.capacity_low;
576 val->intval = battmgr->status.capacity;
579 val->intval = battmgr->status.percent;
582 val->intval = battmgr->status.temperature;
585 val->intval = battmgr->status.discharge_time;
588 val->intval = battmgr->status.charge_time;
591 val->intval = battmgr->info.year;
594 val->intval = battmgr->info.month;
597 val->intval = battmgr->info.day;
600 val->strval = battmgr->info.model_number;
603 val->strval = battmgr->info.oem_info;
606 val->strval = battmgr->info.serial_number;
641 .name = "qcom-battmgr-bat",
671 .name = "qcom-battmgr-bat",
682 struct qcom_battmgr *battmgr = power_supply_get_drvdata(psy);
685 if (!battmgr->service_up)
688 ret = qcom_battmgr_bat_sc8280xp_update(battmgr, psp);
694 val->intval = battmgr->ac.online;
708 .name = "qcom-battmgr-ac",
725 static int qcom_battmgr_usb_sm8350_update(struct qcom_battmgr *battmgr,
736 mutex_lock(&battmgr->lock);
737 ret = qcom_battmgr_request_property(battmgr, BATTMGR_USB_PROPERTY_GET, prop, 0);
738 mutex_unlock(&battmgr->lock);
747 struct qcom_battmgr *battmgr = power_supply_get_drvdata(psy);
750 if (!battmgr->service_up)
753 if (battmgr->variant == QCOM_BATTMGR_SC8280XP)
754 ret = qcom_battmgr_bat_sc8280xp_update(battmgr, psp);
756 ret = qcom_battmgr_usb_sm8350_update(battmgr, psp);
762 val->intval = battmgr->usb.online;
765 val->intval = battmgr->usb.voltage_now;
768 val->intval = battmgr->usb.voltage_max;
771 val->intval = battmgr->usb.current_now;
774 val->intval = battmgr->usb.current_max;
777 val->intval = battmgr->usb.current_limit;
780 val->intval = battmgr->usb.usb_type;
807 .name = "qcom-battmgr-usb",
827 .name = "qcom-battmgr-usb",
844 static int qcom_battmgr_wls_sm8350_update(struct qcom_battmgr *battmgr,
855 mutex_lock(&battmgr->lock);
856 ret = qcom_battmgr_request_property(battmgr, BATTMGR_WLS_PROPERTY_GET, prop, 0);
857 mutex_unlock(&battmgr->lock);
866 struct qcom_battmgr *battmgr = power_supply_get_drvdata(psy);
869 if (!battmgr->service_up)
872 if (battmgr->variant == QCOM_BATTMGR_SC8280XP)
873 ret = qcom_battmgr_bat_sc8280xp_update(battmgr, psp);
875 ret = qcom_battmgr_wls_sm8350_update(battmgr, psp);
881 val->intval = battmgr->wireless.online;
884 val->intval = battmgr->wireless.voltage_now;
887 val->intval = battmgr->wireless.voltage_max;
890 val->intval = battmgr->wireless.current_now;
893 val->intval = battmgr->wireless.current_max;
907 .name = "qcom-battmgr-wls",
923 .name = "qcom-battmgr-wls",
930 static void qcom_battmgr_notification(struct qcom_battmgr *battmgr,
938 dev_warn(battmgr->dev, "ignoring notification with invalid length\n");
945 battmgr->info.valid = false;
949 power_supply_changed(battmgr->bat_psy);
952 power_supply_changed(battmgr->usb_psy);
955 power_supply_changed(battmgr->wls_psy);
958 dev_err(battmgr->dev, "unknown notification: %#x\n", notification);
990 static void qcom_battmgr_sc8280xp_callback(struct qcom_battmgr *battmgr,
1000 dev_warn(battmgr->dev, "invalid payload length for %#x: %zd\n",
1007 battmgr->error = 0;
1011 dev_warn(battmgr->dev,
1014 battmgr->error = -ENODATA;
1018 battmgr->unit = le32_to_cpu(resp->info.power_unit);
1020 battmgr->info.present = true;
1021 battmgr->info.design_capacity = le32_to_cpu(resp->info.design_capacity) * 1000;
1022 battmgr->info.last_full_capacity = le32_to_cpu(resp->info.last_full_capacity) * 1000;
1023 battmgr->info.voltage_max_design = le32_to_cpu(resp->info.design_voltage) * 1000;
1024 battmgr->info.capacity_low = le32_to_cpu(resp->info.capacity_low) * 1000;
1025 battmgr->info.cycle_count = le32_to_cpu(resp->info.cycle_count);
1026 qcom_battmgr_sc8280xp_strcpy(battmgr->info.model_number, resp->info.model_number);
1027 qcom_battmgr_sc8280xp_strcpy(battmgr->info.serial_number, resp->info.serial_number);
1028 battmgr->info.technology = qcom_battmgr_sc8280xp_parse_technology(resp->info.battery_chemistry);
1029 qcom_battmgr_sc8280xp_strcpy(battmgr->info.oem_info, resp->info.oem_info);
1030 battmgr->info.day = resp->info.day;
1031 battmgr->info.month = resp->info.month;
1032 battmgr->info.year = le16_to_cpu(resp->info.year);
1036 dev_warn(battmgr->dev,
1039 battmgr->error = -ENODATA;
1045 battmgr->status.status = POWER_SUPPLY_STATUS_DISCHARGING;
1047 battmgr->status.status = POWER_SUPPLY_STATUS_CHARGING;
1049 battmgr->status.status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1051 battmgr->status.capacity = le32_to_cpu(resp->status.capacity) * 1000;
1052 battmgr->status.power_now = le32_to_cpu(resp->status.rate) * 1000;
1053 battmgr->status.voltage_now = le32_to_cpu(resp->status.battery_voltage) * 1000;
1054 battmgr->status.temperature = qcom_battmgr_sc8280xp_convert_temp(le32_to_cpu(resp->status.temperature));
1057 battmgr->ac.online = source == BATTMGR_CHARGING_SOURCE_AC;
1058 battmgr->usb.online = source == BATTMGR_CHARGING_SOURCE_USB;
1059 battmgr->wireless.online = source == BATTMGR_CHARGING_SOURCE_WIRELESS;
1062 battmgr->status.discharge_time = le32_to_cpu(resp->time);
1065 battmgr->status.charge_time = le32_to_cpu(resp->time);
1068 dev_warn(battmgr->dev, "unknown message %#x\n", opcode);
1072 complete(&battmgr->ack);
1075 static void qcom_battmgr_sm8350_callback(struct qcom_battmgr *battmgr,
1085 dev_warn(battmgr->dev, "invalid payload length for %#x: %zd\n",
1095 dev_warn(battmgr->dev,
1098 battmgr->error = -ENODATA;
1103 dev_warn(battmgr->dev,
1106 battmgr->error = -ENODATA;
1110 battmgr->error = le32_to_cpu(resp->intval.result);
1111 if (battmgr->error)
1117 battmgr->status.status = le32_to_cpu(resp->intval.value);
1120 battmgr->status.health = le32_to_cpu(resp->intval.value);
1123 battmgr->info.present = le32_to_cpu(resp->intval.value);
1126 battmgr->info.charge_type = le32_to_cpu(resp->intval.value);
1129 battmgr->status.percent = le32_to_cpu(resp->intval.value) / 100;
1132 battmgr->status.voltage_ocv = le32_to_cpu(resp->intval.value);
1135 battmgr->status.voltage_now = le32_to_cpu(resp->intval.value);
1138 battmgr->info.voltage_max = le32_to_cpu(resp->intval.value);
1141 battmgr->status.current_now = le32_to_cpu(resp->intval.value);
1145 battmgr->status.temperature = DIV_ROUND_CLOSEST(val, 10);
1148 battmgr->info.technology = le32_to_cpu(resp->intval.value);
1151 battmgr->info.charge_count = le32_to_cpu(resp->intval.value);
1154 battmgr->info.cycle_count = le32_to_cpu(resp->intval.value);
1157 battmgr->info.design_capacity = le32_to_cpu(resp->intval.value);
1160 battmgr->info.last_full_capacity = le32_to_cpu(resp->intval.value);
1163 strscpy(battmgr->info.model_number, resp->strval.model, BATTMGR_STRING_LEN);
1166 battmgr->status.charge_time = le32_to_cpu(resp->intval.value);
1169 battmgr->status.discharge_time = le32_to_cpu(resp->intval.value);
1172 battmgr->status.power_now = le32_to_cpu(resp->intval.value);
1175 dev_warn(battmgr->dev, "unknown property %#x\n", property);
1182 dev_warn(battmgr->dev,
1185 battmgr->error = -ENODATA;
1189 battmgr->error = le32_to_cpu(resp->intval.result);
1190 if (battmgr->error)
1195 battmgr->usb.online = le32_to_cpu(resp->intval.value);
1198 battmgr->usb.voltage_now = le32_to_cpu(resp->intval.value);
1201 battmgr->usb.voltage_max = le32_to_cpu(resp->intval.value);
1204 battmgr->usb.current_now = le32_to_cpu(resp->intval.value);
1207 battmgr->usb.current_max = le32_to_cpu(resp->intval.value);
1210 battmgr->usb.current_limit = le32_to_cpu(resp->intval.value);
1213 battmgr->usb.usb_type = le32_to_cpu(resp->intval.value);
1216 dev_warn(battmgr->dev, "unknown property %#x\n", property);
1223 dev_warn(battmgr->dev,
1226 battmgr->error = -ENODATA;
1230 battmgr->error = le32_to_cpu(resp->intval.result);
1231 if (battmgr->error)
1236 battmgr->wireless.online = le32_to_cpu(resp->intval.value);
1239 battmgr->wireless.voltage_now = le32_to_cpu(resp->intval.value);
1242 battmgr->wireless.voltage_max = le32_to_cpu(resp->intval.value);
1245 battmgr->wireless.current_now = le32_to_cpu(resp->intval.value);
1248 battmgr->wireless.current_max = le32_to_cpu(resp->intval.value);
1251 dev_warn(battmgr->dev, "unknown property %#x\n", property);
1256 battmgr->error = 0;
1259 dev_warn(battmgr->dev, "unknown message %#x\n", opcode);
1264 complete(&battmgr->ack);
1270 struct qcom_battmgr *battmgr = priv;
1274 qcom_battmgr_notification(battmgr, data, len);
1275 else if (battmgr->variant == QCOM_BATTMGR_SC8280XP)
1276 qcom_battmgr_sc8280xp_callback(battmgr, data, len);
1278 qcom_battmgr_sm8350_callback(battmgr, data, len);
1283 struct qcom_battmgr *battmgr = container_of(work, struct qcom_battmgr, enable_work);
1291 ret = qcom_battmgr_request(battmgr, &req, sizeof(req));
1293 dev_err(battmgr->dev, "failed to request power notifications\n");
1298 struct qcom_battmgr *battmgr = priv;
1301 battmgr->service_up = true;
1302 schedule_work(&battmgr->enable_work);
1304 battmgr->service_up = false;
1323 struct qcom_battmgr *battmgr;
1326 battmgr = devm_kzalloc(dev, sizeof(*battmgr), GFP_KERNEL);
1327 if (!battmgr)
1330 battmgr->dev = dev;
1332 psy_cfg.drv_data = battmgr;
1335 psy_cfg_supply.drv_data = battmgr;
1340 INIT_WORK(&battmgr->enable_work, qcom_battmgr_enable_worker);
1341 mutex_init(&battmgr->lock);
1342 init_completion(&battmgr->ack);
1346 battmgr->variant = (unsigned long)match->data;
1348 battmgr->variant = QCOM_BATTMGR_SM8350;
1350 if (battmgr->variant == QCOM_BATTMGR_SC8280XP) {
1351 battmgr->bat_psy = devm_power_supply_register(dev, &sc8280xp_bat_psy_desc, &psy_cfg);
1352 if (IS_ERR(battmgr->bat_psy))
1353 return dev_err_probe(dev, PTR_ERR(battmgr->bat_psy),
1356 battmgr->ac_psy = devm_power_supply_register(dev, &sc8280xp_ac_psy_desc, &psy_cfg_supply);
1357 if (IS_ERR(battmgr->ac_psy))
1358 return dev_err_probe(dev, PTR_ERR(battmgr->ac_psy),
1361 battmgr->usb_psy = devm_power_supply_register(dev, &sc8280xp_usb_psy_desc, &psy_cfg_supply);
1362 if (IS_ERR(battmgr->usb_psy))
1363 return dev_err_probe(dev, PTR_ERR(battmgr->usb_psy),
1366 battmgr->wls_psy = devm_power_supply_register(dev, &sc8280xp_wls_psy_desc, &psy_cfg_supply);
1367 if (IS_ERR(battmgr->wls_psy))
1368 return dev_err_probe(dev, PTR_ERR(battmgr->wls_psy),
1371 battmgr->bat_psy = devm_power_supply_register(dev, &sm8350_bat_psy_desc, &psy_cfg);
1372 if (IS_ERR(battmgr->bat_psy))
1373 return dev_err_probe(dev, PTR_ERR(battmgr->bat_psy),
1376 battmgr->usb_psy = devm_power_supply_register(dev, &sm8350_usb_psy_desc, &psy_cfg_supply);
1377 if (IS_ERR(battmgr->usb_psy))
1378 return dev_err_probe(dev, PTR_ERR(battmgr->usb_psy),
1381 battmgr->wls_psy = devm_power_supply_register(dev, &sm8350_wls_psy_desc, &psy_cfg_supply);
1382 if (IS_ERR(battmgr->wls_psy))
1383 return dev_err_probe(dev, PTR_ERR(battmgr->wls_psy),
1387 battmgr->client = devm_pmic_glink_register_client(dev,
1391 battmgr);
1392 return PTR_ERR_OR_ZERO(battmgr->client);