Загрузка данных
vmdolzhenkov@user-MS-7E12:/mnt/vmdolzhenkov/SDK_6.1/rk3588_sdk_6.1$ git diff kernel-6.1/drivers/power/supply/max17042_battery.c
diff --git a/kernel-6.1/drivers/power/supply/max17042_battery.c b/kernel-6.1/drivers/power/supply/max17042_battery.c
index ab031bbfb..c89442d1d 100644
--- a/kernel-6.1/drivers/power/supply/max17042_battery.c
+++ b/kernel-6.1/drivers/power/supply/max17042_battery.c
@@ -889,6 +889,49 @@ static irqreturn_t max17042_thread_handler(int id, void *dev)
return IRQ_HANDLED;
}
+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);
+ //Set VRECOVER to 3.88V
+ vempty |= 0x61;
+ 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");
+ }
+ }
+}
+
static void max17042_init_worker(struct work_struct *work)
{
struct max17042_chip *chip = container_of(work,
@@ -901,7 +944,8 @@ static void max17042_init_worker(struct work_struct *work)
if (ret)
return;
}
-
+ printk("%s(%d) Start get battery info(with STATUS_BIT_POR)\n",__FUNCTION__,__LINE__);
+ max17042_get_battery_info(chip->client, chip);
chip->init_complete = 1;
}
@@ -1100,10 +1144,15 @@ static int max17042_probe(struct i2c_client *client,
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);
+ int err = PTR_ERR(chip->battery);
+ if (err == -EPROBE_DEFER) {
+ return -EPROBE_DEFER;
+ }
+ dev_err(&client->dev, "failed: power supply register (%d)\n", err);
+ return err;
}
+ //max17042_get_battery_info(client, chip);
if (client->irq) {
unsigned int flags = IRQF_ONESHOT;
@@ -1143,6 +1192,8 @@ static int max17042_probe(struct i2c_client *client,
schedule_work(&chip->work);
} else {
chip->init_complete = 1;
+ printk("%s(%d) Start get battery info(without STATUS_BIT_POR)\n",__FUNCTION__,__LINE__);
+ max17042_get_battery_info(client, chip);
}
return 0;