Hello guys!
Especially @jonathanh and @Parashuram.Biradar. Thank you for the work you did here https://forums.developer.nvidia.com/t/tlv320aic32x4-audio-codec-is-not-detecting-for-tx2i/160412
I’m migrating from 28.2 to the very latest 32.7.6.
For 28.2 I have the @igal.kroyter ‘s set of patches. For 32.7.6 I was expecting to make it work using @Parashuram.Biradar ‘s patches from here: https://forums.developer.nvidia.com/t/tlv320aic32x4-audio-codec-is-not-detecting-for-tx2i/160412/76?u=kosharov.ilya
But looks like I have some issues. Any help would be appreciated.
First I will show to you my changes. They are pretty the same as in the original post
diff --git a/nvidia/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-quill-common.dtsi b/nvidia/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-quill-common.dtsi
old mode 100644
new mode 100755
index 42108d8e1570..71a510e0c3d1
--- a/nvidia/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-quill-common.dtsi
+++ b/nvidia/platform/t18x/common/kernel-dts/t18x-common-platforms/tegra186-quill-common.dtsi
@@ -169,6 +169,19 @@
rom-val = /bits/ 8 <0x05>;
};
};
+
+ aic32x4: tlv320aic32x4.1-0018@18 {
+ compatible = "ti,tlv320aic32x4";
+ status = "okay";
+ reg = <0x18>;
+ clocks = <&tegra_car TEGRA186_CLK_AUD_MCLK>;
+ clock-names = "mclk";
+ micbias-resistor-k-ohms = <2>;
+ micbias-voltage-m-volts = <3000>;
+ dv-supply = <&battery_reg>;
+ av-supply = <&battery_reg>;
+ iov-supply = <&battery_reg>;
+ };
};
i2c@c240000 {
@@ -671,7 +684,8 @@
#endif
ahub {
/* I2S6 */
- i2s@2901500 {
+ i2s@2901100 {
+ status = "okay";
bclk-ratio = <4>;
};
@@ -698,47 +712,45 @@
tegra_sound: sound {
compatible = "nvidia,tegra-audio-t186ref-mobile-rt565x";
nvidia,model = "tegra-snd-t186ref-mobile-rt565x";
- nvidia,num-codec-link = <12>;
+ nvidia,num-codec-link = <1>;
clocks = <&tegra_car TEGRA186_CLK_PLLA>,
<&tegra_car TEGRA186_CLK_PLL_A_OUT0>,
+ <&tegra_car TEGRA186_CLK_AHUB>,
<&tegra_car TEGRA186_CLK_AUD_MCLK>;
- clock-names = "pll_a", "pll_a_out0", "extern1";
+ clock-names = "pll_a", "pll_a_out0", "ahub", "extern1";
assigned-clocks = <&tegra_car TEGRA186_CLK_PLL_A_OUT0>,
<&tegra_car TEGRA186_CLK_AUD_MCLK>;
assigned-clock-parents = <&tegra_car TEGRA186_CLK_PLLA>,
- <&tegra_car TEGRA186_CLK_PLL_A_OUT0>;
+ <&tegra_car TEGRA186_CLK_PLLP_OUT0>;
+ assigned-clock-rates = <0>, <12000000>;
resets = <&tegra_car TEGRA186_RESET_AUD_MCLK>;
reset-names = "extern1_rst";
status = "okay";
nvidia,audio-routing =
- "x Headphone", "x OUT",
- "x IN", "x Mic",
- "y Headphone", "y OUT",
- "y IN", "y Mic",
- "z Headphone", "z OUT",
- "z IN", "z Mic",
- "m Headphone", "m OUT",
- "m IN", "m Mic",
- "n Headphone", "n OUT",
- "n IN", "n Mic",
- "o Headphone", "o OUT",
- "o IN", "o Mic",
- "a IN", "a Mic",
- "b IN", "b Mic",
- "c IN", "c Mic",
- "d IN", "d Mic",
- "d1 Headphone", "d1 OUT",
- "d3 Headphone", "d3 OUT";
+ "z Headphone", "z LOL",
+ "z Headphone", "z LOR",
+ "z Headphone", "z HPL",
+ "z Headphone", "z HPR",
+ "z Left DAC", "z Playback",
+ "z Right DAC", "z Playback",
+ "z IN1_L", "z Mic",
+ "z IN1_R", "z Mic",
+ "z IN2_L", "z Mic",
+ "z IN2_R", "z Mic",
+ "z IN3_L", "z Mic",
+ "z IN3_R", "z Mic",
+ "z Capture", "z Left ADC",
+ "z Capture", "z Right ADC";
nvidia,xbar = <&tegra_axbar>;
- mclk-fs = <256>;
+ //mclk-fs = <256>;
rt565x_dai_link: nvidia,dai-link-1 {
link-name = "spdif-dit-0";
- cpu-dai = <&tegra_i2s1>;
+ cpu-dai = <&tegra_i2s2>;
codec-dai = <&spdif_dit0>;
- cpu-dai-name = "I2S1";
+ cpu-dai-name = "I2S2";
codec-dai-name = "dit-hifi";
format = "i2s";
bit-format = "s16_le";
@@ -746,20 +758,27 @@
num-channel = <2>;
ignore_suspend;
name-prefix = "x";
- status = "okay";
+ status = "disabled";
};
nvidia,dai-link-2 {
- link-name = "spdif-dit-1";
- cpu-dai = <&tegra_i2s2>;
- codec-dai = <&spdif_dit1>;
- cpu-dai-name = "I2S2";
- codec-dai-name = "dit-hifi";
+ link-name = "ti-capture";
+ cpu-dai = <&tegra_i2s1>;
+ codec-dai = <&aic32x4>;
+ cpu-dai-name = "I2S1";
+ codec-dai-name = "tlv320aic32x4-hifi";
+ tx-mask = <0xFF>;
+ rx-mask = <0xFF>;
format = "i2s";
+ bitclock-slave;
+ frame-slave;
+ bitclock-noninversion;
+ frame-noninversion;
bit-format = "s16_le";
- srate = <48000>;
+ srate = <44100>;
+ bclk_ratio = <1>;
num-channel = <2>;
ignore_suspend;
- name-prefix = "y";
+ name-prefix = "z";
status = "okay";
};
nvidia,dai-link-3 {
@@ -773,8 +792,8 @@
srate = <48000>;
num-channel = <2>;
ignore_suspend;
- name-prefix = "z";
- status = "okay";
+ name-prefix = "a";
+ status = "disabled";
};
nvidia,dai-link-4 {
link-name = "spdif-dit-3";
@@ -788,7 +807,7 @@
num-channel = <2>;
ignore_suspend;
name-prefix = "m";
- status = "okay";
+ status = "disabled";
};
nvidia,dai-link-5 {
link-name = "spdif-dit-4";
@@ -802,7 +821,7 @@
num-channel = <2>;
ignore_suspend;
name-prefix = "n";
- status = "okay";
+ status = "disabled";
};
nvidia,dai-link-6 {
link-name = "spdif-dit-6";
@@ -819,7 +838,7 @@
num-channel = <1>;
ignore_suspend;
name-prefix = "o";
- status = "okay";
+ status = "disabled";
};
nvidia,dai-link-7 {
link-name = "spdif-dit-7";
@@ -833,7 +852,7 @@
ignore_suspend;
num-channel = <2>;
name-prefix = "a";
- status = "okay";
+ status = "disabled";
};
nvidia,dai-link-8 {
link-name = "spdif-dit-8";
@@ -847,7 +866,7 @@
ignore_suspend;
num-channel = <2>;
name-prefix = "b";
- status = "okay";
+ status = "disabled";
};
nvidia,dai-link-9 {
link-name = "spdif-dit-9";
@@ -861,7 +880,7 @@
ignore_suspend;
num-channel = <2>;
name-prefix = "c";
- status = "okay";
+ status = "disabled";
};
nvidia,dai-link-10 {
link-name = "spdif-dit-10";
@@ -875,7 +894,7 @@
ignore_suspend;
num-channel = <2>;
name-prefix = "d";
- status = "okay";
+ status = "disabled";
};
nvidia,dai-link-11 {
link-name = "dspk1-playback";
@@ -889,7 +908,7 @@
num-channel = <2>;
ignore_suspend;
name-prefix = "d3";
- status = "okay";
+ status = "disabled";
};
dspk_1_dai_link: nvidia,dai-link-12 {
link-name = "dspk-playback-l";
@@ -903,7 +922,7 @@
num-channel = <2>;
ignore_suspend;
name-prefix = "d1";
- status = "okay";
+ status = "disabled";
};
dspk_2_dai_link: nvidia,dai-link-13 {
link-name = "dspk-playback-r";
@@ -917,7 +936,7 @@
num-channel = <2>;
ignore_suspend;
name-prefix = "d2";
- status = "okay";
+ status = "disabled";
};
};
Except that I believe nvidia,num-codec-link should be <1> as we have only one link active.
diff --git a/nvidia/sound/soc/tegra-alt/machine_drivers/tegra_machine_driver_mobile.c b/nvidia/sound/soc/tegra-alt/machine_drivers/tegra_machine_driver_mobile.c
index b2e8fa27cd62..a544c6c6764f 100644
--- a/nvidia/sound/soc/tegra-alt/machine_drivers/tegra_machine_driver_mobile.c
+++ b/nvidia/sound/soc/tegra-alt/machine_drivers/tegra_machine_driver_mobile.c
@@ -30,6 +30,7 @@
#include <dt-bindings/sound/tas2552.h>
#include "rt5659.h"
#include "sgtl5000.h"
+#include "tlv320aic32x4.h"
#include "tegra_asoc_machine_alt.h"
#include "tegra210_xbar_alt.h"
@@ -288,7 +289,7 @@ static int tegra_machine_set_params(struct snd_soc_card *card,
static int tegra_machine_dai_init(struct snd_soc_pcm_runtime *runtime,
unsigned int rate, unsigned int channels,
- u64 formats)
+ u64 formats, bool is_palyback)
{
struct snd_soc_card *card = runtime->card;
struct tegra_machine *machine = snd_soc_card_get_drvdata(card);
@@ -358,6 +359,19 @@ static int tegra_machine_dai_init(struct snd_soc_pcm_runtime *runtime,
}
}
+ rtd = snd_soc_get_pcm_runtime(card, "ti-capture");
+ if (rtd) {
+ dai_params =
+ (struct snd_soc_pcm_stream *)rtd->dai_link->params;
+ dai_params->rate_min = srate;
+ dai_params->channels_min = channels;
+ dai_params->formats = formats;
+ if (err < 0) {
+ dev_err(card->dev, "codec_dai clock not parashuram set\n");
+ return err;
+ }
+ }
+
rtd = snd_soc_get_pcm_runtime(card, "rt565x-codec-sysclk-bclk1");
if (rtd) {
dai_params =
@@ -410,10 +424,18 @@ static int tegra_machine_pcm_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_card *card = rtd->card;
int err;
+ bool is_playback;
+
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+ is_playback = true;
+ else
+ is_playback = false;
+
err = tegra_machine_dai_init(rtd, params_rate(params),
params_channels(params),
- params_format(params));
+ params_format(params),
+ is_playback);
if (err < 0) {
dev_err(card->dev, "Failed dai init\n");
return err;
@@ -583,6 +605,21 @@ static int tegra_machine_rt565x_init(struct snd_soc_pcm_runtime *rtd)
return 0;
}
+static int tegra_machine_aic32x4_init(struct snd_soc_pcm_runtime *rtd)
+{
+ struct device *dev = rtd->card->dev;
+ int err;
+
+ err = snd_soc_dai_set_sysclk(rtd->codec_dai, AIC32X4_FREQ_12000000, 12000000,
+ SND_SOC_CLOCK_IN);
+ if (err) {
+ dev_err(dev, "failed to set aic32x4 sysclk!\n");
+ return err;
+ }
+
+ return 0;
+}
+
static int codec_init(struct tegra_machine *machine)
{
struct snd_soc_dai_link *dai_links = machine->asoc->dai_links;
@@ -602,6 +639,9 @@ static int codec_init(struct tegra_machine *machine)
dai_links[i].init = tegra_machine_fepi_init;
else if (strstr(dai_links[i].name, "respeaker-4-mic-array"))
dai_links[i].init = tegra_machine_respeaker_init;
+ else if (strstr(dai_links[i].name, "ti-capture"))
+ dai_links[i].init = tegra_machine_aic32x4_init;
+
}
return 0;
But i don’t see the is_playing is actually used anywhere.
diff --git a/sound/soc/codecs/tlv320aic32x4.c b/sound/soc/codecs/tlv320aic32x4.c
old mode 100644
new mode 100755
index c27e3476848a..08e77c4d0559
--- a/sound/soc/codecs/tlv320aic32x4.c
+++ b/sound/soc/codecs/tlv320aic32x4.c
@@ -30,6 +30,7 @@
#include <linux/pm.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
+#include <linux/i2c.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/clk.h>
@@ -159,10 +160,7 @@ static const struct aic32x4_rate_divs aic32x4_divs[] = {
/* 48k rate */
{AIC32X4_FREQ_12000000, 48000, 1, 8, 1920, 128, 2, 8, 128, 2, 8, 4},
{AIC32X4_FREQ_24000000, 48000, 2, 8, 1920, 128, 8, 2, 64, 8, 4, 4},
- {AIC32X4_FREQ_25000000, 48000, 2, 7, 8643, 128, 8, 2, 64, 8, 4, 4},
-
- /* 96k rate */
- {AIC32X4_FREQ_25000000, 96000, 2, 7, 8643, 64, 4, 4, 64, 4, 4, 1},
+ {AIC32X4_FREQ_25000000, 48000, 2, 7, 8643, 128, 8, 2, 64, 8, 4, 4}
};
static const struct snd_kcontrol_new hpl_output_mixer_controls[] = {
@@ -183,75 +181,46 @@ static const struct snd_kcontrol_new lor_output_mixer_controls[] = {
SOC_DAPM_SINGLE("R_DAC Switch", AIC32X4_LORROUTE, 3, 1, 0),
};
-static const char * const resistor_text[] = {
- "Off", "10 kOhm", "20 kOhm", "40 kOhm",
+static const struct snd_kcontrol_new left_input_mixer_controls[] = {
+ SOC_DAPM_SINGLE("IN1_L P Switch", AIC32X4_LMICPGAPIN, 6, 1, 0),
+ SOC_DAPM_SINGLE("IN2_L P Switch", AIC32X4_LMICPGAPIN, 4, 1, 0),
+ SOC_DAPM_SINGLE("IN3_L P Switch", AIC32X4_LMICPGAPIN, 2, 1, 0),
};
-/* Left mixer pins */
-static SOC_ENUM_SINGLE_DECL(in1l_lpga_p_enum, AIC32X4_LMICPGAPIN, 6, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in2l_lpga_p_enum, AIC32X4_LMICPGAPIN, 4, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in3l_lpga_p_enum, AIC32X4_LMICPGAPIN, 2, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in1r_lpga_p_enum, AIC32X4_LMICPGAPIN, 0, resistor_text);
-
-static SOC_ENUM_SINGLE_DECL(cml_lpga_n_enum, AIC32X4_LMICPGANIN, 6, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in2r_lpga_n_enum, AIC32X4_LMICPGANIN, 4, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in3r_lpga_n_enum, AIC32X4_LMICPGANIN, 2, resistor_text);
-
-static const struct snd_kcontrol_new in1l_to_lmixer_controls[] = {
- SOC_DAPM_ENUM("IN1_L L+ Switch", in1l_lpga_p_enum),
-};
-static const struct snd_kcontrol_new in2l_to_lmixer_controls[] = {
- SOC_DAPM_ENUM("IN2_L L+ Switch", in2l_lpga_p_enum),
-};
-static const struct snd_kcontrol_new in3l_to_lmixer_controls[] = {
- SOC_DAPM_ENUM("IN3_L L+ Switch", in3l_lpga_p_enum),
-};
-static const struct snd_kcontrol_new in1r_to_lmixer_controls[] = {
- SOC_DAPM_ENUM("IN1_R L+ Switch", in1r_lpga_p_enum),
-};
-static const struct snd_kcontrol_new cml_to_lmixer_controls[] = {
- SOC_DAPM_ENUM("CM_L L- Switch", cml_lpga_n_enum),
-};
-static const struct snd_kcontrol_new in2r_to_lmixer_controls[] = {
- SOC_DAPM_ENUM("IN2_R L- Switch", in2r_lpga_n_enum),
-};
-static const struct snd_kcontrol_new in3r_to_lmixer_controls[] = {
- SOC_DAPM_ENUM("IN3_R L- Switch", in3r_lpga_n_enum),
+static const struct snd_kcontrol_new right_input_mixer_controls[] = {
+ SOC_DAPM_SINGLE("IN1_R P Switch", AIC32X4_RMICPGAPIN, 6, 1, 0),
+ SOC_DAPM_SINGLE("IN2_R P Switch", AIC32X4_RMICPGAPIN, 4, 1, 0),
+ SOC_DAPM_SINGLE("IN3_R P Switch", AIC32X4_RMICPGAPIN, 2, 1, 0),
};
-/* Right mixer pins */
-static SOC_ENUM_SINGLE_DECL(in1r_rpga_p_enum, AIC32X4_RMICPGAPIN, 6, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in2r_rpga_p_enum, AIC32X4_RMICPGAPIN, 4, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in3r_rpga_p_enum, AIC32X4_RMICPGAPIN, 2, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in2l_rpga_p_enum, AIC32X4_RMICPGAPIN, 0, resistor_text);
-static SOC_ENUM_SINGLE_DECL(cmr_rpga_n_enum, AIC32X4_RMICPGANIN, 6, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in1l_rpga_n_enum, AIC32X4_RMICPGANIN, 4, resistor_text);
-static SOC_ENUM_SINGLE_DECL(in3l_rpga_n_enum, AIC32X4_RMICPGANIN, 2, resistor_text);
-
-static const struct snd_kcontrol_new in1r_to_rmixer_controls[] = {
- SOC_DAPM_ENUM("IN1_R R+ Switch", in1r_rpga_p_enum),
-};
-static const struct snd_kcontrol_new in2r_to_rmixer_controls[] = {
- SOC_DAPM_ENUM("IN2_R R+ Switch", in2r_rpga_p_enum),
-};
-static const struct snd_kcontrol_new in3r_to_rmixer_controls[] = {
- SOC_DAPM_ENUM("IN3_R R+ Switch", in3r_rpga_p_enum),
-};
-static const struct snd_kcontrol_new in2l_to_rmixer_controls[] = {
- SOC_DAPM_ENUM("IN2_L R+ Switch", in2l_rpga_p_enum),
-};
-static const struct snd_kcontrol_new cmr_to_rmixer_controls[] = {
- SOC_DAPM_ENUM("CM_R R- Switch", cmr_rpga_n_enum),
-};
-static const struct snd_kcontrol_new in1l_to_rmixer_controls[] = {
- SOC_DAPM_ENUM("IN1_L R- Switch", in1l_rpga_n_enum),
-};
-static const struct snd_kcontrol_new in3l_to_rmixer_controls[] = {
- SOC_DAPM_ENUM("IN3_L R- Switch", in3l_rpga_n_enum),
-};
+static int mic_bias_event(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event)
+{
+ struct snd_soc_component *component =
+snd_soc_dapm_to_component(w->dapm);
+
+ // switch (event) {
+ // case SND_SOC_DAPM_POST_PMU:
+ // /* Change Mic Bias Registor */
+ // snd_soc_component_update_bits(component, AIC32X4_MICBIAS,
+ // AIC32x4_MICBIAS_MASK,
+ // AIC32X4_MICBIAS_LDOIN |
+ // AIC32X4_MICBIAS_2075V);
+ // printk(KERN_DEBUG "%s: Mic Bias will be turned ON\n", __func__);
+ // break;
+ // case SND_SOC_DAPM_PRE_PMD:
+ // snd_soc_component_update_bits(component, AIC32X4_MICBIAS,
+ // AIC32x4_MICBIAS_MASK, 0);
+ // printk(KERN_DEBUG "%s: Mic Bias will be turned OFF\n",
+ // __func__);
+ // break;
+ // }
+
+ return 0;
+}
static const struct snd_soc_dapm_widget aic32x4_dapm_widgets[] = {
- SND_SOC_DAPM_DAC("Left DAC", "Left Playback", AIC32X4_DACSETUP, 7, 0),
+ SND_SOC_DAPM_DAC("Left DAC", "Playback", AIC32X4_DACSETUP, 7, 0),
SND_SOC_DAPM_MIXER("HPL Output Mixer", SND_SOC_NOPM, 0, 0,
&hpl_output_mixer_controls[0],
ARRAY_SIZE(hpl_output_mixer_controls)),
@@ -262,7 +231,7 @@ static const struct snd_soc_dapm_widget aic32x4_dapm_widgets[] = {
ARRAY_SIZE(lol_output_mixer_controls)),
SND_SOC_DAPM_PGA("LOL Power", AIC32X4_OUTPWRCTL, 3, 0, NULL, 0),
- SND_SOC_DAPM_DAC("Right DAC", "Right Playback", AIC32X4_DACSETUP, 6, 0),
+ SND_SOC_DAPM_DAC("Right DAC", "Playback", AIC32X4_DACSETUP, 6, 0),
SND_SOC_DAPM_MIXER("HPR Output Mixer", SND_SOC_NOPM, 0, 0,
&hpr_output_mixer_controls[0],
ARRAY_SIZE(hpr_output_mixer_controls)),
@@ -271,40 +240,17 @@ static const struct snd_soc_dapm_widget aic32x4_dapm_widgets[] = {
&lor_output_mixer_controls[0],
ARRAY_SIZE(lor_output_mixer_controls)),
SND_SOC_DAPM_PGA("LOR Power", AIC32X4_OUTPWRCTL, 2, 0, NULL, 0),
-
- SND_SOC_DAPM_ADC("Right ADC", "Right Capture", AIC32X4_ADCSETUP, 6, 0),
- SND_SOC_DAPM_MUX("IN1_R to Right Mixer Positive Resistor", SND_SOC_NOPM, 0, 0,
- in1r_to_rmixer_controls),
- SND_SOC_DAPM_MUX("IN2_R to Right Mixer Positive Resistor", SND_SOC_NOPM, 0, 0,
- in2r_to_rmixer_controls),
- SND_SOC_DAPM_MUX("IN3_R to Right Mixer Positive Resistor", SND_SOC_NOPM, 0, 0,
- in3r_to_rmixer_controls),
- SND_SOC_DAPM_MUX("IN2_L to Right Mixer Positive Resistor", SND_SOC_NOPM, 0, 0,
- in2l_to_rmixer_controls),
- SND_SOC_DAPM_MUX("CM_R to Right Mixer Negative Resistor", SND_SOC_NOPM, 0, 0,
- cmr_to_rmixer_controls),
- SND_SOC_DAPM_MUX("IN1_L to Right Mixer Negative Resistor", SND_SOC_NOPM, 0, 0,
- in1l_to_rmixer_controls),
- SND_SOC_DAPM_MUX("IN3_L to Right Mixer Negative Resistor", SND_SOC_NOPM, 0, 0,
- in3l_to_rmixer_controls),
-
- SND_SOC_DAPM_ADC("Left ADC", "Left Capture", AIC32X4_ADCSETUP, 7, 0),
- SND_SOC_DAPM_MUX("IN1_L to Left Mixer Positive Resistor", SND_SOC_NOPM, 0, 0,
- in1l_to_lmixer_controls),
- SND_SOC_DAPM_MUX("IN2_L to Left Mixer Positive Resistor", SND_SOC_NOPM, 0, 0,
- in2l_to_lmixer_controls),
- SND_SOC_DAPM_MUX("IN3_L to Left Mixer Positive Resistor", SND_SOC_NOPM, 0, 0,
- in3l_to_lmixer_controls),
- SND_SOC_DAPM_MUX("IN1_R to Left Mixer Positive Resistor", SND_SOC_NOPM, 0, 0,
- in1r_to_lmixer_controls),
- SND_SOC_DAPM_MUX("CM_L to Left Mixer Negative Resistor", SND_SOC_NOPM, 0, 0,
- cml_to_lmixer_controls),
- SND_SOC_DAPM_MUX("IN2_R to Left Mixer Negative Resistor", SND_SOC_NOPM, 0, 0,
- in2r_to_lmixer_controls),
- SND_SOC_DAPM_MUX("IN3_R to Left Mixer Negative Resistor", SND_SOC_NOPM, 0, 0,
- in3r_to_lmixer_controls),
-
- SND_SOC_DAPM_MICBIAS("Mic Bias", AIC32X4_MICBIAS, 6, 0),
+ SND_SOC_DAPM_MIXER("Left Input Mixer", SND_SOC_NOPM, 0, 0,
+ &left_input_mixer_controls[0],
+ ARRAY_SIZE(left_input_mixer_controls)),
+ SND_SOC_DAPM_MIXER("Right Input Mixer", SND_SOC_NOPM, 0, 0,
+ &right_input_mixer_controls[0],
+ ARRAY_SIZE(right_input_mixer_controls)),
+ SND_SOC_DAPM_ADC( "Left ADC", "Capture", AIC32X4_ADCSETUP, 7, 0), // Jon 20.03.2018
+ SND_SOC_DAPM_ADC( "Right ADC", "Capture", AIC32X4_ADCSETUP, 6, 0), // Jon 20.03.2018
+ //SND_SOC_DAPM_MICBIAS("Mic Bias", AIC32X4_MICBIAS, 6, 0),
+ SND_SOC_DAPM_SUPPLY("Mic Bias", AIC32X4_MICBIAS, 6, 0, mic_bias_event,
+ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
SND_SOC_DAPM_OUTPUT("HPL"),
SND_SOC_DAPM_OUTPUT("HPR"),
@@ -345,77 +291,19 @@ static const struct snd_soc_dapm_route aic32x4_dapm_routes[] = {
{"LOR Power", NULL, "LOR Output Mixer"},
{"LOR", NULL, "LOR Power"},
+ /* Left input */
+ {"Left Input Mixer", "IN1_L P Switch", "IN1_L"},
+ {"Left Input Mixer", "IN2_L P Switch", "IN2_L"},
+ {"Left Input Mixer", "IN3_L P Switch", "IN3_L"},
+
+ {"Left ADC", NULL, "Left Input Mixer"},
+
/* Right Input */
- {"Right ADC", NULL, "IN1_R to Right Mixer Positive Resistor"},
- {"IN1_R to Right Mixer Positive Resistor", "10 kOhm", "IN1_R"},
- {"IN1_R to Right Mixer Positive Resistor", "20 kOhm", "IN1_R"},
- {"IN1_R to Right Mixer Positive Resistor", "40 kOhm", "IN1_R"},
-
- {"Right ADC", NULL, "IN2_R to Right Mixer Positive Resistor"},
- {"IN2_R to Right Mixer Positive Resistor", "10 kOhm", "IN2_R"},
- {"IN2_R to Right Mixer Positive Resistor", "20 kOhm", "IN2_R"},
- {"IN2_R to Right Mixer Positive Resistor", "40 kOhm", "IN2_R"},
-
- {"Right ADC", NULL, "IN3_R to Right Mixer Positive Resistor"},
- {"IN3_R to Right Mixer Positive Resistor", "10 kOhm", "IN3_R"},
- {"IN3_R to Right Mixer Positive Resistor", "20 kOhm", "IN3_R"},
- {"IN3_R to Right Mixer Positive Resistor", "40 kOhm", "IN3_R"},
-
- {"Right ADC", NULL, "IN2_L to Right Mixer Positive Resistor"},
- {"IN2_L to Right Mixer Positive Resistor", "10 kOhm", "IN2_L"},
- {"IN2_L to Right Mixer Positive Resistor", "20 kOhm", "IN2_L"},
- {"IN2_L to Right Mixer Positive Resistor", "40 kOhm", "IN2_L"},
-
- {"Right ADC", NULL, "CM_R to Right Mixer Negative Resistor"},
- {"CM_R to Right Mixer Negative Resistor", "10 kOhm", "CM_R"},
- {"CM_R to Right Mixer Negative Resistor", "20 kOhm", "CM_R"},
- {"CM_R to Right Mixer Negative Resistor", "40 kOhm", "CM_R"},
-
- {"Right ADC", NULL, "IN1_L to Right Mixer Negative Resistor"},
- {"IN1_L to Right Mixer Negative Resistor", "10 kOhm", "IN1_L"},
- {"IN1_L to Right Mixer Negative Resistor", "20 kOhm", "IN1_L"},
- {"IN1_L to Right Mixer Negative Resistor", "40 kOhm", "IN1_L"},
-
- {"Right ADC", NULL, "IN3_L to Right Mixer Negative Resistor"},
- {"IN3_L to Right Mixer Negative Resistor", "10 kOhm", "IN3_L"},
- {"IN3_L to Right Mixer Negative Resistor", "20 kOhm", "IN3_L"},
- {"IN3_L to Right Mixer Negative Resistor", "40 kOhm", "IN3_L"},
-
- /* Left Input */
- {"Left ADC", NULL, "IN1_L to Left Mixer Positive Resistor"},
- {"IN1_L to Left Mixer Positive Resistor", "10 kOhm", "IN1_L"},
- {"IN1_L to Left Mixer Positive Resistor", "20 kOhm", "IN1_L"},
- {"IN1_L to Left Mixer Positive Resistor", "40 kOhm", "IN1_L"},
-
- {"Left ADC", NULL, "IN2_L to Left Mixer Positive Resistor"},
- {"IN2_L to Left Mixer Positive Resistor", "10 kOhm", "IN2_L"},
- {"IN2_L to Left Mixer Positive Resistor", "20 kOhm", "IN2_L"},
- {"IN2_L to Left Mixer Positive Resistor", "40 kOhm", "IN2_L"},
-
- {"Left ADC", NULL, "IN3_L to Left Mixer Positive Resistor"},
- {"IN3_L to Left Mixer Positive Resistor", "10 kOhm", "IN3_L"},
- {"IN3_L to Left Mixer Positive Resistor", "20 kOhm", "IN3_L"},
- {"IN3_L to Left Mixer Positive Resistor", "40 kOhm", "IN3_L"},
-
- {"Left ADC", NULL, "IN1_R to Left Mixer Positive Resistor"},
- {"IN1_R to Left Mixer Positive Resistor", "10 kOhm", "IN1_R"},
- {"IN1_R to Left Mixer Positive Resistor", "20 kOhm", "IN1_R"},
- {"IN1_R to Left Mixer Positive Resistor", "40 kOhm", "IN1_R"},
-
- {"Left ADC", NULL, "CM_L to Left Mixer Negative Resistor"},
- {"CM_L to Left Mixer Negative Resistor", "10 kOhm", "CM_L"},
- {"CM_L to Left Mixer Negative Resistor", "20 kOhm", "CM_L"},
- {"CM_L to Left Mixer Negative Resistor", "40 kOhm", "CM_L"},
-
- {"Left ADC", NULL, "IN2_R to Left Mixer Negative Resistor"},
- {"IN2_R to Left Mixer Negative Resistor", "10 kOhm", "IN2_R"},
- {"IN2_R to Left Mixer Negative Resistor", "20 kOhm", "IN2_R"},
- {"IN2_R to Left Mixer Negative Resistor", "40 kOhm", "IN2_R"},
-
- {"Left ADC", NULL, "IN3_R to Left Mixer Negative Resistor"},
- {"IN3_R to Left Mixer Negative Resistor", "10 kOhm", "IN3_R"},
- {"IN3_R to Left Mixer Negative Resistor", "20 kOhm", "IN3_R"},
- {"IN3_R to Left Mixer Negative Resistor", "40 kOhm", "IN3_R"},
+ {"Right Input Mixer", "IN1_R P Switch", "IN1_R"},
+ {"Right Input Mixer", "IN2_R P Switch", "IN2_R"},
+ {"Right Input Mixer", "IN3_R P Switch", "IN3_R"},
+
+ {"Right ADC", NULL, "Right Input Mixer"},
};
static const struct regmap_range_cfg aic32x4_regmap_pages[] = {
@@ -425,12 +313,14 @@ static const struct regmap_range_cfg aic32x4_regmap_pages[] = {
.window_start = 0,
.window_len = 128,
.range_min = 0,
- .range_max = AIC32X4_RMICPGAVOL,
+ .range_max = 0xFB, //AIC32X4_RMICPGAVOL,
},
};
const struct regmap_config aic32x4_regmap_config = {
- .max_register = AIC32X4_RMICPGAVOL,
+ .reg_bits = 8,
+ .val_bits = 8,
+ .max_register = 0xFB, //AIC32X4_RMICPGAVOL,
.ranges = aic32x4_regmap_pages,
.num_ranges = ARRAY_SIZE(aic32x4_regmap_pages),
};
@@ -538,7 +428,7 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream,
printk(KERN_ERR "aic32x4: sampling rate not supported\n");
return i;
}
-
+#if 0
/* Use PLL as CODEC_CLKIN and DAC_MOD_CLK as BDIV_CLKIN */
snd_soc_write(codec, AIC32X4_CLKMUX, AIC32X4_PLLCLKIN);
snd_soc_write(codec, AIC32X4_IFACE3, AIC32X4_DACMOD2BCLK);
@@ -604,7 +494,7 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream,
break;
}
snd_soc_write(codec, AIC32X4_IFACE1, data);
-
+#endif
if (params_channels(params) == 1) {
data = AIC32X4_RDAC2LCHN | AIC32X4_LDAC2LCHN;
} else {
Where I’ve also added these to the original patch:
static const struct snd_soc_dapm_widget aic32x4_dapm_widgets[] = {
- SND_SOC_DAPM_DAC("Left DAC", "Left Playback", AIC32X4_DACSETUP, 7, 0),
+ SND_SOC_DAPM_DAC("Left DAC", "Playback", AIC32X4_DACSETUP, 7, 0),
SND_SOC_DAPM_MIXER("HPL Output Mixer", SND_SOC_NOPM, 0, 0,
&hpl_output_mixer_controls[0],
ARRAY_SIZE(hpl_output_mixer_controls)),
@@ -262,7 +231,7 @@ static const struct snd_soc_dapm_widget aic32x4_dapm_widgets[] = {
ARRAY_SIZE(lol_output_mixer_controls)),
SND_SOC_DAPM_PGA("LOL Power", AIC32X4_OUTPWRCTL, 3, 0, NULL, 0),
- SND_SOC_DAPM_DAC("Right DAC", "Right Playback", AIC32X4_DACSETUP, 6, 0),
+ SND_SOC_DAPM_DAC("Right DAC", "Playback", AIC32X4_DACSETUP, 6, 0),
SND_SOC_DAPM_MIXER("HPR Output Mixer", SND_SOC_NOPM, 0, 0,
&hpr_output_mixer_controls[0],
ARRAY_SIZE(hpr_output_mixer_controls)),
And I’ve commented out mic_bias_event because AIC32x4_MICBIAS_MASK is unknown and @Parashuram.Biradar I suppose just defined it somewhere else.
After booting up I have this:
[ 9.267096] tegra-asoc: sound: ADMAIF1 <-> ADMAIF1 mapping ok
[ 9.272938] tegra-asoc: sound: ADMAIF2 <-> ADMAIF2 mapping ok
[ 9.278756] tegra-asoc: sound: ADMAIF3 <-> ADMAIF3 mapping ok
[ 9.284591] tegra-asoc: sound: ADMAIF4 <-> ADMAIF4 mapping ok
[ 9.290415] tegra-asoc: sound: ADMAIF5 <-> ADMAIF5 mapping ok
[ 9.296243] tegra-asoc: sound: ADMAIF6 <-> ADMAIF6 mapping ok
[ 9.302059] tegra-asoc: sound: ADMAIF7 <-> ADMAIF7 mapping ok
[ 9.307893] tegra-asoc: sound: ADMAIF8 <-> ADMAIF8 mapping ok
[ 9.313729] tegra-asoc: sound: ADMAIF9 <-> ADMAIF9 mapping ok
[ 9.319544] tegra-asoc: sound: ADMAIF10 <-> ADMAIF10 mapping ok
[ 9.325556] tegra-asoc: sound: ADMAIF11 <-> ADMAIF11 mapping ok
[ 9.331562] tegra-asoc: sound: ADMAIF12 <-> ADMAIF12 mapping ok
[ 9.337554] tegra-asoc: sound: ADMAIF13 <-> ADMAIF13 mapping ok
[ 9.343563] tegra-asoc: sound: ADMAIF14 <-> ADMAIF14 mapping ok
[ 9.349560] tegra-asoc: sound: ADMAIF15 <-> ADMAIF15 mapping ok
[ 9.355549] tegra-asoc: sound: ADMAIF16 <-> ADMAIF16 mapping ok
[ 9.361534] tegra-asoc: sound: ADMAIF17 <-> ADMAIF17 mapping ok
[ 9.367541] tegra-asoc: sound: ADMAIF18 <-> ADMAIF18 mapping ok
[ 9.373548] tegra-asoc: sound: ADMAIF19 <-> ADMAIF19 mapping ok
[ 9.379537] tegra-asoc: sound: ADMAIF20 <-> ADMAIF20 mapping ok
[ 9.391237] tegra-asoc: sound: ASoC: no source widget found for z LOL
[ 9.397686] tegra-asoc: sound: ASoC: Failed to add route z LOL -> direct -> z Headphone
[ 9.405715] tegra-asoc: sound: ASoC: no source widget found for z LOR
[ 9.412160] tegra-asoc: sound: ASoC: Failed to add route z LOR -> direct -> z Headphone
[ 9.420177] tegra-asoc: sound: ASoC: no source widget found for z HPL
[ 9.426633] tegra-asoc: sound: ASoC: Failed to add route z HPL -> direct -> z Headphone
[ 9.434651] tegra-asoc: sound: ASoC: no source widget found for z HPR
[ 9.441095] tegra-asoc: sound: ASoC: Failed to add route z HPR -> direct -> z Headphone
[ 9.449131] tegra-asoc: sound: ASoC: no source widget found for z Playback
[ 9.456006] tegra-asoc: sound: ASoC: Failed to add route z Playback -> direct -> z Left DAC
[ 9.464387] tegra-asoc: sound: ASoC: no source widget found for z Playback
[ 9.471264] tegra-asoc: sound: ASoC: Failed to add route z Playback -> direct -> z Right DAC
[ 9.479711] tegra-asoc: sound: ASoC: no sink widget found for z IN1_L
[ 9.486165] tegra-asoc: sound: ASoC: Failed to add route z Mic -> direct -> z IN1_L
[ 9.493833] tegra-asoc: sound: ASoC: no sink widget found for z IN1_R
[ 9.500274] tegra-asoc: sound: ASoC: Failed to add route z Mic -> direct -> z IN1_R
[ 9.507952] tegra-asoc: sound: ASoC: no sink widget found for z IN2_L
[ 9.514399] tegra-asoc: sound: ASoC: Failed to add route z Mic -> direct -> z IN2_L
[ 9.522067] tegra-asoc: sound: ASoC: no sink widget found for z IN2_R
[ 9.528520] tegra-asoc: sound: ASoC: Failed to add route z Mic -> direct -> z IN2_R
[ 9.536187] tegra-asoc: sound: ASoC: no sink widget found for z IN3_L
[ 9.542641] tegra-asoc: sound: ASoC: Failed to add route z Mic -> direct -> z IN3_L
[ 9.550308] tegra-asoc: sound: ASoC: no sink widget found for z IN3_R
[ 9.556751] tegra-asoc: sound: ASoC: Failed to add route z Mic -> direct -> z IN3_R
[ 9.564441] tegra-asoc: sound: ASoC: no source widget found for z Left ADC
[ 9.571317] tegra-asoc: sound: ASoC: Failed to add route z Left ADC -> direct -> z Capture
[ 9.579598] tegra-asoc: sound: ASoC: no source widget found for z Right ADC
[ 9.586573] tegra-asoc: sound: ASoC: Failed to add route z Right ADC -> direct -> z Capture
and also this:
root@jetson-tx2:~# alsamixer
ALSA lib ../../alsa-lib-1.2.6.1/src/confmisc.c:165:(snd_config_get_card) Cannot get card index for Tegra
cannot open mixer: No such device
Please help me with this errors. Thank you!