summaryrefslogtreecommitdiffstats
path: root/cpukit/libi2c/libi2c.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cpukit/libi2c/libi2c.c71
1 files changed, 35 insertions, 36 deletions
diff --git a/cpukit/libi2c/libi2c.c b/cpukit/libi2c/libi2c.c
index 2d54a640ed..c07a03d92d 100644
--- a/cpukit/libi2c/libi2c.c
+++ b/cpukit/libi2c/libi2c.c
@@ -110,8 +110,7 @@ static struct i2cbus
{
rtems_libi2c_bus_t *bush;
volatile rtems_id mutex; /* lock this across start -> stop */
- volatile short waiting;
- volatile char started;
+ volatile bool started;
char *name;
} busses[MAX_NO_BUSSES] = { { 0, 0, 0, 0, 0 } };
@@ -120,7 +119,7 @@ static struct
rtems_libi2c_drv_t *drv;
} drvs[MAX_NO_DRIVERS] = { { 0 } };
-static rtems_id libmutex = 0;
+static rtems_id libmutex = RTEMS_ID_NONE;
#define LOCK(m) assert(!rtems_semaphore_obtain((m), RTEMS_WAIT, RTEMS_NO_TIMEOUT))
#define UNLOCK(m) rtems_semaphore_release((m))
@@ -175,24 +174,29 @@ mutexCreate (rtems_name nm, rtems_id *pm)
static void
lock_bus (int busno)
{
-rtems_status_code sc;
-struct i2cbus *bus = &busses[busno];
+ struct i2cbus *bus = &busses[busno];
- LIBLOCK ();
- if (!bus->waiting) {
- rtems_id m;
- /* nobody is holding the bus mutex - it's not there. Create it on the fly */
- sc = mutexCreate (rtems_build_name ('i', '2', 'c', '0' + busno), &m);
- if ( RTEMS_SUCCESSFUL != sc ) {
- LIBUNLOCK ();
- rtems_panic (DRVNM "Unable to create bus lock");
- } else {
- bus->mutex = m;
- }
+ if (bus->mutex == RTEMS_ID_NONE) {
+ /*
+ * Nobody is holding the bus mutex - it's not there. Create it on the fly.
+ */
+ LIBLOCK ();
+ if (bus->mutex == RTEMS_ID_NONE) {
+ rtems_id m = RTEMS_ID_NONE;
+ rtems_status_code sc = mutexCreate (
+ rtems_build_name ('i', '2', 'c', '0' + busno),
+ &m
+ );
+ if (sc != RTEMS_SUCCESSFUL) {
+ LIBUNLOCK ();
+ rtems_panic (DRVNM "Unable to create bus lock");
+ return;
+ }
+ bus->mutex = m;
+ }
+ LIBUNLOCK ();
}
- /* count number of people waiting on this bus; only the last one deletes the mutex */
- bus->waiting++;
- LIBUNLOCK ();
+
/* Now lock this bus */
LOCK (bus->mutex);
}
@@ -201,12 +205,7 @@ static void
unlock_bus (int busno)
{
struct i2cbus *bus = &busses[busno];
- LIBLOCK ();
UNLOCK (bus->mutex);
- if (!--bus->waiting) {
- rtems_semaphore_delete (bus->mutex);
- }
- LIBUNLOCK ();
}
/* Note that 'arg' is always passed in as NULL */
@@ -226,7 +225,7 @@ rtems_i2c_init (rtems_device_major_number major, rtems_device_minor_number minor
is_initialized = true;
rtems_libi2c_major = major;
} else {
- libmutex = 0;
+ libmutex = RTEMS_ID_NONE;
}
return rval;
}
@@ -370,10 +369,11 @@ rtems_libi2c_initialize (void)
safe_printf(
DRVNM "Claiming driver slot failed (rtems status code %i)\n",
sc);
- if ( libmutex )
- rtems_semaphore_delete (libmutex);
- libmutex = 0;
- is_initialized = false;
+ if (libmutex != RTEMS_ID_NONE) {
+ rtems_semaphore_delete (libmutex);
+ }
+ libmutex = RTEMS_ID_NONE;
+ is_initialized = false;
return -1;
}
@@ -417,7 +417,7 @@ rtems_libi2c_register_bus (const char *name, rtems_libi2c_bus_t * bus)
/* should be a directory since name terminates in '/' */
- if (!libmutex) {
+ if (libmutex == RTEMS_ID_NONE) {
safe_printf ( DRVNM "Library not initialized\n");
return -RTEMS_NOT_DEFINED;
}
@@ -432,9 +432,8 @@ rtems_libi2c_register_bus (const char *name, rtems_libi2c_bus_t * bus)
if (!busses[i].bush) {
/* found a free slot */
busses[i].bush = bus;
- busses[i].mutex = 0;
- busses[i].waiting = 0;
- busses[i].started = 0;
+ busses[i].mutex = RTEMS_ID_NONE;
+ busses[i].started = false;
if (!name)
sprintf (nmcpy + strlen (nmcpy), "%i", i);
@@ -497,7 +496,7 @@ rtems_libi2c_send_start (rtems_device_minor_number minor)
unlock_bus (busno);
} else {
/* successful 1st start; keep bus locked until stop is sent */
- busses[busno].started = 1;
+ busses[busno].started = true;
}
return rval;
}
@@ -513,7 +512,7 @@ rtems_libi2c_send_stop (rtems_device_minor_number minor)
rval = bush->ops->send_stop (bush);
- busses[busno].started = 0;
+ busses[busno].started = false;
unlock_bus (busno);
return rval;
@@ -693,7 +692,7 @@ rtems_libi2c_register_drv (const char *name, rtems_libi2c_drv_t * drvtbl,
rtems_status_code err;
rtems_device_minor_number minor;
- if (!libmutex) {
+ if (libmutex == RTEMS_ID_NONE) {
safe_printf ( DRVNM "Library not initialized\n");
return -RTEMS_NOT_DEFINED;
}