1*1e1e5a4dSGatien Chevallier // SPDX-License-Identifier: BSD-2-Clause
2*1e1e5a4dSGatien Chevallier /*
3*1e1e5a4dSGatien Chevallier * Copyright (c) 2017-2022, STMicroelectronics
4*1e1e5a4dSGatien Chevallier */
5*1e1e5a4dSGatien Chevallier
6*1e1e5a4dSGatien Chevallier #include <drivers/stm32_shared_io.h>
7*1e1e5a4dSGatien Chevallier #include <io.h>
8*1e1e5a4dSGatien Chevallier #include <kernel/spinlock.h>
9*1e1e5a4dSGatien Chevallier #include <stm32_util.h>
10*1e1e5a4dSGatien Chevallier
11*1e1e5a4dSGatien Chevallier static unsigned int shregs_lock = SPINLOCK_UNLOCK;
12*1e1e5a4dSGatien Chevallier
lock_stm32shregs(void)13*1e1e5a4dSGatien Chevallier static uint32_t lock_stm32shregs(void)
14*1e1e5a4dSGatien Chevallier {
15*1e1e5a4dSGatien Chevallier return may_spin_lock(&shregs_lock);
16*1e1e5a4dSGatien Chevallier }
17*1e1e5a4dSGatien Chevallier
unlock_stm32shregs(uint32_t exceptions)18*1e1e5a4dSGatien Chevallier static void unlock_stm32shregs(uint32_t exceptions)
19*1e1e5a4dSGatien Chevallier {
20*1e1e5a4dSGatien Chevallier may_spin_unlock(&shregs_lock, exceptions);
21*1e1e5a4dSGatien Chevallier }
22*1e1e5a4dSGatien Chevallier
io_mask32_stm32shregs(vaddr_t va,uint32_t value,uint32_t mask)23*1e1e5a4dSGatien Chevallier void io_mask32_stm32shregs(vaddr_t va, uint32_t value, uint32_t mask)
24*1e1e5a4dSGatien Chevallier {
25*1e1e5a4dSGatien Chevallier uint32_t exceptions = lock_stm32shregs();
26*1e1e5a4dSGatien Chevallier
27*1e1e5a4dSGatien Chevallier io_mask32(va, value, mask);
28*1e1e5a4dSGatien Chevallier
29*1e1e5a4dSGatien Chevallier unlock_stm32shregs(exceptions);
30*1e1e5a4dSGatien Chevallier }
31*1e1e5a4dSGatien Chevallier
io_clrsetbits32_stm32shregs(vaddr_t va,uint32_t clr,uint32_t set)32*1e1e5a4dSGatien Chevallier void io_clrsetbits32_stm32shregs(vaddr_t va, uint32_t clr, uint32_t set)
33*1e1e5a4dSGatien Chevallier {
34*1e1e5a4dSGatien Chevallier uint32_t exceptions = lock_stm32shregs();
35*1e1e5a4dSGatien Chevallier
36*1e1e5a4dSGatien Chevallier io_clrsetbits32(va, clr, set);
37*1e1e5a4dSGatien Chevallier
38*1e1e5a4dSGatien Chevallier unlock_stm32shregs(exceptions);
39*1e1e5a4dSGatien Chevallier }
40