1 /******************************************************************************
2  *
3  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4  * Analog Devices, Inc.),
5  * Copyright (C) 2023-2024 Analog Devices, Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************************/
20 
21 /* **** Includes **** */
22 #include "mxc_device.h"
23 #include "mxc_lock.h"
24 
25 #ifndef __riscv
26 /* ************************************************************************** */
MXC_GetLock(uint32_t * lock,uint32_t value)27 int MXC_GetLock(uint32_t *lock, uint32_t value)
28 {
29     do {
30         // Return if the lock is taken by a different thread
31         if (__LDREXW((volatile uint32_t *)lock) != 0) {
32             return E_BUSY;
33         }
34 
35         // Attempt to take the lock
36     } while (__STREXW(value, (volatile uint32_t *)lock) != 0);
37 
38     // Do not start any other memory access until memory barrier is complete
39     __DMB();
40 
41     return E_NO_ERROR;
42 }
43 
44 /* ************************************************************************** */
MXC_FreeLock(uint32_t * lock)45 void MXC_FreeLock(uint32_t *lock)
46 {
47     // Ensure memory operations complete before releasing lock
48     __DMB();
49     *lock = 0;
50 }
51 #else // __riscv
52 /* ************************************************************************** */
MXC_GetLock(uint32_t * lock,uint32_t value)53 int MXC_GetLock(uint32_t *lock, uint32_t value)
54 {
55 #warning "Unimplemented for RISCV"
56     return E_NO_ERROR;
57 }
58 
59 /* ************************************************************************** */
MXC_FreeLock(uint32_t * lock)60 void MXC_FreeLock(uint32_t *lock)
61 {
62 #warning "Unimplemented for RISCV"
63 }
64 #endif
65