mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-30 02:20:48 +00:00
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:
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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__));
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user