Merge tag 'trace-v5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[linux-2.6-microblaze.git] / drivers / i2c / i2c-slave-testunit.c
index c288102..56dae08 100644 (file)
@@ -19,6 +19,7 @@
 enum testunit_cmds {
        TU_CMD_READ_BYTES = 1,  /* save 0 for ABORT, RESET or similar */
        TU_CMD_HOST_NOTIFY,
+       TU_CMD_SMBUS_BLOCK_PROC_CALL,
        TU_NUM_CMDS
 };
 
@@ -88,6 +89,8 @@ static int i2c_slave_testunit_slave_cb(struct i2c_client *client,
                                     enum i2c_slave_event event, u8 *val)
 {
        struct testunit_data *tu = i2c_get_clientdata(client);
+       bool is_proc_call = tu->reg_idx == 3 && tu->regs[TU_REG_DATAL] == 1 &&
+                           tu->regs[TU_REG_CMD] == TU_CMD_SMBUS_BLOCK_PROC_CALL;
        int ret = 0;
 
        switch (event) {
@@ -118,12 +121,17 @@ static int i2c_slave_testunit_slave_cb(struct i2c_client *client,
                fallthrough;
 
        case I2C_SLAVE_WRITE_REQUESTED:
+               memset(tu->regs, 0, TU_NUM_REGS);
                tu->reg_idx = 0;
                break;
 
-       case I2C_SLAVE_READ_REQUESTED:
        case I2C_SLAVE_READ_PROCESSED:
-               *val = TU_CUR_VERSION;
+               if (is_proc_call && tu->regs[TU_REG_DATAH])
+                       tu->regs[TU_REG_DATAH]--;
+               fallthrough;
+
+       case I2C_SLAVE_READ_REQUESTED:
+               *val = is_proc_call ? tu->regs[TU_REG_DATAH] : TU_CUR_VERSION;
                break;
        }