Skip to content

Commit d295a86

Browse files
Russell KingWolfram Sang
Russell King
authored and
Wolfram Sang
committed
i2c: mv64xxx: work around signals causing I2C transactions to be aborted
Do not use interruptible waits in an I2C driver; if a process uses signals (eg, Xorg uses SIGALRM and SIGPIPE) then these signals can cause the I2C driver to abort a transaction in progress by another driver, which can cause that driver to fail. I2C drivers are not expected to abort transactions on signals. Signed-off-by: Russell King <[email protected]> Signed-off-by: Wolfram Sang <[email protected]>
1 parent 5322934 commit d295a86

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

drivers/i2c/busses/i2c-mv64xxx.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data)
252252
writel(drv_data->cntl_bits,
253253
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
254254
drv_data->block = 0;
255-
wake_up_interruptible(&drv_data->waitq);
255+
wake_up(&drv_data->waitq);
256256
break;
257257

258258
case MV64XXX_I2C_ACTION_CONTINUE:
@@ -300,7 +300,7 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data)
300300
writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP,
301301
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
302302
drv_data->block = 0;
303-
wake_up_interruptible(&drv_data->waitq);
303+
wake_up(&drv_data->waitq);
304304
break;
305305

306306
case MV64XXX_I2C_ACTION_INVALID:
@@ -315,7 +315,7 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data)
315315
writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP,
316316
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
317317
drv_data->block = 0;
318-
wake_up_interruptible(&drv_data->waitq);
318+
wake_up(&drv_data->waitq);
319319
break;
320320
}
321321
}
@@ -381,7 +381,7 @@ mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data)
381381
unsigned long flags;
382382
char abort = 0;
383383

384-
time_left = wait_event_interruptible_timeout(drv_data->waitq,
384+
time_left = wait_event_timeout(drv_data->waitq,
385385
!drv_data->block, drv_data->adapter.timeout);
386386

387387
spin_lock_irqsave(&drv_data->lock, flags);

0 commit comments

Comments
 (0)