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 <li1.feng@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/784091
Commit-Ready: Li1 Feng <li1.feng@intel.com>
Tested-by: Li1 Feng <li1.feng@intel.com>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
li feng
2017-11-20 17:19:41 -08:00
committed by chrome-bot
parent 6d2f73e3dd
commit 39efbc3ada
3 changed files with 53 additions and 5 deletions

View File

@@ -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];
}

View File

@@ -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__));

View File

@@ -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 */