10 #include <soc/periph.h>
11 #include <soc/pinmux.h>
14 #define I2C_TIMEOUT_US (1000 * USECS_PER_MSEC)
79 .regs = (
void *)0x12c60000,
84 .regs = (
void *)0x12c70000,
89 .regs = (
void *)0x12c80000,
94 .regs = (
void *)0x12c90000,
100 .hsregs = (
void *)0x12ca0000,
106 .hsregs = (
void *)0x12cb0000,
112 .hsregs = (
void *)0x12cc0000,
118 .hsregs = (
void *)0x12cd0000,
124 .hsregs = (
void *)0x12e00000,
130 .hsregs = (
void *)0x12e10000,
136 .hsregs = (
void *)0x12e20000,
212 #define HSI2C_SLV_ADDR_MAS(x) ((x & 0x3ff) << 10)
253 int temp = (clkin / op_clk) - 8 - 2 * flt_cycle;
257 for (i = 0; i < 256; i++) {
258 int period = temp / (i + 1) - 2;
259 if (period < 512 && period >= 2) {
265 printk(
BIOS_ERR,
"%s: Failed to find timing parameters.\n", __func__);
280 uint32_t scl_l, scl_h, start_su, start_hd, stop_su;
281 scl_l = scl_h = start_su = start_hd = stop_su = cycle / 2;
284 data_su = data_hd = cycle / 4;
286 uint32_t timing_fs1 = start_su << 24 | start_hd << 16 | stop_su << 8;
287 uint32_t timing_fs2 = data_su << 24 | scl_l << 8 | scl_h << 0;
288 uint32_t timing_fs3 = div << 16 | sr_release << 0;
322 unsigned long freq, pres = 16, div;
327 if ((
freq / pres / (16 + 1)) > speed)
333 while ((
freq / pres / (div + 1)) > speed)
337 val = (div & 0x0f) | 0xa0 | ((pres == 512) ? 0x40 : 0);
373 "%s: Transaction aborted.\n", __func__);
376 "%s: No ack from device.\n", __func__);
379 "%s: No response from device.\n", __func__);
382 "%s: Transaction time out.\n", __func__);
478 for (i = 0; i <
count; i++) {
515 int timeout = timeout_us / 10;
527 int timeout = timeout_us / 10;
570 for (i = 0; i < len; i++) {
593 for (i = 0; i < len; i++) {
622 for (i = 0; i <
count; i++) {
623 struct i2c_msg *seg = &segments[i];
static void write8(void *addr, uint8_t val)
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
static uint8_t read8(const void *addr)
#define printk(level,...)
static struct tpm_chip chip
static int stopwatch_expired(struct stopwatch *sw)
static void stopwatch_init_msecs_expire(struct stopwatch *sw, long ms)
#define BIOS_INFO
BIOS_INFO - Expected events.
#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)
unsigned long clock_get_periph_rate(enum periph_id peripheral)
get the clk frequency of the required peripheral
static int hsi2c_wait_for_transfer(struct hsi2c_regs *i2c)
static void hsi2c_ch_init(struct i2c_bus *i2c, unsigned int frequency)
static void i2c_ack_enable(struct i2c_regs *regs)
static int hsi2c_transfer(struct i2c_bus *i2c, struct i2c_msg *segments, int count)
static int i2c_got_ack(struct i2c_regs *regs)
static void i2c_clear_int(struct i2c_regs *regs)
static int i2c_xmit_buf(struct i2c_regs *regs, uint8_t *data, int len)
#define HSI2C_SLV_ADDR_MAS(x)
static int i2c_int_pending(struct i2c_regs *regs)
static int i2c_send_stop(struct i2c_regs *regs)
static int hsi2c_segment(struct i2c_msg *seg, struct hsi2c_regs *regs, int stop)
check_member(hsi2c_regs, i2c_addr, 0x70)
static int i2c_wait_for_idle(struct i2c_regs *regs, int timeout_us)
static int hsi2c_check_transfer(struct hsi2c_regs *regs)
static void i2c_ch_init(struct i2c_bus *i2c, int speed)
static int hsi2c_recvdata(struct hsi2c_regs *regs, uint8_t *data, int len)
static struct i2c_bus i2c_busses[]
static void hsi2c_reset(struct i2c_bus *i2c)
static int i2c_recv_buf(struct i2c_regs *regs, uint8_t *data, int len)
static int hsi2c_senddata(struct hsi2c_regs *regs, const uint8_t *data, int len)
static int i2c_send_start(struct i2c_regs *regs, int read, int chip)
static int hsi2c_get_clk_details(struct i2c_bus *i2c, int *div, int *cycle, unsigned int op_clk)
static void i2c_ack_disable(struct i2c_regs *regs)
@ Hsi2cTxfifoTriggerLevel
@ Hsi2cRxfifoTriggerLevel
static int i2c_wait_for_int(struct i2c_regs *regs, int timeout_us)
@ Hsi2cIntTxAlmostemptyEn
uint32_t i2c_trans_status
uint32_t usi_trailing_ctl
struct hsi2c_regs * hsregs
struct i2c_msg - an I2C transaction segment beginning with START @addr: Slave address,...