2021-11-17 11:37:19 +02:00
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
//
// This file is provided under a dual BSD/GPLv2 license. When using or
// redistributing this file, you may do so under either license.
//
// Copyright(c) 2021 Advanced Micro Devices, Inc.
//
// Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
/*
* PCM interface for generic AMD audio ACP DSP block
*/
# include <sound/pcm_params.h>
# include "../ops.h"
# include "acp.h"
# include "acp-dsp-offset.h"
int acp_pcm_hw_params ( struct snd_sof_dev * sdev , struct snd_pcm_substream * substream ,
2022-03-09 20:27:12 -08:00
struct snd_pcm_hw_params * params ,
struct snd_sof_platform_stream_params * platform_params )
2021-11-17 11:37:19 +02:00
{
2022-03-04 14:57:25 -06:00
struct snd_pcm_runtime * runtime = substream - > runtime ;
struct acp_dsp_stream * stream = runtime - > private_data ;
2021-11-17 11:37:19 +02:00
unsigned int buf_offset , index ;
u32 size ;
int ret ;
2022-03-04 14:57:25 -06:00
size = runtime - > dma_bytes ;
stream - > num_pages = PFN_UP ( runtime - > dma_bytes ) ;
2021-11-17 11:37:19 +02:00
stream - > dmab = substream - > runtime - > dma_buffer_p ;
ret = acp_dsp_stream_config ( sdev , stream ) ;
if ( ret < 0 ) {
dev_err ( sdev - > dev , " stream configuration failed \n " ) ;
return ret ;
}
2022-03-09 20:27:12 -08:00
platform_params - > use_phy_address = true ;
platform_params - > phy_addr = stream - > reg_offset ;
platform_params - > stream_tag = stream - > stream_tag ;
2021-11-17 11:37:19 +02:00
/* write buffer size of stream in scratch memory */
buf_offset = offsetof ( struct scratch_reg_conf , buf_size ) ;
index = stream - > stream_tag - 1 ;
buf_offset = buf_offset + index * 4 ;
snd_sof_dsp_write ( sdev , ACP_DSP_BAR , ACP_SCRATCH_REG_0 + buf_offset , size ) ;
return 0 ;
}
EXPORT_SYMBOL_NS ( acp_pcm_hw_params , SND_SOC_SOF_AMD_COMMON ) ;
int acp_pcm_open ( struct snd_sof_dev * sdev , struct snd_pcm_substream * substream )
{
struct acp_dsp_stream * stream ;
stream = acp_dsp_stream_get ( sdev , 0 ) ;
if ( ! stream )
return - ENODEV ;
substream - > runtime - > private_data = stream ;
stream - > substream = substream ;
return 0 ;
}
EXPORT_SYMBOL_NS ( acp_pcm_open , SND_SOC_SOF_AMD_COMMON ) ;
int acp_pcm_close ( struct snd_sof_dev * sdev , struct snd_pcm_substream * substream )
{
struct acp_dsp_stream * stream ;
stream = substream - > runtime - > private_data ;
if ( ! stream ) {
dev_err ( sdev - > dev , " No open stream \n " ) ;
return - EINVAL ;
}
stream - > substream = NULL ;
substream - > runtime - > private_data = NULL ;
return acp_dsp_stream_put ( sdev , stream ) ;
}
EXPORT_SYMBOL_NS ( acp_pcm_close , SND_SOC_SOF_AMD_COMMON ) ;