blob: 2b6f43a02072dec886fbb4eb2a9584c799456fd3 [file] [log] [blame]
/*
* Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef _MEC172X_I2C_SMB_H
#define _MEC172X_I2C_SMB_H
#include <stdint.h>
#include <stddef.h>
/* Version 3.7 MCHP I2C/SMBus Controller specification */
#define MCHP_I2C_BAUD_CLK_HZ 16000000u
#define MCHP_I2C_SMB_INST_SPACING 0x400u
#define MCHP_I2C_SMB_INST_SPACING_P2 10u
#define MCHP_I2C_SMB0_BASE_ADDR 0x40004000u
#define MCHP_I2C_SMB1_BASE_ADDR 0x40004400u
#define MCHP_I2C_SMB2_BASE_ADDR 0x40004800u
#define MCHP_I2C_SMB3_BASE_ADDR 0x40004c00u
#define MCHP_I2C_SMB4_BASE_ADDR 0x40005000u
/* 0 <= n < MCHP_I2C_SMB_MAX_INSTANCES */
#define MCHP_I2C_SMB_BASE_ADDR(n) \
((MCHP_I2C_SMB0_BASE_ADDR) + \
((uint32_t)(n) * (MCHP_I2C_SMB_INST_SPACING)))
/*
* Offset 0x00
* Control and Status register
* Write to Control
* Read from Status
* Size 8-bit
*/
#define MCHP_I2C_SMB_CTRL_OFS 0x00u
#define MCHP_I2C_SMB_CTRL_MASK 0xcfu
#define MCHP_I2C_SMB_CTRL_ACK BIT(0)
#define MCHP_I2C_SMB_CTRL_STO BIT(1)
#define MCHP_I2C_SMB_CTRL_STA BIT(2)
#define MCHP_I2C_SMB_CTRL_ENI BIT(3)
/* bits [5:4] reserved */
#define MCHP_I2C_SMB_CTRL_ESO BIT(6)
#define MCHP_I2C_SMB_CTRL_PIN BIT(7)
/* Status Read-only */
#define MCHP_I2C_SMB_STS_OFS 0x00u
#define MCHP_I2C_SMB_STS_NBB BIT(0)
#define MCHP_I2C_SMB_STS_LAB BIT(1)
#define MCHP_I2C_SMB_STS_AAS BIT(2)
#define MCHP_I2C_SMB_STS_LRB_AD0 BIT(3)
#define MCHP_I2C_SMB_STS_BER BIT(4)
#define MCHP_I2C_SMB_STS_EXT_STOP BIT(5)
#define MCHP_I2C_SMB_STS_SAD BIT(6)
#define MCHP_I2C_SMB_STS_PIN BIT(7)
/*
* Offset 0x04
* Own Address b[7:0] = Slave address 1
* b[14:8] = Slave address 2
*/
#define MCHP_I2C_SMB_OWN_ADDR_OFS 0x04u
#define MCHP_I2C_SMB_OWN_ADDR2_OFS 0x05u
#define MCHP_I2C_SMB_OWN_ADDR_MASK 0x7f7fu
/*
* Offset 0x08
* Data register, 8-bit
* Data to be shifted out or shifted in.
*/
#define MCHP_I2C_SMB_DATA_OFS 0x08u
/* Offset 0x0C Leader Command register
*/
#define MCHP_I2C_SMB_MSTR_CMD_OFS 0x0cu
#define MCHP_I2C_SMB_MSTR_CMD_RD_CNT_OFS 0x0fu /* byte 3 */
#define MCHP_I2C_SMB_MSTR_CMD_WR_CNT_OFS 0x0eu /* byte 2 */
#define MCHP_I2C_SMB_MSTR_CMD_OP_OFS 0x0du /* byte 1 */
#define MCHP_I2C_SMB_MSTR_CMD_M_OFS 0x0cu /* byte 0 */
#define MCHP_I2C_SMB_MSTR_CMD_MASK 0xffff3ff3u
/* 32-bit definitions */
#define MCHP_I2C_SMB_MSTR_CMD_MRUN BIT(0)
#define MCHP_I2C_SMB_MSTR_CMD_MPROCEED BIT(1)
#define MCHP_I2C_SMB_MSTR_CMD_START0 BIT(8)
#define MCHP_I2C_SMB_MSTR_CMD_STARTN BIT(9)
#define MCHP_I2C_SMB_MSTR_CMD_STOP BIT(10)
#define MCHP_I2C_SMB_MSTR_CMD_PEC_TERM BIT(11)
#define MCHP_I2C_SMB_MSTR_CMD_READM BIT(12)
#define MCHP_I2C_SMB_MSTR_CMD_READ_PEC BIT(13)
#define MCHP_I2C_SMB_MSTR_CMD_RD_CNT_POS 24u
#define MCHP_I2C_SMB_MSTR_CMD_WR_CNT_POS 16u
/* byte 0 definitions */
#define MCHP_I2C_SMB_MSTR_CMD_B0_MRUN BIT(0)
#define MCHP_I2C_SMB_MSTR_CMD_B0_MPROCEED BIT(1)
/* byte 1 definitions */
#define MCHP_I2C_SMB_MSTR_CMD_B1_START0 BIT((8 - 8))
#define MCHP_I2C_SMB_MSTR_CMD_B1_STARTN BIT((9 - 8))
#define MCHP_I2C_SMB_MSTR_CMD_B1_STOP BIT((10 - 8))
#define MCHP_I2C_SMB_MSTR_CMD_B1_PEC_TERM BIT((11 - 8))
#define MCHP_I2C_SMB_MSTR_CMD_B1_READM BIT((12 - 8))
#define MCHP_I2C_SMB_MSTR_CMD_B1_READ_PEC BIT((13 - 8))
/* Offset 0x10 Follower Command register */
#define MCHP_I2C_SMB_SLV_CMD_OFS 0x10u
#define MCHP_I2C_SMB_SLV_CMD_MASK 0x00ffff07u
#define MCHP_I2C_SMB_SLV_CMD_SRUN BIT(0)
#define MCHP_I2C_SMB_SLV_CMD_SPROCEED BIT(1)
#define MCHP_I2C_SMB_SLV_CMD_SEND_PEC BIT(2)
#define MCHP_I2C_SMB_SLV_WR_CNT_POS 8u
#define MCHP_I2C_SMB_SLV_RD_CNT_POS 16u
/* Offset 0x14 PEC CRC register, 8-bit read-write */
#define MCHP_I2C_SMB_PEC_CRC_OFS 0x14u
/* Offset 0x18 Repeated Start Hold Time register, 8-bit read-write */
#define MCHP_I2C_SMB_RSHT_OFS 0x18u
/* Offset 0x20 Completion register, 32-bit */
#define MCHP_I2C_SMB_CMPL_OFS 0x20u
#define MCHP_I2C_SMB_CMPL_MASK 0xe33b7f7Cu
#define MCHP_I2C_SMB_CMPL_RW1C_MASK 0xe1397f00u
#define MCHP_I2C_SMB_CMPL_DTEN BIT(2)
#define MCHP_I2C_SMB_CMPL_MCEN BIT(3)
#define MCHP_I2C_SMB_CMPL_SCEN BIT(4)
#define MCHP_I2C_SMB_CMPL_BIDEN BIT(5)
#define MCHP_I2C_SMB_CMPL_TIMERR BIT(6)
#define MCHP_I2C_SMB_CMPL_DTO_RWC BIT(8)
#define MCHP_I2C_SMB_CMPL_MCTO_RWC BIT(9)
#define MCHP_I2C_SMB_CMPL_SCTO_RWC BIT(10)
#define MCHP_I2C_SMB_CMPL_CHDL_RWC BIT(11)
#define MCHP_I2C_SMB_CMPL_CHDH_RWC BIT(12)
#define MCHP_I2C_SMB_CMPL_BER_RWC BIT(13)
#define MCHP_I2C_SMB_CMPL_LAB_RWC BIT(14)
#define MCHP_I2C_SMB_CMPL_SNAKR_RWC BIT(16)
#define MCHP_I2C_SMB_CMPL_STR_RO BIT(17)
#define MCHP_I2C_SMB_CMPL_SPROT_RWC BIT(19)
#define MCHP_I2C_SMB_CMPL_RPT_RD_RWC BIT(20)
#define MCHP_I2C_SMB_CMPL_RPT_WR_RWC BIT(21)
#define MCHP_I2C_SMB_CMPL_MNAKX_RWC BIT(24)
#define MCHP_I2C_SMB_CMPL_MTR_RO BIT(25)
#define MCHP_I2C_SMB_CMPL_IDLE_RWC BIT(29)
#define MCHP_I2C_SMB_CMPL_MDONE_RWC BIT(30)
#define MCHP_I2C_SMB_CMPL_SDONE_RWC BIT(31)
/* Offset 0x24 Idle Scaling register */
#define MCHP_I2C_SMB_IDLSC_OFS 0x24u
#define MCHP_I2C_SMB_IDLSC_DLY_OFS 0x24u
#define MCHP_I2C_SMB_IDLSC_BUS_OFS 0x26u
#define MCHP_I2C_SMB_IDLSC_MASK 0x0fff0fffu
#define MCHP_I2C_SMB_IDLSC_BUS_MIN_POS 0u
#define MCHP_I2C_SMB_IDLSC_DLY_POS 16u
/* Offset 0x28 Configuration register */
#define MCHP_I2C_SMB_CFG_OFS 0x28u
#define MCHP_I2C_SMB_CFG_MASK 0xf00f5Fbfu
#define MCHP_I2C_SMB_CFG_PORT_SEL_POS 0
#define MCHP_I2C_SMB_CFG_PORT_SEL_MASK 0x0fu
#define MCHP_I2C_SMB_CFG_TCEN BIT(4)
#define MCHP_I2C_SMB_CFG_SLOW_CLK BIT(5)
#define MCHP_I2C_SMB_CFG_PCEN BIT(7)
#define MCHP_I2C_SMB_CFG_FEN BIT(8)
#define MCHP_I2C_SMB_CFG_RESET BIT(9)
#define MCHP_I2C_SMB_CFG_ENAB BIT(10)
#define MCHP_I2C_SMB_CFG_DSA BIT(11)
#define MCHP_I2C_SMB_CFG_FAIR BIT(12)
#define MCHP_I2C_SMB_CFG_GC_DIS BIT(14)
#define MCHP_I2C_SMB_CFG_FLUSH_SXBUF_WO BIT(16)
#define MCHP_I2C_SMB_CFG_FLUSH_SRBUF_WO BIT(17)
#define MCHP_I2C_SMB_CFG_FLUSH_MXBUF_WO BIT(18)
#define MCHP_I2C_SMB_CFG_FLUSH_MRBUF_WO BIT(19)
#define MCHP_I2C_SMB_CFG_EN_AAS BIT(28)
#define MCHP_I2C_SMB_CFG_ENIDI BIT(29)
#define MCHP_I2C_SMB_CFG_ENMI BIT(30)
#define MCHP_I2C_SMB_CFG_ENSI BIT(31)
/* Offset 0x2C Bus Clock register */
#define MCHP_I2C_SMB_BUS_CLK_OFS 0x2cu
#define MCHP_I2C_SMB_BUS_CLK_MASK 0x0000ffffu
#define MCHP_I2C_SMB_BUS_CLK_LO_POS 0u
#define MCHP_I2C_SMB_BUS_CLK_HI_POS 8u
/* Offset 0x30 Block ID register, 8-bit read-only */
#define MCHP_I2C_SMB_BLOCK_ID_OFS 0x30u
#define MCHP_I2C_SMB_BLOCK_ID_MASK 0xffu
/* Offset 0x34 Block Revision register, 8-bit read-only */
#define MCHP_I2C_SMB_BLOCK_REV_OFS 0x34u
#define MCHP_I2C_SMB_BLOCK_REV_MASK 0xffu
/* Offset 0x38 Bit-Bang Control register, 8-bit read-write */
#define MCHP_I2C_SMB_BB_OFS 0x38u
#define MCHP_I2C_SMB_BB_MASK 0x7fu
#define MCHP_I2C_SMB_BB_EN BIT(0)
#define MCHP_I2C_SMB_BB_SCL_DIR_IN 0
#define MCHP_I2C_SMB_BB_SCL_DIR_OUT BIT(1)
#define MCHP_I2C_SMB_BB_SDA_DIR_IN 0
#define MCHP_I2C_SMB_BB_SDA_DIR_OUT BIT(2)
#define MCHP_I2C_SMB_BB_CL BIT(3)
#define MCHP_I2C_SMB_BB_DAT BIT(4)
#define MCHP_I2C_SMB_BB_IN_POS 5u
#define MCHP_I2C_SMB_BB_IN_MASK0 0x03u
#define MCHP_I2C_SMB_BB_IN_MASK SHLU32(0x03, 5)
#define MCHP_I2C_SMB_BB_CLKI_RO BIT(5)
#define MCHP_I2C_SMB_BB_DATI_RO BIT(6)
/* Offset 0x40 Data Timing register */
#define MCHP_I2C_SMB_DATA_TM_OFS 0x40u
#define MCHP_I2C_SMB_DATA_TM_MASK GENMASK(31, 0)
#define MCHP_I2C_SMB_DATA_TM_DATA_HOLD_POS 0u
#define MCHP_I2C_SMB_DATA_TM_DATA_HOLD_MASK 0xffu
#define MCHP_I2C_SMB_DATA_TM_DATA_HOLD_MASK0 0xffu
#define MCHP_I2C_SMB_DATA_TM_RESTART_POS 8u
#define MCHP_I2C_SMB_DATA_TM_RESTART_MASK 0xff00u
#define MCHP_I2C_SMB_DATA_TM_RESTART_MASK0 0xffu
#define MCHP_I2C_SMB_DATA_TM_STOP_POS 16u
#define MCHP_I2C_SMB_DATA_TM_STOP_MASK 0xff0000u
#define MCHP_I2C_SMB_DATA_TM_STOP_MASK0 0xffu
#define MCHP_I2C_SMB_DATA_TM_FSTART_POS 24u
#define MCHP_I2C_SMB_DATA_TM_FSTART_MASK 0xff000000u
#define MCHP_I2C_SMB_DATA_TM_FSTART_MASK0 0xffu
/* Offset 0x44 Time-out Scaling register */
#define MCHP_I2C_SMB_TMTSC_OFS 0x44u
#define MCHP_I2C_SMB_TMTSC_MASK GENMASK(31, 0)
#define MCHP_I2C_SMB_TMTSC_CLK_HI_POS 0u
#define MCHP_I2C_SMB_TMTSC_CLK_HI_MASK 0xffu
#define MCHP_I2C_SMB_TMTSC_CLK_HI_MASK0 0xffu
#define MCHP_I2C_SMB_TMTSC_SLV_POS 8u
#define MCHP_I2C_SMB_TMTSC_SLV_MASK 0xff00u
#define MCHP_I2C_SMB_TMTSC_SLV_MASK0 0xffu
#define MCHP_I2C_SMB_TMTSC_MSTR_POS 16u
#define MCHP_I2C_SMB_TMTSC_MSTR_MASK 0xff0000u
#define MCHP_I2C_SMB_TMTSC_MSTR_MASK0 0xffu
#define MCHP_I2C_SMB_TMTSC_BUS_POS 24u
#define MCHP_I2C_SMB_TMTSC_BUS_MASK 0xff000000u
#define MCHP_I2C_SMB_TMTSC_BUS_MASK0 0xffu
/* Offset 0x48 Follower Transmit Buffer register 8-bit read-write */
#define MCHP_I2C_SMB_SLV_TX_BUF_OFS 0x48u
/* Offset 0x4C Follower Receive Buffer register 8-bit read-write */
#define MCHP_I2C_SMB_SLV_RX_BUF_OFS 0x4cu
/* Offset 0x50 Leader Transmit Buffer register 8-bit read-write */
#define MCHP_I2C_SMB_MTR_TX_BUF_OFS 0x50u
/* Offset 0x54 Leader Receive Buffer register 8-bit read-write */
#define MCHP_I2C_SMB_MTR_RX_BUF_OFS 0x54u
/* Offset 0x58 I2C FSM read-only */
#define MCHP_I2C_SMB_I2C_FSM_OFS 0x58u
/* Offset 0x5C SMB Network layer FSM read-only */
#define MCHP_I2C_SMB_FSM_OFS 0x5cu
/* Offset 0x60 Wake Status register */
#define MCHP_I2C_SMB_WAKE_STS_OFS 0x60u
#define MCHP_I2C_SMB_WAKE_STS_START_RWC BIT(0)
/* Offset 0x64 Wake Enable register */
#define MCHP_I2C_SMB_WAKE_EN_OFS 0x64u
#define MCHP_I2C_SMB_WAKE_EN BIT(0)
/* Offset 0x68 */
#define MCHP_I2C_SMB_WAKE_SYNC_OFS 0x68u
#define MCHP_I2C_SMB_WAKE_FAST_RESYNC_EN BIT(0)
/** @brief I2C-SMBus with network layer registers. */
struct i2c_smb_regs {
volatile uint8_t CTRLSTS;
uint8_t RSVD1[3];
volatile uint32_t OWN_ADDR;
volatile uint8_t I2CDATA;
uint8_t RSVD2[3];
volatile uint32_t MCMD;
volatile uint32_t SCMD;
volatile uint8_t PEC;
uint8_t RSVD3[3];
volatile uint32_t RSHTM;
volatile uint32_t EXTLEN;
volatile uint32_t COMPL;
volatile uint32_t IDLSC;
volatile uint32_t CFG;
volatile uint32_t BUSCLK;
volatile uint32_t BLKID;
volatile uint32_t BLKREV;
volatile uint8_t BBCTRL;
uint8_t RSVD7[3];
volatile uint32_t CLKSYNC;
volatile uint32_t DATATM;
volatile uint32_t TMOUTSC;
volatile uint8_t SLV_TXB;
uint8_t RSVD8[3];
volatile uint8_t SLV_RXB;
uint8_t RSVD9[3];
volatile uint8_t MTR_TXB;
uint8_t RSVD10[3];
volatile uint8_t MTR_RXB;
uint8_t RSVD11[3];
volatile uint32_t FSM;
volatile uint32_t FSM_SMB;
volatile uint8_t WAKE_STS;
uint8_t RSVD12[3];
volatile uint8_t WAKE_EN;
uint32_t RSVD13[2];
volatile uint32_t PROM_ISTS;
volatile uint32_t PROM_IEN;
volatile uint32_t PROM_CTRL;
volatile uint32_t SHADOW_DATA;
}; /* Size = 128(0x80) */
#endif /* #ifndef _MEC172X_I2C_SMB_H */