Загрузка данных


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);