summaryrefslogtreecommitdiff
path: root/chip/host
diff options
context:
space:
mode:
Diffstat (limited to 'chip/host')
-rw-r--r--chip/host/i2c.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/chip/host/i2c.c b/chip/host/i2c.c
index 072d4564f8..3f8a8b8241 100644
--- a/chip/host/i2c.c
+++ b/chip/host/i2c.c
@@ -5,15 +5,83 @@
* Dummy I2C driver for unit test.
*/
+#include "hooks.h"
#include "i2c.h"
#include "link_defs.h"
#include "test_util.h"
+#define MAX_DETACHED_DEV_COUNT 3
+
+struct i2c_dev {
+ int port;
+ int slave_addr;
+ int valid;
+};
+
+static struct i2c_dev detached_devs[MAX_DETACHED_DEV_COUNT];
+
+static void detach_init(void)
+{
+ int i;
+ for (i = 0; i < MAX_DETACHED_DEV_COUNT; ++i)
+ detached_devs[i].valid = 0;
+}
+DECLARE_HOOK(HOOK_INIT, detach_init, HOOK_PRIO_FIRST);
+
+int test_detach_i2c(int port, int slave_addr)
+{
+ int i;
+
+ for (i = 0; i < MAX_DETACHED_DEV_COUNT; ++i)
+ if (detached_devs[i].valid == 0)
+ break;
+
+ if (i == MAX_DETACHED_DEV_COUNT)
+ return EC_ERROR_OVERFLOW;
+
+ detached_devs[i].port = port;
+ detached_devs[i].slave_addr = slave_addr;
+ detached_devs[i].valid = 1;
+
+ return EC_SUCCESS;
+}
+
+int test_attach_i2c(int port, int slave_addr)
+{
+ int i;
+
+ for (i = 0; i < MAX_DETACHED_DEV_COUNT; ++i)
+ if (detached_devs[i].valid &&
+ detached_devs[i].port == port &&
+ detached_devs[i].slave_addr == slave_addr)
+ break;
+
+ if (i == MAX_DETACHED_DEV_COUNT)
+ return EC_ERROR_INVAL;
+
+ detached_devs[i].valid = 0;
+ return EC_SUCCESS;
+}
+
+static int test_check_detached(int port, int slave_addr)
+{
+ int i;
+
+ for (i = 0; i < MAX_DETACHED_DEV_COUNT; ++i)
+ if (detached_devs[i].valid &&
+ detached_devs[i].port == port &&
+ detached_devs[i].slave_addr == slave_addr)
+ return 1;
+ return 0;
+}
+
int i2c_read16(int port, int slave_addr, int offset, int *data)
{
const struct test_i2c_read_dev *p;
int rv;
+ if (test_check_detached(port, slave_addr))
+ return EC_ERROR_UNKNOWN;
for (p = __test_i2c_read16; p < __test_i2c_read16_end; ++p) {
rv = p->routine(port, slave_addr, offset, data);
if (rv != EC_ERROR_INVAL)
@@ -27,6 +95,8 @@ int i2c_write16(int port, int slave_addr, int offset, int data)
const struct test_i2c_write_dev *p;
int rv;
+ if (test_check_detached(port, slave_addr))
+ return EC_ERROR_UNKNOWN;
for (p = __test_i2c_write16; p < __test_i2c_write16_end; ++p) {
rv = p->routine(port, slave_addr, offset, data);
if (rv != EC_ERROR_INVAL)
@@ -40,6 +110,8 @@ int i2c_read8(int port, int slave_addr, int offset, int *data)
const struct test_i2c_read_dev *p;
int rv;
+ if (test_check_detached(port, slave_addr))
+ return EC_ERROR_UNKNOWN;
for (p = __test_i2c_read8; p < __test_i2c_read8_end; ++p) {
rv = p->routine(port, slave_addr, offset, data);
if (rv != EC_ERROR_INVAL)
@@ -53,6 +125,8 @@ int i2c_write8(int port, int slave_addr, int offset, int data)
const struct test_i2c_write_dev *p;
int rv;
+ if (test_check_detached(port, slave_addr))
+ return EC_ERROR_UNKNOWN;
for (p = __test_i2c_write8; p < __test_i2c_write8_end; ++p) {
rv = p->routine(port, slave_addr, offset, data);
if (rv != EC_ERROR_INVAL)
@@ -67,6 +141,8 @@ int i2c_read_string(int port, int slave_addr, int offset, uint8_t *data,
const struct test_i2c_read_string_dev *p;
int rv;
+ if (test_check_detached(port, slave_addr))
+ return EC_ERROR_UNKNOWN;
for (p = __test_i2c_read_string; p < __test_i2c_read_string_end; ++p) {
rv = p->routine(port, slave_addr, offset, data, len);
if (rv != EC_ERROR_INVAL)