/*
 * Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

#if !defined( __VOS_LOCK_H )
#define __VOS_LOCK_H

/**=========================================================================

  \file  vos_lock.h

  \brief virtual Operating System Servies (vOS) Locks

   Definitions for vOSS Locks

  ========================================================================*/

/* $Header$ */

/*--------------------------------------------------------------------------
  Include Files
  ------------------------------------------------------------------------*/
#include "vos_status.h"
#include "i_vos_lock.h"

/*--------------------------------------------------------------------------
  Preprocessor definitions and constants
  ------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------
  Type declarations
  ------------------------------------------------------------------------*/

/*-------------------------------------------------------------------------
  Function declarations and documenation
  ------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------

  \brief vos_lock_init() - initialize a vOSS lock

  The \a vos_lock_init() function initializes the specified lock. Upon
  successful initialization, the state of the lock becomes initialized
  and unlocked.

  A lock must be initialized by calling vos_lock_init() before it
  may be used in any other lock functions.

  Attempting to initialize an already initialized lock results in
  a failure.

  \param lock - pointer to the opaque lock object to initialize

  \return VOS_STATUS_SUCCESS - lock was successfully initialized and
          is ready to be used.

          VOS_STATUS_E_RESOURCES - System resources (other than memory)
          are unavailable to initilize the lock

          VOS_STATUS_E_NOMEM - insufficient memory exists to initialize
          the lock

          VOS_STATUS_E_BUSY - The implementation has detected an attempt
          to reinitialize the object referenced by lock, a previously
          initialized, but not yet destroyed, lock.

          VOS_STATUS_E_FAULT  - lock is an invalid pointer.
  \sa

  --------------------------------------------------------------------------*/
VOS_STATUS vos_lock_init( vos_lock_t *lock );

/*--------------------------------------------------------------------------

  \brief vos_lock_acquire() - acquire a lock

  A lock object is acquired by calling \a vos_lock_acquire().  If the lock
  is already locked, the calling thread shall block until the lock becomes
  available. This operation shall return with the lock object referenced by
  lock in the locked state with the calling thread as its owner.

  \param lock - the lock object to acquire

  \return VOS_STATUS_SUCCESS - the lock was successfully acquired by
          the calling thread.

          VOS_STATUS_E_INVAL - The value specified by lock does not refer
          to an initialized lock object.

          VOS_STATUS_E_FAULT - lock is an invalid pointer.

  \sa

  ------------------------------------------------------------------------*/
VOS_STATUS vos_lock_acquire( vos_lock_t * lock );


/*--------------------------------------------------------------------------

  \brief vos_lock_release() - release a lock

  The \a vos_lock_release() function shall release the lock object
  referenced by 'lock'.

  If a thread attempts to release a lock that it unlocked or is not
  initialized, an error is returned.

  \param lock - the lock to release

  \return VOS_STATUS_SUCCESS - the lock was successfully released

          VOS_STATUS_E_INVAL - The value specified by lock does not refer
          to an initialized lock object.

          VOS_STATUS_E_FAULT - The value specified by lock does not refer
          to an initialized lock object.

          VOS_STATUS_E_PERM - Operation is not permitted.  The calling
          thread does not own the lock.

  \sa

  ------------------------------------------------------------------------*/
VOS_STATUS vos_lock_release( vos_lock_t *lock );


/*--------------------------------------------------------------------------

  \brief vos_lock_destroy() - Destroy a vOSS Lock

  The \a vos_lock_destroy() function shall destroy the lock object
  referenced by lock.  After a successful return from \a vos_lock_destroy()
  the lock object becomes, in effect, uninitialized.

  A destroyed lock object can be reinitialized using vos_lock_init();
  the results of otherwise referencing the object after it has been destroyed
  are undefined.  Calls to vOSS lock functions to manipulate the lock such
  as vos_lock_acquire() will fail if the lock is destroyed.  Therefore,
  don't use the lock after it has been destroyed until it has
  been re-initialized.

  \param lock - the lock object to be destroyed.

  \return VOS_STATUS_SUCCESS - lock was successfully destroyed.

          VOS_STATUS_E_BUSY - The implementation has detected an attempt
          to destroy the object referenced by lock while it is locked
          or still referenced.

          VOS_STATUS_E_INVAL - The value specified by lock is invalid.

          VOS_STATUS_E_FAULT  - lock is an invalid pointer.
  \sa

  ------------------------------------------------------------------------*/
VOS_STATUS vos_lock_destroy( vos_lock_t *lock );

