arm-trusted-firmware/plat/mediatek/common/lpm_v2/mt_lp_api.c
Wenzhen Yu da8cc41bc8 feat(mt8196): add LPM v2 support
LPM means low power module, it will connect idle and SPM to achieve
lower power consumption in some scenarios, and this patch is LPM
second version

Signed-off-by: Wenzhen Yu <wenzhen.yu@mediatek.corp-partner.google.com>
Change-Id: I6ae5b5b4c2056d08c29efab5116be3a92351d8f1
2025-01-22 15:28:08 +08:00

90 lines
1.8 KiB
C

/*
* Copyright (c) 2025, MediaTek Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <lpm_v2/mt_lp_api.h>
#define UPDATE_STATUS(val, status, bit) \
((val) ? ((status) | (1 << (bit))) : ((status) & ~(1 << (bit))))
static uint64_t lp_status;
int mt_audio_update(int type)
{
int ret, val;
switch (type) {
case AUDIO_AFE_ENTER:
case AUDIO_AFE_LEAVE:
val = (type == AUDIO_AFE_ENTER) ? 1 : 0;
lp_status = UPDATE_STATUS(val, lp_status, AUDIO_AFE);
ret = mt_lp_rm_do_update(-1, PLAT_RC_IS_FMAUDIO, &val);
break;
case AUDIO_DSP_ENTER:
case AUDIO_DSP_LEAVE:
val = (type == AUDIO_DSP_ENTER) ? 1 : 0;
lp_status = UPDATE_STATUS(val, lp_status, AUDIO_DSP);
ret = mt_lp_rm_do_update(-1, PLAT_RC_IS_ADSP, &val);
break;
default:
ret = -1;
break;
}
return ret;
}
int mt_usb_update(int type)
{
int ret, val;
switch (type) {
case LPM_USB_ENTER:
case LPM_USB_LEAVE:
val = (type == LPM_USB_ENTER) ? 1 : 0;
ret = mt_lp_rm_do_update(-1, PLAT_RC_IS_USB_INFRA, &val);
break;
case USB_HEADSET_ENTER:
case USB_HEADSET_LEAVE:
val = (type == USB_HEADSET_ENTER) ? 1 : 0;
lp_status = UPDATE_STATUS(val, lp_status, USB_HEADSET);
ret = mt_lp_rm_do_update(-1, PLAT_RC_IS_USB_HEADSET, &val);
break;
default:
ret = -1;
break;
}
return ret;
}
uint64_t mt_get_lp_scenario_status(void)
{
return lp_status;
}
int mt_gpueb_hwctrl(int type, void *priv)
{
int ret, val;
switch (type) {
case GPUEB_PLL_EN:
case GPUEB_PLL_DIS:
val = (type == GPUEB_PLL_EN) ? 1 : 0;
ret = mt_lp_rm_do_hwctrl(PLAT_AP_GPUEB_PLL_CONTROL, val, priv);
break;
case GPUEB_GET_PWR_STATUS:
ret = mt_lp_rm_do_hwctrl(PLAT_AP_GPUEB_PWR_STATUS, 0, priv);
break;
case GPUEB_GET_MFG0_PWR_CON:
ret = mt_lp_rm_do_hwctrl(PLAT_AP_GPUEB_MFG0_PWR_CON, 0, priv);
break;
default:
ret = -1;
break;
}
return ret;
}