#include <linux/init.h>
#include <linux/mm.h>
#include <linux/module.h>
+#include <linux/completion.h>
#include <asm/iSeries/HvLpConfig.h>
#include <linux/slab.h>
#include <linux/delay.h>
};
struct VspRspData {
- struct semaphore *sem;
+ struct completion com;
struct VspCmdData *response;
};
struct pending_event *ev = new_pending_event();
int rc;
struct VspRspData response;
- DECLARE_MUTEX_LOCKED(Semaphore);
if (ev == NULL)
return -ENOMEM;
- response.sem = &Semaphore;
+ init_completion(&response.com);
response.response = vspCmd;
ev->event.hp_lp_event.xSubtype = 6;
ev->event.hp_lp_event.x.xSubtypeData =
rc = signal_event(ev);
if (rc == 0)
- down(&Semaphore);
+ wait_for_completion(&response.com);
return rc;
}
if (rsp != NULL) {
if (rsp->response != NULL)
memcpy(rsp->response, &(event->data.vsp_cmd), sizeof(event->data.vsp_cmd));
- if (rsp->sem != NULL)
- up(rsp->sem);
+ complete(&rsp->com);
} else
printk(KERN_ERR "mf.c: no rsp\n");
freeIt = 1;
}
struct RtcTimeData {
- struct semaphore *sem;
+ struct completion com;
struct CeMsgData xCeMsg;
int xRc;
};
memcpy(&(rtc->xCeMsg), ceMsg, sizeof(rtc->xCeMsg));
rtc->xRc = 0;
- up(rtc->sem);
+ complete(&rtc->com);
}
static unsigned long lastsec = 1;
struct CeMsgCompleteData ceComplete;
struct RtcTimeData rtcData;
int rc;
- DECLARE_MUTEX_LOCKED(Semaphore);
memset(&ceComplete, 0, sizeof(ceComplete));
memset(&rtcData, 0, sizeof(rtcData));
- rtcData.sem = &Semaphore;
+ init_completion(&rtcData.com);
ceComplete.handler = &getRtcTimeComplete;
ceComplete.token = (void *)&rtcData;
rc = signal_ce_msg("\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00",
&ceComplete);
if (rc == 0) {
- down(&Semaphore);
+ wait_for_completion(&rtcData.com);
if (rtcData.xRc == 0) {
if ((rtcData.xCeMsg.ce_msg[2] == 0xa9) ||