From 72c61f10053c20c4ae96823d8c934aed049a05ce Mon Sep 17 00:00:00 2001 From: Yonatan Schachter Date: Mon, 7 Feb 2022 22:35:30 +0200 Subject: [PATCH] drivers: hwinfo: Added reset cause support for RPi Pico Added support for hwinfo's reset cause functions, for the Raspberry Pi Pico series. Signed-off-by: Yonatan Schachter --- drivers/hwinfo/hwinfo_rpi_pico.c | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/drivers/hwinfo/hwinfo_rpi_pico.c b/drivers/hwinfo/hwinfo_rpi_pico.c index 2ca251389c0..2527adda992 100644 --- a/drivers/hwinfo/hwinfo_rpi_pico.c +++ b/drivers/hwinfo/hwinfo_rpi_pico.c @@ -7,9 +7,14 @@ #include #include #include +#include #define FLASH_RUID_DATA_BYTES 8 +#define HAD_RUN_BIT BIT(VREG_AND_CHIP_RESET_CHIP_RESET_HAD_RUN_LSB) +#define HAD_PSM_RESTART_BIT BIT(VREG_AND_CHIP_RESET_CHIP_RESET_HAD_PSM_RESTART_LSB) +#define HAD_POR_BIT BIT(VREG_AND_CHIP_RESET_CHIP_RESET_HAD_POR_LSB) + ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length) { uint8_t id[FLASH_RUID_DATA_BYTES]; @@ -32,3 +37,38 @@ 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 reset_register = vreg_and_chip_reset_hw->chip_reset; + + if (reset_register & HAD_POR_BIT) { + flags |= RESET_POR; + } + + if (reset_register & HAD_RUN_BIT) { + flags |= RESET_PIN; + } + + if (reset_register & HAD_PSM_RESTART_BIT) { + flags |= RESET_DEBUG; + } + + *cause = flags; + return 0; +} + +int z_impl_hwinfo_clear_reset_cause(void) +{ + /* The reset register can't be modified, nothing to do. */ + + return -ENOSYS; +} + +int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported) +{ + *supported = RESET_PIN | RESET_DEBUG | RESET_POR; + + return 0; +}