diff options
author | John Schoenick <johns@valvesoftware.com> | 2023-11-13 17:22:57 -0800 |
---|---|---|
committer | John Schoenick <johns@valvesoftware.com> | 2023-11-13 18:55:42 -0800 |
commit | 19c5dff18f80a1e4a7e97ab7c31e62197fe54e5b (patch) | |
tree | 6ea9d1770c80706fd40c8b6c3349bc8ab2fbac9b /sound/soc | |
parent | 39ecb253ecf7ed12e3019b72d7a226f0525dfaa3 (diff) | |
download | linux-19c5dff18f80a1e4a7e97ab7c31e62197fe54e5b.tar.gz |
Revert "Revert "ASoC: amd: acp: Add support for cs35l41 codec""
Galilypad: Dropped as part of the patch series for galileo, but jupiter actually wants this so restoring for the merge This reverts commit 6c90260c6f7ef7b3e72dcc34a0a6733829d21f91.
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/amd/acp/Kconfig | 2 | ||||
-rw-r--r-- | sound/soc/amd/acp/acp-mach-common.c | 82 | ||||
-rw-r--r-- | sound/soc/amd/acp/acp-mach.h | 1 |
3 files changed, 85 insertions, 0 deletions
diff --git a/sound/soc/amd/acp/Kconfig b/sound/soc/amd/acp/Kconfig index d7f1c3c90484..54405ffa16de 100644 --- a/sound/soc/amd/acp/Kconfig +++ b/sound/soc/amd/acp/Kconfig @@ -62,6 +62,8 @@ config SND_SOC_AMD_MACH_COMMON select SND_SOC_RT5682S select SND_SOC_NAU8825 select SND_SOC_NAU8821 + select SND_SOC_CS35L41_SPI + select SND_SOC_CS35L41_I2C select SND_SOC_MAX98388 help This option enables common Machine driver module for ACP. diff --git a/sound/soc/amd/acp/acp-mach-common.c b/sound/soc/amd/acp/acp-mach-common.c index d56e5826db56..51b32fe0891b 100644 --- a/sound/soc/amd/acp/acp-mach-common.c +++ b/sound/soc/amd/acp/acp-mach-common.c @@ -26,6 +26,8 @@ #include "../../codecs/rt5682s.h" #include "../../codecs/nau8825.h" #include "../../codecs/nau8821.h" +#include "../../codecs/cs35l41.h" + #include "acp-mach.h" static struct snd_soc_jack vg_headset; @@ -1043,6 +1045,78 @@ SND_SOC_DAILINK_DEF(nau8821, DAILINK_COMP_ARRAY(COMP_CODEC("i2c-NVTN2020:00", "nau8821-hifi"))); +static int acp_cs35l41_init(struct snd_soc_pcm_runtime *rtd) +{ + return 0; +} + +static int acp_cs35l41_startup(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + runtime->hw.channels_max = DUAL_CHANNEL; + snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, + &constraints_channels); + snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, + &constraints_rates); + return 0; +} + +static int acp_cs35l41_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); + struct snd_soc_card *card = rtd->card; + struct snd_soc_dai *codec_dai; + int ret, i; + unsigned int num_codecs = rtd->dai_link->num_codecs; + unsigned int bclk_val; + + ret = 0; + for (i = 0; i < num_codecs; i++) { + codec_dai = asoc_rtd_to_codec(rtd, i); + if (strcmp(codec_dai->name, "cs35l41-pcm") == 0) { + switch (params_rate(params)) { + case 48000: + bclk_val = 1536000; + break; + default: + dev_err(card->dev, "Invalid Samplerate:0x%x\n", + params_rate(params)); + return -EINVAL; + } + ret = snd_soc_component_set_sysclk(codec_dai->component, + 0, 0, bclk_val, SND_SOC_CLOCK_IN); + if (ret < 0) { + dev_err(card->dev, "failed to set sysclk for CS35l41 dai\n"); + return ret; + } + } + } + + return ret; +} + +static struct snd_soc_codec_conf cs35l41_conf[] = { + { + .dlc = COMP_CODEC_CONF("spi-VLV1776:00"), + .name_prefix = "Left", + }, + { + .dlc = COMP_CODEC_CONF("spi-VLV1776:01"), + .name_prefix = "Right", + }, +}; + +static const struct snd_soc_ops acp_cs35l41_ops = { + .startup = acp_cs35l41_startup, + .hw_params = acp_cs35l41_hw_params, +}; + +SND_SOC_DAILINK_DEF(cs35l41, + DAILINK_COMP_ARRAY(COMP_CODEC("spi-VLV1776:00", "cs35l41-pcm"), + COMP_CODEC("spi-VLV1776:01", "cs35l41-pcm"))); + /* Declare DMIC codec components */ SND_SOC_DAILINK_DEF(dmic_codec, DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi"))); @@ -1295,6 +1369,14 @@ int acp_sofdsp_dai_links_create(struct snd_soc_card *card) card->codec_conf = rt1019_conf; card->num_configs = ARRAY_SIZE(rt1019_conf); } + if (drv_data->amp_codec_id == CS35L41) { + links[i].codecs = cs35l41; + links[i].num_codecs = ARRAY_SIZE(cs35l41); + links[i].init = acp_cs35l41_init; + card->codec_conf = cs35l41_conf; + card->num_configs = ARRAY_SIZE(cs35l41_conf); + links[i].ops = &acp_cs35l41_ops; + } i++; } diff --git a/sound/soc/amd/acp/acp-mach.h b/sound/soc/amd/acp/acp-mach.h index 5f12fa4a26a8..3075a901bc60 100644 --- a/sound/soc/amd/acp/acp-mach.h +++ b/sound/soc/amd/acp/acp-mach.h @@ -43,6 +43,7 @@ enum codec_endpoints { RT5682S, NAU8825, NAU8821, + CS35L41, MAX98388, }; |