From 782c9b797368ceacb321f7228106004276e5e94d Mon Sep 17 00:00:00 2001 From: Yonatan Schachter Date: Wed, 9 Jun 2021 22:31:11 +0300 Subject: [PATCH] drivers: hwinfo: Added Gecko support for reset cause This commit provides implementations for the reset cause API functions as part of hwinfo. Signed-off-by: Yonatan Schachter --- drivers/hwinfo/Kconfig | 1 + drivers/hwinfo/hwinfo_gecko.c | 144 ++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) diff --git a/drivers/hwinfo/Kconfig b/drivers/hwinfo/Kconfig index 26709574254..0934ddd0ed9 100644 --- a/drivers/hwinfo/Kconfig +++ b/drivers/hwinfo/Kconfig @@ -91,6 +91,7 @@ config HWINFO_GECKO bool "GECKO hwinfo" default y depends on SOC_FAMILY_EXX32 + select SOC_GECKO_RMU help Enable Silabs GECKO hwinfo driver. diff --git a/drivers/hwinfo/hwinfo_gecko.c b/drivers/hwinfo/hwinfo_gecko.c index 404b5d0c970..9b772e373cd 100644 --- a/drivers/hwinfo/hwinfo_gecko.c +++ b/drivers/hwinfo/hwinfo_gecko.c @@ -1,14 +1,23 @@ /* * Copyright (c) 2021 Sun Amar + * Copyright (c) 2021 Yonatan Schachter * * SPDX-License-Identifier: Apache-2.0 */ #include +#include #include #include #include +#define HAS_BROWNOUT (defined(RMU_RSTCAUSE_BODUNREGRST) + || defined(RMU_RSTCAUSE_BODREGRST) + || defined(RMU_RSTCAUSE_AVDDBOD) || defined(RMU_RSTCAUSE_DVDDBOD) + || defined(RMU_RSTCAUSE_DECBOD) || defined(RMU_RSTCAUSE_BODAVDD0) + || defined(RMU_RSTCAUSE_BODAVDD1) + || (defined(BU_PRESENT) && defined(_SILICON_LABS_32B_SERIES_0))) + ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length) { uint64_t unique_id = sys_cpu_to_be64(SYSTEM_GetUnique()); @@ -21,3 +30,138 @@ ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length) return length; } + +int z_impl_hwinfo_get_reset_cause(uint32_t *cause) +{ + uint32_t flags = 0; + uint32_t rmu_flags = RMU_ResetCauseGet(); + + if (rmu_flags & RMU_RSTCAUSE_PORST) { + flags |= RESET_POR; + } + + if (rmu_flags & RMU_RSTCAUSE_EXTRST) { + flags |= RESET_PIN; + } + + if (rmu_flags & RMU_RSTCAUSE_SYSREQRST) { + flags |= RESET_SOFTWARE; + } + + if (rmu_flags & RMU_RSTCAUSE_LOCKUPRST) { + flags |= RESET_CPU_LOCKUP; + } + + if (rmu_flags & RMU_RSTCAUSE_WDOGRST) { + flags |= RESET_WATCHDOG; + } + +#ifdef RMU_RSTCAUSE_EM4WURST + if (rmu_flags & RMU_RSTCAUSE_EM4WURST) { + flags |= RESET_LOW_POWER_WAKE; + } +#endif /* RMU_RSTCAUSE_EM4WURST */ + +#ifdef RMU_RSTCAUSE_EM4RST + if (rmu_flags & RMU_RSTCAUSE_EM4RST) { + flags |= RESET_LOW_POWER_WAKE; + } +#endif /* RMU_RSTCAUSE_EM4RST */ + +#ifdef RMU_RSTCAUSE_BODUNREGRST + if (rmu_flags & RMU_RSTCAUSE_BODUNREGRST) { + flags |= RESET_BROWNOUT; + } +#endif /* RMU_RSTCAUSE_BODUNREGRST */ + +#ifdef RMU_RSTCAUSE_BODREGRST + if (rmu_flags & RMU_RSTCAUSE_BODREGRST) { + flags |= RESET_BROWNOUT; + } +#endif /* RMU_RSTCAUSE_BODREGRST */ + +#ifdef RMU_RSTCAUSE_AVDDBOD + if (rmu_flags & RMU_RSTCAUSE_AVDDBOD) { + flags |= RESET_BROWNOUT; + } +#endif /* RMU_RSTCAUSE_AVDDBOD */ + +#ifdef RMU_RSTCAUSE_DVDDBOD + if (rmu_flags & RMU_RSTCAUSE_DVDDBOD) { + flags |= RESET_BROWNOUT; + } +#endif /* RMU_RSTCAUSE_DVDDBOD */ + +#ifdef RMU_RSTCAUSE_DECBOD + if (rmu_flags & RMU_RSTCAUSE_DECBOD) { + flags |= RESET_BROWNOUT; + } +#endif /* RMU_RSTCAUSE_DECBOD */ + +#ifdef RMU_RSTCAUSE_BODAVDD0 + if (rmu_flags & RMU_RSTCAUSE_BODAVDD0) { + flags |= RESET_BROWNOUT; + } +#endif /* RMU_RSTCAUSE_BODAVDD0 */ + +#ifdef RMU_RSTCAUSE_BODAVDD1 + if (rmu_flags & RMU_RSTCAUSE_BODAVDD1) { + flags |= RESET_BROWNOUT; + } +#endif /* RMU_RSTCAUSE_BODAVDD1 */ + +#if defined(BU_PRESENT) && defined(_SILICON_LABS_32B_SERIES_0) + if (rmu_flags & RMU_RSTCAUSE_BUBODVDDDREG) { + flags |= RESET_BROWNOUT; + } + + if (rmu_flags & RMU_RSTCAUSE_BUBODBUVIN) { + flags |= RESET_BROWNOUT; + } + + if (rmu_flags & RMU_RSTCAUSE_BUBODUNREG) { + flags |= RESET_BROWNOUT; + } + + if (rmu_flags & RMU_RSTCAUSE_BUBODREG) { + flags |= RESET_BROWNOUT; + } + + if (rmu_flags & RMU_RSTCAUSE_BUMODERST) { + flags |= RESET_BROWNOUT; + } + +#elif defined(RMU_RSTCAUSE_BUMODERST) + if (rmu_flags & RMU_RSTCAUSE_BUMODERST) { + flags |= RESET_BROWNOUT; + } + +#endif /* defined(BU_PRESENT) && defined(_SILICON_LABS_32B_SERIES_0) */ + + *cause = flags; + return 0; +} + +int z_impl_hwinfo_clear_reset_cause(void) +{ + RMU_ResetCauseClear(); + + return 0; +} + +int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported) +{ + *supported = RESET_PIN + | RESET_SOFTWARE + | RESET_POR + | RESET_WATCHDOG + | RESET_CPU_LOCKUP +#if defined(RMU_RSTCAUSE_EM4WURST) || defined(RMU_RSTCAUSE_EM4RST) + | RESET_LOW_POWER_WAKE +#endif /* defined(RMU_RSTCAUSE_EM4WURST) || defined(RMU_RSTCAUSE_EM4RST) */ +#if HAS_BROWNOUT + | RESET_BROWNOUT +#endif /* HAS_BROWNOUT */ + ; + return 0; +}