1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2004-2010 3*4882a593Smuzhiyun * Texas Instruments, <www.ti.com> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #ifndef _OMAP2PLUS_I2C_H_ 8*4882a593Smuzhiyun #define _OMAP2PLUS_I2C_H_ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun /* I2C masks */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* I2C Interrupt Enable Register (I2C_IE): */ 13*4882a593Smuzhiyun #define I2C_IE_GC_IE (1 << 5) 14*4882a593Smuzhiyun #define I2C_IE_XRDY_IE (1 << 4) /* Transmit data ready interrupt enable */ 15*4882a593Smuzhiyun #define I2C_IE_RRDY_IE (1 << 3) /* Receive data ready interrupt enable */ 16*4882a593Smuzhiyun #define I2C_IE_ARDY_IE (1 << 2) /* Register access ready interrupt enable */ 17*4882a593Smuzhiyun #define I2C_IE_NACK_IE (1 << 1) /* No acknowledgment interrupt enable */ 18*4882a593Smuzhiyun #define I2C_IE_AL_IE (1 << 0) /* Arbitration lost interrupt enable */ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* I2C Status Register (I2C_STAT): */ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define I2C_STAT_SBD (1 << 15) /* Single byte data */ 23*4882a593Smuzhiyun #define I2C_STAT_BB (1 << 12) /* Bus busy */ 24*4882a593Smuzhiyun #define I2C_STAT_ROVR (1 << 11) /* Receive overrun */ 25*4882a593Smuzhiyun #define I2C_STAT_XUDF (1 << 10) /* Transmit underflow */ 26*4882a593Smuzhiyun #define I2C_STAT_AAS (1 << 9) /* Address as slave */ 27*4882a593Smuzhiyun #define I2C_STAT_GC (1 << 5) 28*4882a593Smuzhiyun #define I2C_STAT_XRDY (1 << 4) /* Transmit data ready */ 29*4882a593Smuzhiyun #define I2C_STAT_RRDY (1 << 3) /* Receive data ready */ 30*4882a593Smuzhiyun #define I2C_STAT_ARDY (1 << 2) /* Register access ready */ 31*4882a593Smuzhiyun #define I2C_STAT_NACK (1 << 1) /* No acknowledgment interrupt enable */ 32*4882a593Smuzhiyun #define I2C_STAT_AL (1 << 0) /* Arbitration lost interrupt enable */ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* I2C Interrupt Code Register (I2C_INTCODE): */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define I2C_INTCODE_MASK 7 37*4882a593Smuzhiyun #define I2C_INTCODE_NONE 0 38*4882a593Smuzhiyun #define I2C_INTCODE_AL 1 /* Arbitration lost */ 39*4882a593Smuzhiyun #define I2C_INTCODE_NAK 2 /* No acknowledgement/general call */ 40*4882a593Smuzhiyun #define I2C_INTCODE_ARDY 3 /* Register access ready */ 41*4882a593Smuzhiyun #define I2C_INTCODE_RRDY 4 /* Rcv data ready */ 42*4882a593Smuzhiyun #define I2C_INTCODE_XRDY 5 /* Xmit data ready */ 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* I2C Buffer Configuration Register (I2C_BUF): */ 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define I2C_BUF_RDMA_EN (1 << 15) /* Receive DMA channel enable */ 47*4882a593Smuzhiyun #define I2C_BUF_XDMA_EN (1 << 7) /* Transmit DMA channel enable */ 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* I2C Configuration Register (I2C_CON): */ 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define I2C_CON_EN (1 << 15) /* I2C module enable */ 52*4882a593Smuzhiyun #define I2C_CON_BE (1 << 14) /* Big endian mode */ 53*4882a593Smuzhiyun #define I2C_CON_STB (1 << 11) /* Start byte mode (master mode only) */ 54*4882a593Smuzhiyun #define I2C_CON_MST (1 << 10) /* Master/slave mode */ 55*4882a593Smuzhiyun #define I2C_CON_TRX (1 << 9) /* Transmitter/receiver mode */ 56*4882a593Smuzhiyun /* (master mode only) */ 57*4882a593Smuzhiyun #define I2C_CON_XA (1 << 8) /* Expand address */ 58*4882a593Smuzhiyun #define I2C_CON_STP (1 << 1) /* Stop condition (master mode only) */ 59*4882a593Smuzhiyun #define I2C_CON_STT (1 << 0) /* Start condition (master mode only) */ 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* I2C System Test Register (I2C_SYSTEST): */ 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define I2C_SYSTEST_ST_EN (1 << 15) /* System test enable */ 64*4882a593Smuzhiyun #define I2C_SYSTEST_FREE (1 << 14) /* Free running mode, on brkpoint) */ 65*4882a593Smuzhiyun #define I2C_SYSTEST_TMODE_MASK (3 << 12) /* Test mode select */ 66*4882a593Smuzhiyun #define I2C_SYSTEST_TMODE_SHIFT (12) /* Test mode select */ 67*4882a593Smuzhiyun #define I2C_SYSTEST_SCL_I (1 << 3) /* SCL line sense input value */ 68*4882a593Smuzhiyun #define I2C_SYSTEST_SCL_O (1 << 2) /* SCL line drive output value */ 69*4882a593Smuzhiyun #define I2C_SYSTEST_SDA_I (1 << 1) /* SDA line sense input value */ 70*4882a593Smuzhiyun #define I2C_SYSTEST_SDA_O (1 << 0) /* SDA line drive output value */ 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* I2C System Status Register (I2C_SYSS): */ 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define I2C_SYSS_RDONE (1 << 0) /* Internel reset monitoring */ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define I2C_SCLL_SCLL 0 77*4882a593Smuzhiyun #define I2C_SCLL_SCLL_M 0xFF 78*4882a593Smuzhiyun #define I2C_SCLL_HSSCLL 8 79*4882a593Smuzhiyun #define I2C_SCLH_HSSCLL_M 0xFF 80*4882a593Smuzhiyun #define I2C_SCLH_SCLH 0 81*4882a593Smuzhiyun #define I2C_SCLH_SCLH_M 0xFF 82*4882a593Smuzhiyun #define I2C_SCLH_HSSCLH 8 83*4882a593Smuzhiyun #define I2C_SCLH_HSSCLH_M 0xFF 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define OMAP_I2C_STANDARD 100000 86*4882a593Smuzhiyun #define OMAP_I2C_FAST_MODE 400000 87*4882a593Smuzhiyun #define OMAP_I2C_HIGH_SPEED 3400000 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #define SYSTEM_CLOCK_12 12000000 90*4882a593Smuzhiyun #define SYSTEM_CLOCK_13 13000000 91*4882a593Smuzhiyun #define SYSTEM_CLOCK_192 19200000 92*4882a593Smuzhiyun #define SYSTEM_CLOCK_96 96000000 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* Use the reference value of 96MHz if not explicitly set by the board */ 95*4882a593Smuzhiyun #ifndef I2C_IP_CLK 96*4882a593Smuzhiyun #define I2C_IP_CLK SYSTEM_CLOCK_96 97*4882a593Smuzhiyun #endif 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* 100*4882a593Smuzhiyun * The reference minimum clock for high speed is 19.2MHz. 101*4882a593Smuzhiyun * The linux 2.6.30 kernel uses this value. 102*4882a593Smuzhiyun * The reference minimum clock for fast mode is 9.6MHz 103*4882a593Smuzhiyun * The reference minimum clock for standard mode is 4MHz 104*4882a593Smuzhiyun * In TRM, the value of 12MHz is used. 105*4882a593Smuzhiyun */ 106*4882a593Smuzhiyun #ifndef I2C_INTERNAL_SAMPLING_CLK 107*4882a593Smuzhiyun #define I2C_INTERNAL_SAMPLING_CLK 19200000 108*4882a593Smuzhiyun #endif 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* 111*4882a593Smuzhiyun * The equation for the low and high time is 112*4882a593Smuzhiyun * tlow = scll + scll_trim = (sampling clock * tlow_duty) / speed 113*4882a593Smuzhiyun * thigh = sclh + sclh_trim = (sampling clock * (1 - tlow_duty)) / speed 114*4882a593Smuzhiyun * 115*4882a593Smuzhiyun * If the duty cycle is 50% 116*4882a593Smuzhiyun * 117*4882a593Smuzhiyun * tlow = scll + scll_trim = sampling clock / (2 * speed) 118*4882a593Smuzhiyun * thigh = sclh + sclh_trim = sampling clock / (2 * speed) 119*4882a593Smuzhiyun * 120*4882a593Smuzhiyun * In TRM 121*4882a593Smuzhiyun * scll_trim = 7 122*4882a593Smuzhiyun * sclh_trim = 5 123*4882a593Smuzhiyun * 124*4882a593Smuzhiyun * The linux 4.9 kernel uses 125*4882a593Smuzhiyun * scll_trim = 7 126*4882a593Smuzhiyun * sclh_trim = 5 127*4882a593Smuzhiyun * 128*4882a593Smuzhiyun * These are the trim values for standard and fast speed 129*4882a593Smuzhiyun */ 130*4882a593Smuzhiyun #ifndef I2C_FASTSPEED_SCLL_TRIM 131*4882a593Smuzhiyun #define I2C_FASTSPEED_SCLL_TRIM 7 132*4882a593Smuzhiyun #endif 133*4882a593Smuzhiyun #ifndef I2C_FASTSPEED_SCLH_TRIM 134*4882a593Smuzhiyun #define I2C_FASTSPEED_SCLH_TRIM 5 135*4882a593Smuzhiyun #endif 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* These are the trim values for high speed */ 138*4882a593Smuzhiyun #ifndef I2C_HIGHSPEED_PHASE_ONE_SCLL_TRIM 139*4882a593Smuzhiyun #define I2C_HIGHSPEED_PHASE_ONE_SCLL_TRIM I2C_FASTSPEED_SCLL_TRIM 140*4882a593Smuzhiyun #endif 141*4882a593Smuzhiyun #ifndef I2C_HIGHSPEED_PHASE_ONE_SCLH_TRIM 142*4882a593Smuzhiyun #define I2C_HIGHSPEED_PHASE_ONE_SCLH_TRIM I2C_FASTSPEED_SCLH_TRIM 143*4882a593Smuzhiyun #endif 144*4882a593Smuzhiyun #ifndef I2C_HIGHSPEED_PHASE_TWO_SCLL_TRIM 145*4882a593Smuzhiyun #define I2C_HIGHSPEED_PHASE_TWO_SCLL_TRIM I2C_FASTSPEED_SCLL_TRIM 146*4882a593Smuzhiyun #endif 147*4882a593Smuzhiyun #ifndef I2C_HIGHSPEED_PHASE_TWO_SCLH_TRIM 148*4882a593Smuzhiyun #define I2C_HIGHSPEED_PHASE_TWO_SCLH_TRIM I2C_FASTSPEED_SCLH_TRIM 149*4882a593Smuzhiyun #endif 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #define I2C_PSC_MAX 0x0f 152*4882a593Smuzhiyun #define I2C_PSC_MIN 0x00 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #endif /* _OMAP24XX_I2C_H_ */ 155