From 39efbc3ada5545f6784e7d09b7c358684cb124fa Mon Sep 17 00:00:00 2001 From: li feng Date: Mon, 20 Nov 2017 17:19:41 -0800 Subject: [PATCH] ish i2c: add I2C Fast Mode Plus 1Mbps speed option Also added CONFI_ISH_I2C_PORT0_SPEED, CONFI_ISH_I2C_PORT1_SPEED, and CONFI_ISH_I2C_PORT2_SPEED to define speed for each ISH I2C port. By default, those are set to fast mode, 400kbps, I2C_SPEED_FAST. The values can be modified in board.h. BUG=None BRANCH=None TEST=On Soraka modified board for ISH, set I2C stardard mode, fast mode and fast mode plus, measured I2C clock freq using scope respectively and confirmed the freq matched I2C mode. Change-Id: I426b50dc935c3760903360a50f6069e99bd0abff Signed-off-by: li feng Reviewed-on: https://chromium-review.googlesource.com/784091 Commit-Ready: Li1 Feng Tested-by: Li1 Feng Reviewed-by: Aaron Durbin --- chip/ish/i2c.c | 49 ++++++++++++++++++++++++++++++++++++++++++---- chip/ish/ish_i2c.h | 5 ++++- include/config.h | 4 ++++ 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/chip/ish/i2c.c b/chip/ish/i2c.c index 5b16b41d36..f736927242 100644 --- a/chip/ish/i2c.c +++ b/chip/ish/i2c.c @@ -24,6 +24,18 @@ #define I2C_FLAG_REPEATED_START_DISABLED 0 #define EVENT_FLAG_I2C_TIMEOUT TASK_EVENT_CUSTOM(1 << 1) +#ifndef CONFI_ISH_I2C_PORT0_SPEED +#define CONFI_ISH_I2C_PORT0_SPEED I2C_SPEED_FAST +#endif + +#ifndef CONFI_ISH_I2C_PORT1_SPEED +#define CONFI_ISH_I2C_PORT1_SPEED I2C_SPEED_FAST +#endif + +#ifndef CONFI_ISH_I2C_PORT2_SPEED +#define CONFI_ISH_I2C_PORT2_SPEED I2C_SPEED_FAST +#endif +/*25MHz,50MHz,100MHz,120MHz,40MHz,20MHz,37MHz*/ static uint16_t default_hcnt_scl_100[] = { 4000, 4420, 4920, 4400, 4000, 4000, 4300 }; @@ -40,11 +52,19 @@ static uint16_t default_lcnt_scl_400[] = { 1320, 1380, 1300, 1300, 1300, 1200, 1250 }; +static uint16_t default_hcnt_scl_1000[] = { + 260, 260, 260, 260, 260, 260, 260 +}; + +static uint16_t default_lcnt_scl_1000[] = { + 500, 500, 500, 500, 500, 500, 500 +}; + static uint16_t default_hcnt_scl_hs[] = { 160, 300, 160, 166, 175, 150, 162 }; static uint16_t default_lcnt_scl_hs[] = { 320, 340, 320, 325, 325, 300, 297 }; static uint8_t speed_val_arr[] = { - STD_SPEED_VAL, FAST_SPEED_VAL, HIGH_SPEED_VAL }; + STD_SPEED_VAL, FAST_SPEED_VAL, FAST_PLUS_SPEED_VAL, HIGH_SPEED_VAL}; static uint8_t bus_freq[ISH_I2C_PORT_COUNT] = { I2C_FREQ_120, I2C_FREQ_120, I2C_FREQ_120 @@ -54,17 +74,17 @@ static struct i2c_context i2c_ctxs[ISH_I2C_PORT_COUNT] = { { .bus = 0, .base = (uint32_t *) ISH_I2C0_BASE, - .speed = I2C_SPEED_FAST, + .speed = CONFI_ISH_I2C_PORT0_SPEED, }, { .bus = 1, .base = (uint32_t *) ISH_I2C1_BASE, - .speed = I2C_SPEED_FAST, + .speed = CONFI_ISH_I2C_PORT1_SPEED, }, { .bus = 2, .base = (uint32_t *) ISH_I2C2_BASE, - .speed = I2C_SPEED_FAST, + .speed = CONFI_ISH_I2C_PORT2_SPEED, }, }; @@ -73,18 +93,21 @@ static struct i2c_bus_info board_config[ISH_I2C_PORT_COUNT] = { .bus_id = 0, .std_speed.sda_hold = DEFAULT_SDA_HOLD, .fast_speed.sda_hold = DEFAULT_SDA_HOLD, + .fast_plus_speed.sda_hold = DEFAULT_SDA_HOLD, .high_speed.sda_hold = DEFAULT_SDA_HOLD, }, { .bus_id = 1, .std_speed.sda_hold = DEFAULT_SDA_HOLD, .fast_speed.sda_hold = DEFAULT_SDA_HOLD, + .fast_plus_speed.sda_hold = DEFAULT_SDA_HOLD, .high_speed.sda_hold = DEFAULT_SDA_HOLD, }, { .bus_id = 2, .std_speed.sda_hold = DEFAULT_SDA_HOLD, .fast_speed.sda_hold = DEFAULT_SDA_HOLD, + .fast_plus_speed.sda_hold = DEFAULT_SDA_HOLD, .high_speed.sda_hold = DEFAULT_SDA_HOLD, }, }; @@ -184,6 +207,19 @@ static void i2c_init_transaction(struct i2c_context *ctx, clk_in_val)); break; + + case I2C_SPEED_FAST_PLUS: + i2c_mmio_write(base, IC_FS_SCL_HCNT, + NS_2_COUNTERS(bus_info->fast_plus_speed.hcnt, + clk_in_val)); + i2c_mmio_write(base, IC_FS_SCL_LCNT, + NS_2_COUNTERS(bus_info->fast_plus_speed.lcnt, + clk_in_val)); + i2c_mmio_write(base, IC_SDA_HOLD, + NS_2_COUNTERS(bus_info->fast_plus_speed.sda_hold, + clk_in_val)); + break; + case I2C_SPEED_HIGH: i2c_mmio_write(base, IC_HS_SCL_HCNT, NS_2_COUNTERS(bus_info->high_speed.hcnt, @@ -387,8 +423,13 @@ static void i2c_initial_board_config(struct i2c_context *ctx) bus_info->std_speed.hcnt = default_hcnt_scl_100[freq]; bus_info->std_speed.lcnt = default_lcnt_scl_100[freq]; + bus_info->fast_speed.hcnt = default_hcnt_scl_400[freq]; bus_info->fast_speed.lcnt = default_lcnt_scl_400[freq]; + + bus_info->fast_plus_speed.hcnt = default_hcnt_scl_1000[freq]; + bus_info->fast_plus_speed.lcnt = default_lcnt_scl_1000[freq]; + bus_info->high_speed.hcnt = default_hcnt_scl_hs[freq]; bus_info->high_speed.lcnt = default_lcnt_scl_hs[freq]; } diff --git a/chip/ish/ish_i2c.h b/chip/ish/ish_i2c.h index 0a894593ea..9accddfebc 100644 --- a/chip/ish/ish_i2c.h +++ b/chip/ish/ish_i2c.h @@ -22,7 +22,8 @@ enum { /* speed mode values */ I2C_SPEED_STD = 0, I2C_SPEED_FAST = 1, - I2C_SPEED_HIGH = 2, + I2C_SPEED_FAST_PLUS = 2, + I2C_SPEED_HIGH = 3, /* freq mode values */ I2C_FREQ_25 = 0, I2C_FREQ_50 = 1, @@ -107,6 +108,7 @@ enum { MASTER_MODE_VAL = (MASTER_MODE << MASTER_MODE_OFFSET), STD_SPEED_VAL = (STD_SPEED << SPEED_OFFSET), FAST_SPEED_VAL = (FAST_SPEED << SPEED_OFFSET), + FAST_PLUS_SPEED_VAL = (FAST_SPEED << SPEED_OFFSET), HIGH_SPEED_VAL = (HIGH_SPEED << SPEED_OFFSET), SPEED_MASK = (0x3 << SPEED_OFFSET), IC_RESTART_EN_VAL = (IC_RESTART_EN << IC_RESTART_EN_OFFSET), @@ -173,6 +175,7 @@ struct i2c_bus_info { uint8_t bus_id; struct i2c_bus_data std_speed; struct i2c_bus_data fast_speed; + struct i2c_bus_data fast_plus_speed; struct i2c_bus_data high_speed; } __attribute__ ((__packed__)); diff --git a/include/config.h b/include/config.h index 2b4a9a6e5c..6d89ba5f66 100644 --- a/include/config.h +++ b/include/config.h @@ -1613,6 +1613,10 @@ */ #undef CONFIG_I2C_MULTI_PORT_CONTROLLER +#undef CONFI_ISH_I2C_PORT0_SPEED +#undef CONFI_ISH_I2C_PORT1_SPEED +#undef CONFI_ISH_I2C_PORT2_SPEED + /*****************************************************************************/ /* Current/Power monitor */