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 /*
0012  * SOF Machine Driver Support for ACP HW block
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");