static void max17042_get_battery_info(struct i2c_client *client, struct max17042_chip *chip)
{
if (client->dev.of_node)
{
struct power_supply_battery_info *info = NULL;
if ((power_supply_get_battery_info(chip->battery, &info) == 0) && info)
{
// 1. (DesignCap, 0x18)
if (info->charge_full_design_uah > 0)
{
u64 dcap = (u64)info->charge_full_design_uah * chip->pdata->r_sns;
do_div(dcap, 5000000ll);
regmap_write(chip->regmap, MAX17042_DesignCap, (u32)dcap);
dev_info(&client->dev, "DTS DesignCap applied: 0x%X\n", (u32)dcap);
}
// 2. (V_empty, 0x3A)
if (info->voltage_min_design_uv > 0)
{
u32 vempty = info->voltage_min_design_uv / 10000;
vempty = (vempty << 7);
regmap_write(chip->regmap, MAX17047_V_empty, vempty);
dev_info(&client->dev, "DTS V_empty applied: 0x%X\n", vempty);
}
// 3. (IChgTerm, 0x1E)
if (info->charge_term_current_ua > 0)
{
u64 ichg = (u64)info->charge_term_current_ua * chip->pdata->r_sns;
do_div(ichg, 1562500ll);
regmap_write(chip->regmap, MAX17042_ICHGTerm, (u32)ichg);
dev_info(&client->dev, "DTS IChgTerm applied: 0x%X\n", (u32)ichg);
}
power_supply_put_battery_info(chip->battery, info);
}
else {
dev_warn(&client->dev, "No monitored-battery data found via core helper\n");
}
}
}
функция probe(часть кода):
i2c_set_clientdata(client, chip);
psy_cfg.drv_data = chip;
psy_cfg.of_node = dev->of_node;
/* When current is not measured,
* CURRENT_NOW and CURRENT_AVG properties should be invisible. */
if (!chip->pdata->enable_current_sense)
max17042_desc = &max17042_no_current_sense_psy_desc;
if (chip->pdata->r_sns == 0)
chip->pdata->r_sns = MAX17042_DEFAULT_SNS_RESISTOR;
if (chip->pdata->init_data)
for (i = 0; i < chip->pdata->num_init_data; i++)
regmap_write(chip->regmap,
chip->pdata->init_data[i].addr,
chip->pdata->init_data[i].data);
if (!chip->pdata->enable_current_sense) {
regmap_write(chip->regmap, MAX17042_CGAIN, 0x0000);
regmap_write(chip->regmap, MAX17042_MiscCFG, 0x0003);
regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007);
}
chip->battery = devm_power_supply_register(&client->dev, max17042_desc,
&psy_cfg);
if (IS_ERR(chip->battery)) {
dev_err(&client->dev, "failed: power supply register\n");
return PTR_ERR(chip->battery);
}
max17042_get_battery_info(client, chip);