/* * sync.h * * DSP-BIOS Bridge driver support functions for TI OMAP processors. * * Provide synchronization services. * * Copyright (C) 2005-2006 Texas Instruments, Inc. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _SYNC_H #define _SYNC_H #include #include /* Special timeout value indicating an infinite wait: */ #define SYNC_INFINITE 0xffffffff /** * struct sync_object - the basic sync_object structure * @comp: use to signal events * @multi_comp: use to signal multiple events. * */ struct sync_object{ struct completion comp; struct completion *multi_comp; }; /** * sync_init_event() - set initial state for a sync_event element * @event: event to be initialized. * * Set the initial state for a sync_event element. */ static inline void sync_init_event(struct sync_object *event) { init_completion(&event->comp); event->multi_comp = NULL; } /** * sync_reset_event() - reset a sync_event element * @event: event to be reset. * * This function reset to the initial state to @event. */ static inline void sync_reset_event(struct sync_object *event) { INIT_COMPLETION(event->comp); event->multi_comp = NULL; } /** * sync_set_event() - set or signal and specified event * @event: Event to be set.. * * set the @event, if there is an thread waiting for the event * it will be waken up, this function only wakes one thread. */ void sync_set_event(struct sync_object *event); /** * sync_wait_on_event() - waits for a event to be set. * @event: events to wait for it. * @timeout timeout on waiting for the evetn. * * This function will wait until @event is set or until timeout. In case of * success the function will return 0 and * in case of timeout the function will return -ETIME * in case of signal the function will return -ERESTARTSYS */ static inline int sync_wait_on_event(struct sync_object *event, unsigned timeout) { int res; res = wait_for_completion_interruptible_timeout(&event->comp, msecs_to_jiffies(timeout)); if (!res) res = -ETIME; else if (res > 0) res = 0; return res; } /** * sync_wait_on_multiple_events() - waits for multiple events to be set. * @events: Array of events to wait for them. * @count: number of elements of the array. * @timeout timeout on waiting for the evetns. * @pu_index index of the event set. * * This function will wait until any of the array element is set or until * timeout. In case of success the function will return 0 and * @pu_index will store the index of the array element set and in case * of timeout the function will return -ETIME. */ int sync_wait_on_multiple_events(struct sync_object **events, unsigned count, unsigned timeout, unsigned *index); #endif /* _SYNC_H */