1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2021, Microchip 4 */ 5 6 #include <drivers/atmel_rstc.h> 7 #include <io.h> 8 #include <kernel/dt.h> 9 #include <tee_api_defines.h> 10 #include <tee_api_types.h> 11 #include <types_ext.h> 12 13 #define AT91_RSTC_CR 0x0 14 #define AT91_RSTC_CR_KEY SHIFT_U32(0xA5, 24) 15 #define AT91_RSTC_CR_PROCRST BIT32(0) 16 #define AT91_RSTC_CR_PERRST BIT32(2) 17 18 static vaddr_t rstc_base; 19 20 bool atmel_rstc_available(void) 21 { 22 return rstc_base != 0; 23 } 24 25 void __noreturn atmel_rstc_reset(void) 26 { 27 uint32_t val = AT91_RSTC_CR_KEY | AT91_RSTC_CR_PROCRST | 28 AT91_RSTC_CR_PERRST; 29 30 io_write32(rstc_base + AT91_RSTC_CR, val); 31 32 /* 33 * After the previous write, the CPU will reset so we will never hit 34 * this loop. 35 */ 36 while (true) 37 ; 38 } 39 40 static TEE_Result atmel_rstc_probe(const void *fdt, int node, 41 const void *compat_data __unused) 42 43 { 44 size_t size = 0; 45 46 if (dt_map_dev(fdt, node, &rstc_base, &size, DT_MAP_AUTO) < 0) 47 return TEE_ERROR_GENERIC; 48 49 return TEE_SUCCESS; 50 } 51 52 static const struct dt_device_match atmel_rstc_match_table[] = { 53 { .compatible = "atmel,sama5d3-rstc" }, 54 { } 55 }; 56 57 DEFINE_DT_DRIVER(atmel_rstc_dt_driver) = { 58 .name = "atmel_rstc", 59 .type = DT_DRIVER_NOTYPE, 60 .match_table = atmel_rstc_match_table, 61 .probe = atmel_rstc_probe, 62 }; 63