summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Lin <kylelinck@google.com>2022-09-14 09:52:20 +0000
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-09-28 05:19:30 +0000
commit58bb9b518d23617f085b8ef539ac91c36ccc368c (patch)
treed9a74e00372092b07bbc87280147f58ce93353cd
parentab71261010629016885601b6f7553c5ba0c08560 (diff)
downloadchrome-ec-58bb9b518d23617f085b8ef539ac91c36ccc368c.tar.gz
charger: Detect the number of battery cells
The charging mode of SM5803 charger is configured by sensing an external resistors. The number of battery cells can be determined from the charging mode. To support 2S and 3S batteries in one model(project), the number of battery cells should be detected at run time. BUG=b:242477985 BRANCH=none TEST='make buildall' and 'zmake build -a' Change-Id: Icb7af51ab7b3b27a6fb7ad4ac4b8fe87331108fe Signed-off-by: Kyle Lin <kylelinck@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3892078 Code-Coverage: Andrew McRae <amcrae@google.com> Tested-by: Zick Wei <zick.wei@quanta.corp-partner.google.com> Reviewed-by: Andrew McRae <amcrae@google.com> Reviewed-by: Aseda Aboagye <aaboagye@chromium.org> Commit-Queue: Andrew McRae <amcrae@google.com> Reviewed-by: Zhuohao Lee <zhuohao@chromium.org>
-rw-r--r--common/charger.c11
-rw-r--r--driver/charger/sm5803.c24
-rw-r--r--include/charger.h20
-rw-r--r--zephyr/shim/include/battery_enum.h4
-rw-r--r--zephyr/shim/src/battery.c5
5 files changed, 64 insertions, 0 deletions
diff --git a/common/charger.c b/common/charger.c
index c19dd85832..b289ba6a02 100644
--- a/common/charger.c
+++ b/common/charger.c
@@ -785,3 +785,14 @@ inline int charger_get_min_bat_pct_for_power_on(void)
return CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON;
}
#endif
+
+enum ec_error_list charger_get_battery_cells(int chgnum, int *cells)
+{
+ if ((chgnum < 0) || (chgnum >= board_get_charger_chip_count()))
+ return EC_ERROR_INVAL;
+
+ if (chg_chips[chgnum].drv->get_battery_cells)
+ return chg_chips[chgnum].drv->get_battery_cells(chgnum, cells);
+
+ return EC_ERROR_UNIMPLEMENTED;
+}
diff --git a/driver/charger/sm5803.c b/driver/charger/sm5803.c
index b8940cf8ff..a6e178258f 100644
--- a/driver/charger/sm5803.c
+++ b/driver/charger/sm5803.c
@@ -2038,6 +2038,29 @@ static void command_sm5803_dump(int chgnum)
}
#endif /* CONFIG_CMD_CHARGER_DUMP */
+static enum ec_error_list sm5803_get_battery_cells(int chgnum, int *cells)
+{
+ enum ec_error_list rv;
+ uint32_t platform_id;
+
+ rv = main_read8(chgnum, SM5803_REG_PLATFORM, &platform_id);
+ if (rv)
+ return rv;
+
+ platform_id &= SM5803_PLATFORM_ID;
+ if (is_platform_id_2s(platform_id))
+ *cells = 2;
+ else if (is_platform_id_3s(platform_id))
+ *cells = 3;
+ else {
+ *cells = -1;
+
+ return EC_ERROR_UNKNOWN;
+ }
+
+ return EC_SUCCESS;
+}
+
const struct charger_drv sm5803_drv = {
.init = &sm5803_init,
.post_init = &sm5803_post_init,
@@ -2075,4 +2098,5 @@ const struct charger_drv sm5803_drv = {
#ifdef CONFIG_CMD_CHARGER_DUMP
.dump_registers = &command_sm5803_dump,
#endif
+ .get_battery_cells = &sm5803_get_battery_cells,
};
diff --git a/include/charger.h b/include/charger.h
index 046ed3acc2..e4c10ec7a9 100644
--- a/include/charger.h
+++ b/include/charger.h
@@ -146,6 +146,12 @@ struct charger_drv {
*/
enum ec_error_list (*enable_bypass_mode)(int chgnum, bool enable);
+ /*
+ * Get the number of battery cells from charging mode set by sensing an
+ * external resistor
+ */
+ enum ec_error_list (*get_battery_cells)(int chgnum, int *cells);
+
/* Dumps charger registers */
void (*dump_registers)(int chgnum);
};
@@ -390,6 +396,20 @@ enum ec_error_list charger_enable_linear_charge(int chgnum, bool enable);
enum ec_error_list charger_enable_bypass_mode(int chgnum, int enable);
/**
+ * Get the charger configuration for the number of battery cells
+ *
+ * The default charging mode is configured by sensing an external
+ * resistor. The number of battery cells can be determined from the
+ * charging mode.
+ *
+ * @param chgnum: Active charge port.
+ * @param cells: The number of battery cells.
+ *
+ * @return EC_SUCCESS on success, an error otherwise.
+ */
+enum ec_error_list charger_get_battery_cells(int chgnum, int *cells);
+
+/*
* Print all charger info for debugging purposes
* @param chgnum: charger IC index.
*/
diff --git a/zephyr/shim/include/battery_enum.h b/zephyr/shim/include/battery_enum.h
index c0d10a6ed5..774b9d4c29 100644
--- a/zephyr/shim/include/battery_enum.h
+++ b/zephyr/shim/include/battery_enum.h
@@ -21,3 +21,7 @@ enum battery_type {
};
#undef BATTERY_TYPE_WITH_COMMA
+
+#if DT_NODE_EXISTS(DT_NODELABEL(default_battery_3s))
+extern const enum battery_type DEFAULT_BATTERY_TYPE_3S;
+#endif
diff --git a/zephyr/shim/src/battery.c b/zephyr/shim/src/battery.c
index cdf6e6d894..98c0877770 100644
--- a/zephyr/shim/src/battery.c
+++ b/zephyr/shim/src/battery.c
@@ -64,4 +64,9 @@ const enum battery_type DEFAULT_BATTERY_TYPE =
BATTERY_TYPE(DT_NODELABEL(default_battery));
#endif
+#if DT_NODE_EXISTS(DT_NODELABEL(default_battery_3s))
+#define BAT_ENUM(node) DT_CAT(BATTERY_, node)
+const enum battery_type DEFAULT_BATTERY_TYPE_3S =
+ BATTERY_TYPE(DT_NODELABEL(default_battery_3s));
+#endif
#endif /* DT_HAS_COMPAT_STATUS_OKAY(battery_smart) */