1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _LINUX_I2C_ALGO_PCA_H 3*4882a593Smuzhiyun #define _LINUX_I2C_ALGO_PCA_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* Chips known to the pca algo */ 6*4882a593Smuzhiyun #define I2C_PCA_CHIP_9564 0x00 7*4882a593Smuzhiyun #define I2C_PCA_CHIP_9665 0x01 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* Internal period for PCA9665 oscilator */ 10*4882a593Smuzhiyun #define I2C_PCA_OSC_PER 3 /* e10-8s */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* Clock speeds for the bus for PCA9564*/ 13*4882a593Smuzhiyun #define I2C_PCA_CON_330kHz 0x00 14*4882a593Smuzhiyun #define I2C_PCA_CON_288kHz 0x01 15*4882a593Smuzhiyun #define I2C_PCA_CON_217kHz 0x02 16*4882a593Smuzhiyun #define I2C_PCA_CON_146kHz 0x03 17*4882a593Smuzhiyun #define I2C_PCA_CON_88kHz 0x04 18*4882a593Smuzhiyun #define I2C_PCA_CON_59kHz 0x05 19*4882a593Smuzhiyun #define I2C_PCA_CON_44kHz 0x06 20*4882a593Smuzhiyun #define I2C_PCA_CON_36kHz 0x07 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* PCA9564 registers */ 23*4882a593Smuzhiyun #define I2C_PCA_STA 0x00 /* STATUS Read Only */ 24*4882a593Smuzhiyun #define I2C_PCA_TO 0x00 /* TIMEOUT Write Only */ 25*4882a593Smuzhiyun #define I2C_PCA_DAT 0x01 /* DATA Read/Write */ 26*4882a593Smuzhiyun #define I2C_PCA_ADR 0x02 /* OWN ADR Read/Write */ 27*4882a593Smuzhiyun #define I2C_PCA_CON 0x03 /* CONTROL Read/Write */ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* PCA9665 registers */ 30*4882a593Smuzhiyun #define I2C_PCA_INDPTR 0x00 /* INDIRECT Pointer Write Only */ 31*4882a593Smuzhiyun #define I2C_PCA_IND 0x02 /* INDIRECT Read/Write */ 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* PCA9665 indirect registers */ 34*4882a593Smuzhiyun #define I2C_PCA_ICOUNT 0x00 /* Byte Count for buffered mode */ 35*4882a593Smuzhiyun #define I2C_PCA_IADR 0x01 /* OWN ADR */ 36*4882a593Smuzhiyun #define I2C_PCA_ISCLL 0x02 /* SCL LOW period */ 37*4882a593Smuzhiyun #define I2C_PCA_ISCLH 0x03 /* SCL HIGH period */ 38*4882a593Smuzhiyun #define I2C_PCA_ITO 0x04 /* TIMEOUT */ 39*4882a593Smuzhiyun #define I2C_PCA_IPRESET 0x05 /* Parallel bus reset */ 40*4882a593Smuzhiyun #define I2C_PCA_IMODE 0x06 /* I2C Bus mode */ 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* PCA9665 I2C bus mode */ 43*4882a593Smuzhiyun #define I2C_PCA_MODE_STD 0x00 /* Standard mode */ 44*4882a593Smuzhiyun #define I2C_PCA_MODE_FAST 0x01 /* Fast mode */ 45*4882a593Smuzhiyun #define I2C_PCA_MODE_FASTP 0x02 /* Fast Plus mode */ 46*4882a593Smuzhiyun #define I2C_PCA_MODE_TURBO 0x03 /* Turbo mode */ 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define I2C_PCA_CON_AA 0x80 /* Assert Acknowledge */ 50*4882a593Smuzhiyun #define I2C_PCA_CON_ENSIO 0x40 /* Enable */ 51*4882a593Smuzhiyun #define I2C_PCA_CON_STA 0x20 /* Start */ 52*4882a593Smuzhiyun #define I2C_PCA_CON_STO 0x10 /* Stop */ 53*4882a593Smuzhiyun #define I2C_PCA_CON_SI 0x08 /* Serial Interrupt */ 54*4882a593Smuzhiyun #define I2C_PCA_CON_CR 0x07 /* Clock Rate (MASK) */ 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /** 57*4882a593Smuzhiyun * struct pca_i2c_bus_settings - The configured PCA i2c bus settings 58*4882a593Smuzhiyun * @mode: Configured i2c bus mode 59*4882a593Smuzhiyun * @tlow: Configured SCL LOW period 60*4882a593Smuzhiyun * @thi: Configured SCL HIGH period 61*4882a593Smuzhiyun * @clock_freq: The configured clock frequency 62*4882a593Smuzhiyun */ 63*4882a593Smuzhiyun struct pca_i2c_bus_settings { 64*4882a593Smuzhiyun int mode; 65*4882a593Smuzhiyun int tlow; 66*4882a593Smuzhiyun int thi; 67*4882a593Smuzhiyun int clock_freq; 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct i2c_algo_pca_data { 71*4882a593Smuzhiyun void *data; /* private low level data */ 72*4882a593Smuzhiyun void (*write_byte) (void *data, int reg, int val); 73*4882a593Smuzhiyun int (*read_byte) (void *data, int reg); 74*4882a593Smuzhiyun int (*wait_for_completion) (void *data); 75*4882a593Smuzhiyun void (*reset_chip) (void *data); 76*4882a593Smuzhiyun /* For PCA9564, use one of the predefined frequencies: 77*4882a593Smuzhiyun * 330000, 288000, 217000, 146000, 88000, 59000, 44000, 36000 78*4882a593Smuzhiyun * For PCA9665, use the frequency you want here. */ 79*4882a593Smuzhiyun unsigned int i2c_clock; 80*4882a593Smuzhiyun unsigned int chip; 81*4882a593Smuzhiyun struct pca_i2c_bus_settings bus_settings; 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun int i2c_pca_add_bus(struct i2c_adapter *); 85*4882a593Smuzhiyun int i2c_pca_add_numbered_bus(struct i2c_adapter *); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #endif /* _LINUX_I2C_ALGO_PCA_H */ 88