/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
/*
 * Copyright (c) 2023 MediaTek Inc.
 */

#ifndef _MTK_PM_H_
#define _MTK_PM_H_

/* Boot reason. */
#define PM_BR_AC                  (0x00) /* Hardware default. */
#define PM_BR_STR_STANDBY         (0x01) /* Standby trigger suspend callback at mtk-pm.ko. */
#define PM_BR_STR_SLEEP           (0x02) /* Legacy. */
#define PM_BR_STR_DSLEEP          (0x03) /* Legacy. */
#define PM_BR_MAX_CNT             (0x04) /* Internal use by mtk-pm.ko suspend callback. */
#define PM_BR_REBOOT              (0xD1) /* Android trigger reboot notify at mtk-pm.ko. */
#define PM_BR_REBOOT_SHELL        (0xD2) /* Command line tirgger reboot notify with default. */
#define PM_BR_REBOOT_BOOTLOADER   (0xD3) /* Command line tirgger reboot notify with bootloader. */
#define PM_BR_REBOOT_FORCE        (0xDF) /* Reserve. */
#define PM_BR_WATCHDOG            (0xE0) /* Host CPU trigger by WDT. */
#define PM_BR_WATCHDOG_FORCE      (0xE1) /* Preload overwrite from PM_BR_WATCHDOG.*/
#define PM_BR_WATCHDOG_PQU        (0xE2) /* Co-processor trigger by PQU WDT. */
#define PM_BR_WATCHDOG_SAR5       (0xE3) /* AC drop trigger by storage device. */
#define PM_BR_WATCHDOG_OVER_HEAT  (0xE4) /* CPU over heat reset */
#define PM_BR_PANIC_OWL           (0xEC) /* OWL mode load firmware. */
#define PM_BR_PANIC_MIUP          (0xED) /* Module MIU protect trigger by ISR. */
#define PM_BR_PANIC               (0xEE) /* Host CPU trgger by exception. */
#define PM_BR_PANIC_FORCE         (0xEF) /* Preload overwrite from PM_BR_PANIC.*/
#define PM_BR_SECONDARY           (0xF1) /* Uboot trigger secondary standby framework. */
#define PM_BR_DC                  (0xFF) /* Power off trigger shutdown callback at mtk-pm.ko. */

/* Legacy naming. */
#define PM_BR_PQU_WATCHDOG        (PM_BR_WATCHDOG_PQU)

/* Trigger DM probe. */
int32_t pm_init(void);
/* Boot reason record in RIU. */
int32_t pm_get_boot_reason(void);
int32_t pm_set_boot_reason(uint8_t reason);
/* Wakeup reason record in RIU. */
char *pm_get_wakeup_reason_str(void);
int32_t pm_get_wakeup_reason(void);
int32_t pm_set_wakeup_reason(const char *name);
/* Wakeup key record in RIU. */
int32_t pm_get_wakeup_key(void);
int32_t pm_set_wakeup_key(uint16_t key);
/* Wakeup config recode in RIU. */
int32_t pm_get_wakeup_config(const char *name, bool *enable);
int32_t pm_set_wakeup_config(const char *name, bool enable);
#if defined(CONFIG_MULTICORES_PLATFORM)
void *pm_init_thread_entry(void *args);
#endif
#endif
