diff options
author | Oliver Endriss <o.endriss@gmx.de> | 2007-08-09 01:41:16 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-10-09 21:04:44 -0400 |
commit | 276e49a01a7e6c4a7bfb78618cf2f5befbf9f5de (patch) | |
tree | 8397db6807a2311c423957165d650ba169dff263 /drivers/media/common/saa7146_i2c.c | |
parent | c471b331dda9fdfaf67832998d0b2c848777ab4a (diff) |
V4L/DVB (5987): saa7146: clean-up irq processing
Interrupt processing fixed: First handle interrupt, then acknowledge it.
Otherwise the same interrupt might occur twice.
Cleaned-up i2c interrupt handler and i2c error messages.
Signed-off-by: Oliver Endriss <o.endriss@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/common/saa7146_i2c.c')
-rw-r--r-- | drivers/media/common/saa7146_i2c.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c index f823286341eb..7e7689afae62 100644 --- a/drivers/media/common/saa7146_i2c.c +++ b/drivers/media/common/saa7146_i2c.c | |||
@@ -202,7 +202,8 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d | |||
202 | /* a signal arrived */ | 202 | /* a signal arrived */ |
203 | return -ERESTARTSYS; | 203 | return -ERESTARTSYS; |
204 | 204 | ||
205 | printk(KERN_WARNING "saa7146_i2c_writeout: timed out waiting for end of xfer\n"); | 205 | printk(KERN_WARNING "%s %s [irq]: timed out waiting for end of xfer\n", |
206 | dev->name, __FUNCTION__); | ||
206 | return -EIO; | 207 | return -EIO; |
207 | } | 208 | } |
208 | status = saa7146_read(dev, I2C_STATUS); | 209 | status = saa7146_read(dev, I2C_STATUS); |
@@ -219,7 +220,8 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d | |||
219 | break; | 220 | break; |
220 | } | 221 | } |
221 | if (time_after(jiffies,timeout)) { | 222 | if (time_after(jiffies,timeout)) { |
222 | printk(KERN_WARNING "saa7146_i2c_writeout: timed out waiting for MC2\n"); | 223 | printk(KERN_WARNING "%s %s: timed out waiting for MC2\n", |
224 | dev->name, __FUNCTION__); | ||
223 | return -EIO; | 225 | return -EIO; |
224 | } | 226 | } |
225 | } | 227 | } |
@@ -235,7 +237,8 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d | |||
235 | /* this is normal when probing the bus | 237 | /* this is normal when probing the bus |
236 | * (no answer from nonexisistant device...) | 238 | * (no answer from nonexisistant device...) |
237 | */ | 239 | */ |
238 | DEB_I2C(("saa7146_i2c_writeout: timed out waiting for end of xfer\n")); | 240 | printk(KERN_WARNING "%s %s [poll]: timed out waiting for end of xfer\n", |
241 | dev->name, __FUNCTION__); | ||
239 | return -EIO; | 242 | return -EIO; |
240 | } | 243 | } |
241 | if (++trial < 50 && short_delay) | 244 | if (++trial < 50 && short_delay) |
@@ -246,8 +249,16 @@ static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_d | |||
246 | } | 249 | } |
247 | 250 | ||
248 | /* give a detailed status report */ | 251 | /* give a detailed status report */ |
249 | if ( 0 != (status & SAA7146_I2C_ERR)) { | 252 | if ( 0 != (status & (SAA7146_I2C_SPERR | SAA7146_I2C_APERR | |
250 | 253 | SAA7146_I2C_DTERR | SAA7146_I2C_DRERR | | |
254 | SAA7146_I2C_AL | SAA7146_I2C_ERR | | ||
255 | SAA7146_I2C_BUSY)) ) { | ||
256 | |||
257 | if ( 0 == (status & SAA7146_I2C_ERR) || | ||
258 | 0 == (status & SAA7146_I2C_BUSY) ) { | ||
259 | /* it may take some time until ERR goes high - ignore */ | ||
260 | DEB_I2C(("unexpected i2c status %04x\n", status)); | ||
261 | } | ||
251 | if( 0 != (status & SAA7146_I2C_SPERR) ) { | 262 | if( 0 != (status & SAA7146_I2C_SPERR) ) { |
252 | DEB_I2C(("error due to invalid start/stop condition.\n")); | 263 | DEB_I2C(("error due to invalid start/stop condition.\n")); |
253 | } | 264 | } |