// SPDX-License-Identifier: GPL-2.0-only/* * Driver for I2C adapter in Rockchip RK3xxx SoC * * Max Schwarz <max.schwarz@online.de> * based on the patches by Rockchip Inc. */#include<linux/kernel.h>#include<linux/module.h>#include<linux/i2c.h>#include<linux/interrupt.h>#include<linux/iopoll.h>#include<linux/errno.h>#include<linux/err.h>#include<linux/platform_device.h>#include<linux/io.h>#include<linux/of_address.h>#include<linux/of_irq.h>#include<linux/spinlock.h>#include<linux/clk.h>#include<linux/wait.h>#include<linux/mfd/syscon.h>#include<linux/regmap.h>#include<linux/math64.h>/* Register Map */#define REG_CON 0x00 /* control register */#define REG_CLKDIV 0x04 /* clock divisor register */#define REG_MRXADDR 0x08 /* slave address for REGISTER_TX */#define REG_MRXRADDR 0x0c /* slave register address for REGISTER_TX */#define REG_MTXCNT 0x10 /* number of bytes to be transmitted */#define REG_MRXCNT 0x14 /* number of bytes to be received */#define REG_IEN 0x18 /* interrupt enable */#define REG_IPD 0x1c /* interrupt pending */#define REG_FCNT 0x20 /* finished count *//* Data buffer offsets */#define TXBUFFER_BASE 0x100#define RXBUFFER_BASE 0x200/* REG_CON bits */#define REG_CON_EN BIT(0)enum{REG_CON_MOD_TX=0,/* transmit data */REG_CON_MOD_REGISTER_TX,/* select register and restart */REG_CON_MOD_RX,/* receive data */REG_CON_MOD_REGISTER_RX,/* broken: transmits read addr AND writes * register addr */};#define REG_CON_MOD(mod) ((mod) << 1)#define REG_CON_MOD_MASK (BIT(1) | BIT(2))#define REG_CON_START BIT(3)#define REG_CON_STOP BIT(4)#define REG_CON_LASTACK BIT(5) /* 1: send NACK after last received byte */#define REG_CON_ACTACK BIT(6) /* 1: stop if NACK is received */#define REG_CON_TUNING_MASK GENMASK_ULL(15, 8)#define REG_CON_SDA_CFG(cfg) ((cfg) << 8)#define REG_CON_STA_CFG(cfg) ((cfg) << 12)#define REG_CON_STO_CFG(cfg) ((cfg) << 14)/* REG_MRXADDR bits */#define REG_MRXADDR_VALID(x) BIT(24 + (x)) /* [x*8+7:x*8] of MRX[R]ADDR valid *//* REG_IEN/REG_IPD bits */#define REG_INT_BTF BIT(0) /* a byte was transmitted */#define REG_INT_BRF BIT(1) /* a byte was received */#define REG_INT_MBTF BIT(2) /* master data transmit finished */#define REG_INT_MBRF BIT(3) /* master data receive finished */#define REG_INT_START BIT(4) /* START condition generated */#define REG_INT_STOP BIT(5) /* STOP condition generated */#define REG_INT_NAKRCV BIT(6) /* NACK received */#define REG_INT_ALL 0x7f/* Constants */#define WAIT_TIMEOUT 1000 /* ms */#define DEFAULT_SCL_RATE (100 * 1000) /* Hz *//** * struct i2c_spec_values - I2C specification values for various modes * @min_hold_start_ns: min hold time (repeated) START condition * @min_low_ns: min LOW period of the SCL clock * @min_high_ns: min HIGH period of the SCL cloc * @min_setup_start_ns: min set-up time for a repeated START conditio * @max_data_hold_ns: max data hold time * @min_data_setup_ns: min data set-up time * @min_setup_stop_ns: min set-up time for STOP condition * @mi