Skip to content

Commit 3d075c4

Browse files
danieldegrassecfriedt
authored andcommitted
drivers: i2c: i2c_dw: make target stop callback after read/write callbacks
In target mode, issue the stop callback from the I2C DW driver after the read/write callbacks. This mirrors the behavior of other I2C target mode drivers, and allows target handler code to correctly service any pending read or write requests before it handles the stop condition. Fixes #98675 Signed-off-by: Daniel DeGrasse <ddegrasse@tenstorrent.com>
1 parent af7ae5d commit 3d075c4

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

‎drivers/i2c/i2c_dw.c‎

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,15 @@ static void i2c_dw_isr(const struct device *port)
607607
}
608608
}
609609
}
610+
611+
if (intr_stat.bits.stop_det) {
612+
read_clr_stop_det(reg_base);
613+
dw->state = I2C_DW_STATE_READY;
614+
dw->read_in_progress = false;
615+
if (slave_cb->stop) {
616+
slave_cb->stop(dw->slave_cfg);
617+
}
618+
}
610619
#endif
611620
}
612621

@@ -1157,8 +1166,6 @@ static void i2c_dw_slave_read_clear_intr_bits(const struct device *dev)
11571166
union ic_interrupt_register intr_stat;
11581167
uint32_t reg_base = get_regs(dev);
11591168

1160-
const struct i2c_target_callbacks *slave_cb = dw->slave_cfg->callbacks;
1161-
11621169
intr_stat.raw = read_intr_stat(reg_base);
11631170

11641171
if (intr_stat.bits.tx_abrt) {
@@ -1191,15 +1198,6 @@ static void i2c_dw_slave_read_clear_intr_bits(const struct device *dev)
11911198
dw->state = I2C_DW_STATE_READY;
11921199
}
11931200

1194-
if (intr_stat.bits.stop_det) {
1195-
read_clr_stop_det(reg_base);
1196-
dw->state = I2C_DW_STATE_READY;
1197-
dw->read_in_progress = false;
1198-
if (slave_cb->stop) {
1199-
slave_cb->stop(dw->slave_cfg);
1200-
}
1201-
}
1202-
12031201
if (intr_stat.bits.start_det) {
12041202
read_clr_start_det(reg_base);
12051203
dw->state = I2C_DW_STATE_READY;

0 commit comments

Comments
 (0)