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  * Machine Driver Legacy 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 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 rt5682s_max_data = {
0033     .hs_cpu_id = I2S_SP,
0034     .amp_cpu_id = I2S_SP,
0035     .dmic_cpu_id = DMIC,
0036     .hs_codec_id = RT5682S,
0037     .amp_codec_id = MAX98360A,
0038     .dmic_codec_id = DMIC,
0039 };
0040 
0041 static struct acp_card_drvdata 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 max_nau8825_data = {
0051     .hs_cpu_id = I2S_HS,
0052     .amp_cpu_id = I2S_HS,
0053     .dmic_cpu_id = DMIC,
0054     .hs_codec_id = NAU8825,
0055     .amp_codec_id = MAX98360A,
0056     .dmic_codec_id = DMIC,
0057     .soc_mclk = true,
0058     .platform = REMBRANDT,
0059 };
0060 
0061 static struct acp_card_drvdata rt5682s_rt1019_rmb_data = {
0062     .hs_cpu_id = I2S_HS,
0063     .amp_cpu_id = I2S_HS,
0064     .dmic_cpu_id = DMIC,
0065     .hs_codec_id = RT5682S,
0066     .amp_codec_id = RT1019,
0067     .dmic_codec_id = DMIC,
0068     .soc_mclk = true,
0069     .platform = REMBRANDT,
0070 };
0071 
0072 static const struct snd_kcontrol_new acp_controls[] = {
0073     SOC_DAPM_PIN_SWITCH("Headphone Jack"),
0074     SOC_DAPM_PIN_SWITCH("Headset Mic"),
0075     SOC_DAPM_PIN_SWITCH("Spk"),
0076     SOC_DAPM_PIN_SWITCH("Left Spk"),
0077     SOC_DAPM_PIN_SWITCH("Right Spk"),
0078 
0079 };
0080 
0081 static const struct snd_soc_dapm_widget acp_widgets[] = {
0082     SND_SOC_DAPM_HP("Headphone Jack", NULL),
0083     SND_SOC_DAPM_MIC("Headset Mic", NULL),
0084     SND_SOC_DAPM_SPK("Spk", NULL),
0085     SND_SOC_DAPM_SPK("Left Spk", NULL),
0086     SND_SOC_DAPM_SPK("Right Spk", NULL),
0087 };
0088 
0089 static int acp_asoc_probe(struct platform_device *pdev)
0090 {
0091     struct snd_soc_card *card = NULL;
0092     struct device *dev = &pdev->dev;
0093     int ret;
0094 
0095     if (!pdev->id_entry)
0096         return -EINVAL;
0097 
0098     card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
0099     if (!card)
0100         return -ENOMEM;
0101 
0102     card->dev = dev;
0103     card->owner = THIS_MODULE;
0104     card->name = pdev->id_entry->name;
0105     card->dapm_widgets = acp_widgets;
0106     card->num_dapm_widgets = ARRAY_SIZE(acp_widgets);
0107     card->controls = acp_controls;
0108     card->num_controls = ARRAY_SIZE(acp_controls);
0109     card->drvdata = (struct acp_card_drvdata *)pdev->id_entry->driver_data;
0110 
0111     acp_legacy_dai_links_create(card);
0112 
0113     ret = devm_snd_soc_register_card(&pdev->dev, card);
0114     if (ret) {
0115         dev_err(&pdev->dev,
0116                 "devm_snd_soc_register_card(%s) failed: %d\n",
0117                 card->name, ret);
0118         return ret;
0119     }
0120 
0121     return 0;
0122 }
0123 
0124 static const struct platform_device_id board_ids[] = {
0125     {
0126         .name = "acp3xalc56821019",
0127         .driver_data = (kernel_ulong_t)&rt5682_rt1019_data,
0128     },
0129     {
0130         .name = "acp3xalc5682sm98360",
0131         .driver_data = (kernel_ulong_t)&rt5682s_max_data,
0132     },
0133     {
0134         .name = "acp3xalc5682s1019",
0135         .driver_data = (kernel_ulong_t)&rt5682s_rt1019_data,
0136     },
0137     {
0138         .name = "rmb-nau8825-max",
0139         .driver_data = (kernel_ulong_t)&max_nau8825_data,
0140     },
0141     {
0142         .name = "rmb-rt5682s-rt1019",
0143         .driver_data = (kernel_ulong_t)&rt5682s_rt1019_rmb_data,
0144     },
0145     { }
0146 };
0147 static struct platform_driver acp_asoc_audio = {
0148     .driver = {
0149         .pm = &snd_soc_pm_ops,
0150         .name = "acp_mach",
0151     },
0152     .probe = acp_asoc_probe,
0153     .id_table = board_ids,
0154 };
0155 
0156 module_platform_driver(acp_asoc_audio);
0157 
0158 MODULE_IMPORT_NS(SND_SOC_AMD_MACH);
0159 MODULE_DESCRIPTION("ACP chrome audio support");
0160 MODULE_ALIAS("platform:acp3xalc56821019");
0161 MODULE_ALIAS("platform:acp3xalc5682sm98360");
0162 MODULE_ALIAS("platform:acp3xalc5682s1019");
0163 MODULE_ALIAS("platform:rmb-nau8825-max");
0164 MODULE_ALIAS("platform:rmb-rt5682s-rt1019");
0165 MODULE_LICENSE("GPL v2");