1*4da6b033SAjit Kumar Pandey // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 2*4da6b033SAjit Kumar Pandey // 3*4da6b033SAjit Kumar Pandey // This file is provided under a dual BSD/GPLv2 license. When using or 4*4da6b033SAjit Kumar Pandey // redistributing this file, you may do so under either license. 5*4da6b033SAjit Kumar Pandey // 6*4da6b033SAjit Kumar Pandey // Copyright(c) 2022 Advanced Micro Devices, Inc. 7*4da6b033SAjit Kumar Pandey // 8*4da6b033SAjit Kumar Pandey // Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com> 9*4da6b033SAjit Kumar Pandey // V sujith kumar Reddy <Vsujithkumar.Reddy@amd.com> 10*4da6b033SAjit Kumar Pandey 11*4da6b033SAjit Kumar Pandey /* ACP-specific Common code */ 12*4da6b033SAjit Kumar Pandey 13*4da6b033SAjit Kumar Pandey #include "../sof-priv.h" 14*4da6b033SAjit Kumar Pandey #include "../sof-audio.h" 15*4da6b033SAjit Kumar Pandey #include "../ops.h" 16*4da6b033SAjit Kumar Pandey #include "../sof-audio.h" 17*4da6b033SAjit Kumar Pandey #include "acp.h" 18*4da6b033SAjit Kumar Pandey #include "acp-dsp-offset.h" 19*4da6b033SAjit Kumar Pandey 20*4da6b033SAjit Kumar Pandey int acp_dai_probe(struct snd_soc_dai *dai) 21*4da6b033SAjit Kumar Pandey { 22*4da6b033SAjit Kumar Pandey struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(dai->component); 23*4da6b033SAjit Kumar Pandey const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata); 24*4da6b033SAjit Kumar Pandey unsigned int val; 25*4da6b033SAjit Kumar Pandey 26*4da6b033SAjit Kumar Pandey val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->i2s_pin_config_offset); 27*4da6b033SAjit Kumar Pandey if (val != desc->i2s_mode) { 28*4da6b033SAjit Kumar Pandey dev_err(sdev->dev, "I2S Mode is not supported (I2S_PIN_CONFIG: %#x)\n", val); 29*4da6b033SAjit Kumar Pandey return -EINVAL; 30*4da6b033SAjit Kumar Pandey } 31*4da6b033SAjit Kumar Pandey 32*4da6b033SAjit Kumar Pandey return 0; 33*4da6b033SAjit Kumar Pandey } 34*4da6b033SAjit Kumar Pandey EXPORT_SYMBOL_NS(acp_dai_probe, SND_SOC_SOF_AMD_COMMON); 35*4da6b033SAjit Kumar Pandey 36*4da6b033SAjit Kumar Pandey struct snd_soc_acpi_mach *amd_sof_machine_select(struct snd_sof_dev *sdev) 37*4da6b033SAjit Kumar Pandey { 38*4da6b033SAjit Kumar Pandey struct snd_sof_pdata *sof_pdata = sdev->pdata; 39*4da6b033SAjit Kumar Pandey const struct sof_dev_desc *desc = sof_pdata->desc; 40*4da6b033SAjit Kumar Pandey struct snd_soc_acpi_mach *mach; 41*4da6b033SAjit Kumar Pandey 42*4da6b033SAjit Kumar Pandey mach = snd_soc_acpi_find_machine(desc->machines); 43*4da6b033SAjit Kumar Pandey if (!mach) { 44*4da6b033SAjit Kumar Pandey dev_warn(sdev->dev, "No matching ASoC machine driver found\n"); 45*4da6b033SAjit Kumar Pandey return NULL; 46*4da6b033SAjit Kumar Pandey } 47*4da6b033SAjit Kumar Pandey 48*4da6b033SAjit Kumar Pandey sof_pdata->tplg_filename = mach->sof_tplg_filename; 49*4da6b033SAjit Kumar Pandey sof_pdata->fw_filename = mach->fw_filename; 50*4da6b033SAjit Kumar Pandey 51*4da6b033SAjit Kumar Pandey return mach; 52*4da6b033SAjit Kumar Pandey } 53*4da6b033SAjit Kumar Pandey 54*4da6b033SAjit Kumar Pandey /* AMD Common DSP ops */ 55*4da6b033SAjit Kumar Pandey struct snd_sof_dsp_ops sof_acp_common_ops = { 56*4da6b033SAjit Kumar Pandey /* probe and remove */ 57*4da6b033SAjit Kumar Pandey .probe = amd_sof_acp_probe, 58*4da6b033SAjit Kumar Pandey .remove = amd_sof_acp_remove, 59*4da6b033SAjit Kumar Pandey 60*4da6b033SAjit Kumar Pandey /* Register IO */ 61*4da6b033SAjit Kumar Pandey .write = sof_io_write, 62*4da6b033SAjit Kumar Pandey .read = sof_io_read, 63*4da6b033SAjit Kumar Pandey 64*4da6b033SAjit Kumar Pandey /* Block IO */ 65*4da6b033SAjit Kumar Pandey .block_read = acp_dsp_block_read, 66*4da6b033SAjit Kumar Pandey .block_write = acp_dsp_block_write, 67*4da6b033SAjit Kumar Pandey 68*4da6b033SAjit Kumar Pandey /*Firmware loading */ 69*4da6b033SAjit Kumar Pandey .load_firmware = snd_sof_load_firmware_memcpy, 70*4da6b033SAjit Kumar Pandey .pre_fw_run = acp_dsp_pre_fw_run, 71*4da6b033SAjit Kumar Pandey .get_bar_index = acp_get_bar_index, 72*4da6b033SAjit Kumar Pandey 73*4da6b033SAjit Kumar Pandey /* DSP core boot */ 74*4da6b033SAjit Kumar Pandey .run = acp_sof_dsp_run, 75*4da6b033SAjit Kumar Pandey 76*4da6b033SAjit Kumar Pandey /*IPC */ 77*4da6b033SAjit Kumar Pandey .send_msg = acp_sof_ipc_send_msg, 78*4da6b033SAjit Kumar Pandey .ipc_msg_data = acp_sof_ipc_msg_data, 79*4da6b033SAjit Kumar Pandey .get_mailbox_offset = acp_sof_ipc_get_mailbox_offset, 80*4da6b033SAjit Kumar Pandey .irq_thread = acp_sof_ipc_irq_thread, 81*4da6b033SAjit Kumar Pandey 82*4da6b033SAjit Kumar Pandey /* stream callbacks */ 83*4da6b033SAjit Kumar Pandey .pcm_open = acp_pcm_open, 84*4da6b033SAjit Kumar Pandey .pcm_close = acp_pcm_close, 85*4da6b033SAjit Kumar Pandey .pcm_hw_params = acp_pcm_hw_params, 86*4da6b033SAjit Kumar Pandey 87*4da6b033SAjit Kumar Pandey .hw_info = SNDRV_PCM_INFO_MMAP | 88*4da6b033SAjit Kumar Pandey SNDRV_PCM_INFO_MMAP_VALID | 89*4da6b033SAjit Kumar Pandey SNDRV_PCM_INFO_INTERLEAVED | 90*4da6b033SAjit Kumar Pandey SNDRV_PCM_INFO_PAUSE | 91*4da6b033SAjit Kumar Pandey SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, 92*4da6b033SAjit Kumar Pandey 93*4da6b033SAjit Kumar Pandey /* Machine driver callbacks */ 94*4da6b033SAjit Kumar Pandey .machine_select = amd_sof_machine_select, 95*4da6b033SAjit Kumar Pandey .machine_register = sof_machine_register, 96*4da6b033SAjit Kumar Pandey .machine_unregister = sof_machine_unregister, 97*4da6b033SAjit Kumar Pandey 98*4da6b033SAjit Kumar Pandey /* Trace Logger */ 99*4da6b033SAjit Kumar Pandey .trace_init = acp_sof_trace_init, 100*4da6b033SAjit Kumar Pandey .trace_release = acp_sof_trace_release, 101*4da6b033SAjit Kumar Pandey 102*4da6b033SAjit Kumar Pandey /* PM */ 103*4da6b033SAjit Kumar Pandey .suspend = amd_sof_acp_suspend, 104*4da6b033SAjit Kumar Pandey .resume = amd_sof_acp_resume, 105*4da6b033SAjit Kumar Pandey }; 106*4da6b033SAjit Kumar Pandey EXPORT_SYMBOL_NS(sof_acp_common_ops, SND_SOC_SOF_AMD_COMMON); 107*4da6b033SAjit Kumar Pandey 108*4da6b033SAjit Kumar Pandey MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON); 109*4da6b033SAjit Kumar Pandey MODULE_DESCRIPTION("ACP SOF COMMON Driver"); 110*4da6b033SAjit Kumar Pandey MODULE_LICENSE("Dual BSD/GPL"); 111