From d970c3d0542c6b207d82446e7f839ed5c59672e5 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Mon, 12 Nov 2007 07:58:54 +0000 Subject: Portal player i2c driver: More struct spinlock phaseout. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15593 a1c6a512-1295-4272-9138-f99709370657 --- firmware/export/i2c-pp.h | 3 ++- firmware/target/arm/i2c-pp.c | 25 +++++++++++++++++-------- firmware/target/arm/sandisk/adc-c200_e200.c | 4 ++-- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/firmware/export/i2c-pp.h b/firmware/export/i2c-pp.h index 908db22554..e789c72d84 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 69bc60e672..b8e3869907 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 9dc8f3aabb..fd07812cfb 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; -- cgit v1.2.3