/* * Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved. * * SPDX-License-Identifier: MIT */ #include "soc.h" #include "suspend.h" #include "mailbox-api.h" #include "vad_suspend.h" #include "dsp.h" static struct xClientMboxChan *pxClkAO2DSPChan; static void *xMboxVadWakeup(void *msg) { (void)msg; uint32_t buf[4] = {0}; buf[0] = VAD_WAKEUP; STR_Wakeup_src_Queue_Send(buf); return NULL; } void vDSPVadWakeupInit(void) { xInstallRemoteMessageCallbackFeedBack(DSPA2AO_CHANNEL, MBX_CMD_VAD_AWE_WAKEUP, xMboxVadWakeup, 0); pxClkAO2DSPChan = xMboxRequestChan(AO2DSPA_CLK); if (!pxClkAO2DSPChan) printf("err: AO2DSPA mbx chan req fail!\n"); } void vDSPVadWakeupDeinit(void) { xUninstallRemoteMessageCallback(DSPA2AO_CHANNEL, MBX_CMD_VAD_AWE_WAKEUP); xMboxFreeChan(pxClkAO2DSPChan); pxClkAO2DSPChan = NULL; } void vDSP_suspend(uint32_t st_f) { #ifdef CONFIG_MAILBOX_SEND int iIdx = 0; struct xMboxData xMboxSendData; if (!st_f && pxClkAO2DSPChan) { iIdx = WAIT_SWITCH_TO_RTC_PLL; xMboxSendData.ulCmd = MBX_CMD_SUSPEND_WITH_DSP; xMboxSendData.pvTxbuf = (void *)&iIdx; xMboxSendData.ucTxSize = 4; xMboxSendMsg(pxClkAO2DSPChan, &xMboxSendData); vTaskDelay(pdMS_TO_TICKS(90)); printf("[AO]: running at 24MHz, 24MHz osc clk power off.\n"); } #else (void)st_f; #endif } void vDSP_resume(uint32_t st_f) { #ifdef CONFIG_MAILBOX_SEND int iIdx; struct xMboxData xMboxSendData; xMboxSendData.ulCmd = MBX_CMD_SUSPEND_WITH_DSP; xMboxSendData.pvTxbuf = (void *)&iIdx; xMboxSendData.ucTxSize = 4; if ((!st_f) && (get_reason_flag() != VAD_WAKEUP) && pxClkAO2DSPChan) { wakeup_dsp(); vTaskDelay(pdMS_TO_TICKS(90)); iIdx = WAKEUP_FROM_OTHER_KEY; xMboxSendMsg(pxClkAO2DSPChan, &xMboxSendData); clear_dsp_wakeup_trigger(); } if (!st_f && pxClkAO2DSPChan) { iIdx = WAIT_SWITCH_TO_24MHZ; xMboxSendMsg(pxClkAO2DSPChan, &xMboxSendData); vTaskDelay(pdMS_TO_TICKS(90)); } #else (void)st_f; #endif }