summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-11-24 11:47:24 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-11-24 11:47:24 +0000
commit63f0b5ec3a773e55c6565483a3da959cf935f231 (patch)
tree2423d91df8e48753c05c8a1eb7d4c45c7e2994ee
parentc833a816d8ca98c4d44578da7f9a467fc0c1e8a8 (diff)
downloadrockbox-63f0b5ec3a773e55c6565483a3da959cf935f231.tar.gz
rockbox-63f0b5ec3a773e55c6565483a3da959cf935f231.zip
Removed a potential I2C deadlock
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2879 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/mas.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/firmware/drivers/mas.c b/firmware/drivers/mas.c
index ec4de76a84..e5967fe5f0 100644
--- a/firmware/drivers/mas.c
+++ b/firmware/drivers/mas.c
@@ -380,32 +380,34 @@ int mas_codec_readreg(int reg)
380 /* send read command */ 380 /* send read command */
381 if (i2c_write(MAS_DEV_WRITE,buf,3)) 381 if (i2c_write(MAS_DEV_WRITE,buf,3))
382 { 382 {
383 return -1; 383 ret = -1;
384 } 384 }
385 385 else
386 i2c_start(); 386 {
387 i2c_outb(MAS_DEV_WRITE); 387 i2c_start();
388 if (i2c_getack()) { 388 i2c_outb(MAS_DEV_WRITE);
389 i2c_outb(MAS_CODEC_READ);
390 if (i2c_getack()) { 389 if (i2c_getack()) {
391 i2c_start(); 390 i2c_outb(MAS_CODEC_READ);
392 i2c_outb(MAS_DEV_READ);
393 if (i2c_getack()) { 391 if (i2c_getack()) {
394 tmp[0] = i2c_inb(0); 392 i2c_start();
395 tmp[1] = i2c_inb(1); /* NAK the last byte */ 393 i2c_outb(MAS_DEV_READ);
396 ret = (tmp[0] << 8) | tmp[1]; 394 if (i2c_getack()) {
395 tmp[0] = i2c_inb(0);
396 tmp[1] = i2c_inb(1); /* NAK the last byte */
397 ret = (tmp[0] << 8) | tmp[1];
398 }
399 else
400 ret = -4;
397 } 401 }
398 else 402 else
399 ret = -3; 403 ret = -3;
400 } 404 }
401 else 405 else
402 ret = -2; 406 ret = -2;
407
408 i2c_stop();
403 } 409 }
404 else
405 ret = -1;
406 410
407 i2c_stop();
408
409 i2c_end(); 411 i2c_end();
410 return ret; 412 return ret;
411} 413}