// SPDX-License-Identifier: GPL-2.0-only /* * huawei-gaokun-battery - A power supply driver for HUAWEI Matebook E Go * * Copyright (C) 2024 Pengyu Luo <mitltlatltl@gmail.com>
*/
staticint gaokun_psy_get_bat_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val)
{ struct gaokun_psy *ecbat = power_supply_get_drvdata(psy);
u8 buf[GAOKUN_SMART_CHARGE_DATA_SIZE]; int ret;
if (gaokun_psy_bat_present(ecbat))
gaokun_psy_get_bat_status(ecbat); elseif (psp != POWER_SUPPLY_PROP_PRESENT) return -ENODEV;
switch (psp) { case POWER_SUPPLY_PROP_STATUS:
val->intval = ecbat->charge_now; break;
case POWER_SUPPLY_PROP_PRESENT:
val->intval = ecbat->bat_present; break;
case POWER_SUPPLY_PROP_TECHNOLOGY:
val->intval = POWER_SUPPLY_TECHNOLOGY_LION; break;
case POWER_SUPPLY_PROP_CYCLE_COUNT:
val->intval = le16_to_cpu(ecbat->info.cycle_count); break;
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
val->intval = le16_to_cpu(ecbat->info.design_voltage) * MILLI_TO_MICRO; break;
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
val->intval = le16_to_cpu(ecbat->status.voltage_now) * MILLI_TO_MICRO; break;
case POWER_SUPPLY_PROP_CURRENT_NOW:
val->intval = (s16)le16_to_cpu(ecbat->status.rate_now) * MILLI_TO_MICRO; break;
case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
val->intval = le16_to_cpu(ecbat->info.design_capacity) * MILLI_TO_MICRO; break;
case POWER_SUPPLY_PROP_CHARGE_FULL:
val->intval = le16_to_cpu(ecbat->status.full_capacity) * MILLI_TO_MICRO; break;
case POWER_SUPPLY_PROP_CHARGE_NOW:
val->intval = le16_to_cpu(ecbat->status.capacity_now) * MILLI_TO_MICRO; break;
case POWER_SUPPLY_PROP_CHARGE_CONTROL_START_THRESHOLD: case POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD:
ret = gaokun_ec_psy_get_smart_charge(ecbat->ec, buf); if (ret) return ret;
if (!gaokun_psy_bat_present(ecbat)) return -ENODEV;
ret = gaokun_ec_psy_get_smart_charge(ecbat->ec, buf); if (ret) return ret;
switch (psp) { /* * Resetting another thershold makes single thersold setting more likely * to succeed. But setting start = end makes thing strange(failure).
*/ case POWER_SUPPLY_PROP_CHARGE_CONTROL_START_THRESHOLD:
buf[SMART_CHARGE_START] = val->intval; if (buf[SMART_CHARGE_START] > buf[SMART_CHARGE_END])
buf[SMART_CHARGE_END] = buf[SMART_CHARGE_START] + 1; return gaokun_ec_psy_set_smart_charge(ecbat->ec, buf);
case POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD:
buf[SMART_CHARGE_END] = val->intval; if (buf[SMART_CHARGE_END] < buf[SMART_CHARGE_START])
buf[SMART_CHARGE_START] = buf[SMART_CHARGE_END] - 1; return gaokun_ec_psy_set_smart_charge(ecbat->ec, buf);
/* * Note that, HUAWEI calls them SBAC/GBAC and SBCM/GBCM in DSDT, they are likely * Set/Get Battery Adaptive Charging and Set/Get Battery Charging Mode.
*/
staticinlinevoid
set_charge_delay(u8 buf[GAOKUN_SMART_CHARGE_DATA_SIZE], u8 delay)
{ if (delay) {
buf[SMART_CHARGE_DELAY] = delay;
buf[SMART_CHARGE_MODE] = DELAY_MODE;
} else { /* No writing zero, there is a specific mode for it. */
buf[SMART_CHARGE_MODE] = NO_DELAY_MODE;
}
}
psy_cfg.drv_data = ecbat;
ecbat->adp_psy = devm_power_supply_register(dev, &gaokun_psy_adp_desc,
&psy_cfg); if (IS_ERR(ecbat->adp_psy)) return dev_err_probe(dev, PTR_ERR(ecbat->adp_psy), "Failed to register AC power supply\n");
psy_cfg.supplied_to = (char **)&gaokun_psy_bat_desc.name;
psy_cfg.num_supplicants = 1;
psy_cfg.no_wakeup_source = true;
psy_cfg.attr_grp = gaokun_psy_features_groups;
ecbat->bat_psy = devm_power_supply_register(dev, &gaokun_psy_bat_desc,
&psy_cfg); if (IS_ERR(ecbat->bat_psy)) return dev_err_probe(dev, PTR_ERR(ecbat->bat_psy), "Failed to register battery power supply\n");
gaokun_psy_init(ecbat);
MODULE_DESCRIPTION("HUAWEI Matebook E Go psy driver");
MODULE_LICENSE("GPL");
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.11Bemerkung:
(vorverarbeitet am 2026-06-07)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.