Ryan Chen | 4088f5f | 2023-01-30 14:19:24 +0800 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
| 2 | /* |
| 3 | * Copyright ASPEED Technology Inc. |
| 4 | */ |
| 5 | #ifndef __AST2600_I2C_H_ |
| 6 | #define __AST2600_I2C_H_ |
| 7 | |
| 8 | struct ast2600_i2c_regs { |
| 9 | u32 fun_ctrl; |
| 10 | u32 ac_timing; |
| 11 | u32 trx_buff; |
| 12 | u32 icr; |
| 13 | u32 ier; |
| 14 | u32 isr; |
| 15 | u32 cmd_sts; |
| 16 | }; |
| 17 | |
| 18 | /* 0x00 : I2CC Master/Slave Function Control Register */ |
| 19 | #define I2CC_SLAVE_ADDR_RX_EN BIT(20) |
| 20 | #define I2CC_MASTER_RETRY_MASK GENMASK(19, 18) |
| 21 | #define I2CC_MASTER_RETRY(x) (((x) & GENMASK(1, 0)) << 18) |
| 22 | #define I2CC_BUS_AUTO_RELEASE BIT(17) |
| 23 | #define I2CC_M_SDA_LOCK_EN BIT(16) |
| 24 | #define I2CC_MULTI_MASTER_DIS BIT(15) |
| 25 | #define I2CC_M_SCL_DRIVE_EN BIT(14) |
| 26 | #define I2CC_MSB_STS BIT(9) |
| 27 | #define I2CC_SDA_DRIVE_1T_EN BIT(8) |
| 28 | #define I2CC_M_SDA_DRIVE_1T_EN BIT(7) |
| 29 | #define I2CC_M_HIGH_SPEED_EN BIT(6) |
| 30 | /* reserved 5 : 2 */ |
| 31 | #define I2CC_SLAVE_EN BIT(1) |
| 32 | #define I2CC_MASTER_EN BIT(0) |
| 33 | |
| 34 | /* 0x04 : I2CD Clock and AC Timing Control Register #1 */ |
| 35 | /* Base register value. These bits are always set by the driver. */ |
| 36 | #define I2CD_CACTC_BASE 0xfff00300 |
| 37 | #define I2CD_TCKHIGH_SHIFT 16 |
| 38 | #define I2CD_TCKLOW_SHIFT 12 |
| 39 | #define I2CD_THDDAT_SHIFT 10 |
| 40 | #define I2CD_TO_DIV_SHIFT 8 |
| 41 | #define I2CD_BASE_DIV_SHIFT 0 |
| 42 | |
| 43 | /* 0x08 : I2CC Master/Slave Transmit/Receive Byte Buffer Register */ |
| 44 | #define I2CC_TX_DIR_MASK GENMASK(31, 29) |
| 45 | #define I2CC_SDA_OE BIT(28) |
| 46 | #define I2CC_SDA_O BIT(27) |
| 47 | #define I2CC_SCL_OE BIT(26) |
| 48 | #define I2CC_SCL_O BIT(25) |
| 49 | |
| 50 | #define I2CC_SCL_LINE_STS BIT(18) |
| 51 | #define I2CC_SDA_LINE_STS BIT(17) |
| 52 | #define I2CC_BUS_BUSY_STS BIT(16) |
| 53 | #define I2CC_GET_RX_BUFF(x) (((x) >> 8) & GENMASK(7, 0)) |
| 54 | |
| 55 | /* 0x10 : I2CM Master Interrupt Control Register */ |
| 56 | /* 0x14 : I2CM Master Interrupt Status Register */ |
| 57 | #define I2CM_PKT_TIMEOUT BIT(18) |
| 58 | #define I2CM_PKT_ERROR BIT(17) |
| 59 | #define I2CM_PKT_DONE BIT(16) |
| 60 | |
| 61 | #define I2CM_BUS_RECOVER_FAIL BIT(15) |
| 62 | #define I2CM_SDA_DL_TO BIT(14) |
| 63 | #define I2CM_BUS_RECOVER BIT(13) |
| 64 | #define I2CM_SMBUS_ALT BIT(12) |
| 65 | |
| 66 | #define I2CM_SCL_LOW_TO BIT(6) |
| 67 | #define I2CM_ABNORMAL BIT(5) |
| 68 | #define I2CM_NORMAL_STOP BIT(4) |
| 69 | #define I2CM_ARBIT_LOSS BIT(3) |
| 70 | #define I2CM_RX_DONE BIT(2) |
| 71 | #define I2CM_TX_NAK BIT(1) |
| 72 | #define I2CM_TX_ACK BIT(0) |
| 73 | |
| 74 | /* 0x18 : I2CM Master Command/Status Register */ |
| 75 | #define I2CM_PKT_ADDR(x) (((x) & GENMASK(6, 0)) << 24) |
| 76 | #define I2CM_PKT_EN BIT(16) |
| 77 | #define I2CM_SDA_OE_OUT_DIR BIT(15) |
| 78 | #define I2CM_SDA_O_OUT_DIR BIT(14) |
| 79 | #define I2CM_SCL_OE_OUT_DIR BIT(13) |
| 80 | #define I2CM_SCL_O_OUT_DIR BIT(12) |
| 81 | #define I2CM_RECOVER_CMD_EN BIT(11) |
| 82 | |
| 83 | #define I2CM_RX_DMA_EN BIT(9) |
| 84 | #define I2CM_TX_DMA_EN BIT(8) |
| 85 | /* Command Bit */ |
| 86 | #define I2CM_RX_BUFF_EN BIT(7) |
| 87 | #define I2CM_TX_BUFF_EN BIT(6) |
| 88 | #define I2CM_STOP_CMD BIT(5) |
| 89 | #define I2CM_RX_CMD_LAST BIT(4) |
| 90 | #define I2CM_RX_CMD BIT(3) |
| 91 | |
| 92 | #define I2CM_TX_CMD BIT(1) |
| 93 | #define I2CM_START_CMD BIT(0) |
| 94 | |
| 95 | #define I2C_TIMEOUT_US 100000 |
| 96 | |
| 97 | /* I2C Global Register */ |
| 98 | #define I2CG_ISR 0x00 |
| 99 | #define I2CG_SLAVE_ISR 0x04 |
| 100 | #define I2CG_OWNER 0x08 |
| 101 | #define I2CG_CTRL 0x0C |
| 102 | #define I2CG_CLK_DIV_CTRL 0x10 |
| 103 | |
| 104 | #define I2CG_SLAVE_PKT_NAK BIT(4) |
| 105 | #define I2CG_M_S_SEPARATE_INTR BIT(3) |
| 106 | #define I2CG_CTRL_NEW_REG BIT(2) |
| 107 | #define I2CG_CTRL_NEW_CLK_DIV BIT(1) |
| 108 | |
| 109 | #define GLOBAL_INIT \ |
| 110 | (I2CG_SLAVE_PKT_NAK | \ |
| 111 | I2CG_CTRL_NEW_REG | \ |
| 112 | I2CG_CTRL_NEW_CLK_DIV) |
| 113 | #define I2CCG_DIV_CTRL 0xc6411208 |
| 114 | |
| 115 | #define GET_CLK1_DIV(x) ((x) & 0xff) |
| 116 | #define GET_CLK2_DIV(x) (((x) >> 8) & 0xff) |
| 117 | #define GET_CLK3_DIV(x) (((x) >> 16) & 0xff) |
| 118 | #define GET_CLK4_DIV(x) (((x) >> 24) & 0xff) |
| 119 | |
| 120 | #endif /* __AST2600_I2C_H_ */ |