From 8975cef12dae8b02c69143cc63e31b034aa28628 Mon Sep 17 00:00:00 2001 From: yanyh2 Date: Wed, 9 Feb 2022 14:16:21 +0800 Subject: [PATCH] add paired id to support paired battery notification Add paired id used to support multiple batteries notification between reference battery and target battery. Change-Id: I2e1d991d055834a68c38eb7372c7fae17eb297e1 Signed-off-by: yanyh2 Reviewed-on: https://gerrit.mot.com/2186431 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Jianqi Yang Submit-Approved: Jira Key --- drivers/power/mmi_charger/README | 12 +++++++ drivers/power/mmi_charger/mmi_charger.c | 44 +++++++++++++++++++++++++ drivers/power/mmi_charger/mmi_charger.h | 1 + 3 files changed, 57 insertions(+) diff --git a/drivers/power/mmi_charger/README b/drivers/power/mmi_charger/README index fe1c591a127d..d4d4d4b13501 100644 --- a/drivers/power/mmi_charger/README +++ b/drivers/power/mmi_charger/README @@ -245,6 +245,15 @@ for each line is defined by the target user of the profile data. Definition: Unlimited array of arrays. Each internal array specifics a power supply name, the change of which the battery is sensitive to. +- mmi,paired-id + Usage: optional + Value Type: + Definition: It will define the paired id for dual battery matching, high-16bits is used +for reference battery paired id, low-16bits is used for target battery paired id, +Only when the target battery paired id is equal to reference battery, then reference battery +information will be notified to the target battery when it is updated. +If not defined, defaults to 0. + Example: qti_glink_charger: mmi,qti-glink-charger { compatible = "mmi,qti-glink-charger"; @@ -280,6 +289,7 @@ qti_glink_charger: mmi,qti-glink-charger { <45 4350 3000 2000>, <60 4200 2185 0>; profile-ids-map = "0", "unknown-sn", "100750", "SB18C85232"; + mmi,paired-id = <0x00010000>; }; Single-battery Pack: @@ -328,6 +338,7 @@ pm7250b_mmi: qcom,qpnp-smb5-mmi { <15 0 608 608>, <45 4450 1210 1200>, <60 4200 608 0>; + mmi,paired-id = <0x00010000>; }; &flip_battery { @@ -343,6 +354,7 @@ pm7250b_mmi: qcom,qpnp-smb5-mmi { <15 0 750 750>, <45 4450 1250 1200>, <60 4200 750 0>; + mmi,paired-id = <0x00000001>; }; ========================== diff --git a/drivers/power/mmi_charger/mmi_charger.c b/drivers/power/mmi_charger/mmi_charger.c index 8890f6956346..f326e82bc208 100644 --- a/drivers/power/mmi_charger/mmi_charger.c +++ b/drivers/power/mmi_charger/mmi_charger.c @@ -35,6 +35,9 @@ #define WARM_TEMP 45 #define COOL_TEMP 0 +#define BATT_PAIR_ID_BITS 16 +#define BATT_PAIR_ID_MASK ((1 << BATT_PAIR_ID_BITS) - 1) + #define HEARTBEAT_DELAY_MS 60000 #define HEARTBEAT_FACTORY_MS 1000 #define HEARTBEAT_DISCHARGE_MS 100000 @@ -129,6 +132,8 @@ struct mmi_battery_pack { int reference; int charger_rate; int soc_cycles_start; + int paired_id; + struct mmi_battery_pack *paired_batt; struct mmi_battery_info *info; char sn[MMI_BATT_SN_LEN]; struct list_head list; @@ -1313,6 +1318,39 @@ exit: } } +static void mmi_update_paired_battery( + struct mmi_charger_chip *chip, + struct mmi_battery_pack *battery) +{ + struct mmi_battery_pack *batt = NULL; + + if (!battery->paired_id) { + battery->paired_batt = NULL; + return; + } + + list_for_each_entry(batt, &chip->battery_list, list) { + if ((batt->paired_id >> BATT_PAIR_ID_BITS) == + (battery->paired_id & BATT_PAIR_ID_MASK)) { + battery->paired_batt = batt; + } + if ((battery->paired_id >> BATT_PAIR_ID_BITS) == + (batt->paired_id & BATT_PAIR_ID_MASK)) { + batt->paired_batt = battery; + } + } +} + +static void mmi_notify_paired_battery(struct mmi_charger *charger) +{ + if (!charger->battery->paired_batt || + !charger->driver->notify_paired_battery) + return; + + charger->driver->notify_paired_battery(charger->driver->data, + charger->battery->paired_batt->info); +} + static void mmi_get_charger_info(struct mmi_charger_chip *chip, struct mmi_charger *charger) { @@ -1561,6 +1599,7 @@ static void mmi_configure_charger(struct mmi_charger_chip *chip, cfg->charging_disable = false; } + mmi_notify_paired_battery(charger); charger->driver->set_constraint(charger->driver->data, &charger->constraint); charger->driver->config_charge(charger->driver->data, cfg); @@ -1992,6 +2031,8 @@ static void mmi_charger_heartbeat_work(struct work_struct *work) mmi_update_charger_profile(chip, charger); mmi_reset_charger_configure(chip, charger); mmi_update_charger_status(chip, charger); + } + list_for_each_entry(charger, &chip->charger_list, list) { mmi_configure_charger(chip, charger); } mmi_update_battery_status(chip); @@ -2257,6 +2298,9 @@ int mmi_register_charger_driver(struct mmi_charger_driver *driver) battery->cycles = 0; battery->soc_cycles_start = 100; memcpy(battery->sn, batt_info.batt_sn, MMI_BATT_SN_LEN); + of_property_read_u32(driver->dev->of_node, "mmi,paired-id", + &battery->paired_id); + mmi_update_paired_battery(chip, battery); mutex_lock(&chip->battery_lock); list_add_tail(&battery->list, &chip->battery_list); diff --git a/drivers/power/mmi_charger/mmi_charger.h b/drivers/power/mmi_charger/mmi_charger.h index f6aea7f8b6ee..ba99464690f8 100644 --- a/drivers/power/mmi_charger/mmi_charger.h +++ b/drivers/power/mmi_charger/mmi_charger.h @@ -110,6 +110,7 @@ struct mmi_charger_driver { bool (*is_charge_tapered)(void *data, int tapered_ma); bool (*is_charge_halt)(void *data); void (*set_constraint)(void *data, struct mmi_charger_constraint *constraint); + void (*notify_paired_battery)(void *data, struct mmi_battery_info *batt_info); void *data; };