/*
 * Copyright (c) 2021 Sun Amar
 * Copyright (c) 2021 Yonatan Schachter
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <em_system.h>
#include <em_rmu.h>
#include <zephyr/drivers/hwinfo.h>
#include <string.h>
#include <zephyr/sys/byteorder.h>

#if 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))
#define HAS_BROWNOUT 1
#endif

ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length)
{
	uint64_t unique_id = sys_cpu_to_be64(SYSTEM_GetUnique());

	if (length > sizeof(unique_id)) {
		length = sizeof(unique_id);
	}

	memcpy(buffer, &unique_id, 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;
}
