From 7cd790dd941484e184f7dbd633a7d716834c540f Mon Sep 17 00:00:00 2001 From: yanyh2 Date: Tue, 22 May 2018 14:58:35 +0800 Subject: [PATCH] Find the battery profile by serial number Support the way to find the battery profile by serial number of battery in battid utags. Change-Id: I05b3368e151b153ba20417b34cd1c73cfe3c9754 Signed-off-by: yanyh2 Reviewed-on: https://gerrit.mot.com/1178205 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Lu Chai Reviewed-by: Jianqi Yang Submit-Approved: Jira Key Reviewed-on: https://gerrit.mot.com/1338748 Reviewed-by: Huosheng Liao Reviewed-by: Haijian Ma Reviewed-on: https://gerrit.mot.com/1447561 Reviewed-on: https://gerrit.mot.com/1771166 --- .../supply/qcom/battery-profile-loader.c | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/drivers/power/supply/qcom/battery-profile-loader.c b/drivers/power/supply/qcom/battery-profile-loader.c index 287ddb9e5403..5dfe2ebb966d 100644 --- a/drivers/power/supply/qcom/battery-profile-loader.c +++ b/drivers/power/supply/qcom/battery-profile-loader.c @@ -42,6 +42,88 @@ static int of_batterydata_read_batt_id_kohm(const struct device_node *np, return 0; } +static const char *get_battery_serialnumber(void) +{ + struct device_node *np = of_find_node_by_path("/chosen"); + const char *battsn_buf; + int retval; + + battsn_buf = NULL; + + if (np) + retval = of_property_read_string(np, "mmi,battid", + &battsn_buf); + else + return NULL; + + if ((retval == -EINVAL) || !battsn_buf) { + pr_err("Battsn unused\n"); + of_node_put(np); + return NULL; + + } else + pr_err("Battsn = %s\n", battsn_buf); + + of_node_put(np); + + return battsn_buf; +} + +static struct device_node *get_profile_by_serialnumber( + const struct device_node *np) +{ + struct device_node *node, *df_node, *sn_node; + const char *sn_buf, *df_sn, *dev_sn; + int rc; + + if (!np) + return NULL; + + dev_sn = NULL; + df_sn = NULL; + sn_buf = NULL; + df_node = NULL; + sn_node = NULL; + + dev_sn = get_battery_serialnumber(); + + rc = of_property_read_string(np, "df-serialnum", + &df_sn); + if (rc) + pr_warn("No Default Serial Number defined\n"); + else if (df_sn) + pr_info("Default Serial Number %s\n", df_sn); + + for_each_child_of_node(np, node) { + rc = of_property_read_string(node, "serialnum", + &sn_buf); + if (!rc && sn_buf) { + if (dev_sn) + if (strnstr(dev_sn, sn_buf, 32)) + sn_node = node; + if (df_sn) + if (strnstr(df_sn, sn_buf, 32)) + df_node = node; + } + } + + if (sn_node) { + node = sn_node; + df_node = NULL; + pr_info("Battery Match Found using %s\n", sn_node->name); + } else if (df_node) { + node = df_node; + sn_node = NULL; + pr_info("Battery Match Found using default %s\n", + df_node->name); + } else { + pr_warn("No Battery Match Found!\n"); + return NULL; + } + + return node; +} + struct device_node *of_batterydata_get_best_profile( const struct device_node *batterydata_container_node, int batt_id_kohm, const char *batt_type) @@ -66,6 +148,10 @@ struct device_node *of_batterydata_get_best_profile( } } + best_node = get_profile_by_serialnumber(batterydata_container_node); + if (best_node) + return best_node; + /* * Find the battery data with a battery id resistor closest to this one */