Lines Matching +full:pmic +full:- +full:glink
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
191 /* mWh or mAh, based on info->power_unit */
322 reinit_completion(&battmgr->ack);
324 battmgr->error = 0;
326 ret = pmic_glink_send(battmgr->client, data, len);
330 left = wait_for_completion_timeout(&battmgr->ack, HZ);
332 return -ETIMEDOUT;
334 return battmgr->error;
431 return -EINVAL;
435 mutex_lock(&battmgr->lock);
437 mutex_unlock(&battmgr->lock);
447 mutex_lock(&battmgr->lock);
449 if (!battmgr->info.valid) {
453 battmgr->info.valid = true;
463 ret = -ENODATA;
471 ret = -ENODATA;
477 mutex_unlock(&battmgr->lock);
486 enum qcom_battmgr_unit unit = battmgr->unit;
489 if (!battmgr->service_up)
490 return -EAGAIN;
492 if (battmgr->variant == QCOM_BATTMGR_SC8280XP)
501 val->intval = battmgr->status.status;
504 val->intval = battmgr->info.charge_type;
507 val->intval = battmgr->status.health;
510 val->intval = battmgr->info.present;
513 val->intval = battmgr->info.technology;
516 val->intval = battmgr->info.cycle_count;
519 val->intval = battmgr->info.voltage_max_design;
522 val->intval = battmgr->info.voltage_max;
525 val->intval = battmgr->status.voltage_now;
528 val->intval = battmgr->status.voltage_ocv;
531 val->intval = battmgr->status.current_now;
534 val->intval = battmgr->status.power_now;
538 return -ENODATA;
539 val->intval = battmgr->info.design_capacity;
543 return -ENODATA;
544 val->intval = battmgr->info.last_full_capacity;
548 return -ENODATA;
549 val->intval = battmgr->info.capacity_low;
553 return -ENODATA;
554 val->intval = battmgr->status.capacity;
557 val->intval = battmgr->info.charge_count;
561 return -ENODATA;
562 val->intval = battmgr->info.design_capacity;
566 return -ENODATA;
567 val->intval = battmgr->info.last_full_capacity;
571 return -ENODATA;
572 val->intval = battmgr->info.capacity_low;
576 return -ENODATA;
577 val->intval = battmgr->status.capacity;
580 val->intval = battmgr->status.percent;
583 val->intval = battmgr->status.temperature;
586 val->intval = battmgr->status.discharge_time;
589 val->intval = battmgr->status.charge_time;
592 val->intval = battmgr->info.year;
595 val->intval = battmgr->info.month;
598 val->intval = battmgr->info.day;
601 val->strval = battmgr->info.model_number;
604 val->strval = battmgr->info.oem_info;
607 val->strval = battmgr->info.serial_number;
610 return -EINVAL;
642 .name = "qcom-battmgr-bat",
672 .name = "qcom-battmgr-bat",
686 if (!battmgr->service_up)
687 return -EAGAIN;
695 val->intval = battmgr->ac.online;
698 return -EINVAL;
709 .name = "qcom-battmgr-ac",
733 return -EINVAL;
737 mutex_lock(&battmgr->lock);
739 mutex_unlock(&battmgr->lock);
751 if (!battmgr->service_up)
752 return -EAGAIN;
754 if (battmgr->variant == QCOM_BATTMGR_SC8280XP)
763 val->intval = battmgr->usb.online;
766 val->intval = battmgr->usb.voltage_now;
769 val->intval = battmgr->usb.voltage_max;
772 val->intval = battmgr->usb.current_now;
775 val->intval = battmgr->usb.current_max;
778 val->intval = battmgr->usb.current_limit;
781 val->intval = battmgr->usb.usb_type;
784 return -EINVAL;
795 .name = "qcom-battmgr-usb",
823 .name = "qcom-battmgr-usb",
855 return -EINVAL;
859 mutex_lock(&battmgr->lock);
861 mutex_unlock(&battmgr->lock);
873 if (!battmgr->service_up)
874 return -EAGAIN;
876 if (battmgr->variant == QCOM_BATTMGR_SC8280XP)
885 val->intval = battmgr->wireless.online;
888 val->intval = battmgr->wireless.voltage_now;
891 val->intval = battmgr->wireless.voltage_max;
894 val->intval = battmgr->wireless.current_now;
897 val->intval = battmgr->wireless.current_max;
900 return -EINVAL;
911 .name = "qcom-battmgr-wls",
927 .name = "qcom-battmgr-wls",
938 size_t payload_len = len - sizeof(struct pmic_glink_hdr);
941 if (payload_len != sizeof(msg->notification)) {
942 dev_warn(battmgr->dev, "ignoring notification with invalid length\n");
946 notification = le32_to_cpu(msg->notification);
949 battmgr->info.valid = false;
953 power_supply_changed(battmgr->bat_psy);
956 power_supply_changed(battmgr->usb_psy);
959 power_supply_changed(battmgr->wls_psy);
962 dev_err(battmgr->dev, "unknown notification: %#x\n", notification);
971 /* Some firmware versions return Pascal-style strings */
972 if (len < BATTMGR_STRING_LEN && len == strnlen(src + 1, BATTMGR_STRING_LEN - 1)) {
998 unsigned int opcode = le32_to_cpu(resp->hdr.opcode);
1001 size_t payload_len = len - sizeof(struct pmic_glink_hdr);
1004 dev_warn(battmgr->dev, "invalid payload length for %#x: %zd\n",
1011 battmgr->error = 0;
1015 if (payload_len != sizeof(resp->info) &&
1016 payload_len != (sizeof(resp->info) + sizeof(__le32))) {
1017 dev_warn(battmgr->dev,
1020 battmgr->error = -ENODATA;
1024 battmgr->unit = le32_to_cpu(resp->info.power_unit);
1026 battmgr->info.present = true;
1027 battmgr->info.design_capacity = le32_to_cpu(resp->info.design_capacity) * 1000;
1028 battmgr->info.last_full_capacity = le32_to_cpu(resp->info.last_full_capacity) * 1000;
1029 battmgr->info.voltage_max_design = le32_to_cpu(resp->info.design_voltage) * 1000;
1030 battmgr->info.capacity_low = le32_to_cpu(resp->info.capacity_low) * 1000;
1031 battmgr->info.cycle_count = le32_to_cpu(resp->info.cycle_count);
1032 qcom_battmgr_sc8280xp_strcpy(battmgr->info.model_number, resp->info.model_number);
1033 qcom_battmgr_sc8280xp_strcpy(battmgr->info.serial_number, resp->info.serial_number);
1034 battmgr->info.technology = qcom_battmgr_sc8280xp_parse_technology(resp->info.battery_chemistry);
1035 qcom_battmgr_sc8280xp_strcpy(battmgr->info.oem_info, resp->info.oem_info);
1036 battmgr->info.day = resp->info.day;
1037 battmgr->info.month = resp->info.month;
1038 battmgr->info.year = le16_to_cpu(resp->info.year);
1041 if (payload_len != sizeof(resp->status)) {
1042 dev_warn(battmgr->dev,
1045 battmgr->error = -ENODATA;
1049 state = le32_to_cpu(resp->status.battery_state);
1051 battmgr->status.status = POWER_SUPPLY_STATUS_DISCHARGING;
1053 battmgr->status.status = POWER_SUPPLY_STATUS_CHARGING;
1055 battmgr->status.status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1057 battmgr->status.capacity = le32_to_cpu(resp->status.capacity) * 1000;
1058 battmgr->status.power_now = le32_to_cpu(resp->status.rate) * 1000;
1059 battmgr->status.voltage_now = le32_to_cpu(resp->status.battery_voltage) * 1000;
1060 battmgr->status.temperature = qcom_battmgr_sc8280xp_convert_temp(le32_to_cpu(resp->status.temperature));
1062 source = le32_to_cpu(resp->status.charging_source);
1063 battmgr->ac.online = source == BATTMGR_CHARGING_SOURCE_AC;
1064 battmgr->usb.online = source == BATTMGR_CHARGING_SOURCE_USB;
1065 battmgr->wireless.online = source == BATTMGR_CHARGING_SOURCE_WIRELESS;
1068 battmgr->status.discharge_time = le32_to_cpu(resp->time);
1071 battmgr->status.charge_time = le32_to_cpu(resp->time);
1074 dev_warn(battmgr->dev, "unknown message %#x\n", opcode);
1078 complete(&battmgr->ack);
1086 unsigned int opcode = le32_to_cpu(resp->hdr.opcode);
1087 size_t payload_len = len - sizeof(struct pmic_glink_hdr);
1091 dev_warn(battmgr->dev, "invalid payload length for %#x: %zd\n",
1098 property = le32_to_cpu(resp->intval.property);
1100 if (payload_len != sizeof(resp->strval)) {
1101 dev_warn(battmgr->dev,
1104 battmgr->error = -ENODATA;
1108 if (payload_len != sizeof(resp->intval)) {
1109 dev_warn(battmgr->dev,
1112 battmgr->error = -ENODATA;
1116 battmgr->error = le32_to_cpu(resp->intval.result);
1117 if (battmgr->error)
1123 battmgr->status.status = le32_to_cpu(resp->intval.value);
1126 battmgr->status.health = le32_to_cpu(resp->intval.value);
1129 battmgr->info.present = le32_to_cpu(resp->intval.value);
1132 battmgr->info.charge_type = le32_to_cpu(resp->intval.value);
1135 battmgr->status.percent = le32_to_cpu(resp->intval.value) / 100;
1138 battmgr->status.voltage_ocv = le32_to_cpu(resp->intval.value);
1141 battmgr->status.voltage_now = le32_to_cpu(resp->intval.value);
1144 battmgr->info.voltage_max = le32_to_cpu(resp->intval.value);
1147 battmgr->status.current_now = le32_to_cpu(resp->intval.value);
1150 val = le32_to_cpu(resp->intval.value);
1151 battmgr->status.temperature = DIV_ROUND_CLOSEST(val, 10);
1154 battmgr->info.technology = le32_to_cpu(resp->intval.value);
1157 battmgr->info.charge_count = le32_to_cpu(resp->intval.value);
1160 battmgr->info.cycle_count = le32_to_cpu(resp->intval.value);
1163 battmgr->info.design_capacity = le32_to_cpu(resp->intval.value);
1166 battmgr->info.last_full_capacity = le32_to_cpu(resp->intval.value);
1169 strscpy(battmgr->info.model_number, resp->strval.model, BATTMGR_STRING_LEN);
1172 battmgr->status.charge_time = le32_to_cpu(resp->intval.value);
1175 battmgr->status.discharge_time = le32_to_cpu(resp->intval.value);
1178 battmgr->status.power_now = le32_to_cpu(resp->intval.value);
1181 dev_warn(battmgr->dev, "unknown property %#x\n", property);
1186 property = le32_to_cpu(resp->intval.property);
1187 if (payload_len != sizeof(resp->intval)) {
1188 dev_warn(battmgr->dev,
1191 battmgr->error = -ENODATA;
1195 battmgr->error = le32_to_cpu(resp->intval.result);
1196 if (battmgr->error)
1201 battmgr->usb.online = le32_to_cpu(resp->intval.value);
1204 battmgr->usb.voltage_now = le32_to_cpu(resp->intval.value);
1207 battmgr->usb.voltage_max = le32_to_cpu(resp->intval.value);
1210 battmgr->usb.current_now = le32_to_cpu(resp->intval.value);
1213 battmgr->usb.current_max = le32_to_cpu(resp->intval.value);
1216 battmgr->usb.current_limit = le32_to_cpu(resp->intval.value);
1219 battmgr->usb.usb_type = le32_to_cpu(resp->intval.value);
1222 dev_warn(battmgr->dev, "unknown property %#x\n", property);
1227 property = le32_to_cpu(resp->intval.property);
1228 if (payload_len != sizeof(resp->intval)) {
1229 dev_warn(battmgr->dev,
1232 battmgr->error = -ENODATA;
1236 battmgr->error = le32_to_cpu(resp->intval.result);
1237 if (battmgr->error)
1242 battmgr->wireless.online = le32_to_cpu(resp->intval.value);
1245 battmgr->wireless.voltage_now = le32_to_cpu(resp->intval.value);
1248 battmgr->wireless.voltage_max = le32_to_cpu(resp->intval.value);
1251 battmgr->wireless.current_now = le32_to_cpu(resp->intval.value);
1254 battmgr->wireless.current_max = le32_to_cpu(resp->intval.value);
1257 dev_warn(battmgr->dev, "unknown property %#x\n", property);
1262 battmgr->error = 0;
1265 dev_warn(battmgr->dev, "unknown message %#x\n", opcode);
1270 complete(&battmgr->ack);
1277 unsigned int opcode = le32_to_cpu(hdr->opcode);
1281 else if (battmgr->variant == QCOM_BATTMGR_SC8280XP)
1299 dev_err(battmgr->dev, "failed to request power notifications\n");
1307 battmgr->service_up = true;
1308 schedule_work(&battmgr->enable_work);
1310 battmgr->service_up = false;
1315 { .compatible = "qcom,sc8180x-pmic-glink", .data = (void *)QCOM_BATTMGR_SC8280XP },
1316 { .compatible = "qcom,sc8280xp-pmic-glink", .data = (void *)QCOM_BATTMGR_SC8280XP },
1317 { .compatible = "qcom,x1e80100-pmic-glink", .data = (void *)QCOM_BATTMGR_SC8280XP },
1331 struct device *dev = &adev->dev;
1335 return -ENOMEM;
1337 battmgr->dev = dev;
1340 psy_cfg.fwnode = dev_fwnode(&adev->dev);
1343 psy_cfg_supply.fwnode = dev_fwnode(&adev->dev);
1347 INIT_WORK(&battmgr->enable_work, qcom_battmgr_enable_worker);
1348 mutex_init(&battmgr->lock);
1349 init_completion(&battmgr->ack);
1351 match = of_match_device(qcom_battmgr_of_variants, dev->parent);
1353 battmgr->variant = (unsigned long)match->data;
1355 battmgr->variant = QCOM_BATTMGR_SM8350;
1357 if (battmgr->variant == QCOM_BATTMGR_SC8280XP) {
1358 battmgr->bat_psy = devm_power_supply_register(dev, &sc8280xp_bat_psy_desc, &psy_cfg);
1359 if (IS_ERR(battmgr->bat_psy))
1360 return dev_err_probe(dev, PTR_ERR(battmgr->bat_psy),
1363 battmgr->ac_psy = devm_power_supply_register(dev, &sc8280xp_ac_psy_desc, &psy_cfg_supply);
1364 if (IS_ERR(battmgr->ac_psy))
1365 return dev_err_probe(dev, PTR_ERR(battmgr->ac_psy),
1368 battmgr->usb_psy = devm_power_supply_register(dev, &sc8280xp_usb_psy_desc, &psy_cfg_supply);
1369 if (IS_ERR(battmgr->usb_psy))
1370 return dev_err_probe(dev, PTR_ERR(battmgr->usb_psy),
1373 battmgr->wls_psy = devm_power_supply_register(dev, &sc8280xp_wls_psy_desc, &psy_cfg_supply);
1374 if (IS_ERR(battmgr->wls_psy))
1375 return dev_err_probe(dev, PTR_ERR(battmgr->wls_psy),
1378 battmgr->bat_psy = devm_power_supply_register(dev, &sm8350_bat_psy_desc, &psy_cfg);
1379 if (IS_ERR(battmgr->bat_psy))
1380 return dev_err_probe(dev, PTR_ERR(battmgr->bat_psy),
1383 battmgr->usb_psy = devm_power_supply_register(dev, &sm8350_usb_psy_desc, &psy_cfg_supply);
1384 if (IS_ERR(battmgr->usb_psy))
1385 return dev_err_probe(dev, PTR_ERR(battmgr->usb_psy),
1388 battmgr->wls_psy = devm_power_supply_register(dev, &sm8350_wls_psy_desc, &psy_cfg_supply);
1389 if (IS_ERR(battmgr->wls_psy))
1390 return dev_err_probe(dev, PTR_ERR(battmgr->wls_psy),
1394 battmgr->client = devm_pmic_glink_client_alloc(dev, PMIC_GLINK_OWNER_BATTMGR,
1398 if (IS_ERR(battmgr->client))
1399 return PTR_ERR(battmgr->client);
1401 pmic_glink_client_register(battmgr->client);
1407 { .name = "pmic_glink.power-supply", },
1420 MODULE_DESCRIPTION("Qualcomm PMIC GLINK battery manager driver");