root/drivers/acpi/acpica/utxfmutex.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ACPI_MODULE_NAME
  2. acpi_acquire_mutex
  3. ACPI_EXPORT_SYMBOL

   1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2 /*******************************************************************************
   3  *
   4  * Module Name: utxfmutex - external AML mutex access functions
   5  *
   6  ******************************************************************************/
   7 
   8 #include <acpi/acpi.h>
   9 #include "accommon.h"
  10 #include "acnamesp.h"
  11 
  12 #define _COMPONENT          ACPI_UTILITIES
  13 ACPI_MODULE_NAME("utxfmutex")
  14 
  15 /* Local prototypes */
  16 static acpi_status
  17 acpi_ut_get_mutex_object(acpi_handle handle,
  18                          acpi_string pathname,
  19                          union acpi_operand_object **ret_obj);
  20 
  21 /*******************************************************************************
  22  *
  23  * FUNCTION:    acpi_ut_get_mutex_object
  24  *
  25  * PARAMETERS:  handle              - Mutex or prefix handle (optional)
  26  *              pathname            - Mutex pathname (optional)
  27  *              ret_obj             - Where the mutex object is returned
  28  *
  29  * RETURN:      Status
  30  *
  31  * DESCRIPTION: Get an AML mutex object. The mutex node is pointed to by
  32  *              Handle:Pathname. Either Handle or Pathname can be NULL, but
  33  *              not both.
  34  *
  35  ******************************************************************************/
  36 
  37 static acpi_status
  38 acpi_ut_get_mutex_object(acpi_handle handle,
  39                          acpi_string pathname,
  40                          union acpi_operand_object **ret_obj)
  41 {
  42         struct acpi_namespace_node *mutex_node;
  43         union acpi_operand_object *mutex_obj;
  44         acpi_status status;
  45 
  46         /* Parameter validation */
  47 
  48         if (!ret_obj || (!handle && !pathname)) {
  49                 return (AE_BAD_PARAMETER);
  50         }
  51 
  52         /* Get a the namespace node for the mutex */
  53 
  54         mutex_node = handle;
  55         if (pathname != NULL) {
  56                 status =
  57                     acpi_get_handle(handle, pathname,
  58                                     ACPI_CAST_PTR(acpi_handle, &mutex_node));
  59                 if (ACPI_FAILURE(status)) {
  60                         return (status);
  61                 }
  62         }
  63 
  64         /* Ensure that we actually have a Mutex object */
  65 
  66         if (!mutex_node || (mutex_node->type != ACPI_TYPE_MUTEX)) {
  67                 return (AE_TYPE);
  68         }
  69 
  70         /* Get the low-level mutex object */
  71 
  72         mutex_obj = acpi_ns_get_attached_object(mutex_node);
  73         if (!mutex_obj) {
  74                 return (AE_NULL_OBJECT);
  75         }
  76 
  77         *ret_obj = mutex_obj;
  78         return (AE_OK);
  79 }
  80 
  81 /*******************************************************************************
  82  *
  83  * FUNCTION:    acpi_acquire_mutex
  84  *
  85  * PARAMETERS:  handle              - Mutex or prefix handle (optional)
  86  *              pathname            - Mutex pathname (optional)
  87  *              timeout             - Max time to wait for the lock (millisec)
  88  *
  89  * RETURN:      Status
  90  *
  91  * DESCRIPTION: Acquire an AML mutex. This is a device driver interface to
  92  *              AML mutex objects, and allows for transaction locking between
  93  *              drivers and AML code. The mutex node is pointed to by
  94  *              Handle:Pathname. Either Handle or Pathname can be NULL, but
  95  *              not both.
  96  *
  97  ******************************************************************************/
  98 
  99 acpi_status
 100 acpi_acquire_mutex(acpi_handle handle, acpi_string pathname, u16 timeout)
 101 {
 102         acpi_status status;
 103         union acpi_operand_object *mutex_obj;
 104 
 105         /* Get the low-level mutex associated with Handle:Pathname */
 106 
 107         status = acpi_ut_get_mutex_object(handle, pathname, &mutex_obj);
 108         if (ACPI_FAILURE(status)) {
 109                 return (status);
 110         }
 111 
 112         /* Acquire the OS mutex */
 113 
 114         status = acpi_os_acquire_mutex(mutex_obj->mutex.os_mutex, timeout);
 115         return (status);
 116 }
 117 
 118 ACPI_EXPORT_SYMBOL(acpi_acquire_mutex)
 119 
 120 /*******************************************************************************
 121  *
 122  * FUNCTION:    acpi_release_mutex
 123  *
 124  * PARAMETERS:  handle              - Mutex or prefix handle (optional)
 125  *              pathname            - Mutex pathname (optional)
 126  *
 127  * RETURN:      Status
 128  *
 129  * DESCRIPTION: Release an AML mutex. This is a device driver interface to
 130  *              AML mutex objects, and allows for transaction locking between
 131  *              drivers and AML code. The mutex node is pointed to by
 132  *              Handle:Pathname. Either Handle or Pathname can be NULL, but
 133  *              not both.
 134  *
 135  ******************************************************************************/
 136 acpi_status acpi_release_mutex(acpi_handle handle, acpi_string pathname)
 137 {
 138         acpi_status status;
 139         union acpi_operand_object *mutex_obj;
 140 
 141         /* Get the low-level mutex associated with Handle:Pathname */
 142 
 143         status = acpi_ut_get_mutex_object(handle, pathname, &mutex_obj);
 144         if (ACPI_FAILURE(status)) {
 145                 return (status);
 146         }
 147 
 148         /* Release the OS mutex */
 149 
 150         acpi_os_release_mutex(mutex_obj->mutex.os_mutex);
 151         return (AE_OK);
 152 }
 153 
 154 ACPI_EXPORT_SYMBOL(acpi_release_mutex)

/* [<][>][^][v][top][bottom][index][help] */