diff options
author | li feng <li1.feng@intel.com> | 2017-12-06 18:17:48 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-12-13 00:32:23 -0800 |
commit | 84124045457e115e6be116fa0a7215098ba7f0d5 (patch) | |
tree | a3a58309727b25909a0d13fd2621a5c8151aba2f | |
parent | 0e882def3898d49548fcced0d21889d4b0934672 (diff) | |
download | chrome-ec-84124045457e115e6be116fa0a7215098ba7f0d5.tar.gz |
ish i2c: use i2c_ports[] to set bus speed
BUG=None
BRANCH=None
TEST=Tested on Soraka ISH modified board, measured I2C speed for std,
fast, fast plus mode.
Change-Id: I0e07c3c73f5f0302fba41ad8e7f83e10e8f0af99
Signed-off-by: li feng <li1.feng@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/817899
Commit-Ready: Li1 Feng <li1.feng@intel.com>
Tested-by: Li1 Feng <li1.feng@intel.com>
Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r-- | chip/ish/i2c.c | 51 | ||||
-rw-r--r-- | chip/ish/ish_i2c.h | 3 | ||||
-rw-r--r-- | include/config.h | 4 |
3 files changed, 31 insertions, 27 deletions
diff --git a/chip/ish/i2c.c b/chip/ish/i2c.c index f736927242..9525849085 100644 --- a/chip/ish/i2c.c +++ b/chip/ish/i2c.c @@ -24,18 +24,7 @@ #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*/ +/*25MHz, 50MHz, 100MHz, 120MHz, 40MHz, 20MHz, 37MHz*/ static uint16_t default_hcnt_scl_100[] = { 4000, 4420, 4920, 4400, 4000, 4000, 4300 }; @@ -74,17 +63,20 @@ static struct i2c_context i2c_ctxs[ISH_I2C_PORT_COUNT] = { { .bus = 0, .base = (uint32_t *) ISH_I2C0_BASE, - .speed = CONFI_ISH_I2C_PORT0_SPEED, + .speed = I2C_SPEED_FAST, + .int_pin = ISH_I2C0_IRQ, }, { .bus = 1, .base = (uint32_t *) ISH_I2C1_BASE, - .speed = CONFI_ISH_I2C_PORT1_SPEED, + .speed = I2C_SPEED_FAST, + .int_pin = ISH_I2C1_IRQ, }, { .bus = 2, .base = (uint32_t *) ISH_I2C2_BASE, - .speed = CONFI_ISH_I2C_PORT2_SPEED, + .speed = I2C_SPEED_FAST, + .int_pin = ISH_I2C2_IRQ, }, }; @@ -394,6 +386,20 @@ static void i2c_isr_bus2(void) } DECLARE_IRQ(ISH_I2C2_IRQ, i2c_isr_bus2); +static void i2c_config_speed(struct i2c_context *ctx, int kbps) +{ + + if (kbps > 1000) + ctx->speed = I2C_SPEED_HIGH; + else if (kbps > 400) + ctx->speed = I2C_SPEED_FAST_PLUS; + else if (kbps > 100) + ctx->speed = I2C_SPEED_FAST; + else + ctx->speed = I2C_SPEED_STD; + +} + static void i2c_init_hardware(struct i2c_context *ctx) { uint32_t *base = ctx->base; @@ -438,14 +444,15 @@ static void i2c_init(void) { int i; - for (i = 0; i < ISH_I2C_PORT_COUNT; i++) { - i2c_initial_board_config(&i2c_ctxs[i]); - i2c_init_hardware(&i2c_ctxs[i]); - } + for (i = 0; i < i2c_ports_used; i++) { + int port = i2c_ports[i].port; + i2c_initial_board_config(&i2c_ctxs[port]); + /* Config speed from i2c_ports[] defined in board.c */ + i2c_config_speed(&i2c_ctxs[port], i2c_ports[i].kbps); + i2c_init_hardware(&i2c_ctxs[port]); - task_enable_irq(ISH_I2C0_IRQ); - task_enable_irq(ISH_I2C1_IRQ); - task_enable_irq(ISH_I2C2_IRQ); + task_enable_irq((&i2c_ctxs[port])->int_pin); + } CPRINTS("Done i2c_init"); } diff --git a/chip/ish/ish_i2c.h b/chip/ish/ish_i2c.h index 9accddfebc..26242fa363 100644 --- a/chip/ish/ish_i2c.h +++ b/chip/ish/ish_i2c.h @@ -184,10 +184,11 @@ struct i2c_context { uint8_t max_rx_depth; uint8_t max_tx_depth; uint8_t bus; + uint8_t speed; uint32_t interrupts; uint32_t reason; + uint32_t int_pin; uint8_t error_flag; - uint8_t speed; task_id_t wait_task_id; }; diff --git a/include/config.h b/include/config.h index c90ab85c1f..b0582f3f22 100644 --- a/include/config.h +++ b/include/config.h @@ -1631,10 +1631,6 @@ */ #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 */ |