1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2021, Linaro Limited 4 */ 5 6 #include <assert.h> 7 #include <drivers/rstctrl.h> 8 #include <io.h> 9 #include <kernel/dt.h> 10 #include <kernel/dt_driver.h> 11 #include <kernel/spinlock.h> 12 #include <libfdt.h> 13 #include <stdint.h> 14 15 /* Global reset controller access lock */ 16 17 TEE_Result rstctrl_get_exclusive(struct rstctrl *rstctrl) 18 { 19 uint32_t exceptions = 0; 20 TEE_Result res = TEE_ERROR_ACCESS_CONFLICT; 21 static unsigned int rstctrl_lock = SPINLOCK_UNLOCK; 22 23 exceptions = cpu_spin_lock_xsave(&rstctrl_lock); 24 25 if (!rstctrl->exclusive) { 26 rstctrl->exclusive = true; 27 res = TEE_SUCCESS; 28 } 29 30 cpu_spin_unlock_xrestore(&rstctrl_lock, exceptions); 31 32 return res; 33 } 34 35 void rstctrl_put_exclusive(struct rstctrl *rstctrl) 36 { 37 assert(rstctrl->exclusive); 38 39 WRITE_ONCE(rstctrl->exclusive, false); 40 } 41 42 TEE_Result rstctrl_dt_get_by_name(const void *fdt, int nodeoffset, 43 const char *name, struct rstctrl **rstctrl) 44 { 45 int index = 0; 46 47 index = fdt_stringlist_search(fdt, nodeoffset, "reset-names", name); 48 if (index < 0) 49 return TEE_ERROR_GENERIC; 50 51 return rstctrl_dt_get_by_index(fdt, nodeoffset, index, rstctrl); 52 } 53