Lines Matching +full:input +full:- +full:precharge +full:- +full:resistor +full:- +full:ohms
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * LTC4162-L 35V/3.2A Multi-Cell Lithium-Ion Step-Down Battery Charger
5 * LTC4162-F 35V/3.2A Multi-Cell LiFePO4 Step-Down Battery Charger
6 * LTC4162-S 35V/3.2A Lead-Acid Step-Down Battery Charger
73 precharge = 128, /* trickle on low bat voltage */ enumerator
119 u32 rsnsb; /* Series resistor that sets charge current, microOhm */
120 u32 rsnsi; /* Series resistor to measure input current, microOhm */
130 if (info->cell_count) in ltc4162l_get_cell_count()
131 return info->cell_count; in ltc4162l_get_cell_count()
133 ret = regmap_read(info->regmap, LTC4162L_CHEM_CELLS_REG, &val); in ltc4162l_get_cell_count()
143 info->cell_count = val; in ltc4162l_get_cell_count()
153 ret = regmap_read(info->regmap, LTC4162L_CHEM_CELLS_REG, &val); in ltc4162l_get_chem_type()
164 case precharge: in ltc4162l_state_decode()
183 ret = regmap_read(info->regmap, LTC4162L_CHARGER_STATE, ®val); in ltc4162l_get_status()
185 dev_err(&info->client->dev, "Failed to read CHARGER_STATE\n"); in ltc4162l_get_status()
189 val->intval = ltc4162l_state_decode(regval); in ltc4162l_get_status()
213 ret = regmap_read(info->regmap, LTC4162L_CHARGE_STATUS, ®val); in ltc4162l_get_charge_type()
217 val->intval = ltc4162l_charge_status_decode(regval); in ltc4162l_get_charge_type()
246 ret = regmap_read(info->regmap, LTC4162L_CHARGER_STATE, ®val); in ltc4162l_get_health()
250 val->intval = ltc4162l_state_to_health(regval); in ltc4162l_get_health()
261 ret = regmap_read(info->regmap, LTC4162L_SYSTEM_STATUS_REG, ®val); in ltc4162l_get_online()
265 /* BIT(2) indicates if input voltage is sufficient to charge */ in ltc4162l_get_online()
266 val->intval = !!(regval & BIT(2)); in ltc4162l_get_online()
278 ret = regmap_read(info->regmap, reg, ®val); in ltc4162l_get_vbat()
284 * For ltc4162-s, it uses a cell_count value of 2 for each group of 3 in ltc4162l_get_vbat()
296 val->intval = regval; in ltc4162l_get_vbat()
303 val->intval = regval; in ltc4162l_get_vbat()
307 return -EINVAL; in ltc4162l_get_vbat()
318 ret = regmap_read(info->regmap, reg, ®val); in ltc4015_get_vbat()
324 * ltc4015 lead-acid fixed and lead-acid programmable corresponds to in ltc4015_get_vbat()
333 val->intval = regval; in ltc4015_get_vbat()
336 case ltc4162_sst - 1 ... ltc4162_sad - 1: in ltc4015_get_vbat()
340 val->intval = regval; in ltc4015_get_vbat()
344 return -EINVAL; in ltc4015_get_vbat()
351 const struct ltc4162l_chip_info *chip_info = info->chip_info; in ltc4162l_get_ibat()
355 ret = regmap_read(info->regmap, LTC4162L_IBAT, ®val); in ltc4162l_get_ibat()
360 val->intval = mult_frac(ret, chip_info->ibat_resolution_pv, info->rsnsb); in ltc4162l_get_ibat()
369 const struct ltc4162l_chip_info *chip_info = info->chip_info; in ltc4162l_get_input_voltage()
373 ret = regmap_read(info->regmap, LTC4162L_VIN, ®val); in ltc4162l_get_input_voltage()
377 val->intval = regval * chip_info->vin_resolution_uv; in ltc4162l_get_input_voltage()
385 const struct ltc4162l_chip_info *chip_info = info->chip_info; in ltc4162l_get_input_current()
389 ret = regmap_read(info->regmap, LTC4162L_IIN, ®val); in ltc4162l_get_input_current()
394 ret *= chip_info->ibat_resolution_pv; in ltc4162l_get_input_current()
395 ret /= info->rsnsi; in ltc4162l_get_input_current()
397 val->intval = ret; in ltc4162l_get_input_current()
409 ret = regmap_read(info->regmap, reg, ®val); in ltc4162l_get_icharge()
417 val->intval = 10000u * mult_frac(regval, 100000u, info->rsnsb); in ltc4162l_get_icharge()
426 value = mult_frac(value, info->rsnsb, 100000u); in ltc4162l_set_icharge()
431 --value; in ltc4162l_set_icharge()
434 return -EINVAL; in ltc4162l_set_icharge()
436 return regmap_write(info->regmap, reg, value); in ltc4162l_set_icharge()
448 ret = regmap_read(info->regmap, reg, ®val); in ltc4162l_get_vcharge()
471 val->intval = voltage; in ltc4162l_get_vcharge()
477 val->intval = voltage; in ltc4162l_get_vcharge()
483 val->intval = voltage; in ltc4162l_get_vcharge()
487 return -EINVAL; in ltc4162l_get_vcharge()
499 ret = regmap_read(info->regmap, reg, ®val); in ltc4015_get_vcharge()
509 * Li-Ion: a = 1/80V, b = 3.8125V, c = 31, d = 4.2Vmax in ltc4015_get_vcharge()
518 val->intval = voltage; in ltc4015_get_vcharge()
524 val->intval = voltage; in ltc4015_get_vcharge()
527 case ltc4162_sst - 1 ... ltc4162_sad - 1: in ltc4015_get_vcharge()
530 val->intval = voltage; in ltc4015_get_vcharge()
534 return -EINVAL; in ltc4015_get_vcharge()
547 return -EINVAL; in ltc4162l_vcharge()
549 value -= base_voltage; in ltc4162l_vcharge()
553 return -EINVAL; in ltc4162l_vcharge()
570 return -EBUSY; in ltc4162l_set_vcharge()
573 return regmap_write(info->regmap, reg, value); in ltc4162l_set_vcharge()
577 return -EBUSY; in ltc4162l_set_vcharge()
580 return regmap_write(info->regmap, reg, value); in ltc4162l_set_vcharge()
584 return -EBUSY; in ltc4162l_set_vcharge()
587 return regmap_write(info->regmap, reg, value); in ltc4162l_set_vcharge()
589 return -EINVAL; in ltc4162l_set_vcharge()
605 return -EBUSY; in ltc4015_set_vcharge()
608 return regmap_write(info->regmap, reg, value); in ltc4015_set_vcharge()
612 return -EBUSY; in ltc4015_set_vcharge()
615 return regmap_write(info->regmap, reg, value); in ltc4015_set_vcharge()
616 case ltc4162_sst - 1 ... ltc4162_sad - 1: in ltc4015_set_vcharge()
619 return -EBUSY; in ltc4015_set_vcharge()
623 return regmap_write(info->regmap, reg, value); in ltc4015_set_vcharge()
625 return -EINVAL; in ltc4015_set_vcharge()
635 ret = regmap_read(info->regmap, LTC4162L_IIN_LIMIT_DAC, ®val); in ltc4162l_get_iin_limit_dac()
644 regval /= info->rsnsi; in ltc4162l_get_iin_limit_dac()
645 val->intval = 100u * regval; in ltc4162l_get_iin_limit_dac()
655 regval = mult_frac(value, info->rsnsi, 50000u); in ltc4162l_set_iin_limit()
658 --regval; in ltc4162l_set_iin_limit()
662 return regmap_write(info->regmap, LTC4162L_IIN_LIMIT_TARGET, regval); in ltc4162l_set_iin_limit()
671 ret = regmap_read(info->regmap, LTC4162L_DIE_TEMPERATURE, ®val); in ltc4162l_get_die_temp()
675 /* die_temp × 0.0215°C/LSB - 264.4°C */ in ltc4162l_get_die_temp()
679 ret -= 26440; in ltc4162l_get_die_temp()
680 val->intval = ret; in ltc4162l_get_die_temp()
691 ret = regmap_read(info->regmap, LTC4162L_DIE_TEMPERATURE, ®val); in ltc4015_get_die_temp()
695 /* (die_temp - 12010) / 45.6°C */ in ltc4015_get_die_temp()
697 ret -= 12010; in ltc4015_get_die_temp()
700 val->intval = ret; in ltc4015_get_die_temp()
708 const struct ltc4162l_chip_info *chip_info = info->chip_info; in ltc4162l_get_term_current()
712 ret = regmap_read(info->regmap, LTC4162L_CHARGER_CONFIG_BITS, ®val); in ltc4162l_get_term_current()
718 val->intval = 0; in ltc4162l_get_term_current()
722 ret = regmap_read(info->regmap, LTC4162L_C_OVER_X_THRESHOLD, ®val); in ltc4162l_get_term_current()
726 regval *= chip_info->ibat_resolution_pv; in ltc4162l_get_term_current()
727 regval /= info->rsnsb; in ltc4162l_get_term_current()
728 val->intval = regval; in ltc4162l_get_term_current()
741 return regmap_update_bits(info->regmap, in ltc4162l_set_term_current()
746 regval = mult_frac(value, info->rsnsb, 14660u); in ltc4162l_set_term_current()
749 ret = regmap_write(info->regmap, LTC4162L_C_OVER_X_THRESHOLD, regval); in ltc4162l_set_term_current()
754 return regmap_update_bits(info->regmap, LTC4162L_CHARGER_CONFIG_BITS, in ltc4162l_set_term_current()
775 ARRAY_SIZE(ltc4162l_charge_status_name) - 1]; in charge_status_show()
781 ret = regmap_read(info->regmap, LTC4162L_CHARGE_STATUS, ®val); in charge_status_show()
802 const struct ltc4162l_chip_info *chip_info = info->chip_info; in vbat_show()
806 ret = chip_info->get_vbat(info, LTC4162L_VBAT, &val); in vbat_show()
819 const struct ltc4162l_chip_info *chip_info = info->chip_info; in vbat_avg_show()
823 ret = chip_info->get_vbat(info, LTC4162L_VBAT_FILT, &val); in vbat_avg_show()
855 ret = regmap_read(info->regmap, LTC4162L_CONFIG_BITS_REG, ®val); in force_telemetry_show()
860 info->chip_info->telemetry_mask ? 1 : 0); in force_telemetry_show()
877 ret = regmap_update_bits(info->regmap, LTC4162L_CONFIG_BITS_REG, in force_telemetry_store()
878 info->chip_info->telemetry_mask, in force_telemetry_store()
879 value ? info->chip_info->telemetry_mask : 0); in force_telemetry_store()
896 ret = regmap_read(info->regmap, LTC4162L_ARM_SHIP_MODE, ®val); in arm_ship_mode_show()
918 ret = regmap_write(info->regmap, LTC4162L_ARM_SHIP_MODE, in arm_ship_mode_store()
953 const struct ltc4162l_chip_info *chip_info = info->chip_info; in ltc4162l_get_property()
975 return chip_info->get_vcharge(info, LTC4162L_VCHARGE_DAC, val); in ltc4162l_get_property()
977 return chip_info->get_vcharge(info, LTC4162L_VCHARGE_SETTING, val); in ltc4162l_get_property()
981 return chip_info->get_die_temp(info, val); in ltc4162l_get_property()
985 return -EINVAL; in ltc4162l_get_property()
998 LTC4162L_CHARGE_CURRENT_SETTING, val->intval); in ltc4162l_set_property()
1001 LTC4162L_VCHARGE_SETTING, val->intval); in ltc4162l_set_property()
1003 return ltc4162l_set_iin_limit(info, val->intval); in ltc4162l_set_property()
1005 return ltc4162l_set_term_current(info, val->intval); in ltc4162l_set_property()
1007 return -EINVAL; in ltc4162l_set_property()
1052 .name = "ltc4162-l",
1063 .name = "ltc4162-f",
1074 .name = "ltc4162-s",
1111 /* all registers after this one are read-only status registers */ in ltc4162l_is_volatile_reg()
1128 regmap_write(info->regmap, LTC4162L_LIMIT_ALERTS_REG, 0); in ltc4162l_clear_interrupts()
1129 regmap_write(info->regmap, LTC4162L_CHARGER_STATE_ALERTS_REG, 0); in ltc4162l_clear_interrupts()
1130 regmap_write(info->regmap, LTC4162L_CHARGE_STATUS_ALERTS_REG, 0); in ltc4162l_clear_interrupts()
1135 struct i2c_adapter *adapter = client->adapter; in ltc4162l_probe()
1136 struct device *dev = &client->dev; in ltc4162l_probe()
1146 return -ENODEV; in ltc4162l_probe()
1150 return -ENOMEM; in ltc4162l_probe()
1152 info->client = client; in ltc4162l_probe()
1157 return -ENODEV; in ltc4162l_probe()
1159 info->chip_info = chip_info; in ltc4162l_probe()
1161 info->regmap = devm_regmap_init_i2c(client, <c4162l_regmap_config); in ltc4162l_probe()
1162 if (IS_ERR(info->regmap)) { in ltc4162l_probe()
1164 return PTR_ERR(info->regmap); in ltc4162l_probe()
1167 ret = device_property_read_u32(dev, "lltc,rsnsb-micro-ohms", in ltc4162l_probe()
1168 &info->rsnsb); in ltc4162l_probe()
1170 dev_err(dev, "Missing lltc,rsnsb-micro-ohms property\n"); in ltc4162l_probe()
1173 if (!info->rsnsb) in ltc4162l_probe()
1174 return -EINVAL; in ltc4162l_probe()
1176 ret = device_property_read_u32(dev, "lltc,rsnsi-micro-ohms", in ltc4162l_probe()
1177 &info->rsnsi); in ltc4162l_probe()
1179 dev_err(dev, "Missing lltc,rsnsi-micro-ohms property\n"); in ltc4162l_probe()
1182 if (!info->rsnsi) in ltc4162l_probe()
1183 return -EINVAL; in ltc4162l_probe()
1185 if (!device_property_read_u32(dev, "lltc,cell-count", &value)) in ltc4162l_probe()
1186 info->cell_count = value; in ltc4162l_probe()
1188 ltc4162l_config.of_node = dev->of_node; in ltc4162l_probe()
1196 return -ENOMEM; in ltc4162l_probe()
1198 desc->name = chip_info->name; in ltc4162l_probe()
1200 info->charger = devm_power_supply_register(dev, desc, <c4162l_config); in ltc4162l_probe()
1201 if (IS_ERR(info->charger)) { in ltc4162l_probe()
1203 return PTR_ERR(info->charger); in ltc4162l_probe()
1207 regmap_write(info->regmap, LTC4162L_EN_LIMIT_ALERTS_REG, 0); in ltc4162l_probe()
1210 regmap_write(info->regmap, LTC4162L_EN_CHARGER_STATE_ALERTS_REG, in ltc4162l_probe()
1212 regmap_write(info->regmap, LTC4162L_EN_CHARGE_STATUS_ALERTS_REG, 0x1f); in ltc4162l_probe()
1228 power_supply_changed(info->charger); in ltc4162l_alert()
1233 { "ltc4162-f", (kernel_ulong_t)<c4162f_chip_info },
1234 { "ltc4162-l", (kernel_ulong_t)<c4162l_chip_info },
1235 { "ltc4162-s", (kernel_ulong_t)<c4162s_chip_info },
1242 { .compatible = "lltc,ltc4162-f", .data = <c4162f_chip_info },
1243 { .compatible = "lltc,ltc4162-l", .data = <c4162l_chip_info },
1244 { .compatible = "lltc,ltc4162-s", .data = <c4162s_chip_info },
1254 .name = "ltc4162-l-charger",
1262 MODULE_DESCRIPTION("LTC4162-L charger driver");