0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <sound/core.h>
0016 #include <sound/pcm_params.h>
0017 #include <sound/soc-acpi.h>
0018 #include <sound/soc-dapm.h>
0019 #include <linux/module.h>
0020
0021 #include "acp-mach.h"
0022
0023 static struct acp_card_drvdata sof_rt5682_rt1019_data = {
0024 .hs_cpu_id = I2S_SP,
0025 .amp_cpu_id = I2S_SP,
0026 .dmic_cpu_id = DMIC,
0027 .hs_codec_id = RT5682,
0028 .amp_codec_id = RT1019,
0029 .dmic_codec_id = DMIC,
0030 };
0031
0032 static struct acp_card_drvdata sof_rt5682_max_data = {
0033 .hs_cpu_id = I2S_SP,
0034 .amp_cpu_id = I2S_SP,
0035 .dmic_cpu_id = DMIC,
0036 .hs_codec_id = RT5682,
0037 .amp_codec_id = MAX98360A,
0038 .dmic_codec_id = DMIC,
0039 };
0040
0041 static struct acp_card_drvdata sof_rt5682s_rt1019_data = {
0042 .hs_cpu_id = I2S_SP,
0043 .amp_cpu_id = I2S_SP,
0044 .dmic_cpu_id = DMIC,
0045 .hs_codec_id = RT5682S,
0046 .amp_codec_id = RT1019,
0047 .dmic_codec_id = DMIC,
0048 };
0049
0050 static struct acp_card_drvdata sof_rt5682s_max_data = {
0051 .hs_cpu_id = I2S_SP,
0052 .amp_cpu_id = I2S_SP,
0053 .dmic_cpu_id = DMIC,
0054 .hs_codec_id = RT5682S,
0055 .amp_codec_id = MAX98360A,
0056 .dmic_codec_id = DMIC,
0057 };
0058
0059 static struct acp_card_drvdata sof_nau8825_data = {
0060 .hs_cpu_id = I2S_HS,
0061 .amp_cpu_id = I2S_HS,
0062 .dmic_cpu_id = DMIC,
0063 .hs_codec_id = NAU8825,
0064 .amp_codec_id = MAX98360A,
0065 .dmic_codec_id = DMIC,
0066 .soc_mclk = true,
0067 };
0068
0069 static struct acp_card_drvdata sof_rt5682s_hs_rt1019_data = {
0070 .hs_cpu_id = I2S_HS,
0071 .amp_cpu_id = I2S_HS,
0072 .dmic_cpu_id = DMIC,
0073 .hs_codec_id = RT5682S,
0074 .amp_codec_id = RT1019,
0075 .dmic_codec_id = DMIC,
0076 .soc_mclk = true,
0077 };
0078
0079 static const struct snd_kcontrol_new acp_controls[] = {
0080 SOC_DAPM_PIN_SWITCH("Headphone Jack"),
0081 SOC_DAPM_PIN_SWITCH("Headset Mic"),
0082 SOC_DAPM_PIN_SWITCH("Spk"),
0083 SOC_DAPM_PIN_SWITCH("Left Spk"),
0084 SOC_DAPM_PIN_SWITCH("Right Spk"),
0085 };
0086
0087 static const struct snd_soc_dapm_widget acp_widgets[] = {
0088 SND_SOC_DAPM_HP("Headphone Jack", NULL),
0089 SND_SOC_DAPM_MIC("Headset Mic", NULL),
0090 SND_SOC_DAPM_SPK("Spk", NULL),
0091 SND_SOC_DAPM_SPK("Left Spk", NULL),
0092 SND_SOC_DAPM_SPK("Right Spk", NULL),
0093 };
0094
0095 static int acp_sof_probe(struct platform_device *pdev)
0096 {
0097 struct snd_soc_card *card = NULL;
0098 struct device *dev = &pdev->dev;
0099 int ret;
0100
0101 if (!pdev->id_entry)
0102 return -EINVAL;
0103
0104 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
0105 if (!card)
0106 return -ENOMEM;
0107
0108 card->dev = dev;
0109 card->owner = THIS_MODULE;
0110 card->name = pdev->id_entry->name;
0111 card->dapm_widgets = acp_widgets;
0112 card->num_dapm_widgets = ARRAY_SIZE(acp_widgets);
0113 card->controls = acp_controls;
0114 card->num_controls = ARRAY_SIZE(acp_controls);
0115 card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
0116
0117 acp_sofdsp_dai_links_create(card);
0118
0119 ret = devm_snd_soc_register_card(&pdev->dev, card);
0120 if (ret) {
0121 dev_err(&pdev->dev,
0122 "devm_snd_soc_register_card(%s) failed: %d\n",
0123 card->name, ret);
0124 return ret;
0125 }
0126
0127 return 0;
0128 }
0129
0130 static const struct platform_device_id board_ids[] = {
0131 {
0132 .name = "rt5682-rt1019",
0133 .driver_data = (kernel_ulong_t)&sof_rt5682_rt1019_data
0134 },
0135 {
0136 .name = "rt5682-max",
0137 .driver_data = (kernel_ulong_t)&sof_rt5682_max_data
0138 },
0139 {
0140 .name = "rt5682s-max",
0141 .driver_data = (kernel_ulong_t)&sof_rt5682s_max_data
0142 },
0143 {
0144 .name = "rt5682s-rt1019",
0145 .driver_data = (kernel_ulong_t)&sof_rt5682s_rt1019_data
0146 },
0147 {
0148 .name = "nau8825-max",
0149 .driver_data = (kernel_ulong_t)&sof_nau8825_data
0150 },
0151 {
0152 .name = "rt5682s-hs-rt1019",
0153 .driver_data = (kernel_ulong_t)&sof_rt5682s_hs_rt1019_data
0154 },
0155 { }
0156 };
0157 static struct platform_driver acp_asoc_audio = {
0158 .driver = {
0159 .name = "sof_mach",
0160 .pm = &snd_soc_pm_ops,
0161 },
0162 .probe = acp_sof_probe,
0163 .id_table = board_ids,
0164 };
0165
0166 module_platform_driver(acp_asoc_audio);
0167
0168 MODULE_IMPORT_NS(SND_SOC_AMD_MACH);
0169 MODULE_DESCRIPTION("ACP chrome SOF audio support");
0170 MODULE_ALIAS("platform:rt5682-rt1019");
0171 MODULE_ALIAS("platform:rt5682-max");
0172 MODULE_ALIAS("platform:rt5682s-max");
0173 MODULE_ALIAS("platform:rt5682s-rt1019");
0174 MODULE_ALIAS("platform:nau8825-max");
0175 MODULE_ALIAS("platform:rt5682s-hs-rt1019");
0176 MODULE_LICENSE("GPL v2");