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:
parent
55fdd1fd33
commit
0b95c35549
2 changed files with 7 additions and 0 deletions
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue