Lines Matching +full:dead +full:- +full:volt

1 // SPDX-License-Identifier: GPL-2.0+
12 #include <linux/devm-helpers.h>
100 struct regmap *map = chip->regmap;
107 /* The value is converted into deci-centigrade scale */
119 ret = power_supply_am_i_supplied(chip->battery);
130 * The MAX170xx has builtin end-of-charge detection and will update
135 * continuously once end-of-charge detection kicks in, so allow the
139 ret = regmap_read(chip->regmap, MAX17042_FullCAP, &charge_full);
143 ret = regmap_read(chip->regmap, MAX17042_RepCap, &charge_now);
147 if ((charge_full - charge_now) <= MAX17042_FULL_THRESHOLD) {
156 if (!chip->pdata->enable_current_sense) {
161 ret = regmap_read(chip->regmap, MAX17042_AvgCurrent, &data);
166 avg_current *= 1562500 / chip->pdata->r_sns;
181 ret = regmap_read(chip->regmap, MAX17042_AvgVCELL, &val);
185 /* bits [0-3] unused */
190 ret = regmap_read(chip->regmap, MAX17042_VCELL, &val);
194 /* bits [0-3] unused */
199 if (vavg < chip->pdata->vmin) {
204 if (vbatt > chip->pdata->vmax + MAX17042_VMAX_TOLERANCE) {
213 if (temp < chip->pdata->temp_min) {
218 if (temp > chip->pdata->temp_max) {
237 struct regmap *map = chip->regmap;
242 if (!chip->init_complete)
243 return -EAGAIN;
247 ret = max17042_get_status(chip, &val->intval);
257 val->intval = 0;
259 val->intval = 1;
262 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
269 val->intval = data;
276 val->intval = data >> 8;
277 val->intval *= 20000; /* Units of LSB = 20mV */
284 val->intval = (data & 0xff) * 20000; /* Units of 20mV */
287 if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042)
294 val->intval = data >> 7;
295 val->intval *= 10000; /* Units of LSB = 10mV */
302 val->intval = data * 625 / 8;
309 val->intval = data * 625 / 8;
316 val->intval = data * 625 / 8;
319 if (chip->pdata->enable_current_sense)
326 val->intval = data >> 8;
334 do_div(data64, chip->pdata->r_sns);
335 val->intval = data64;
343 do_div(data64, chip->pdata->r_sns);
344 val->intval = data64;
352 do_div(data64, chip->pdata->r_sns);
353 val->intval = data64;
361 val->intval = div_s64(data64, chip->pdata->r_sns);
364 ret = max17042_get_temperature(chip, &val->intval);
372 /* LSB is Alert Minimum. In deci-centigrade */
373 val->intval = sign_extend32(data & 0xff, 7) * 10;
379 /* MSB is Alert Maximum. In deci-centigrade */
380 val->intval = sign_extend32(data >> 8, 7) * 10;
383 val->intval = chip->pdata->temp_min;
386 val->intval = chip->pdata->temp_max;
389 ret = max17042_get_battery_health(chip, &val->intval);
394 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
397 if (chip->pdata->enable_current_sense) {
403 val->intval = div_s64(data64, chip->pdata->r_sns);
405 return -EINVAL;
409 if (chip->pdata->enable_current_sense) {
415 val->intval = div_s64(data64, chip->pdata->r_sns);
417 return -EINVAL;
426 val->intval = div_s64(data64, chip->pdata->r_sns);
433 val->intval = data * 5625 / 1000;
436 return -EINVAL;
446 struct regmap *map = chip->regmap;
457 /* Input in deci-centigrade, convert to centigrade */
458 temp = val->intval / 10;
461 temp = (int8_t)(data >> 8) - 1;
471 /* Input in Deci-Centigrade, convert to centigrade */
472 temp = val->intval / 10;
481 ret = -EINVAL;
514 ret = -EIO;
515 retries--;
534 struct regmap *map = chip->regmap;
542 struct regmap *map = chip->regmap;
551 struct regmap *map = chip->regmap;
556 chip->pdata->config_data->cell_char_tbl[i]);
562 struct regmap *map = chip->regmap;
578 dev_err(chip->dev, "%s compare failed\n", __func__);
580 dev_info(chip->dev, "0x%x, 0x%x",
582 dev_info(chip->dev, "\n");
583 return -EINVAL;
591 int table_size = ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl);
596 return -ENOMEM;
606 chip->pdata->config_data->cell_char_tbl,
619 int table_size = ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl);
625 return -ENOMEM;
631 ret = -EINVAL;
639 struct max17042_config_data *config = chip->pdata->config_data;
640 struct regmap *map = chip->regmap;
642 regmap_write(map, MAX17042_CONFIG, config->config);
643 regmap_write(map, MAX17042_LearnCFG, config->learn_cfg);
645 config->filter_cfg);
646 regmap_write(map, MAX17042_RelaxCFG, config->relax_cfg);
647 if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047 ||
648 chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050 ||
649 chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055)
651 config->full_soc_thresh);
656 struct max17042_config_data *config = chip->pdata->config_data;
657 struct regmap *map = chip->regmap;
659 max17042_write_verify_reg(map, MAX17042_RCOMP0, config->rcomp0);
660 max17042_write_verify_reg(map, MAX17042_TempCo, config->tcompc0);
661 max17042_write_verify_reg(map, MAX17042_ICHGTerm, config->ichgt_term);
662 if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) {
663 regmap_write(map, MAX17042_EmptyTempCo, config->empty_tempco);
665 config->kempty0);
668 config->qrtbl00);
670 config->qrtbl10);
672 config->qrtbl20);
674 config->qrtbl30);
680 struct max17042_config_data *config = chip->pdata->config_data;
681 struct regmap *map = chip->regmap;
684 config->fullcap);
685 regmap_write(map, MAX17042_DesignCap, config->design_cap);
687 config->fullcapnom);
693 struct regmap *map = chip->regmap;
706 struct max17042_config_data *config = chip->pdata->config_data;
707 struct regmap *map = chip->regmap;
723 dq_acc = config->fullcap / dQ_ACC_DIV;
728 config->fullcap);
730 config->design_cap);
732 config->fullcapnom);
744 struct regmap *map = chip->regmap;
745 struct max17042_config_data *config = chip->pdata->config_data;
747 max17042_override_por(map, MAX17042_TGAIN, config->tgain);
748 max17042_override_por(map, MAX17042_TOFF, config->toff);
749 max17042_override_por(map, MAX17042_CGAIN, config->cgain);
750 max17042_override_por(map, MAX17042_COFF, config->coff);
752 max17042_override_por(map, MAX17042_VALRT_Th, config->valrt_thresh);
753 max17042_override_por(map, MAX17042_TALRT_Th, config->talrt_thresh);
755 config->soc_alrt_thresh);
756 max17042_override_por(map, MAX17042_CONFIG, config->config);
757 max17042_override_por(map, MAX17042_SHDNTIMER, config->shdntimer);
759 max17042_override_por(map, MAX17042_DesignCap, config->design_cap);
760 max17042_override_por(map, MAX17042_ICHGTerm, config->ichgt_term);
762 max17042_override_por(map, MAX17042_AtRate, config->at_rate);
763 max17042_override_por(map, MAX17042_LearnCFG, config->learn_cfg);
764 max17042_override_por(map, MAX17042_FilterCFG, config->filter_cfg);
765 max17042_override_por(map, MAX17042_RelaxCFG, config->relax_cfg);
766 max17042_override_por(map, MAX17042_MiscCFG, config->misc_cfg);
768 max17042_override_por(map, MAX17042_FullCAP, config->fullcap);
769 max17042_override_por(map, MAX17042_FullCAPNom, config->fullcapnom);
770 max17042_override_por(map, MAX17042_dQacc, config->dqacc);
771 max17042_override_por(map, MAX17042_dPacc, config->dpacc);
773 max17042_override_por(map, MAX17042_RCOMP0, config->rcomp0);
774 max17042_override_por(map, MAX17042_TempCo, config->tcompc0);
776 if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) {
777 max17042_override_por(map, MAX17042_MaskSOC, config->masksoc);
778 max17042_override_por(map, MAX17042_SOC_empty, config->socempty);
779 max17042_override_por(map, MAX17042_V_empty, config->vempty);
780 max17042_override_por(map, MAX17042_EmptyTempCo, config->empty_tempco);
781 max17042_override_por(map, MAX17042_K_empty0, config->kempty0);
784 if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) ||
785 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) ||
786 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050)) {
787 max17042_override_por(map, MAX17042_IAvg_empty, config->iavg_empty);
788 max17042_override_por(map, MAX17042_TempNom, config->temp_nom);
789 max17042_override_por(map, MAX17042_TempLim, config->temp_lim);
790 max17042_override_por(map, MAX17042_FCTC, config->fctc);
793 if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) ||
794 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050) ||
795 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055)) {
796 max17042_override_por(map, MAX17047_V_empty, config->vempty);
802 struct regmap *map = chip->regmap;
817 dev_err(chip->dev, "%s init failed\n",
819 return -EIO;
824 dev_err(chip->dev, "%s lock verify failed\n",
826 return -EIO;
852 struct regmap *map = chip->regmap;
858 if (chip->pdata->enable_current_sense)
865 soc_tr |= soc - off;
875 ret = regmap_read(chip->regmap, MAX17042_STATUS, &val);
880 dev_dbg(chip->dev, "SOC threshold INTR\n");
885 regmap_clear_bits(chip->regmap, MAX17042_STATUS,
888 power_supply_changed(chip->battery);
899 if (chip->pdata->enable_por_init && chip->pdata->config_data) {
905 chip->init_complete = 1;
912 struct device *dev = chip->dev;
913 struct device_node *np = dev->of_node;
923 * current-sense functionality to be enabled at all.
925 if (of_property_read_u32(np, "maxim,rsns-microohm", &prop) == 0) {
926 pdata->r_sns = prop;
927 pdata->enable_current_sense = true;
930 if (of_property_read_s32(np, "maxim,cold-temp", &pdata->temp_min))
931 pdata->temp_min = INT_MIN;
932 if (of_property_read_s32(np, "maxim,over-heat-temp", &pdata->temp_max))
933 pdata->temp_max = INT_MAX;
934 if (of_property_read_s32(np, "maxim,dead-volt", &pdata->vmin))
935 pdata->vmin = INT_MIN;
936 if (of_property_read_s32(np, "maxim,over-volt", &pdata->vmax))
937 pdata->vmax = INT_MAX;
945 * Some firmwares do not set FullSOCThr, Enable End-of-Charge Detection
954 struct device *dev = chip->dev;
960 * the firmware will already have initialized the fuel-gauge and provide
967 if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) ||
968 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050)) {
969 pdata->init_data = max17047_default_pdata_init_regs;
970 pdata->num_init_data =
974 ret = regmap_read(chip->regmap, MAX17042_MiscCFG, &misc_cfg);
978 /* If bits 0-1 are set to 3 then only Voltage readings are used */
980 pdata->enable_current_sense = false;
982 pdata->enable_current_sense = true;
984 pdata->vmin = MAX17042_DEFAULT_VMIN;
985 pdata->vmax = MAX17042_DEFAULT_VMAX;
986 pdata->temp_min = MAX17042_DEFAULT_TEMP_MIN;
987 pdata->temp_max = MAX17042_DEFAULT_TEMP_MAX;
995 struct device *dev = chip->dev;
998 if (dev->of_node)
1001 if (dev->platform_data)
1002 return dev->platform_data;
1032 .num_properties = ARRAY_SIZE(max17042_battery_props) - 2,
1038 struct i2c_adapter *adapter = client->adapter;
1047 return -EIO;
1051 return -ENOMEM;
1053 chip->dev = dev;
1054 chip->chip_type = chip_type;
1055 chip->regmap = devm_regmap_init_i2c(client, &max17042_regmap_config);
1056 if (IS_ERR(chip->regmap)) {
1058 return -EINVAL;
1061 chip->pdata = max17042_get_pdata(chip);
1062 if (!chip->pdata) {
1064 return -EINVAL;
1073 if (!chip->pdata->enable_current_sense)
1076 if (chip->pdata->r_sns == 0)
1077 chip->pdata->r_sns = MAX17042_DEFAULT_SNS_RESISTOR;
1079 if (chip->pdata->init_data)
1080 for (i = 0; i < chip->pdata->num_init_data; i++)
1081 regmap_write(chip->regmap,
1082 chip->pdata->init_data[i].addr,
1083 chip->pdata->init_data[i].data);
1085 if (!chip->pdata->enable_current_sense) {
1086 regmap_write(chip->regmap, MAX17042_CGAIN, 0x0000);
1087 regmap_write(chip->regmap, MAX17042_MiscCFG, 0x0003);
1088 regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007);
1091 chip->battery = devm_power_supply_register(dev, max17042_desc,
1093 if (IS_ERR(chip->battery)) {
1095 return PTR_ERR(chip->battery);
1104 chip->battery->desc->name,
1107 regmap_update_bits(chip->regmap, MAX17042_CONFIG,
1113 if (ret != -EBUSY)
1117 /* Not able to update the charge threshold when exceeded? -> disable */
1119 regmap_write(chip->regmap, MAX17042_SALRT_Th, 0xff00);
1121 chip->irq = irq;
1123 regmap_read(chip->regmap, MAX17042_STATUS, &val);
1125 ret = devm_work_autocancel(dev, &chip->work,
1129 schedule_work(&chip->work);
1131 chip->init_complete = 1;
1141 struct device *dev = &client->dev;
1145 chip_type = id->driver_data;
1147 acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev);
1149 return -ENODEV;
1151 chip_type = acpi_id->driver_data;
1154 return max17042_probe(client, dev, client->irq, chip_type);
1159 struct device *dev = &pdev->dev;
1164 i2c = to_i2c_client(pdev->dev.parent);
1166 return -EINVAL;
1168 dev->of_node = dev->parent->of_node;
1172 return max17042_probe(i2c, dev, irq, id->driver_data);
1184 if (chip->irq) {
1185 disable_irq(chip->irq);
1186 enable_irq_wake(chip->irq);
1196 if (chip->irq) {
1197 disable_irq_wake(chip->irq);
1198 enable_irq(chip->irq);
1199 /* re-program the SOC thresholds to 1% change */
1237 { .compatible = "maxim,max77705-battery",
1239 { .compatible = "maxim,max77849-battery",
1251 { "max77849-battery", MAXIM_DEVICE_TYPE_MAX17047 },
1261 { "max77705-battery", MAXIM_DEVICE_TYPE_MAX17047 },
1262 { "max77849-battery", MAXIM_DEVICE_TYPE_MAX17047 },