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.zip
rockbox-63f0b5ec3a773e55c6565483a3da959cf935f231.tar.gz
rockbox-63f0b5ec3a773e55c6565483a3da959cf935f231.tar.bz2
rockbox-63f0b5ec3a773e55c6565483a3da959cf935f231.tar.xz
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 ec4de76..e5967fe 100644
--- a/firmware/drivers/mas.c
+++ b/firmware/drivers/mas.c
@@ -380,32 +380,34 @@ int mas_codec_readreg(int reg)
/* send read command */
if (i2c_write(MAS_DEV_WRITE,buf,3))
{
- return -1;
+ ret = -1;
}
-
- i2c_start();
- i2c_outb(MAS_DEV_WRITE);
- if (i2c_getack()) {
- i2c_outb(MAS_CODEC_READ);
+ else
+ {
+ i2c_start();
+ i2c_outb(MAS_DEV_WRITE);
if (i2c_getack()) {
- i2c_start();
- i2c_outb(MAS_DEV_READ);
+ i2c_outb(MAS_CODEC_READ);
if (i2c_getack()) {
- tmp[0] = i2c_inb(0);
- tmp[1] = i2c_inb(1); /* NAK the last byte */
- ret = (tmp[0] << 8) | tmp[1];
+ i2c_start();
+ i2c_outb(MAS_DEV_READ);
+ if (i2c_getack()) {
+ tmp[0] = i2c_inb(0);
+ tmp[1] = i2c_inb(1); /* NAK the last byte */
+ ret = (tmp[0] << 8) | tmp[1];
+ }
+ else
+ ret = -4;
}
else
ret = -3;
}
else
ret = -2;
+
+ i2c_stop();
}
- else
- ret = -1;
- i2c_stop();
-
i2c_end();
return ret;
}