Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
0002 //
0003 // This file is provided under a dual BSD/GPLv2 license. When using or
0004 // redistributing this file, you may do so under either license.
0005 //
0006 // Copyright(c) 2021 Advanced Micro Devices, Inc.
0007 //
0008 // Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
0009 
0010 /*
0011  * Hardware interface for Audio DSP on Renoir platform
0012  */
0013 
0014 #include <linux/platform_device.h>
0015 #include <linux/module.h>
0016 
0017 #include "../ops.h"
0018 #include "../sof-audio.h"
0019 #include "acp.h"
0020 #include "acp-dsp-offset.h"
0021 
0022 #define I2S_BT_INSTANCE     0
0023 #define I2S_SP_INSTANCE     1
0024 #define PDM_DMIC_INSTANCE   2
0025 
0026 #define I2S_MODE        0x04
0027 
0028 static int renoir_dai_probe(struct snd_soc_dai *dai)
0029 {
0030     struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(dai->component);
0031     unsigned int val;
0032 
0033     val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_I2S_PIN_CONFIG);
0034     if (val != I2S_MODE) {
0035         dev_err(sdev->dev, "I2S Mode is not supported (I2S_PIN_CONFIG: %#x)\n", val);
0036         return -EINVAL;
0037     }
0038 
0039     return 0;
0040 }
0041 
0042 static struct snd_soc_dai_driver renoir_sof_dai[] = {
0043     [I2S_BT_INSTANCE] = {
0044         .id = I2S_BT_INSTANCE,
0045         .name = "acp-sof-bt",
0046         .playback = {
0047             .rates = SNDRV_PCM_RATE_8000_96000,
0048             .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
0049                    SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
0050             .channels_min = 2,
0051             .channels_max = 8,
0052             .rate_min = 8000,
0053             .rate_max = 96000,
0054         },
0055         .capture = {
0056             .rates = SNDRV_PCM_RATE_8000_48000,
0057             .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
0058                    SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
0059             /* Supporting only stereo for I2S BT controller capture */
0060             .channels_min = 2,
0061             .channels_max = 2,
0062             .rate_min = 8000,
0063             .rate_max = 48000,
0064         },
0065         .probe = &renoir_dai_probe,
0066     },
0067 
0068     [I2S_SP_INSTANCE] = {
0069         .id = I2S_SP_INSTANCE,
0070         .name = "acp-sof-sp",
0071         .playback = {
0072             .rates = SNDRV_PCM_RATE_8000_96000,
0073             .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
0074                    SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
0075             .channels_min = 2,
0076             .channels_max = 8,
0077             .rate_min = 8000,
0078             .rate_max = 96000,
0079         },
0080         .capture = {
0081             .rates = SNDRV_PCM_RATE_8000_48000,
0082             .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
0083                    SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
0084             /* Supporting only stereo for I2S SP controller capture */
0085             .channels_min = 2,
0086             .channels_max = 2,
0087             .rate_min = 8000,
0088             .rate_max = 48000,
0089         },
0090         .probe = &renoir_dai_probe,
0091     },
0092 
0093     [PDM_DMIC_INSTANCE] = {
0094         .id = PDM_DMIC_INSTANCE,
0095         .name = "acp-sof-dmic",
0096         .capture = {
0097             .rates = SNDRV_PCM_RATE_8000_48000,
0098             .formats = SNDRV_PCM_FMTBIT_S32_LE,
0099             .channels_min = 2,
0100             .channels_max = 4,
0101             .rate_min = 8000,
0102             .rate_max = 48000,
0103         },
0104     },
0105 };
0106 
0107 static struct snd_soc_acpi_mach *amd_sof_machine_select(struct snd_sof_dev *sdev)
0108 {
0109     struct snd_sof_pdata *sof_pdata = sdev->pdata;
0110     const struct sof_dev_desc *desc = sof_pdata->desc;
0111     struct snd_soc_acpi_mach *mach;
0112 
0113     mach = snd_soc_acpi_find_machine(desc->machines);
0114     if (!mach) {
0115         dev_warn(sdev->dev, "No matching ASoC machine driver found\n");
0116         return NULL;
0117     }
0118 
0119     sof_pdata->tplg_filename = mach->sof_tplg_filename;
0120     sof_pdata->fw_filename = mach->fw_filename;
0121 
0122     return mach;
0123 }
0124 
0125 /* AMD Renoir DSP ops */
0126 struct snd_sof_dsp_ops sof_renoir_ops = {
0127     /* probe and remove */
0128     .probe          = amd_sof_acp_probe,
0129     .remove         = amd_sof_acp_remove,
0130 
0131     /* Register IO */
0132     .write          = sof_io_write,
0133     .read           = sof_io_read,
0134 
0135     /* Block IO */
0136     .block_read     = acp_dsp_block_read,
0137     .block_write        = acp_dsp_block_write,
0138 
0139     /*Firmware loading */
0140     .load_firmware      = snd_sof_load_firmware_memcpy,
0141     .pre_fw_run     = acp_dsp_pre_fw_run,
0142     .get_bar_index      = acp_get_bar_index,
0143 
0144     /* DSP core boot */
0145     .run            = acp_sof_dsp_run,
0146 
0147     /*IPC */
0148     .send_msg       = acp_sof_ipc_send_msg,
0149     .ipc_msg_data       = acp_sof_ipc_msg_data,
0150     .get_mailbox_offset = acp_sof_ipc_get_mailbox_offset,
0151     .irq_thread     = acp_sof_ipc_irq_thread,
0152 
0153     /* DAI drivers */
0154     .drv            = renoir_sof_dai,
0155     .num_drv        = ARRAY_SIZE(renoir_sof_dai),
0156 
0157     /* stream callbacks */
0158     .pcm_open       = acp_pcm_open,
0159     .pcm_close      = acp_pcm_close,
0160     .pcm_hw_params      = acp_pcm_hw_params,
0161 
0162     .hw_info        = SNDRV_PCM_INFO_MMAP |
0163                   SNDRV_PCM_INFO_MMAP_VALID |
0164                   SNDRV_PCM_INFO_INTERLEAVED |
0165                   SNDRV_PCM_INFO_PAUSE |
0166                   SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
0167 
0168     /* Machine driver callbacks */
0169     .machine_select     = amd_sof_machine_select,
0170     .machine_register   = sof_machine_register,
0171     .machine_unregister = sof_machine_unregister,
0172 
0173     /* Trace Logger */
0174     .trace_init     = acp_sof_trace_init,
0175     .trace_release      = acp_sof_trace_release,
0176 
0177     /* PM */
0178     .suspend                = amd_sof_acp_suspend,
0179     .resume                 = amd_sof_acp_resume,
0180 };
0181 EXPORT_SYMBOL(sof_renoir_ops);
0182 
0183 MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
0184 MODULE_DESCRIPTION("RENOIR SOF Driver");
0185 MODULE_LICENSE("Dual BSD/GPL");