19#include "sw/device/lib/dif/autogen/dif_i2c_autogen.h"
32 i2c->
dt = kDtI2cCount;
47 i2c->
base_addr = mmio_region_from_addr(dt_i2c_primary_reg_block(dt));
55 if (i2c->
dt == kDtI2cCount || dt == NULL) {
72 alert_idx = I2C_ALERT_TEST_FATAL_FAULT_BIT;
78 uint32_t alert_test_reg = bitfield_bit32_write(0, alert_idx,
true);
81 (ptrdiff_t)I2C_ALERT_TEST_REG_OFFSET,
92 static bool i2c_get_irq_bit_index(
98 *index_out = I2C_INTR_COMMON_FMT_THRESHOLD_BIT;
101 *index_out = I2C_INTR_COMMON_RX_THRESHOLD_BIT;
104 *index_out = I2C_INTR_COMMON_ACQ_THRESHOLD_BIT;
107 *index_out = I2C_INTR_COMMON_RX_OVERFLOW_BIT;
110 *index_out = I2C_INTR_COMMON_CONTROLLER_HALT_BIT;
113 *index_out = I2C_INTR_COMMON_SCL_INTERFERENCE_BIT;
116 *index_out = I2C_INTR_COMMON_SDA_INTERFERENCE_BIT;
119 *index_out = I2C_INTR_COMMON_STRETCH_TIMEOUT_BIT;
122 *index_out = I2C_INTR_COMMON_SDA_UNSTABLE_BIT;
125 *index_out = I2C_INTR_COMMON_CMD_COMPLETE_BIT;
128 *index_out = I2C_INTR_COMMON_TX_STRETCH_BIT;
131 *index_out = I2C_INTR_COMMON_TX_THRESHOLD_BIT;
134 *index_out = I2C_INTR_COMMON_ACQ_STRETCH_BIT;
137 *index_out = I2C_INTR_COMMON_UNEXP_STOP_BIT;
140 *index_out = I2C_INTR_COMMON_HOST_TIMEOUT_BIT;
181 *type = irq_types[irq];
191 if (i2c == NULL || snapshot == NULL) {
195 *snapshot = mmio_region_read32(
197 (ptrdiff_t)I2C_INTR_STATE_REG_OFFSET);
213 (ptrdiff_t)I2C_INTR_STATE_REG_OFFSET,
226 if (i2c == NULL || is_pending == NULL) {
231 if (!i2c_get_irq_bit_index(irq, &index)) {
235 uint32_t intr_state_reg = mmio_region_read32(
237 (ptrdiff_t)I2C_INTR_STATE_REG_OFFSET);
240 *is_pending = bitfield_bit32_read(intr_state_reg, index);
257 (ptrdiff_t)I2C_INTR_STATE_REG_OFFSET,
274 if (!i2c_get_irq_bit_index(irq, &index)) {
279 uint32_t intr_state_reg = bitfield_bit32_write(0, index,
true);
282 (ptrdiff_t)I2C_INTR_STATE_REG_OFFSET,
300 if (!i2c_get_irq_bit_index(irq, &index)) {
304 uint32_t intr_test_reg = bitfield_bit32_write(0, index, val);
307 (ptrdiff_t)I2C_INTR_TEST_REG_OFFSET,
320 if (i2c == NULL || state == NULL) {
325 if (!i2c_get_irq_bit_index(irq, &index)) {
329 uint32_t intr_enable_reg = mmio_region_read32(
331 (ptrdiff_t)I2C_INTR_ENABLE_REG_OFFSET);
334 bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
335 *state = is_enabled ?
352 if (!i2c_get_irq_bit_index(irq, &index)) {
356 uint32_t intr_enable_reg = mmio_region_read32(
358 (ptrdiff_t)I2C_INTR_ENABLE_REG_OFFSET);
362 intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
365 (ptrdiff_t)I2C_INTR_ENABLE_REG_OFFSET,
382 if (snapshot != NULL) {
383 *snapshot = mmio_region_read32(
385 (ptrdiff_t)I2C_INTR_ENABLE_REG_OFFSET);
392 (ptrdiff_t)I2C_INTR_ENABLE_REG_OFFSET,
404 if (i2c == NULL || snapshot == NULL) {
410 (ptrdiff_t)I2C_INTR_ENABLE_REG_OFFSET,