xref: /optee_os/core/drivers/stm32_shared_io.c (revision 1e1e5a4de8e934d9a626ad83d881610f2bf3485b)
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