8 #include <soc/addressmap.h>
12 #include <soc/clock.h>
18 #define I2C_TIMEOUT_US 100000
23 #define i2c_info(x...) do {if (0) printk(BIOS_DEBUG, x); } while (0)
44 #define I2C_ACT2NAK (1<<6)
45 #define I2C_NAK (1<<5)
46 #define I2C_STOP (1<<4)
47 #define I2C_START (1<<3)
48 #define I2C_MODE_TX (0<<1)
49 #define I2C_MODE_TRX (1<<1)
50 #define I2C_MODE_RX (2<<1)
53 #define I2C_8BIT (1<<24)
54 #define I2C_16BIT (3<<24)
55 #define I2C_24BIT (7<<24)
58 #define I2C_CNT(cnt) ((cnt) & 0x3F)
60 #define I2C_NAKRCVI (1<<6)
61 #define I2C_STOPI (1<<5)
62 #define I2C_STARTI (1<<4)
63 #define I2C_MBRFI (1<<3)
64 #define I2C_MBTFI (1<<2)
65 #define I2C_BRFI (1<<1)
66 #define I2C_BTFI (1<<0)
67 #define I2C_CLEANI 0x7F
74 i2c_info(
"I2c Start::Send Start bit\n");
96 i2c_info(
"I2c Stop::Send Stop bit\n");
117 unsigned int bytes_remaining = segment.
len;
118 unsigned int con = 0;
123 while (bytes_remaining) {
124 int timeout = CONFIG_I2C_TRANSFER_TIMEOUT_US;
125 size_t size =
MIN(bytes_remaining, 32);
126 bytes_remaining -= size;
127 if (!bytes_remaining)
130 i2c_info(
"I2C Read::%zu bytes\n", size);
163 int bytes_remaining = segment.
len + 1;
169 while (bytes_remaining) {
170 int timeout = CONFIG_I2C_TRANSFER_TIMEOUT_US;
171 size_t size =
MIN(bytes_remaining, 32);
174 data += size - prefsz;
176 i2c_info(
"I2C Write::%zu bytes\n", size);
200 bytes_remaining -= size;
226 struct i2c_msg *seg = segments;
228 for (i = 0; i < seg_count; i++, seg++) {
238 unsigned int clk_div;
241 unsigned int i2c_src_clk;
242 unsigned int i2c_clk;
250 divh = clk_div * 3 / 7 - 1;
251 divl = clk_div - divh - 2;
252 i2c_clk = i2c_src_clk / (8 * (divl + 1 + divh + 1));
254 bus, i2c_clk, divh, divl);
255 assert((divh < 65536) && (divl < 65536) && hz - i2c_clk < 15*
KHz);
256 write32(&
regs->i2c_clkdiv, (divh << 16) | (divl << 0));
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
#define assert(statement)
#define DIV_ROUND_UP(x, y)
#define printk(level,...)
void buffer_from_fifo32(void *buffer, size_t size, void *fifo, int fifo_stride, int fifo_width)
void buffer_to_fifo32_prefix(const void *buffer, u32 prefix, int prefsz, size_t size, void *fifo, int fifo_stride, int fifo_width)
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
int platform_i2c_transfer(unsigned int bus, struct i2c_msg *segment, int seg_count)
void i2c_init(unsigned int bus)
static int i2c_write(struct rk_i2c_regs *reg_addr, struct i2c_msg segment)
static int i2c_send_start(struct rk_i2c_regs *reg_addr)
static int i2c_read(struct rk_i2c_regs *reg_addr, struct i2c_msg segment)
static int i2c_do_xfer(void *reg_addr, struct i2c_msg segment)
static int i2c_send_stop(struct rk_i2c_regs *reg_addr)
unsigned int rkclk_i2c_clock_for_bus(unsigned int bus)
struct i2c_msg - an I2C transaction segment beginning with START @addr: Slave address,...
u32 reserved0[(0x100 - 0x24)/4]
u32 reserved1[(0x200 - 0x120)/4]