/*--------------------------------------------------------------------------

  \brief vos_spin_lock_init() - initializes a vOSS spin lock

  The vos_spin_lock_init() function initializes the specified spin lock. Upon
  successful initialization, the state of the lock becomes initialized
  and unlocked.

  A lock must be initialized by calling vos_spin_lock_init() before it
  may be used in any other lock functions.

  Attempting to initialize an already initialized lock results in
  a failure.

  \param pLock - pointer to the opaque lock object to initialize

  \return VOS_STATUS_SUCCESS - spin lock was successfully initialized and
          is ready to be used.
  --------------------------------------------------------------------------*/
VOS_STATUS vos_spin_lock_init(vos_spin_lock_t *pLock);

/*--------------------------------------------------------------------------

  \brief vos_spin_lock_acquire() - acquires a spin lock

  A lock object is acquired by calling \a vos_spin_lock_acquire().  If the lock
  is already locked, the calling thread shall spin until the lock becomes
  available. This operation shall return with the lock object referenced by
  lock in the locked state with the calling thread as its owner.

  \param pLock - the lock object to acquire

  \return VOS_STATUS_SUCCESS - the lock was successfully acquired by
          the calling thread.

  \sa
  ------------------------------------------------------------------------*/
VOS_STATUS vos_spin_lock_acquire(vos_spin_lock_t *pLock);

/*--------------------------------------------------------------------------

  \brief vos_spin_lock_release() - releases a lock

  The \a vos_lock_release() function shall release the spin lock object
  referenced by 'lock'.

  If a thread attempts to release a lock that it unlocked or is not
  initialized, an error is returned.

  \param pLock - the lock to release

  \return VOS_STATUS_SUCCESS - the lock was successfully released

  \sa
  ------------------------------------------------------------------------*/
VOS_STATUS vos_spin_lock_release(vos_spin_lock_t *pLock);

/*--------------------------------------------------------------------------

  \brief vos_spin_lock_destroy() - releases resource of a lock

  \param pLock - pointer to a lock to release

  \return VOS_STATUS_SUCCESS - the lock was successfully released

  \sa
  ------------------------------------------------------------------------*/
VOS_STATUS vos_spin_lock_destroy(vos_spin_lock_t *pLock);

/*--------------------------------------------------------------------------

  \brief vos_wake_lock_init() - initializes a vOSS wake lock

  \param pLock - the wake lock to initialize
              name - wakelock name

  \return VOS_STATUS_SUCCESS - wake lock was successfully initialized and
          is ready to be used.
  --------------------------------------------------------------------------*/
VOS_STATUS vos_wake_lock_init(vos_wake_lock_t *pLock, const char *name);

/*--------------------------------------------------------------------------

  \brief vos_wake_lock_acquire() - acquires a wake lock

  \param pLock - the wake lock to acquire
         reason - reason for taking wakelock

  \return VOS_STATUS_SUCCESS - the wake lock was successfully acquired

  ------------------------------------------------------------------------*/
VOS_STATUS vos_wake_lock_acquire(vos_wake_lock_t *pLock, uint32_t reason);

/*--------------------------------------------------------------------------

  \brief vos_wake_lock_timeout_acquire() - acquires a wake lock with a timeout

  \param pLock - the wake lock to acquire
         reason - reason for taking wakelock

  \return VOS_STATUS_SUCCESS - the wake lock was successfully acquired

  ------------------------------------------------------------------------*/
VOS_STATUS vos_wake_lock_timeout_acquire(vos_wake_lock_t *pLock, v_U32_t msec,
                                         uint32_t reason);

/*--------------------------------------------------------------------------

  \brief vos_wake_lock_release() - releases a wake lock

  \param pLock - the wake lock to release
         reason - reason for taking wakelock

  \return VOS_STATUS_SUCCESS - the lock was successfully released

  ------------------------------------------------------------------------*/
VOS_STATUS vos_wake_lock_release(vos_wake_lock_t *pLock, uint32_t reason);

/*--------------------------------------------------------------------------

  \brief vos_wake_lock_destroy() - destroys a wake lock

  \param pLock - the wake lock to destroy

  \return VOS_STATUS_SUCCESS - the lock was successfully destroyed

  ------------------------------------------------------------------------*/
VOS_STATUS vos_wake_lock_destroy(vos_wake_lock_t *pLock);

VOS_STATUS vos_runtime_pm_prevent_suspend(runtime_pm_context_t context);
VOS_STATUS vos_runtime_pm_allow_suspend(runtime_pm_context_t context);
VOS_STATUS vos_runtime_pm_prevent_suspend_timeout(runtime_pm_context_t context,
						unsigned int msec);
void *vos_runtime_pm_prevent_suspend_init(const char *);
void vos_runtime_pm_prevent_suspend_deinit(runtime_pm_context_t);
VOS_STATUS vos_request_runtime_pm_resume(void);
#endif // __VOSS_LOCK_H
