Lines Matching +full:energy +full:- +full:empty

1 // SPDX-License-Identifier: GPL-2.0
7 * Copyright (C) 2010-2011 Lars-Peter Clausen <lars@metafoo.de>
19 * https://www.ti.com/product/bq27510-g1
20 * https://www.ti.com/product/bq27510-g2
21 * https://www.ti.com/product/bq27510-g3
22 * https://www.ti.com/product/bq27520-g1
23 * https://www.ti.com/product/bq27520-g2
24 * https://www.ti.com/product/bq27520-g3
25 * https://www.ti.com/product/bq27520-g4
26 * https://www.ti.com/product/bq27530-g1
27 * https://www.ti.com/product/bq27531-g1
28 * https://www.ti.com/product/bq27541-g1
29 * https://www.ti.com/product/bq27542-g1
30 * https://www.ti.com/product/bq27546-g1
31 * https://www.ti.com/product/bq27742-g1
32 * https://www.ti.com/product/bq27545-g1
33 * https://www.ti.com/product/bq27421-g1
34 * https://www.ti.com/product/bq27425-g1
36 * https://www.ti.com/product/bq27411-g1
37 * https://www.ti.com/product/bq27441-g1
38 * https://www.ti.com/product/bq27621-g1
41 * https://www.ti.com/product/bq34z100-g1
63 #define BQ27XXX_FLAG_SOCF BIT(1) /* State-of-Charge threshold final */
64 #define BQ27XXX_FLAG_SOC1 BIT(2) /* State-of-Charge threshold 1 */
73 #define BQ27000_FLAG_EDVF BIT(0) /* Final End-of-Discharge-Voltage flag */
74 #define BQ27000_FLAG_EDV1 BIT(1) /* First End-of-Discharge-Voltage flag */
97 * bq27xxx_reg_index - Register names
109 BQ27XXX_REG_TTE, /* Time-to-Empty */
110 BQ27XXX_REG_TTF, /* Time-to-Full */
111 BQ27XXX_REG_TTES, /* Time-to-Empty Standby */
112 BQ27XXX_REG_TTECP, /* Time-to-Empty at Constant Power */
117 BQ27XXX_REG_AE, /* Available Energy */
118 BQ27XXX_REG_SOC, /* State-of-Charge */
1059 * struct bq27xxx_dm_buf - chip data memory buffer
1076 .class = (di)->dm_regs[i].subclass_id, \
1077 .block = (di)->dm_regs[i].offset / BQ27XXX_DM_SZ, \
1083 if (buf->class == reg->subclass_id && in bq27xxx_dm_reg_ptr()
1084 buf->block == reg->offset / BQ27XXX_DM_SZ) in bq27xxx_dm_reg_ptr()
1085 return (__be16 *) (buf->data + reg->offset % BQ27XXX_DM_SZ); in bq27xxx_dm_reg_ptr()
1091 [BQ27XXX_DM_DESIGN_CAPACITY] = "design-capacity",
1092 [BQ27XXX_DM_DESIGN_ENERGY] = "design-energy",
1093 [BQ27XXX_DM_TERMINATE_VOLTAGE] = "terminate-voltage",
1100 "Devicetree monitored-battery config updates data memory on NVM/flash chips.\n"
1111 unsigned int prev_val = *(unsigned int *) kp->arg; in poll_interval_param_set()
1115 if (ret < 0 || prev_val == *(unsigned int *) kp->arg) in poll_interval_param_set()
1120 mod_delayed_work(system_wq, &di->work, 0); in poll_interval_param_set()
1134 "battery poll interval in seconds - 0 disables polling");
1145 if (!di || di->regs[reg_index] == INVALID_REG_ADDR) in bq27xxx_read()
1146 return -EINVAL; in bq27xxx_read()
1148 ret = di->bus.read(di, di->regs[reg_index], single); in bq27xxx_read()
1150 dev_dbg(di->dev, "failed to read register 0x%02x (index %d)\n", in bq27xxx_read()
1151 di->regs[reg_index], reg_index); in bq27xxx_read()
1161 if (!di || di->regs[reg_index] == INVALID_REG_ADDR) in bq27xxx_write()
1162 return -EINVAL; in bq27xxx_write()
1164 if (!di->bus.write) in bq27xxx_write()
1165 return -EPERM; in bq27xxx_write()
1167 ret = di->bus.write(di, di->regs[reg_index], value, single); in bq27xxx_write()
1169 dev_dbg(di->dev, "failed to write register 0x%02x (index %d)\n", in bq27xxx_write()
1170 di->regs[reg_index], reg_index); in bq27xxx_write()
1180 if (!di || di->regs[reg_index] == INVALID_REG_ADDR) in bq27xxx_read_block()
1181 return -EINVAL; in bq27xxx_read_block()
1183 if (!di->bus.read_bulk) in bq27xxx_read_block()
1184 return -EPERM; in bq27xxx_read_block()
1186 ret = di->bus.read_bulk(di, di->regs[reg_index], data, len); in bq27xxx_read_block()
1188 dev_dbg(di->dev, "failed to read_bulk register 0x%02x (index %d)\n", in bq27xxx_read_block()
1189 di->regs[reg_index], reg_index); in bq27xxx_read_block()
1199 if (!di || di->regs[reg_index] == INVALID_REG_ADDR) in bq27xxx_write_block()
1200 return -EINVAL; in bq27xxx_write_block()
1202 if (!di->bus.write_bulk) in bq27xxx_write_block()
1203 return -EPERM; in bq27xxx_write_block()
1205 ret = di->bus.write_bulk(di, di->regs[reg_index], data, len); in bq27xxx_write_block()
1207 dev_dbg(di->dev, "failed to write_bulk register 0x%02x (index %d)\n", in bq27xxx_write_block()
1208 di->regs[reg_index], reg_index); in bq27xxx_write_block()
1219 dev_err(di->dev, "bus error on seal: %d\n", ret); in bq27xxx_battery_seal()
1230 if (di->unseal_key == 0) { in bq27xxx_battery_unseal()
1231 dev_err(di->dev, "unseal failed due to missing key\n"); in bq27xxx_battery_unseal()
1232 return -EINVAL; in bq27xxx_battery_unseal()
1235 ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, (u16)(di->unseal_key >> 16), false); in bq27xxx_battery_unseal()
1239 ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, (u16)di->unseal_key, false); in bq27xxx_battery_unseal()
1246 dev_err(di->dev, "bus error on unseal: %d\n", ret); in bq27xxx_battery_unseal()
1256 sum += buf->data[i]; in bq27xxx_battery_checksum_dm_block()
1259 return 0xff - sum; in bq27xxx_battery_checksum_dm_block()
1267 buf->has_data = false; in bq27xxx_battery_read_dm_block()
1269 ret = bq27xxx_write(di, BQ27XXX_DM_CLASS, buf->class, true); in bq27xxx_battery_read_dm_block()
1273 ret = bq27xxx_write(di, BQ27XXX_DM_BLOCK, buf->block, true); in bq27xxx_battery_read_dm_block()
1279 ret = bq27xxx_read_block(di, BQ27XXX_DM_DATA, buf->data, BQ27XXX_DM_SZ); in bq27xxx_battery_read_dm_block()
1288 ret = -EINVAL; in bq27xxx_battery_read_dm_block()
1292 buf->has_data = true; in bq27xxx_battery_read_dm_block()
1293 buf->dirty = false; in bq27xxx_battery_read_dm_block()
1298 dev_err(di->dev, "bus error reading chip memory: %d\n", ret); in bq27xxx_battery_read_dm_block()
1307 struct bq27xxx_dm_reg *reg = &di->dm_regs[reg_id];
1312 dev_warn(di->dev, "buffer does not match %s dm spec\n", str);
1316 if (reg->bytes != 2) {
1317 dev_warn(di->dev, "%s dm spec has unsupported byte size\n", str);
1321 if (!buf->has_data)
1325 dev_info(di->dev, "%s has %u\n", str, val);
1330 if (!(di->opts & BQ27XXX_O_RAM) && !bq27xxx_dt_to_nvm) {
1332 if (!(di->opts & BQ27XXX_O_RAM)) {
1335 dev_warn(di->dev, "%s has %u; update to %u disallowed "
1345 dev_info(di->dev, "update %s to %u\n", str, val);
1348 buf->dirty = true;
1366 } while (!!(ret & BQ27XXX_FLAG_CFGUP) != active && --try);
1368 if (!try && di->chip != BQ27425) { // 425 has a bug
1369 dev_err(di->dev, "timed out waiting for cfgupdate flag %d\n", active);
1370 return -EINVAL;
1373 if (limit - try > 3)
1374 dev_warn(di->dev, "cfgupdate %d, retries %d\n", active, limit - try);
1382 if (ret < 0 && ret != -EINVAL)
1383 dev_err(di->dev, "bus error on set_cfgupdate: %d\n", ret);
1391 if (ret < 0 && ret != -EINVAL)
1392 dev_err(di->dev, "bus error on soft_reset: %d\n", ret);
1400 bool cfgup = di->opts & BQ27XXX_O_CFGUP;
1403 if (!buf->dirty)
1416 ret = bq27xxx_write(di, BQ27XXX_DM_CLASS, buf->class, true);
1420 ret = bq27xxx_write(di, BQ27XXX_DM_BLOCK, buf->block, true);
1426 ret = bq27xxx_write_block(di, BQ27XXX_DM_DATA, buf->data, BQ27XXX_DM_SZ);
1449 buf->dirty = false;
1457 dev_err(di->dev, "bus error writing chip memory: %d\n", ret);
1471 if (info->charge_full_design_uah != -EINVAL &&
1472 info->energy_full_design_uwh != -EINVAL) {
1474 /* assume design energy & capacity are in same block */
1477 info->charge_full_design_uah / 1000);
1480 info->energy_full_design_uwh / 1000);
1483 if (info->voltage_min_design_uv != -EINVAL) {
1489 info->voltage_min_design_uv / 1000);
1499 if (updated && !(di->opts & BQ27XXX_O_CFGUP)) {
1511 if (power_supply_get_battery_info(di->bat, &info) < 0)
1514 if (!di->dm_regs) {
1515 dev_warn(di->dev, "data memory update not supported for chip\n");
1519 if (info->energy_full_design_uwh != info->charge_full_design_uah) {
1520 if (info->energy_full_design_uwh == -EINVAL)
1521 dev_warn(di->dev, "missing battery:energy-full-design-microwatt-hours\n");
1522 else if (info->charge_full_design_uah == -EINVAL)
1523 dev_warn(di->dev, "missing battery:charge-full-design-microamp-hours\n");
1527 max = di->dm_regs[BQ27XXX_DM_DESIGN_ENERGY].max;
1528 if (info->energy_full_design_uwh > max * 1000) {
1529 dev_err(di->dev, "invalid battery:energy-full-design-microwatt-hours %d\n",
1530 info->energy_full_design_uwh);
1531 info->energy_full_design_uwh = -EINVAL;
1535 max = di->dm_regs[BQ27XXX_DM_DESIGN_CAPACITY].max;
1536 if (info->charge_full_design_uah > max * 1000) {
1537 dev_err(di->dev, "invalid battery:charge-full-design-microamp-hours %d\n",
1538 info->charge_full_design_uah);
1539 info->charge_full_design_uah = -EINVAL;
1542 min = di->dm_regs[BQ27XXX_DM_TERMINATE_VOLTAGE].min;
1543 max = di->dm_regs[BQ27XXX_DM_TERMINATE_VOLTAGE].max;
1544 if ((info->voltage_min_design_uv < min * 1000 ||
1545 info->voltage_min_design_uv > max * 1000) &&
1546 info->voltage_min_design_uv != -EINVAL) {
1547 dev_err(di->dev, "invalid battery:voltage-min-design-microvolt %d\n",
1548 info->voltage_min_design_uv);
1549 info->voltage_min_design_uv = -EINVAL;
1552 if ((info->energy_full_design_uwh != -EINVAL &&
1553 info->charge_full_design_uah != -EINVAL) ||
1554 info->voltage_min_design_uv != -EINVAL)
1559 * Return the battery State-of-Charge
1566 if (di->opts & BQ27XXX_O_SOC_SI)
1572 dev_dbg(di->dev, "error reading State-of-Charge\n");
1587 dev_dbg(di->dev, "error reading charge register %02x: %d\n",
1592 if (di->opts & BQ27XXX_O_ZERO)
1635 if (di->opts & BQ27XXX_O_ZERO)
1641 dev_dbg(di->dev, "error reading initial last measured discharge\n");
1645 if (di->opts & BQ27XXX_O_ZERO)
1654 * Return the battery Available energy in µWh
1663 dev_dbg(di->dev, "error reading available energy\n");
1667 if (di->opts & BQ27XXX_O_ZERO)
1685 dev_err(di->dev, "error reading temperature\n");
1689 if (di->opts & BQ27XXX_O_ZERO)
1705 dev_err(di->dev, "error reading cycle count total\n");
1720 dev_dbg(di->dev, "error reading time register %02x: %d\n",
1726 return -ENODATA;
1736 if (di->opts & BQ27XXX_O_OTDC)
1738 if (di->opts & BQ27XXX_O_UTOT)
1749 if (di->opts & BQ27XXX_O_UTOT)
1760 if (di->opts & BQ27XXX_O_ZERO)
1762 else if (di->opts & BQ27Z561_O_BITS)
1774 if (di->opts & BQ27XXX_O_HAS_CI)
1783 if (unlikely(bq27xxx_battery_overtemp(di, di->cache.flags)))
1785 if (unlikely(bq27xxx_battery_undertemp(di, di->cache.flags)))
1787 if (unlikely(bq27xxx_battery_dead(di, di->cache.flags)))
1789 if (unlikely(bq27xxx_battery_capacity_inaccurate(di, di->cache.flags)))
1797 if (di->opts & BQ27XXX_O_ZERO)
1799 else if (di->opts & BQ27Z561_O_BITS)
1816 bool single_flags = (di->opts & BQ27XXX_O_ZERO);
1822 dev_err(di->dev, "error reading current\n");
1827 flags = cache->flags;
1831 dev_err(di->dev, "error reading flags\n");
1836 if (di->opts & BQ27XXX_O_ZERO) {
1838 dev_dbg(di->dev, "negative current!\n");
1839 curr = -curr;
1849 val_curr->intval = curr;
1853 val_status->intval = POWER_SUPPLY_STATUS_CHARGING;
1855 val_status->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1858 val_status->intval = POWER_SUPPLY_STATUS_FULL;
1860 val_status->intval =
1870 union power_supply_propval status = di->last_status;
1872 bool has_singe_flag = di->opts & BQ27XXX_O_ZERO;
1876 cache.flags = -1; /* read error */
1879 if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR)
1881 if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR)
1883 if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR)
1888 if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR)
1889 cache.energy = bq27xxx_battery_read_energy(di);
1890 di->cache.flags = cache.flags;
1892 if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR)
1897 * checked to detect charging <-> discharging status changes.
1899 if (!(di->opts & BQ27XXX_O_ZERO))
1903 if (di->charge_design_full <= 0)
1904 di->charge_design_full = bq27xxx_battery_read_dcap(di);
1907 if ((di->cache.capacity != cache.capacity) ||
1908 (di->cache.flags != cache.flags) ||
1909 (di->last_status.intval != status.intval)) {
1910 di->last_status.intval = status.intval;
1911 power_supply_changed(di->bat);
1914 if (memcmp(&di->cache, &cache, sizeof(cache)) != 0)
1915 di->cache = cache;
1917 di->last_update = jiffies;
1919 if (!di->removed && poll_interval > 0)
1920 mod_delayed_work(system_wq, &di->work, poll_interval * HZ);
1925 mutex_lock(&di->lock);
1927 mutex_unlock(&di->lock);
1951 dev_err(di->dev,
1957 if (di->opts & BQ27XXX_O_ZERO)
1958 val->intval = (power * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS;
1961 val->intval = (int)((s16)power) * 10000;
1971 if (di->opts & BQ27XXX_O_ZERO) {
1972 if (di->cache.flags & BQ27000_FLAG_FC)
1974 else if (di->cache.flags & BQ27000_FLAG_EDVF)
1976 else if (di->cache.flags & BQ27000_FLAG_EDV1)
1980 } else if (di->opts & BQ27Z561_O_BITS) {
1981 if (di->cache.flags & BQ27Z561_FLAG_FC)
1983 else if (di->cache.flags & BQ27Z561_FLAG_FDC)
1988 if (di->cache.flags & BQ27XXX_FLAG_FC)
1990 else if (di->cache.flags & BQ27XXX_FLAG_SOCF)
1992 else if (di->cache.flags & BQ27XXX_FLAG_SOC1)
1998 val->intval = level;
2014 dev_err(di->dev, "error reading voltage\n");
2018 val->intval = volt * 1000;
2029 val->intval = value;
2041 mutex_lock(&di->lock);
2042 if (time_is_before_jiffies(di->last_update + 5 * HZ))
2044 mutex_unlock(&di->lock);
2046 if (psp != POWER_SUPPLY_PROP_PRESENT && di->cache.flags < 0)
2047 return -ENODEV;
2057 val->intval = di->cache.flags < 0 ? 0 : 1;
2063 ret = bq27xxx_simple_value(di->cache.capacity, val);
2069 ret = bq27xxx_simple_value(di->cache.temperature, val);
2071 val->intval -= 2731; /* convert decidegree k to c */
2074 ret = bq27xxx_simple_value(di->cache.time_to_empty, val);
2077 ret = bq27xxx_simple_value(di->cache.time_to_empty_avg, val);
2080 ret = bq27xxx_simple_value(di->cache.time_to_full, val);
2083 if (di->opts & BQ27XXX_O_MUL_CHEM)
2084 val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
2086 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
2089 if (di->regs[BQ27XXX_REG_NAC] != INVALID_REG_ADDR)
2095 ret = bq27xxx_simple_value(di->cache.charge_full, val);
2098 ret = bq27xxx_simple_value(di->charge_design_full, val);
2106 return -EINVAL;
2108 ret = bq27xxx_simple_value(di->cache.cycle_count, val);
2111 ret = bq27xxx_simple_value(di->cache.energy, val);
2117 ret = bq27xxx_simple_value(di->cache.health, val);
2120 val->strval = BQ27XXX_MANUFACTURER;
2123 return -EINVAL;
2134 mod_delayed_work(system_wq, &di->work, HZ / 2);
2141 .of_node = di->dev->of_node,
2145 INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll);
2146 mutex_init(&di->lock);
2148 di->regs = bq27xxx_chip_data[di->chip].regs;
2149 di->unseal_key = bq27xxx_chip_data[di->chip].unseal_key;
2150 di->dm_regs = bq27xxx_chip_data[di->chip].dm_regs;
2151 di->opts = bq27xxx_chip_data[di->chip].opts;
2153 psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL);
2155 return -ENOMEM;
2157 psy_desc->name = di->name;
2158 psy_desc->type = POWER_SUPPLY_TYPE_BATTERY;
2159 psy_desc->properties = bq27xxx_chip_data[di->chip].props;
2160 psy_desc->num_properties = bq27xxx_chip_data[di->chip].props_size;
2161 psy_desc->get_property = bq27xxx_battery_get_property;
2162 psy_desc->external_power_changed = bq27xxx_external_power_changed;
2164 di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg);
2165 if (IS_ERR(di->bat))
2166 return dev_err_probe(di->dev, PTR_ERR(di->bat),
2173 list_add(&di->list, &bq27xxx_battery_devices);
2183 list_del(&di->list);
2186 /* Set removed to avoid bq27xxx_battery_update() re-queuing the work */
2187 mutex_lock(&di->lock);
2188 di->removed = true;
2189 mutex_unlock(&di->lock);
2191 cancel_delayed_work_sync(&di->work);
2193 power_supply_unregister(di->bat);
2194 mutex_destroy(&di->lock);