diff options
author | Oliver Endriss <o.endriss@gmx.de> | 2006-11-01 17:01:42 +0100 |
---|---|---|
committer | Oliver Endriss <o.endriss@gmx.de> | 2006-11-01 17:01:42 +0100 |
commit | e482e02408a1eff9ecafd65f5506bb8156736ff3 (patch) | |
tree | 9d841d437921a99ac0aaa796f326f00ddd72c313 /linux/drivers | |
parent | 5a28d075b42d4401327ab95bf98acee440ae8f24 (diff) | |
download | mediapointer-dvb-s2-e482e02408a1eff9ecafd65f5506bb8156736ff3.tar.gz mediapointer-dvb-s2-e482e02408a1eff9ecafd65f5506bb8156736ff3.tar.bz2 |
saa7146: Add timeout protection for I2C interrupt
From: Hartmut Birr <e9hack@googlemail.com>
Add a timeout to the wait for the i2c-interrupt.
The timeout prevents from endless waiting if the
interrupt gets lost.
Signed-off-by: Hartmut Birr <e9hack@googlemail.com>
Signed-off-by: Oliver Endriss <o.endriss@gmx.de>
Diffstat (limited to 'linux/drivers')
-rw-r--r-- | linux/drivers/media/common/saa7146_i2c.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/linux/drivers/media/common/saa7146_i2c.c b/linux/drivers/media/common/saa7146_i2c.c index 8cf024271..dffa769ef 100644 --- a/linux/drivers/media/common/saa7146_i2c.c +++ b/linux/drivers/media/common/saa7146_i2c.c @@ -190,13 +190,21 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d saa7146_write(dev, I2C_TRANSFER, *dword); dev->i2c_op = 1; + SAA7146_ISR_CLEAR(dev, MASK_16|MASK_17); SAA7146_IER_ENABLE(dev, MASK_16|MASK_17); saa7146_write(dev, MC2, (MASK_00 | MASK_16)); - wait_event_interruptible(dev->i2c_wq, dev->i2c_op == 0); - if (signal_pending (current)) { - /* a signal arrived */ - return -ERESTARTSYS; + timeout = HZ/100 + 1; /* 10ms */ + timeout = wait_event_interruptible_timeout(dev->i2c_wq, dev->i2c_op == 0, timeout); + if (timeout == -ERESTARTSYS || dev->i2c_op) { + SAA7146_IER_DISABLE(dev, MASK_16|MASK_17); + SAA7146_ISR_CLEAR(dev, MASK_16|MASK_17); + if (timeout == -ERESTARTSYS) + /* a signal arrived */ + return -ERESTARTSYS; + + printk(KERN_WARNING "saa7146_i2c_writeout: timed out waiting for end of xfer\n"); + return -EIO; } status = saa7146_read(dev, I2C_STATUS); } else { |