linux/drivers/staging/tidspbridge/include/dspbridge/sync.h
<<
>>
Prefs
   1/*
   2 * sync.h
   3 *
   4 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
   5 *
   6 * Provide synchronization services.
   7 *
   8 * Copyright (C) 2005-2006 Texas Instruments, Inc.
   9 *
  10 * This package is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License version 2 as
  12 * published by the Free Software Foundation.
  13 *
  14 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  15 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  16 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  17 */
  18
  19#ifndef _SYNC_H
  20#define _SYNC_H
  21
  22#include <dspbridge/dbdefs.h>
  23#include <dspbridge/host_os.h>
  24
  25
  26/* Special timeout value indicating an infinite wait: */
  27#define SYNC_INFINITE  0xffffffff
  28
  29/**
  30 * struct sync_object - the basic sync_object structure
  31 * @comp:       use to signal events
  32 * @multi_comp: use to signal multiple events.
  33 *
  34 */
  35struct sync_object{
  36        struct completion comp;
  37        struct completion *multi_comp;
  38};
  39
  40/**
  41 * sync_init_event() - set initial state for a sync_event element
  42 * @event:      event to be initialized.
  43 *
  44 * Set the initial state for a sync_event element.
  45 */
  46
  47static inline void sync_init_event(struct sync_object *event)
  48{
  49        init_completion(&event->comp);
  50        event->multi_comp = NULL;
  51}
  52
  53/**
  54 * sync_reset_event() - reset a sync_event element
  55 * @event:      event to be reset.
  56 *
  57 * This function reset to the initial state to @event.
  58 */
  59
  60static inline void sync_reset_event(struct sync_object *event)
  61{
  62        INIT_COMPLETION(event->comp);
  63        event->multi_comp = NULL;
  64}
  65
  66/**
  67 * sync_set_event() - set or signal and specified event
  68 * @event:      Event to be set..
  69 *
  70 * set the @event, if there is an thread waiting for the event
  71 * it will be waken up, this function only wakes one thread.
  72 */
  73
  74void sync_set_event(struct sync_object *event);
  75
  76/**
  77 * sync_wait_on_event() - waits for a event to be set.
  78 * @event:      events to wait for it.
  79 * @timeout     timeout on waiting for the evetn.
  80 *
  81 * This function will wait until @event is set or until timeout. In case of
  82 * success the function will return 0 and
  83 * in case of timeout the function will return -ETIME
  84 * in case of signal the function will return -ERESTARTSYS
  85 */
  86
  87static inline int sync_wait_on_event(struct sync_object *event,
  88                                                        unsigned timeout)
  89{
  90        int res;
  91
  92        res = wait_for_completion_interruptible_timeout(&event->comp,
  93                                                msecs_to_jiffies(timeout));
  94        if (!res)
  95                res = -ETIME;
  96        else if (res > 0)
  97                res = 0;
  98
  99        return res;
 100}
 101
 102/**
 103 * sync_wait_on_multiple_events() - waits for multiple events to be set.
 104 * @events:     Array of events to wait for them.
 105 * @count:      number of elements of the array.
 106 * @timeout     timeout on waiting for the evetns.
 107 * @pu_index    index of the event set.
 108 *
 109 * This function will wait until any of the array element is set or until
 110 * timeout. In case of success the function will return 0 and
 111 * @pu_index will store the index of the array element set and in case
 112 * of timeout the function will return -ETIME.
 113 */
 114
 115int sync_wait_on_multiple_events(struct sync_object **events,
 116                                     unsigned count, unsigned timeout,
 117                                     unsigned *index);
 118
 119#endif /* _SYNC_H */
 120