93 lines
1.9 KiB
C
93 lines
1.9 KiB
C
/*
|
|
* 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
|
|
}
|