index 115f78b2cf0e85512f54abddd6fcd30513fd3054..9ea4d09877fb6648ee8ae558952b8eb449f09945 100644 (file)
*/
/* GateHWSpinlock Module Local State */
typedef struct {
+ Int32 fd; /* spinlock device handle */
UInt32 * baseAddr; /* base addr lock registers */
GateMutex_Handle gmHandle; /* handle to gate mutex */
} GateHWSpinlock_Module_State;
static GateHWSpinlock_Module_State GateHWSpinlock_state =
{
+ .fd = -1,
.baseAddr = NULL,
.gmHandle = NULL
};
{
Int32 status = GateHWSpinlock_S_SUCCESS;
UInt32 dst;
- Int32 fdMem;
- fdMem = open ("/dev/mem", O_RDWR | O_SYNC);
-
- if (fdMem < 0){
+ Mod->fd = open ("/dev/mem", O_RDWR | O_SYNC);
+ if (Mod->fd < 0){
LOG0("GateHWSpinlock_start: failed to open the /dev/mem");
status = GateHWSpinlock_E_OSFAILURE;
}
if (status == GateHWSpinlock_S_SUCCESS) {
dst = (UInt32)mmap(NULL, _GateHWSpinlock_cfgParams.size,
(PROT_READ | PROT_WRITE),
- (MAP_SHARED), fdMem,
+ (MAP_SHARED), Mod->fd,
(off_t)_GateHWSpinlock_cfgParams.baseAddr);
if (dst == (UInt32)MAP_FAILED) {
LOG0("GateHWSpinlock_start: Memory map failed")
status = GateHWSpinlock_E_OSFAILURE;
+ close(Mod->fd);
+ Mod->fd = -1;
}
else {
Mod->baseAddr = (UInt32 *)(dst + _GateHWSpinlock_cfgParams.offset);
_GateHWSpinlock_cfgParams.size);
}
+ /* close the spinlock device file */
+ if (Mod->fd >= 0) {
+ close(Mod->fd);
+ Mod->fd = -1;
+ }
+
return(status);
}