87 lines
1.7 KiB
C
87 lines
1.7 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (c) 2019 MediaTek Inc.
|
|
*/
|
|
|
|
#include <linux/io.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/ktime.h>
|
|
#include "adsp_core.h"
|
|
#include "adsp_feature_define.h"
|
|
#include "adsp_reserved_mem.h"
|
|
#include "adsp_platform.h"
|
|
#include "adsp_platform_driver.h"
|
|
|
|
#define WAIT_MS (1000)
|
|
#define AP_AWAKE_LOCK_BIT (0)
|
|
#define AP_AWAKE_UNLOCK_BIT (1)
|
|
#define AP_AWAKE_LOCK_MASK (0x1 << AP_AWAKE_LOCK_BIT)
|
|
#define AP_AWAKE_UNLOCK_MASK (0x1 << AP_AWAKE_UNLOCK_BIT)
|
|
|
|
|
|
/*
|
|
* acquire adsp lock flag, keep adsp awake
|
|
* @param adsp_id: adsp core id
|
|
* return 0 : get lock success
|
|
* non-0 : get lock fail
|
|
*/
|
|
int adsp_awake_lock(u32 cid)
|
|
{
|
|
int msg = AP_AWAKE_LOCK_MASK;
|
|
int ret = ADSP_IPI_BUSY;
|
|
|
|
if (cid >= get_adsp_core_total()) {
|
|
ret = -EINVAL;
|
|
goto ERROR;
|
|
}
|
|
|
|
if (!is_adsp_ready(cid) || !adsp_feature_is_active(cid)) {
|
|
ret = -ENODEV;
|
|
goto ERROR;
|
|
}
|
|
|
|
ret = adsp_push_message(ADSP_IPI_DVFS_WAKE, &msg, sizeof(u32), WAIT_MS, cid);
|
|
|
|
if (ret)
|
|
goto ERROR;
|
|
|
|
return ADSP_IPI_DONE;
|
|
|
|
ERROR:
|
|
pr_info("%s, lock fail, ret = %d", __func__, ret);
|
|
return ret;
|
|
}
|
|
|
|
/*
|
|
* release adsp awake lock flag
|
|
* @param adsp_id: adsp core id
|
|
* return 0 : release lock success
|
|
* non-0 : release lock fail
|
|
*/
|
|
int adsp_awake_unlock(u32 cid)
|
|
{
|
|
int msg = AP_AWAKE_UNLOCK_MASK;
|
|
int ret = ADSP_IPI_BUSY;
|
|
|
|
if (cid >= get_adsp_core_total()) {
|
|
ret = -EINVAL;
|
|
goto ERROR;
|
|
}
|
|
|
|
if (!is_adsp_ready(cid) || !adsp_feature_is_active(cid)) {
|
|
ret = -ENODEV;
|
|
goto ERROR;
|
|
}
|
|
|
|
ret = adsp_push_message(ADSP_IPI_DVFS_WAKE, &msg, sizeof(u32), WAIT_MS, cid);
|
|
|
|
if (ret)
|
|
goto ERROR;
|
|
|
|
return ADSP_IPI_DONE;
|
|
|
|
ERROR:
|
|
pr_info("%s, unlock fail, ret = %d", __func__, ret);
|
|
return ret;
|
|
}
|
|
|