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


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;