i2c: Transmission completion semaphore

Add a semaphore. Each task or a fiber that initiates
a transmission waits on this semaphore for it to complete.

Change-Id: Ia6cf961397614ead252ebea3949c016056289311
Signed-off-by: Dmitriy Korovkin <dmitriy.korovkin@windriver.com>
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit is contained in:
Dmitriy Korovkin 2015-10-20 10:49:13 -04:00 committed by Anas Nashif
commit 0b95c35549
2 changed files with 7 additions and 0 deletions

View file

@ -193,6 +193,7 @@ static inline void _i2c_dw_transfer_complete(struct device *dev)
dw->state = I2C_DW_STATE_READY;
value = regs->ic_clr_intr;
synchronous_call_complete(&dw->sync);
if (dw->cb) {
dw->cb(dev, cb_type);
}
@ -446,6 +447,7 @@ static int i2c_dw_transfer(struct device *dev,
uint16_t slave_address, uint32_t flags)
{
struct i2c_dw_rom_config const * const rom = dev->config->config_info;
struct i2c_dw_dev_config * const dw = dev->driver_data;
int ret;
volatile struct i2c_dw_registers * const regs =
@ -477,6 +479,8 @@ static int i2c_dw_transfer(struct device *dev,
/* Enable controller */
regs->ic_enable.bits.enable = 1;
synchronous_call_wait(&dw->sync);
return DEV_OK;
}
@ -774,6 +778,8 @@ int i2c_dw_initialize(struct device *port)
return DEV_NOT_CONFIG;
}
synchronous_call_init(&dev->sync);
regs = (struct i2c_dw_registers *) rom->base_address;
/* verify that we have a valid DesignWare register first */

View file

@ -106,6 +106,7 @@ struct i2c_dw_rom_config {
struct i2c_dw_dev_config {
device_sync_call_t sync;
union dev_config app_config;
volatile uint8_t state; /* last direction of transfer */