summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Peress <peress@google.com>2021-10-02 10:54:01 -0600
committerCommit Bot <commit-bot@chromium.org>2021-10-05 14:23:16 +0000
commit5baaa5c440cfb4ed0c1b8f20c8d2bb0236ab62d5 (patch)
tree51316f0c4e9fb7a702bccdcb6fb9eeb3f5268227
parent00d382845ee04c53cf44079081ba27619f1cef27 (diff)
downloadchrome-ec-5baaa5c440cfb4ed0c1b8f20c8d2bb0236ab62d5.tar.gz
zephyr: test: isl923x set/unset comparator inversion
BRANCH=none BUG=b:201602829 TEST=zmake configure --test zephyr/test/drivers Signed-off-by: Yuval Peress <peress@google.com> Change-Id: I3296c94fd2b591a37349f08c3cd29c92ce5831b9 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3201912 Reviewed-by: Aaron Massey <aaronmassey@google.com> Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
-rw-r--r--zephyr/emul/emul_isl923x.c19
-rw-r--r--zephyr/test/drivers/src/isl923x.c57
2 files changed, 75 insertions, 1 deletions
diff --git a/zephyr/emul/emul_isl923x.c b/zephyr/emul/emul_isl923x.c
index 5ee94dfaec..dcbaaf641b 100644
--- a/zephyr/emul/emul_isl923x.c
+++ b/zephyr/emul/emul_isl923x.c
@@ -43,6 +43,9 @@ LOG_MODULE_REGISTER(isl923x_emul, CONFIG_ISL923X_EMUL_LOG_LEVEL);
/** Mask used for the control 1 register */
#define REG_CONTROL1_MASK (GENMASK(15, 8) | GENMASK(6, 0))
+/** Mask used for the control 2 register */
+#define REG_CONTROL2_MASK GENMASK(15, 0)
+
/** Mask used for the AC PROCHOT register */
#define REG_PROCHOT_AC_MASK GENMASK(12, 7)
@@ -68,6 +71,8 @@ struct isl923x_emul_data {
uint16_t control_0_reg;
/** Emulated control 1 register */
uint16_t control_1_reg;
+ /** Emulated control 2 register */
+ uint16_t control_2_reg;
/** Emulated AC PROCHOT register */
uint16_t ac_prochot_reg;
/** Emulated DC PROCHOT register */
@@ -196,6 +201,13 @@ static int isl923x_emul_read_byte(struct i2c_emul *emul, int reg, uint8_t *val,
else
*val = (uint8_t)((data->control_1_reg >> 8) & 0xff);
break;
+ case ISL923X_REG_CONTROL2:
+ __ASSERT_NO_MSG(bytes == 0 || bytes == 1);
+ if (bytes == 0)
+ *val = (uint8_t)(data->control_2_reg & 0xff);
+ else
+ *val = (uint8_t)((data->control_2_reg >> 8) & 0xff);
+ break;
case ISL923X_REG_PROCHOT_AC:
__ASSERT_NO_MSG(bytes == 0 || bytes == 1);
if (bytes == 0)
@@ -270,6 +282,13 @@ static int isl923x_emul_write_byte(struct i2c_emul *emul, int reg, uint8_t val,
else
data->control_1_reg |= (val << 8) & REG_CONTROL1_MASK;
break;
+ case ISL923X_REG_CONTROL2:
+ __ASSERT_NO_MSG(bytes == 1 || bytes == 2);
+ if (bytes == 1)
+ data->control_2_reg = val & REG_CONTROL2_MASK;
+ else
+ data->control_2_reg |= (val << 8) & REG_CONTROL2_MASK;
+ break;
case ISL923X_REG_PROCHOT_AC:
__ASSERT_NO_MSG(bytes == 1 || bytes == 2);
if (bytes == 1)
diff --git a/zephyr/test/drivers/src/isl923x.c b/zephyr/test/drivers/src/isl923x.c
index 908aa18766..e70874f7a3 100644
--- a/zephyr/test/drivers/src/isl923x.c
+++ b/zephyr/test/drivers/src/isl923x.c
@@ -43,6 +43,13 @@ BUILD_ASSERT(IS_ENABLED(CONFIG_CHARGER_ISL9238),
#define CHARGER_NUM get_charger_num(&isl923x_drv)
#define ISL923X_EMUL emul_get_binding(DT_LABEL(DT_NODELABEL(isl923x_emul)))
+static int mock_write_fn_always_fail(struct i2c_emul *emul, int reg,
+ uint8_t val, int bytes, void *data)
+{
+ ztest_test_fail();
+ return 0;
+}
+
void test_isl923x_set_current(void)
{
const struct emul *isl923x_emul = ISL923X_EMUL;
@@ -432,6 +439,53 @@ void test_set_dc_prochot(void)
}
}
+void test_comparator_inversion(void)
+{
+ const struct emul *isl923x_emul = ISL923X_EMUL;
+ const struct device *i2c_dev = isl923x_emul_get_parent(isl923x_emul);
+ struct i2c_emul *i2c_emul = isl923x_emul_get_i2c_emul(isl923x_emul);
+ uint8_t reg_addr = ISL923X_REG_CONTROL2;
+ uint16_t reg_value;
+ uint8_t tx_buf[] = { reg_addr, 0, 0 };
+
+ /* Test failed read, should not write */
+ i2c_common_emul_set_read_fail_reg(i2c_emul, ISL923X_REG_CONTROL2);
+ i2c_common_emul_set_write_func(i2c_emul, mock_write_fn_always_fail,
+ NULL);
+ zassert_equal(EC_ERROR_INVAL,
+ isl923x_set_comparator_inversion(CHARGER_NUM, false),
+ NULL);
+ i2c_common_emul_set_read_fail_reg(i2c_emul,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+ i2c_common_emul_set_write_func(i2c_emul, NULL, NULL);
+
+ /* Test failed write */
+ zassert_ok(i2c_write(i2c_dev, tx_buf, sizeof(tx_buf), i2c_emul->addr),
+ "Failed to clear CTRL2 register");
+ i2c_common_emul_set_write_fail_reg(i2c_emul, ISL923X_REG_CONTROL2);
+ zassert_equal(EC_ERROR_INVAL,
+ isl923x_set_comparator_inversion(CHARGER_NUM, true),
+ NULL);
+ i2c_common_emul_set_write_fail_reg(i2c_emul,
+ I2C_COMMON_EMUL_NO_FAIL_REG);
+
+ /* Test enable comparator inversion */
+ zassert_ok(isl923x_set_comparator_inversion(CHARGER_NUM, true), NULL);
+ zassert_ok(i2c_write_read(i2c_dev, i2c_emul->addr, &reg_addr,
+ sizeof(reg_addr), &reg_value,
+ sizeof(reg_value)),
+ "Failed to read CTRL 2 register");
+ zassert_true((reg_value & ISL923X_C2_INVERT_CMOUT) != 0, NULL);
+
+ /* Test disable comparator inversion */
+ zassert_ok(isl923x_set_comparator_inversion(CHARGER_NUM, false), NULL);
+ zassert_ok(i2c_write_read(i2c_dev, i2c_emul->addr, &reg_addr,
+ sizeof(reg_addr), &reg_value,
+ sizeof(reg_value)),
+ "Failed to read CTRL 2 register");
+ zassert_true((reg_value & ISL923X_C2_INVERT_CMOUT) == 0, NULL);
+}
+
void test_suite_isl923x(void)
{
ztest_test_suite(isl923x,
@@ -446,6 +500,7 @@ void test_suite_isl923x(void)
ztest_unit_test(test_set_mode),
ztest_unit_test(test_post_init),
ztest_unit_test(test_set_ac_prochot),
- ztest_unit_test(test_set_dc_prochot));
+ ztest_unit_test(test_set_dc_prochot),
+ ztest_unit_test(test_comparator_inversion));
ztest_run_test_suite(isl923x);
}