diff options
author | Liguo Zhang <liguo.zhang@mediatek.com> | 2015-07-31 17:10:51 +0800 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2016-01-22 19:33:58 +0100 |
commit | 5a899e92f1409109e972015ff5784f3909d5096d (patch) | |
tree | 8395636420e6034c8d4ead14b88191309cfd3128 /src/soc/mediatek/mt8173/include | |
parent | 7119222cfab46f6c4464589bbb0c61871a1531a1 (diff) | |
download | coreboot-5a899e92f1409109e972015ff5784f3909d5096d.tar.xz |
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.h | 130 |
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 */ |