ASoC: tegra: Support MAX9808x by machine driver
authorSvyatoslav Ryhel <clamor95@gmail.com>
Wed, 8 Mar 2023 07:35:02 +0000 (09:35 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 20 Mar 2023 13:06:41 +0000 (13:06 +0000)
Add Maxim MAX9808x codec support to the Tegra ASoC machine driver.
This codec is found on LG T30 devices like Optimus 4X HD and
Optimus Vu.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
Link: https://lore.kernel.org/r/20230308073502.5421-9-clamor95@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/tegra/Kconfig
sound/soc/tegra/tegra_asoc_machine.c

index dba70c7..74effc5 100644 (file)
@@ -263,6 +263,15 @@ config SND_SOC_TEGRA_MAX98090
          Say Y or M here if you want to add support for SoC audio on Tegra
          boards using the MAX98090 codec, such as Venice2.
 
+config SND_SOC_TEGRA_MAX98088
+       tristate "SoC Audio support for Tegra boards using a MAX9808x codec"
+       depends on I2C && GPIOLIB
+       select SND_SOC_TEGRA_MACHINE_DRV
+       select SND_SOC_MAX98088
+       help
+         Say Y or M here if you want to add support for SoC audio on Tegra
+         boards using the MAX98088 codec, such as LG X3.
+
 config SND_SOC_TEGRA_RT5677
        tristate "SoC Audio support for Tegra boards using a RT5677 codec"
        depends on I2C && GPIOLIB
index b8cf5ab..c2aaa49 100644 (file)
@@ -86,11 +86,11 @@ static int tegra_machine_event(struct snd_soc_dapm_widget *w,
                gpiod_set_value_cansleep(machine->gpiod_spkr_en,
                                         SND_SOC_DAPM_EVENT_ON(event));
 
-       if (!strcmp(w->name, "Mic Jack"))
+       if (!strcmp(w->name, "Mic Jack") || !strcmp(w->name, "Headset Mic"))
                gpiod_set_value_cansleep(machine->gpiod_ext_mic_en,
                                         SND_SOC_DAPM_EVENT_ON(event));
 
-       if (!strcmp(w->name, "Int Mic"))
+       if (!strcmp(w->name, "Int Mic") || !strcmp(w->name, "Internal Mic 2"))
                gpiod_set_value_cansleep(machine->gpiod_int_mic_en,
                                         SND_SOC_DAPM_EVENT_ON(event));
 
@@ -108,11 +108,12 @@ static const struct snd_soc_dapm_widget tegra_machine_dapm_widgets[] = {
        SND_SOC_DAPM_HP("Headphones", NULL),
        SND_SOC_DAPM_SPK("Speakers", tegra_machine_event),
        SND_SOC_DAPM_SPK("Int Spk", tegra_machine_event),
+       SND_SOC_DAPM_SPK("Earpiece", NULL),
        SND_SOC_DAPM_MIC("Int Mic", tegra_machine_event),
        SND_SOC_DAPM_MIC("Mic Jack", tegra_machine_event),
        SND_SOC_DAPM_MIC("Internal Mic 1", NULL),
-       SND_SOC_DAPM_MIC("Internal Mic 2", NULL),
-       SND_SOC_DAPM_MIC("Headset Mic", NULL),
+       SND_SOC_DAPM_MIC("Internal Mic 2", tegra_machine_event),
+       SND_SOC_DAPM_MIC("Headset Mic", tegra_machine_event),
        SND_SOC_DAPM_MIC("Digital Mic", NULL),
        SND_SOC_DAPM_MIC("Mic", NULL),
        SND_SOC_DAPM_LINE("Line In Jack", NULL),
@@ -123,6 +124,7 @@ static const struct snd_soc_dapm_widget tegra_machine_dapm_widgets[] = {
 static const struct snd_kcontrol_new tegra_machine_controls[] = {
        SOC_DAPM_PIN_SWITCH("Speakers"),
        SOC_DAPM_PIN_SWITCH("Int Spk"),
+       SOC_DAPM_PIN_SWITCH("Earpiece"),
        SOC_DAPM_PIN_SWITCH("Int Mic"),
        SOC_DAPM_PIN_SWITCH("Headset Mic"),
        SOC_DAPM_PIN_SWITCH("Internal Mic 1"),
@@ -718,6 +720,40 @@ static const struct tegra_asoc_data tegra_max98090_data = {
        .add_hp_jack = true,
 };
 
+/* MAX98088 machine */
+
+SND_SOC_DAILINK_DEFS(max98088_hifi,
+       DAILINK_COMP_ARRAY(COMP_EMPTY()),
+       DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "HiFi")),
+       DAILINK_COMP_ARRAY(COMP_EMPTY()));
+
+static struct snd_soc_dai_link tegra_max98088_dai = {
+       .name = "MAX98088",
+       .stream_name = "MAX98088 PCM",
+       .init = tegra_asoc_machine_init,
+       .dai_fmt = SND_SOC_DAIFMT_I2S |
+                  SND_SOC_DAIFMT_NB_NF |
+                  SND_SOC_DAIFMT_CBS_CFS,
+       SND_SOC_DAILINK_REG(max98088_hifi),
+};
+
+static struct snd_soc_card snd_soc_tegra_max98088 = {
+       .components = "codec:max98088",
+       .dai_link = &tegra_max98088_dai,
+       .num_links = 1,
+       .fully_routed = true,
+};
+
+static const struct tegra_asoc_data tegra_max98088_data = {
+       .mclk_rate = tegra_machine_mclk_rate_12mhz,
+       .card = &snd_soc_tegra_max98088,
+       .add_common_dapm_widgets = true,
+       .add_common_controls = true,
+       .add_common_snd_ops = true,
+       .add_mic_jack = true,
+       .add_hp_jack = true,
+};
+
 /* SGTL5000 machine */
 
 SND_SOC_DAILINK_DEFS(sgtl5000_hifi,
@@ -946,6 +982,8 @@ static const struct tegra_asoc_data tegra_rt5631_data = {
 static const struct of_device_id tegra_machine_of_match[] = {
        { .compatible = "nvidia,tegra-audio-trimslice", .data = &tegra_trimslice_data },
        { .compatible = "nvidia,tegra-audio-max98090", .data = &tegra_max98090_data },
+       { .compatible = "nvidia,tegra-audio-max98088", .data = &tegra_max98088_data },
+       { .compatible = "nvidia,tegra-audio-max98089", .data = &tegra_max98088_data },
        { .compatible = "nvidia,tegra-audio-sgtl5000", .data = &tegra_sgtl5000_data },
        { .compatible = "nvidia,tegra-audio-wm9712", .data = &tegra_wm9712_data },
        { .compatible = "nvidia,tegra-audio-wm8753", .data = &tegra_wm8753_data },