summaryrefslogtreecommitdiff
path: root/chip
diff options
context:
space:
mode:
Diffstat (limited to 'chip')
-rw-r--r--chip/it83xx/i2c_slave.c34
-rw-r--r--chip/it83xx/registers.h4
2 files changed, 33 insertions, 5 deletions
diff --git a/chip/it83xx/i2c_slave.c b/chip/it83xx/i2c_slave.c
index bce86d25b8..1902285959 100644
--- a/chip/it83xx/i2c_slave.c
+++ b/chip/it83xx/i2c_slave.c
@@ -230,6 +230,7 @@ void i2c_slave_enable(int port, uint8_t slv_addr)
/* Enhanced I2C slave channel D, E, F DMA mode */
else {
int ch, idx;
+ uint32_t in_data_addr, out_data_addr;
/* Get enhanced i2c channel */
ch = i2c_slv_ctrl[port].offset / I2C_ENHANCED_CH_INTERVAL;
@@ -280,13 +281,36 @@ void i2c_slave_enable(int port, uint8_t slv_addr)
memset(in_data[idx], 0, I2C_MAX_BUFFER_SIZE);
memset(out_data[idx], 0, I2C_MAX_BUFFER_SIZE);
+ if (IS_ENABLED(CHIP_ILM_DLM_ORDER)) {
+ in_data_addr = (uint32_t)in_data[idx] & 0xffffff;
+ out_data_addr = (uint32_t)out_data[idx] & 0xffffff;
+ } else {
+ in_data_addr = (uint32_t)in_data[idx] & 0xfff;
+ out_data_addr = (uint32_t)out_data[idx] & 0xfff;
+ }
+
/* DMA write target address register */
- IT83XX_I2C_RAMHA(ch) = ((uint32_t)in_data[idx] >> 8) & 0x0F;
- IT83XX_I2C_RAMLA(ch) = (uint32_t)in_data[idx] & 0xFF;
+ IT83XX_I2C_RAMHA(ch) = in_data_addr >> 8;
+ IT83XX_I2C_RAMLA(ch) = in_data_addr;
- /* DMA read target address register */
- IT83XX_I2C_RAMHA2(ch) = ((uint32_t)out_data[idx] >> 8) & 0x0F;
- IT83XX_I2C_RAMLA2(ch) = (uint32_t)out_data[idx] & 0xFF;
+ if (IS_ENABLED(CHIP_ILM_DLM_ORDER)) {
+ /*
+ * DMA write target address register
+ * for high order byte
+ */
+ IT83XX_I2C_RAMH2A(ch) = in_data_addr >> 16;
+ /*
+ * DMA read target address register
+ * for high order byte
+ */
+ IT83XX_I2C_CMD_ADDH2(ch) = out_data_addr >> 16;
+ IT83XX_I2C_CMD_ADDH(ch) = out_data_addr >> 8;
+ IT83XX_I2C_CMD_ADDL(ch) = out_data_addr;
+ } else {
+ /* DMA read target address register */
+ IT83XX_I2C_RAMHA2(ch) = out_data_addr >> 8;
+ IT83XX_I2C_RAMLA2(ch) = out_data_addr;
+ }
/* I2C module enable and command queue mode */
IT83XX_I2C_CTR1(ch) = IT83XX_I2C_COMQ_EN |
diff --git a/chip/it83xx/registers.h b/chip/it83xx/registers.h
index 9a2015263e..077bd794cf 100644
--- a/chip/it83xx/registers.h
+++ b/chip/it83xx/registers.h
@@ -1219,6 +1219,10 @@ enum bram_indices {
#define IT83XX_I2C_RAMLA(ch) REG8(IT83XX_I2C_BASE+0x24+(ch << 7))
#define IT83XX_I2C_RAMHA2(ch) REG8(IT83XX_I2C_BASE+0x2B+(ch << 7))
#define IT83XX_I2C_RAMLA2(ch) REG8(IT83XX_I2C_BASE+0x2C+(ch << 7))
+#define IT83XX_I2C_CMD_ADDH(ch) REG8(IT83XX_I2C_BASE+0x25+(ch << 7))
+#define IT83XX_I2C_CMD_ADDL(ch) REG8(IT83XX_I2C_BASE+0x26+(ch << 7))
+#define IT83XX_I2C_RAMH2A(ch) REG8(IT83XX_I2C_BASE+0x50+(ch << 7))
+#define IT83XX_I2C_CMD_ADDH2(ch) REG8(IT83XX_I2C_BASE+0x52+(ch << 7))
enum i2c_channels {
IT83XX_I2C_CH_A, /* GPIO.B3/B4 */