Remove buggy linux completion API emulation and use the common version.
This commit is contained in:
parent
91dff1f8f3
commit
1099eb26d0
|
@ -26,7 +26,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: vchi_bsd.c,v 1.6 2014/03/27 07:59:17 skrll Exp $
|
||||
* $Id: vchi_bsd.c,v 1.7 2014/04/12 13:28:41 skrll Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
@ -120,123 +120,6 @@ del_timer(struct timer_list *t)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Completion API
|
||||
*/
|
||||
void
|
||||
init_completion(struct completion *c)
|
||||
{
|
||||
cv_init(&c->cv, "VCHI completion cv");
|
||||
mutex_init(&c->lock, MUTEX_DEFAULT, IPL_NONE);
|
||||
c->done = 0;
|
||||
}
|
||||
|
||||
void
|
||||
destroy_completion(struct completion *c)
|
||||
{
|
||||
cv_destroy(&c->cv);
|
||||
mutex_destroy(&c->lock);
|
||||
}
|
||||
|
||||
void
|
||||
wait_for_completion(struct completion *c)
|
||||
{
|
||||
mutex_enter(&c->lock);
|
||||
if (!c->done)
|
||||
cv_wait(&c->cv, &c->lock);
|
||||
c->done--;
|
||||
mutex_exit(&c->lock);
|
||||
}
|
||||
|
||||
int
|
||||
try_wait_for_completion(struct completion *c)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
mutex_enter(&c->lock);
|
||||
if (!c->done)
|
||||
c->done--;
|
||||
else
|
||||
res = 1;
|
||||
mutex_exit(&c->lock);
|
||||
return res != 0;
|
||||
}
|
||||
|
||||
int
|
||||
wait_for_completion_timeout(struct completion *c, unsigned long timeout)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
mutex_enter(&c->lock);
|
||||
if (!c->done)
|
||||
res = cv_timedwait(&c->cv, &c->lock, timeout);
|
||||
if (res == 0)
|
||||
c->done--;
|
||||
mutex_exit(&c->lock);
|
||||
return res != 0;
|
||||
}
|
||||
|
||||
int
|
||||
wait_for_completion_interruptible_timeout(struct completion *c, unsigned long timeout)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
mutex_enter(&c->lock);
|
||||
if (!c->done)
|
||||
res = cv_timedwait_sig(&c->cv, &c->lock, timeout);
|
||||
if (res == 0)
|
||||
c->done--;
|
||||
mutex_exit(&c->lock);
|
||||
return res != 0;
|
||||
}
|
||||
|
||||
int
|
||||
wait_for_completion_interruptible(struct completion *c)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
mutex_enter(&c->lock);
|
||||
if (!c->done)
|
||||
res = cv_wait_sig(&c->cv, &c->lock);
|
||||
if (res == 0)
|
||||
c->done--;
|
||||
mutex_exit(&c->lock);
|
||||
return res != 0;
|
||||
}
|
||||
|
||||
int
|
||||
wait_for_completion_killable(struct completion *c)
|
||||
{
|
||||
int res = 0;
|
||||
|
||||
mutex_enter(&c->lock);
|
||||
if (!c->done)
|
||||
res = cv_wait_sig(&c->cv, &c->lock);
|
||||
/* TODO: check actual signals here ? */
|
||||
if (res == 0)
|
||||
c->done--;
|
||||
mutex_exit(&c->lock);
|
||||
return res != 0;
|
||||
}
|
||||
|
||||
void
|
||||
complete(struct completion *c)
|
||||
{
|
||||
mutex_enter(&c->lock);
|
||||
c->done++;
|
||||
cv_signal(&c->cv);
|
||||
mutex_exit(&c->lock);
|
||||
}
|
||||
|
||||
void
|
||||
complete_all(struct completion *c)
|
||||
{
|
||||
mutex_enter(&c->lock);
|
||||
c->done++;
|
||||
cv_broadcast(&c->cv);
|
||||
mutex_exit(&c->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Semaphore API
|
||||
*/
|
||||
|
|
|
@ -44,6 +44,8 @@
|
|||
#include <sys/rwlock.h>
|
||||
#include <sys/callout.h>
|
||||
|
||||
#include <linux/completion.h>
|
||||
|
||||
/*
|
||||
* Copy from/to user API
|
||||
*/
|
||||
|
@ -177,28 +179,6 @@ void add_timer(struct timer_list *t);
|
|||
int del_timer(struct timer_list *t);
|
||||
int del_timer_sync(struct timer_list *t);
|
||||
|
||||
/*
|
||||
* Completion API
|
||||
*/
|
||||
struct completion {
|
||||
kcondvar_t cv;
|
||||
kmutex_t lock;
|
||||
int done;
|
||||
};
|
||||
|
||||
void init_completion(struct completion *c);
|
||||
void destroy_completion(struct completion *c);
|
||||
int try_wait_for_completion(struct completion *);
|
||||
int wait_for_completion_interruptible(struct completion *);
|
||||
int wait_for_completion_interruptible_timeout(struct completion *, unsigned long ticks);
|
||||
int wait_for_completion_killable(struct completion *);
|
||||
void wait_for_completion(struct completion *c);
|
||||
int wait_for_completion_timeout(struct completion *c, unsigned long timeout);
|
||||
void complete(struct completion *c);
|
||||
void complete_all(struct completion *c);
|
||||
|
||||
#define INIT_COMPLETION(x) do {(x).done = 0;} while(0)
|
||||
|
||||
/*
|
||||
* Semaphore API
|
||||
*/
|
||||
|
|
|
@ -38,6 +38,8 @@
|
|||
#include <sys/bus.h>
|
||||
#include <sys/kmem.h>
|
||||
|
||||
#include <linux/completion.h>
|
||||
|
||||
#include <uvm/uvm_extern.h>
|
||||
|
||||
#include <arch/arm/broadcom/bcm2835_mbox.h>
|
||||
|
|
Loading…
Reference in New Issue