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