summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-11-12 07:58:54 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-11-12 07:58:54 +0000
commitd970c3d0542c6b207d82446e7f839ed5c59672e5 (patch)
treeb823b91e5bd79d6a83d9c78e7fecfe9d41b59585
parent81dedee7d050e2b52dfe1a294dbd349c4fe79155 (diff)
downloadrockbox-d970c3d0542c6b207d82446e7f839ed5c59672e5.zip
rockbox-d970c3d0542c6b207d82446e7f839ed5c59672e5.tar.gz
rockbox-d970c3d0542c6b207d82446e7f839ed5c59672e5.tar.bz2
rockbox-d970c3d0542c6b207d82446e7f839ed5c59672e5.tar.xz
Portal player i2c driver: More struct spinlock phaseout.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15593 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/export/i2c-pp.h3
-rw-r--r--firmware/target/arm/i2c-pp.c25
-rw-r--r--firmware/target/arm/sandisk/adc-c200_e200.c4
3 files changed, 21 insertions, 11 deletions
diff --git a/firmware/export/i2c-pp.h b/firmware/export/i2c-pp.h
index 908db22..e789c72 100644
--- a/firmware/export/i2c-pp.h
+++ b/firmware/export/i2c-pp.h
@@ -47,7 +47,8 @@
/* To be used by drivers that need to do multiple i2c operations
atomically */
-extern struct spinlock i2c_spin;
+void i2c_lock(void);
+void i2c_unlock(void);
void i2c_init(void);
int i2c_readbyte(unsigned int dev_addr, int addr);
diff --git a/firmware/target/arm/i2c-pp.c b/firmware/target/arm/i2c-pp.c
index 69bc60e..b8e3869 100644
--- a/firmware/target/arm/i2c-pp.c
+++ b/firmware/target/arm/i2c-pp.c
@@ -33,6 +33,7 @@
#include "as3514.h"
/* Local functions definitions */
+static struct mutex i2c_mtx NOCACHEBSS_ATTR;
#define POLL_TIMEOUT (HZ)
@@ -133,18 +134,26 @@ static int pp_i2c_send_byte(unsigned int addr, int data0)
}
/* Public functions */
-struct spinlock i2c_spin NOCACHEBSS_ATTR;
+void i2c_lock(void)
+{
+ mutex_lock(&i2c_mtx);
+}
+
+void i2c_unlock(void)
+{
+ mutex_unlock(&i2c_mtx);
+}
int i2c_readbytes(unsigned int dev_addr, int addr, int len, unsigned char *data) {
unsigned int temp;
int i;
- spinlock_lock(&i2c_spin);
+ mutex_lock(&i2c_mtx);
pp_i2c_send_byte(dev_addr, addr);
for (i = 0; i < len; i++) {
pp_i2c_read_byte(dev_addr, &temp);
data[i] = temp;
}
- spinlock_unlock(&i2c_spin);
+ mutex_unlock(&i2c_mtx);
return i;
}
@@ -152,10 +161,10 @@ int i2c_readbyte(unsigned int dev_addr, int addr)
{
int data;
- spinlock_lock(&i2c_spin);
+ mutex_lock(&i2c_mtx);
pp_i2c_send_byte(dev_addr, addr);
pp_i2c_read_byte(dev_addr, &data);
- spinlock_unlock(&i2c_spin);
+ mutex_unlock(&i2c_mtx);
return data;
}
@@ -168,9 +177,9 @@ int pp_i2c_send(unsigned int addr, int data0, int data1)
data[0] = data0;
data[1] = data1;
- spinlock_lock(&i2c_spin);
+ mutex_lock(&i2c_mtx);
retval = pp_i2c_send_bytes(addr, 2, data);
- spinlock_unlock(&i2c_spin);
+ mutex_unlock(&i2c_mtx);
return retval;
}
@@ -222,7 +231,7 @@ void i2c_init(void)
#endif
#endif
- spinlock_init(&i2c_spin IF_COP(, SPINLOCK_TASK_SWITCH));
+ mutex_init(&i2c_mtx);
i2c_readbyte(0x8, 0);
}
diff --git a/firmware/target/arm/sandisk/adc-c200_e200.c b/firmware/target/arm/sandisk/adc-c200_e200.c
index 9dc8f3a..fd07812 100644
--- a/firmware/target/arm/sandisk/adc-c200_e200.c
+++ b/firmware/target/arm/sandisk/adc-c200_e200.c
@@ -28,7 +28,7 @@ unsigned short adc_read(int channel)
if ((unsigned)channel < NUM_ADC_CHANNELS)
{
- spinlock_lock(&i2c_spin);
+ i2c_lock();
/* Select channel */
if (pp_i2c_send( AS3514_I2C_ADDR, ADC_0, (channel << 4)) >= 0)
@@ -42,7 +42,7 @@ unsigned short adc_read(int channel)
}
}
- spinlock_unlock(&i2c_spin);
+ i2c_unlock();
}
return data;