0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
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
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
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
0126 struct snd_sof_dsp_ops sof_renoir_ops = {
0127
0128 .probe = amd_sof_acp_probe,
0129 .remove = amd_sof_acp_remove,
0130
0131
0132 .write = sof_io_write,
0133 .read = sof_io_read,
0134
0135
0136 .block_read = acp_dsp_block_read,
0137 .block_write = acp_dsp_block_write,
0138
0139
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
0145 .run = acp_sof_dsp_run,
0146
0147
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
0154 .drv = renoir_sof_dai,
0155 .num_drv = ARRAY_SIZE(renoir_sof_dai),
0156
0157
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
0169 .machine_select = amd_sof_machine_select,
0170 .machine_register = sof_machine_register,
0171 .machine_unregister = sof_machine_unregister,
0172
0173
0174 .trace_init = acp_sof_trace_init,
0175 .trace_release = acp_sof_trace_release,
0176
0177
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");