/* * 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 #include /* 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 */