1
0
Fork 0
forked from len0rd/rockbox

Portal player i2c driver: More struct spinlock phaseout.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15593 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michael Sevakis 2007-11-12 07:58:54 +00:00
parent 81dedee7d0
commit d970c3d054
3 changed files with 21 additions and 11 deletions

View file

@ -47,7 +47,8 @@
/* To be used by drivers that need to do multiple i2c operations /* To be used by drivers that need to do multiple i2c operations
atomically */ atomically */
extern struct spinlock i2c_spin; void i2c_lock(void);
void i2c_unlock(void);
void i2c_init(void); void i2c_init(void);
int i2c_readbyte(unsigned int dev_addr, int addr); int i2c_readbyte(unsigned int dev_addr, int addr);

View file

@ -33,6 +33,7 @@
#include "as3514.h" #include "as3514.h"
/* Local functions definitions */ /* Local functions definitions */
static struct mutex i2c_mtx NOCACHEBSS_ATTR;
#define POLL_TIMEOUT (HZ) #define POLL_TIMEOUT (HZ)
@ -133,18 +134,26 @@ static int pp_i2c_send_byte(unsigned int addr, int data0)
} }
/* Public functions */ /* 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) { int i2c_readbytes(unsigned int dev_addr, int addr, int len, unsigned char *data) {
unsigned int temp; unsigned int temp;
int i; int i;
spinlock_lock(&i2c_spin); mutex_lock(&i2c_mtx);
pp_i2c_send_byte(dev_addr, addr); pp_i2c_send_byte(dev_addr, addr);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
pp_i2c_read_byte(dev_addr, &temp); pp_i2c_read_byte(dev_addr, &temp);
data[i] = temp; data[i] = temp;
} }
spinlock_unlock(&i2c_spin); mutex_unlock(&i2c_mtx);
return i; return i;
} }
@ -152,10 +161,10 @@ int i2c_readbyte(unsigned int dev_addr, int addr)
{ {
int data; int data;
spinlock_lock(&i2c_spin); mutex_lock(&i2c_mtx);
pp_i2c_send_byte(dev_addr, addr); pp_i2c_send_byte(dev_addr, addr);
pp_i2c_read_byte(dev_addr, &data); pp_i2c_read_byte(dev_addr, &data);
spinlock_unlock(&i2c_spin); mutex_unlock(&i2c_mtx);
return data; return data;
} }
@ -168,9 +177,9 @@ int pp_i2c_send(unsigned int addr, int data0, int data1)
data[0] = data0; data[0] = data0;
data[1] = data1; data[1] = data1;
spinlock_lock(&i2c_spin); mutex_lock(&i2c_mtx);
retval = pp_i2c_send_bytes(addr, 2, data); retval = pp_i2c_send_bytes(addr, 2, data);
spinlock_unlock(&i2c_spin); mutex_unlock(&i2c_mtx);
return retval; return retval;
} }
@ -222,7 +231,7 @@ void i2c_init(void)
#endif #endif
#endif #endif
spinlock_init(&i2c_spin IF_COP(, SPINLOCK_TASK_SWITCH)); mutex_init(&i2c_mtx);
i2c_readbyte(0x8, 0); i2c_readbyte(0x8, 0);
} }

View file

@ -28,7 +28,7 @@ unsigned short adc_read(int channel)
if ((unsigned)channel < NUM_ADC_CHANNELS) if ((unsigned)channel < NUM_ADC_CHANNELS)
{ {
spinlock_lock(&i2c_spin); i2c_lock();
/* Select channel */ /* Select channel */
if (pp_i2c_send( AS3514_I2C_ADDR, ADC_0, (channel << 4)) >= 0) 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; return data;