1
0
mirror of https://github.com/physwizz/a155-U-u1.git synced 2025-02-15 00:18:03 +00:00
physwizz 99537be4e2 first
2024-03-11 06:53:12 +11:00

91 lines
2.2 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* MediaTek SCP VoW
*
* Copyright (c) 2020 MediaTek Inc.
* Author: Michael Hsiao <michael.hsiao@mediatek.com>
*/
#include <linux/module.h>
#include "mtk-base-afe.h"
#include "mtk-sram-manager.h"
#include "mtk-scp-vow.h"
#include "mtk-afe-external.h"
#if IS_ENABLED(CONFIG_MTK_TINYSYS_SCP_SUPPORT)
#include "scp.h"
#endif
int mtk_scp_vow_barge_in_allocate_mem(struct snd_pcm_substream *substream,
dma_addr_t *phys_addr,
unsigned char **virt_addr,
unsigned int size)
{
struct snd_dma_buffer *dma_buf = &substream->dma_buffer;
dma_buf->dev.type = SNDRV_DMA_TYPE_DEV;
dma_buf->dev.dev = substream->pcm->card->dev;
dma_buf->private_data = NULL;
dma_buf->bytes = size;
pr_debug("%s(), use DRAM\n", __func__);
#if IS_ENABLED(CONFIG_MTK_TINYSYS_SCP_SUPPORT)
dma_buf->addr = scp_get_reserve_mem_phys(VOW_BARGEIN_MEM_ID);
dma_buf->area =
(uint8_t *)scp_get_reserve_mem_virt(VOW_BARGEIN_MEM_ID);
*phys_addr = dma_buf->addr;
*virt_addr = dma_buf->area;
#else
pr_debug("%s(), SCP not support\n", __func__);
return -EINVAL;
#endif
return 0;
}
int notify_vow_init_event(struct notifier_block *nb, unsigned long event, void *v)
{
int status = NOTIFY_DONE; //default don't care it.
if (event == NOTIFIER_VOW_ALLOCATE_MEM) {
struct snd_pcm_substream *substream;
substream = (struct snd_pcm_substream *)v;
pr_debug("%s(), vow received afe notify init event.\n", __func__);
if (mtk_scp_vow_barge_in_allocate_mem(substream,
&substream->runtime->dma_addr,
&substream->runtime->dma_area,
substream->runtime->dma_bytes) == 0)
status = NOTIFY_STOP;
else
status = NOTIFY_BAD;
}
return status;
}
/* define a notifier_block */
static struct notifier_block vow_scp_init_notifier = {
.notifier_call = notify_vow_init_event,
};
static int __init mtk_scp_vow_init(void)
{
register_afe_allocate_mem_notifier(&vow_scp_init_notifier);
return 0;
}
static void __exit mtk_scp_vow_exit(void)
{
unregister_afe_allocate_mem_notifier(&vow_scp_init_notifier);
}
module_init(mtk_scp_vow_init);
module_exit(mtk_scp_vow_exit);
MODULE_DESCRIPTION("Mediatek SCP VoW Common Driver");
MODULE_AUTHOR("Michael Hsiao <michael.hsiao@mediatek.com>");
MODULE_LICENSE("GPL v2");