Lines Matching +full:alert +full:- +full:celsius

1 // SPDX-License-Identifier: GPL-2.0+
12 #include <linux/devm-helpers.h>
98 struct regmap *map = chip->regmap; in max17042_get_temperature()
105 /* The value is converted into deci-centigrade scale */ in max17042_get_temperature()
106 /* Units of LSB = 1 / 256 degree Celsius */ in max17042_get_temperature()
117 ret = power_supply_am_i_supplied(chip->battery); in max17042_get_status()
128 * The MAX170xx has builtin end-of-charge detection and will update in max17042_get_status()
133 * continuously once end-of-charge detection kicks in, so allow the in max17042_get_status()
137 ret = regmap_read(chip->regmap, MAX17042_FullCAP, &charge_full); in max17042_get_status()
141 ret = regmap_read(chip->regmap, MAX17042_RepCap, &charge_now); in max17042_get_status()
145 if ((charge_full - charge_now) <= MAX17042_FULL_THRESHOLD) { in max17042_get_status()
154 if (!chip->pdata->enable_current_sense) { in max17042_get_status()
159 ret = regmap_read(chip->regmap, MAX17042_AvgCurrent, &data); in max17042_get_status()
164 avg_current *= 1562500 / chip->pdata->r_sns; in max17042_get_status()
179 ret = regmap_read(chip->regmap, MAX17042_AvgVCELL, &val); in max17042_get_battery_health()
183 /* bits [0-3] unused */ in max17042_get_battery_health()
188 ret = regmap_read(chip->regmap, MAX17042_VCELL, &val); in max17042_get_battery_health()
192 /* bits [0-3] unused */ in max17042_get_battery_health()
197 if (vavg < chip->pdata->vmin) { in max17042_get_battery_health()
202 if (vbatt > chip->pdata->vmax + MAX17042_VMAX_TOLERANCE) { in max17042_get_battery_health()
211 if (temp < chip->pdata->temp_min) { in max17042_get_battery_health()
216 if (temp > chip->pdata->temp_max) { in max17042_get_battery_health()
235 struct regmap *map = chip->regmap; in max17042_get_property()
240 if (!chip->init_complete) in max17042_get_property()
241 return -EAGAIN; in max17042_get_property()
245 ret = max17042_get_status(chip, &val->intval); in max17042_get_property()
255 val->intval = 0; in max17042_get_property()
257 val->intval = 1; in max17042_get_property()
260 val->intval = POWER_SUPPLY_TECHNOLOGY_LION; in max17042_get_property()
267 val->intval = data; in max17042_get_property()
274 val->intval = data >> 8; in max17042_get_property()
275 val->intval *= 20000; /* Units of LSB = 20mV */ in max17042_get_property()
282 val->intval = (data & 0xff) * 20000; /* Units of 20mV */ in max17042_get_property()
285 if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) in max17042_get_property()
292 val->intval = data >> 7; in max17042_get_property()
293 val->intval *= 10000; /* Units of LSB = 10mV */ in max17042_get_property()
300 val->intval = data * 625 / 8; in max17042_get_property()
307 val->intval = data * 625 / 8; in max17042_get_property()
314 val->intval = data * 625 / 8; in max17042_get_property()
317 if (chip->pdata->enable_current_sense) in max17042_get_property()
324 val->intval = data >> 8; in max17042_get_property()
332 do_div(data64, chip->pdata->r_sns); in max17042_get_property()
333 val->intval = data64; in max17042_get_property()
341 do_div(data64, chip->pdata->r_sns); in max17042_get_property()
342 val->intval = data64; in max17042_get_property()
350 do_div(data64, chip->pdata->r_sns); in max17042_get_property()
351 val->intval = data64; in max17042_get_property()
359 val->intval = div_s64(data64, chip->pdata->r_sns); in max17042_get_property()
362 ret = max17042_get_temperature(chip, &val->intval); in max17042_get_property()
370 /* LSB is Alert Minimum. In deci-centigrade */ in max17042_get_property()
371 val->intval = sign_extend32(data & 0xff, 7) * 10; in max17042_get_property()
377 /* MSB is Alert Maximum. In deci-centigrade */ in max17042_get_property()
378 val->intval = sign_extend32(data >> 8, 7) * 10; in max17042_get_property()
381 val->intval = chip->pdata->temp_min; in max17042_get_property()
384 val->intval = chip->pdata->temp_max; in max17042_get_property()
387 ret = max17042_get_battery_health(chip, &val->intval); in max17042_get_property()
392 val->intval = POWER_SUPPLY_SCOPE_SYSTEM; in max17042_get_property()
395 if (chip->pdata->enable_current_sense) { in max17042_get_property()
401 val->intval = div_s64(data64, chip->pdata->r_sns); in max17042_get_property()
403 return -EINVAL; in max17042_get_property()
407 if (chip->pdata->enable_current_sense) { in max17042_get_property()
413 val->intval = div_s64(data64, chip->pdata->r_sns); in max17042_get_property()
415 return -EINVAL; in max17042_get_property()
424 val->intval = div_s64(data64, chip->pdata->r_sns); in max17042_get_property()
431 val->intval = data * 5625 / 1000; in max17042_get_property()
434 return -EINVAL; in max17042_get_property()
444 struct regmap *map = chip->regmap; in max17042_set_property()
455 /* Input in deci-centigrade, convert to centigrade */ in max17042_set_property()
456 temp = val->intval / 10; in max17042_set_property()
459 temp = (int8_t)(data >> 8) - 1; in max17042_set_property()
460 /* Write both MAX and MIN ALERT */ in max17042_set_property()
469 /* Input in Deci-Centigrade, convert to centigrade */ in max17042_set_property()
470 temp = val->intval / 10; in max17042_set_property()
474 /* Write both MAX and MIN ALERT */ in max17042_set_property()
479 ret = -EINVAL; in max17042_set_property()
517 ret = -EIO; in max17042_write_verify_reg()
518 retries--; in max17042_write_verify_reg()
537 struct regmap *map = chip->regmap; in max17042_unlock_model()
545 struct regmap *map = chip->regmap; in max17042_lock_model()
554 struct regmap *map = chip->regmap; in max17042_write_model_data()
559 chip->pdata->config_data->cell_char_tbl[i]); in max17042_write_model_data()
565 struct regmap *map = chip->regmap; in max17042_read_model_data()
581 dev_err(&chip->client->dev, "%s compare failed\n", __func__); in max17042_model_data_compare()
583 dev_info(&chip->client->dev, "0x%x, 0x%x", in max17042_model_data_compare()
585 dev_info(&chip->client->dev, "\n"); in max17042_model_data_compare()
586 return -EINVAL; in max17042_model_data_compare()
594 int table_size = ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl); in max17042_init_model()
599 return -ENOMEM; in max17042_init_model()
609 chip->pdata->config_data->cell_char_tbl, in max17042_init_model()
622 int table_size = ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl); in max17042_verify_model_lock()
628 return -ENOMEM; in max17042_verify_model_lock()
634 ret = -EINVAL; in max17042_verify_model_lock()
642 struct max17042_config_data *config = chip->pdata->config_data; in max17042_write_config_regs()
643 struct regmap *map = chip->regmap; in max17042_write_config_regs()
645 regmap_write(map, MAX17042_CONFIG, config->config); in max17042_write_config_regs()
646 regmap_write(map, MAX17042_LearnCFG, config->learn_cfg); in max17042_write_config_regs()
648 config->filter_cfg); in max17042_write_config_regs()
649 regmap_write(map, MAX17042_RelaxCFG, config->relax_cfg); in max17042_write_config_regs()
650 if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047 || in max17042_write_config_regs()
651 chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050 || in max17042_write_config_regs()
652 chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055) in max17042_write_config_regs()
654 config->full_soc_thresh); in max17042_write_config_regs()
659 struct max17042_config_data *config = chip->pdata->config_data; in max17042_write_custom_regs()
660 struct regmap *map = chip->regmap; in max17042_write_custom_regs()
662 max17042_write_verify_reg(map, MAX17042_RCOMP0, config->rcomp0); in max17042_write_custom_regs()
663 max17042_write_verify_reg(map, MAX17042_TempCo, config->tcompc0); in max17042_write_custom_regs()
664 max17042_write_verify_reg(map, MAX17042_ICHGTerm, config->ichgt_term); in max17042_write_custom_regs()
665 if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) { in max17042_write_custom_regs()
666 regmap_write(map, MAX17042_EmptyTempCo, config->empty_tempco); in max17042_write_custom_regs()
668 config->kempty0); in max17042_write_custom_regs()
671 config->qrtbl00); in max17042_write_custom_regs()
673 config->qrtbl10); in max17042_write_custom_regs()
675 config->qrtbl20); in max17042_write_custom_regs()
677 config->qrtbl30); in max17042_write_custom_regs()
683 struct max17042_config_data *config = chip->pdata->config_data; in max17042_update_capacity_regs()
684 struct regmap *map = chip->regmap; in max17042_update_capacity_regs()
687 config->fullcap); in max17042_update_capacity_regs()
688 regmap_write(map, MAX17042_DesignCap, config->design_cap); in max17042_update_capacity_regs()
690 config->fullcapnom); in max17042_update_capacity_regs()
696 struct regmap *map = chip->regmap; in max17042_reset_vfsoc0_reg()
709 struct max17042_config_data *config = chip->pdata->config_data; in max17042_load_new_capacity_params()
710 struct regmap *map = chip->regmap; in max17042_load_new_capacity_params()
726 dq_acc = config->fullcap / dQ_ACC_DIV; in max17042_load_new_capacity_params()
731 config->fullcap); in max17042_load_new_capacity_params()
733 config->design_cap); in max17042_load_new_capacity_params()
735 config->fullcapnom); in max17042_load_new_capacity_params()
747 struct regmap *map = chip->regmap; in max17042_override_por_values()
748 struct max17042_config_data *config = chip->pdata->config_data; in max17042_override_por_values()
750 max17042_override_por(map, MAX17042_TGAIN, config->tgain); in max17042_override_por_values()
751 max17042_override_por(map, MAX17042_TOFF, config->toff); in max17042_override_por_values()
752 max17042_override_por(map, MAX17042_CGAIN, config->cgain); in max17042_override_por_values()
753 max17042_override_por(map, MAX17042_COFF, config->coff); in max17042_override_por_values()
755 max17042_override_por(map, MAX17042_VALRT_Th, config->valrt_thresh); in max17042_override_por_values()
756 max17042_override_por(map, MAX17042_TALRT_Th, config->talrt_thresh); in max17042_override_por_values()
758 config->soc_alrt_thresh); in max17042_override_por_values()
759 max17042_override_por(map, MAX17042_CONFIG, config->config); in max17042_override_por_values()
760 max17042_override_por(map, MAX17042_SHDNTIMER, config->shdntimer); in max17042_override_por_values()
762 max17042_override_por(map, MAX17042_DesignCap, config->design_cap); in max17042_override_por_values()
763 max17042_override_por(map, MAX17042_ICHGTerm, config->ichgt_term); in max17042_override_por_values()
765 max17042_override_por(map, MAX17042_AtRate, config->at_rate); in max17042_override_por_values()
766 max17042_override_por(map, MAX17042_LearnCFG, config->learn_cfg); in max17042_override_por_values()
767 max17042_override_por(map, MAX17042_FilterCFG, config->filter_cfg); in max17042_override_por_values()
768 max17042_override_por(map, MAX17042_RelaxCFG, config->relax_cfg); in max17042_override_por_values()
769 max17042_override_por(map, MAX17042_MiscCFG, config->misc_cfg); in max17042_override_por_values()
771 max17042_override_por(map, MAX17042_FullCAP, config->fullcap); in max17042_override_por_values()
772 max17042_override_por(map, MAX17042_FullCAPNom, config->fullcapnom); in max17042_override_por_values()
773 max17042_override_por(map, MAX17042_dQacc, config->dqacc); in max17042_override_por_values()
774 max17042_override_por(map, MAX17042_dPacc, config->dpacc); in max17042_override_por_values()
776 max17042_override_por(map, MAX17042_RCOMP0, config->rcomp0); in max17042_override_por_values()
777 max17042_override_por(map, MAX17042_TempCo, config->tcompc0); in max17042_override_por_values()
779 if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) { in max17042_override_por_values()
780 max17042_override_por(map, MAX17042_MaskSOC, config->masksoc); in max17042_override_por_values()
781 max17042_override_por(map, MAX17042_SOC_empty, config->socempty); in max17042_override_por_values()
782 max17042_override_por(map, MAX17042_V_empty, config->vempty); in max17042_override_por_values()
783 max17042_override_por(map, MAX17042_EmptyTempCo, config->empty_tempco); in max17042_override_por_values()
784 max17042_override_por(map, MAX17042_K_empty0, config->kempty0); in max17042_override_por_values()
787 if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) || in max17042_override_por_values()
788 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) || in max17042_override_por_values()
789 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050)) { in max17042_override_por_values()
790 max17042_override_por(map, MAX17042_IAvg_empty, config->iavg_empty); in max17042_override_por_values()
791 max17042_override_por(map, MAX17042_TempNom, config->temp_nom); in max17042_override_por_values()
792 max17042_override_por(map, MAX17042_TempLim, config->temp_lim); in max17042_override_por_values()
793 max17042_override_por(map, MAX17042_FCTC, config->fctc); in max17042_override_por_values()
796 if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) || in max17042_override_por_values()
797 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050) || in max17042_override_por_values()
798 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055)) { in max17042_override_por_values()
799 max17042_override_por(map, MAX17047_V_empty, config->vempty); in max17042_override_por_values()
805 struct regmap *map = chip->regmap; in max17042_init_chip()
820 dev_err(&chip->client->dev, "%s init failed\n", in max17042_init_chip()
822 return -EIO; in max17042_init_chip()
827 dev_err(&chip->client->dev, "%s lock verify failed\n", in max17042_init_chip()
829 return -EIO; in max17042_init_chip()
855 struct regmap *map = chip->regmap; 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->client->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->client->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->client->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->client->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()
1031 .num_properties = ARRAY_SIZE(max17042_battery_props) - 2,
1037 struct i2c_adapter *adapter = client->adapter; in max17042_probe()
1041 struct device *dev = &client->dev; in max17042_probe()
1048 return -EIO; in max17042_probe()
1050 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); in max17042_probe()
1052 return -ENOMEM; in max17042_probe()
1054 chip->client = client; in max17042_probe()
1056 chip->chip_type = id->driver_data; in max17042_probe()
1058 acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev); in max17042_probe()
1060 return -ENODEV; in max17042_probe()
1062 chip->chip_type = acpi_id->driver_data; in max17042_probe()
1064 chip->regmap = devm_regmap_init_i2c(client, &max17042_regmap_config); in max17042_probe()
1065 if (IS_ERR(chip->regmap)) { in max17042_probe()
1066 dev_err(&client->dev, "Failed to initialize regmap\n"); in max17042_probe()
1067 return -EINVAL; in max17042_probe()
1070 chip->pdata = max17042_get_pdata(chip); in max17042_probe()
1071 if (!chip->pdata) { in max17042_probe()
1072 dev_err(&client->dev, "no platform data provided\n"); in max17042_probe()
1073 return -EINVAL; in max17042_probe()
1078 psy_cfg.of_node = dev->of_node; in max17042_probe()
1082 if (!chip->pdata->enable_current_sense) in max17042_probe()
1085 if (chip->pdata->r_sns == 0) in max17042_probe()
1086 chip->pdata->r_sns = MAX17042_DEFAULT_SNS_RESISTOR; in max17042_probe()
1088 if (chip->pdata->init_data) in max17042_probe()
1089 for (i = 0; i < chip->pdata->num_init_data; i++) in max17042_probe()
1090 regmap_write(chip->regmap, in max17042_probe()
1091 chip->pdata->init_data[i].addr, in max17042_probe()
1092 chip->pdata->init_data[i].data); in max17042_probe()
1094 if (!chip->pdata->enable_current_sense) { in max17042_probe()
1095 regmap_write(chip->regmap, MAX17042_CGAIN, 0x0000); in max17042_probe()
1096 regmap_write(chip->regmap, MAX17042_MiscCFG, 0x0003); in max17042_probe()
1097 regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007); in max17042_probe()
1100 chip->battery = devm_power_supply_register(&client->dev, max17042_desc, in max17042_probe()
1102 if (IS_ERR(chip->battery)) { in max17042_probe()
1103 dev_err(&client->dev, "failed: power supply register\n"); in max17042_probe()
1104 return PTR_ERR(chip->battery); in max17042_probe()
1107 if (client->irq) { in max17042_probe()
1111 * On ACPI systems the IRQ may be handled by ACPI-event code, in max17042_probe()
1117 ret = devm_request_threaded_irq(&client->dev, client->irq, in max17042_probe()
1120 chip->battery->desc->name, in max17042_probe()
1123 regmap_update_bits(chip->regmap, MAX17042_CONFIG, in max17042_probe()
1128 client->irq = 0; in max17042_probe()
1129 if (ret != -EBUSY) in max17042_probe()
1130 dev_err(&client->dev, "Failed to get IRQ\n"); in max17042_probe()
1133 /* Not able to update the charge threshold when exceeded? -> disable */ in max17042_probe()
1134 if (!client->irq) in max17042_probe()
1135 regmap_write(chip->regmap, MAX17042_SALRT_Th, 0xff00); in max17042_probe()
1137 regmap_read(chip->regmap, MAX17042_STATUS, &val); in max17042_probe()
1139 ret = devm_work_autocancel(&client->dev, &chip->work, in max17042_probe()
1143 schedule_work(&chip->work); in max17042_probe()
1145 chip->init_complete = 1; in max17042_probe()
1160 if (chip->client->irq) { in max17042_suspend()
1161 disable_irq(chip->client->irq); in max17042_suspend()
1162 enable_irq_wake(chip->client->irq); in max17042_suspend()
1172 if (chip->client->irq) { in max17042_resume()
1173 disable_irq_wake(chip->client->irq); in max17042_resume()
1174 enable_irq(chip->client->irq); in max17042_resume()
1175 /* re-program the SOC thresholds to 1% change */ in max17042_resume()
1200 { .compatible = "maxim,max77849-battery" },
1211 { "max77849-battery", MAXIM_DEVICE_TYPE_MAX17047 },