summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorli feng <li1.feng@intel.com>2017-12-06 18:17:48 -0800
committerchrome-bot <chrome-bot@chromium.org>2017-12-13 00:32:23 -0800
commit84124045457e115e6be116fa0a7215098ba7f0d5 (patch)
treea3a58309727b25909a0d13fd2621a5c8151aba2f
parent0e882def3898d49548fcced0d21889d4b0934672 (diff)
downloadchrome-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.c51
-rw-r--r--chip/ish/ish_i2c.h3
-rw-r--r--include/config.h4
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 */