brintos

brintos / linux-shallow public Read only

0
0
Text · 4.4 KiB · be24db2 Raw
155 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/*******************************************************************************3 *4 * Module Name: utxfmutex - external AML mutex access functions5 *6 ******************************************************************************/7 8#include <acpi/acpi.h>9#include "accommon.h"10#include "acnamesp.h"11 12#define _COMPONENT          ACPI_UTILITIES13ACPI_MODULE_NAME("utxfmutex")14 15/* Local prototypes */16static acpi_status17acpi_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_object24 *25 * PARAMETERS:  handle              - Mutex or prefix handle (optional)26 *              pathname            - Mutex pathname (optional)27 *              ret_obj             - Where the mutex object is returned28 *29 * RETURN:      Status30 *31 * DESCRIPTION: Get an AML mutex object. The mutex node is pointed to by32 *              Handle:Pathname. Either Handle or Pathname can be NULL, but33 *              not both.34 *35 ******************************************************************************/36 37static acpi_status38acpi_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_mutex84 *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:      Status90 *91 * DESCRIPTION: Acquire an AML mutex. This is a device driver interface to92 *              AML mutex objects, and allows for transaction locking between93 *              drivers and AML code. The mutex node is pointed to by94 *              Handle:Pathname. Either Handle or Pathname can be NULL, but95 *              not both.96 *97 ******************************************************************************/98 99acpi_status100acpi_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 118ACPI_EXPORT_SYMBOL(acpi_acquire_mutex)119 120/*******************************************************************************121 *122 * FUNCTION:    acpi_release_mutex123 *124 * PARAMETERS:  handle              - Mutex or prefix handle (optional)125 *              pathname            - Mutex pathname (optional)126 *127 * RETURN:      Status128 *129 * DESCRIPTION: Release an AML mutex. This is a device driver interface to130 *              AML mutex objects, and allows for transaction locking between131 *              drivers and AML code. The mutex node is pointed to by132 *              Handle:Pathname. Either Handle or Pathname can be NULL, but133 *              not both.134 *135 ******************************************************************************/136acpi_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 154ACPI_EXPORT_SYMBOL(acpi_release_mutex)155