summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
Diffstat (limited to 'driver')
-rw-r--r--driver/ln9310.c49
-rw-r--r--driver/ln9310.h7
2 files changed, 39 insertions, 17 deletions
diff --git a/driver/ln9310.c b/driver/ln9310.c
index 5a82f3fa28..0bbf130683 100644
--- a/driver/ln9310.c
+++ b/driver/ln9310.c
@@ -76,11 +76,11 @@ void ln9310_interrupt(enum gpio_signal signal)
hook_call_deferred(&ln9310_irq_deferred_data, 0);
}
-static int is_battery_3s(void)
+static int is_battery_gt_10v(void)
{
- int status, val, batt3s;
+ int status, val, gt_10v;
- CPRINTS("LN9310 checking input voltage (2S/3S), threshold=10V");
+ CPRINTS("LN9310 checking input voltage, threshold=10V");
/*
* Turn on INFET_OUT_SWITCH_OK comparator;
* configure INFET_OUT_SWITCH_OK to 10V.
@@ -100,21 +100,21 @@ static int is_battery_3s(void)
CPRINTS("LN9310 BC_STS_B: 0x%x", val);
/*
- * If INFET_OUT_SWITCH_OK=0, VIN < 10V --> 2S battery
- * If INFET_OUT_SWITCH_OK=1, VIN > 10V --> 3S battery
+ * If INFET_OUT_SWITCH_OK=0, VIN < 10V
+ * If INFET_OUT_SWITCH_OK=1, VIN > 10V
*/
- batt3s = !!(val & LN9310_BC_STS_B_INFET_OUT_SWITCH_OK);
- CPRINTS("LN9310 %s battery detected", batt3s ? "3S" : "2S");
+ gt_10v = !!(val & LN9310_BC_STS_B_INFET_OUT_SWITCH_OK);
+ CPRINTS("LN9310 battery %s 10V", gt_10v ? ">" : "<");
/* Turn off INFET_OUT_SWITCH_OK comparator */
field_update8(LN9310_REG_TRACK_CTRL,
LN9310_TRACK_INFET_OUT_SWITCH_OK_EN_MASK,
LN9310_TRACK_INFET_OUT_SWITCH_OK_EN_OFF);
- return batt3s;
+ return gt_10v;
}
-static void ln9310_init_3to1(void)
+static int ln9310_init_3to1(void)
{
CPRINTS("LN9310 init (3:1 operation)");
@@ -136,12 +136,19 @@ static void ln9310_init_3to1(void)
field_update8(LN9310_REG_SYS_CTRL,
LN9310_SYS_CTRL_LB_DELTA_MASK,
LN9310_SYS_CTRL_LB_DELTA_3S);
+
+ return EC_SUCCESS;
}
-static void ln9310_init_2to1(void)
+static int ln9310_init_2to1(void)
{
CPRINTS("LN9310 init (2:1 operation)");
+ if (is_battery_gt_10v()) {
+ CPRINTS("LN9310 init stop. Input voltage is too high.");
+ return EC_ERROR_UNKNOWN;
+ }
+
/* Enable track protection and SC_OUT configs for 2:1 switching */
field_update8(LN9310_REG_MODE_CHANGE_CFG,
LN9310_MODE_TM_TRACK_MASK |
@@ -158,19 +165,27 @@ static void ln9310_init_2to1(void)
field_update8(LN9310_REG_SYS_CTRL,
LN9310_SYS_CTRL_LB_DELTA_MASK,
LN9310_SYS_CTRL_LB_DELTA_2S);
+
+ return EC_SUCCESS;
}
void ln9310_init(void)
{
- int status, val, batt3s;
+ int status, val;
+ enum battery_cell_type batt;
+
+ batt = board_get_battery_cell_type();
+ if (batt == BATTERY_CELL_TYPE_3S) {
+ status = ln9310_init_3to1();
+ } else if (batt == BATTERY_CELL_TYPE_2S) {
+ status = ln9310_init_2to1();
+ } else {
+ CPRINTS("LN9310 not supported battery type: %d", batt);
+ return;
+ }
- batt3s = is_battery_3s();
- if (batt3s == -1)
+ if (status != EC_SUCCESS)
return;
- else if (batt3s)
- ln9310_init_3to1();
- else
- ln9310_init_2to1();
/* Unmask the MODE change interrupt */
field_update8(LN9310_REG_INT1_MSK,
diff --git a/driver/ln9310.h b/driver/ln9310.h
index 92aa16e822..399b25a662 100644
--- a/driver/ln9310.h
+++ b/driver/ln9310.h
@@ -112,6 +112,13 @@
#define LN9310_BC_STS_B_INFET_OUT_SWITCH_OK BIT(5)
#define LN9310_BC_STS_B_INFET_OUT_SWITCH_OK_MASK 0x20
+/* Battery cell type */
+enum battery_cell_type {
+ BATTERY_CELL_TYPE_UNKNOWN = 0,
+ BATTERY_CELL_TYPE_2S = 2,
+ BATTERY_CELL_TYPE_3S = 3
+};
+
/* Define configuration of LN9310 part */
struct ln9310_config_t {
const int i2c_port;