aboutsummaryrefslogtreecommitdiff
path: root/src/soc/mediatek/mt8173/include
diff options
context:
space:
mode:
authorLiguo Zhang <liguo.zhang@mediatek.com>2015-07-31 17:10:51 +0800
committerPatrick Georgi <pgeorgi@google.com>2016-01-22 19:33:58 +0100
commit5a899e92f1409109e972015ff5784f3909d5096d (patch)
tree8395636420e6034c8d4ead14b88191309cfd3128 /src/soc/mediatek/mt8173/include
parent7119222cfab46f6c4464589bbb0c61871a1531a1 (diff)
mediatek/mt8173: Add I2C driver
BUG=none TEST=emerge-oak coreboot BRANCH=none [pg: split into multiple commits] Change-Id: If2cac5aecc5675048e0e2d28897b1a82e099de7d Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 2a3d867fd1e547cadc6c947f38082fddc2265d32 Original-Change-Id: I4f3a9b403b949d8ae8e3c393cc9441fb66ea5f1d Original-Signed-off-by: liguo.zhang <liguo.zhang@mediatek.com> Original-Reviewed-on: https://chromium-review.googlesource.com/292667 Original-Commit-Ready: Yidi Lin <yidi.lin@mediatek.com> Original-Tested-by: Yidi Lin <yidi.lin@mediatek.com> Original-Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/12615 Tested-by: build bot (Jenkins) Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'src/soc/mediatek/mt8173/include')
-rw-r--r--src/soc/mediatek/mt8173/include/soc/i2c.h130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/soc/mediatek/mt8173/include/soc/i2c.h b/src/soc/mediatek/mt8173/include/soc/i2c.h
new file mode 100644
index 0000000000..2d8a5db185
--- /dev/null
+++ b/src/soc/mediatek/mt8173/include/soc/i2c.h
@@ -0,0 +1,130 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef SOC_MEDIATEK_MT8173_I2C_H
+#define SOC_MEDIATEK_MT8173_I2C_H
+
+#include <stddef.h>
+
+/* I2C Configuration */
+enum {
+ I2C_HS_DEFAULT_VALUE = 0x0102,
+};
+
+enum i2c_modes {
+ I2C_WRITE_MODE = 0,
+ I2C_READ_MODE = 1,
+ I2C_WRITE_READ_MODE = 2,
+};
+
+enum {
+ I2C_DMA_CON_TX = 0x0,
+ I2C_DMA_CON_RX = 0x1,
+ I2C_DMA_START_EN = 0x1,
+ I2C_DMA_INT_FLAG_NONE = 0x0,
+ I2C_DMA_CLR_FLAG = 0x0,
+ I2C_DMA_FLUSH_FLAG = 0x1,
+};
+
+/* I2C DMA Registers */
+struct mt8173_i2c_dma_regs {
+ uint32_t dma_int_flag;
+ uint32_t dma_int_en;
+ uint32_t dma_en;
+ uint32_t dma_rst;
+ uint32_t reserved1;
+ uint32_t dma_flush;
+ uint32_t dma_con;
+ uint32_t dma_tx_mem_addr;
+ uint32_t dma_rx_mem_addr;
+ uint32_t dma_tx_len;
+ uint32_t dma_rx_len;
+};
+
+check_member(mt8173_i2c_dma_regs, dma_tx_len, 0x24);
+
+/* I2C Register */
+struct mt8173_i2c_regs {
+ uint32_t data_port;
+ uint32_t slave_addr;
+ uint32_t intr_mask;
+ uint32_t intr_stat;
+ uint32_t control;
+ uint32_t transfer_len;
+ uint32_t transac_len;
+ uint32_t delay_len;
+ uint32_t timing;
+ uint32_t start;
+ uint32_t ext_conf;
+ uint32_t reserved1;
+ uint32_t fifo_stat;
+ uint32_t fifo_thresh;
+ uint32_t fifo_addr_clr;
+ uint32_t reserved2;
+ uint32_t io_config;
+ uint32_t debug;
+ uint32_t hs;
+ uint32_t reserved3;
+ uint32_t softreset;
+ uint32_t dcm;
+ uint32_t reserved4[3];
+ uint32_t debug_stat;
+ uint32_t debug_ctrl;
+ uint32_t transfer_aux_len;
+};
+
+check_member(mt8173_i2c_regs, debug_stat, 0x64);
+
+struct mtk_i2c {
+ struct mt8173_i2c_regs *i2c_regs;
+ struct mt8173_i2c_dma_regs *i2c_dma_regs;
+};
+
+enum {
+ I2C_TRANS_LEN_MASK = (0xff),
+ I2C_TRANS_AUX_LEN_MASK = (0x1f << 8),
+ I2C_CONTROL_MASK = (0x3f << 1)
+};
+
+/* Register mask */
+enum {
+ I2C_HS_NACKERR = (1 << 2),
+ I2C_ACKERR = (1 << 1),
+ I2C_TRANSAC_COMP = (1 << 0),
+};
+
+/* i2c control bits */
+enum {
+ ACK_ERR_DET_EN = (1 << 5),
+ DIR_CHG = (1 << 4),
+ CLK_EXT = (1 << 3),
+ DMA_EN = (1 << 2),
+ REPEATED_START_FLAG = (1 << 1),
+ STOP_FLAG = (0 << 1)
+};
+
+/* I2C Status Code */
+
+enum {
+ I2C_OK = 0x0000,
+ I2C_SET_SPEED_FAIL_OVER_SPEED = 0xA001,
+ I2C_TRANSFER_INVALID_LENGTH = 0xA002,
+ I2C_TRANSFER_FAIL_HS_NACKERR = 0xA003,
+ I2C_TRANSFER_FAIL_ACKERR = 0xA004,
+ I2C_TRANSFER_FAIL_TIMEOUT = 0xA005,
+ I2C_TRANSFER_INVALID_ARGUMENT = 0xA006
+};
+
+#endif /* SOC_MEDIATEK_MT8173_I2C_H */