Hi,
I have some problem with this audio codec, the es8316 has been successfully registered and the sound card has appeared, but there is no sound. The following are my modifications based on r32.6.1:
es8316.c (38.1 KB)
1. codec:
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -68,6 +68,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_DA732X if I2C
select SND_SOC_DA9055 if I2C
select SND_SOC_DMIC
+ select SND_SOC_ES8316 if I2C
select SND_SOC_ES8328_SPI if SPI_MASTER
select SND_SOC_ES8328_I2C if I2C
select SND_SOC_GTM601
@@ -513,6 +514,10 @@ config SND_SOC_DA9055
config SND_SOC_DMIC
tristate
+config SND_SOC_ES8316
+ tristate "Everest Semi ES8316 CODEC"
+ depends on I2C
+
config SND_SOC_HDMI_CODEC
tristate
select SND_PCM_ELD
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 426b39afdd73..158f8e5b8934 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -61,6 +61,7 @@ snd-soc-da7219-objs := da7219.o da7219-aad.o
snd-soc-da732x-objs := da732x.o
snd-soc-da9055-objs := da9055.o
snd-soc-dmic-objs := dmic.o
+snd-soc-es8316-objs := es8316.o
snd-soc-es8328-objs := es8328.o
snd-soc-es8328-i2c-objs := es8328-i2c.o
snd-soc-es8328-spi-objs := es8328-spi.o
@@ -286,6 +287,7 @@ obj-$(CONFIG_SND_SOC_DA7219) += snd-soc-da7219.o
obj-$(CONFIG_SND_SOC_DA732X) += snd-soc-da732x.o
obj-$(CONFIG_SND_SOC_DA9055) += snd-soc-da9055.o
obj-$(CONFIG_SND_SOC_DMIC) += snd-soc-dmic.o
+obj-y += snd-soc-es8316.o
obj-$(CONFIG_SND_SOC_ES8328) += snd-soc-es8328.o
obj-$(CONFIG_SND_SOC_ES8328_I2C)+= snd-soc-es8328-i2c.o
obj-$(CONFIG_SND_SOC_ES8328_SPI)+= snd-soc-es8328-spi.o
diff --git a/sound/soc/codecs/es8316.c b/sound/soc/codecs/es8316.c
2. machine:
--- a/sound/soc/tegra-alt/Kconfig
+++ b/sound/soc/tegra-alt/Kconfig
@@ -176,6 +176,7 @@ config SND_SOC_TEGRA_T186REF_ALT
select SND_SOC_TEGRA_ASOC_HWDEP_ALT
select SND_SOC_SPDIF
select SND_SOC_COMPRESS
+ select SND_SOC_ES8316
help
Say Y or M here.
@@ -205,6 +206,7 @@ config SND_SOC_TEGRA210_AUDIO_ALT
select SND_SOC_RT5640
select SND_SOC_RT5659
select SND_SOC_SGTL5000
+ select SND_SOC_ES8316
help
Say Y or M here if you want to enable support for ASoC machine driver on
Tegra210 and successor platforms like Tegra186, Tegra194.
diff --git a/sound/soc/tegra-alt/machine_drivers/tegra_machine_driver_mobile.c b/sound/soc/tegra-alt/machine_drivers/tegra_machine_driver_mobile.c
index b2e8fa27c..4d3760c95 100644
--- a/sound/soc/tegra-alt/machine_drivers/tegra_machine_driver_mobile.c
+++ b/sound/soc/tegra-alt/machine_drivers/tegra_machine_driver_mobile.c
@@ -29,10 +29,16 @@
#include <sound/soc.h>
#include <dt-bindings/sound/tas2552.h>
#include "rt5659.h"
+#include "es8316.h"
#include "sgtl5000.h"
#include "tegra_asoc_machine_alt.h"
#include "tegra210_xbar_alt.h"
+enum {
+ ES8316_SCLK_S_MCLK = 0,
+ ES8316_SCLK_S_PLL1,
+ ES8316_SCLK_S_RCCLK,
+};
#define DRV_NAME "tegra-asoc:"
#define PARAMS(sformat, channels) \
@@ -169,6 +175,8 @@ static const struct snd_soc_dapm_widget tegra_machine_dapm_widgets[] = {
SND_SOC_DAPM_LINE("y Line Out", NULL),
SND_SOC_DAPM_LINE("x Line In", NULL),
SND_SOC_DAPM_LINE("y Line In", NULL),
+ SND_SOC_DAPM_LINE("x IN", NULL),
+ SND_SOC_DAPM_LINE("x OUT",NULL),
};
static struct snd_soc_pcm_stream tegra_machine_asrc_link_params[] = {
@@ -335,13 +343,33 @@ static int tegra_machine_dai_init(struct snd_soc_pcm_runtime *runtime,
aud_mclk = machine->audio_clock.set_aud_mclk_rate;
- pr_debug("pll_a_out0 = %u Hz, aud_mclk = %u Hz, sample rate = %u Hz\n",
+ printk("pll_a_out0 = %u Hz, aud_mclk = %u Hz, sample rate = %u Hz\n",
machine->audio_clock.set_pll_out_rate, aud_mclk, srate);
err = tegra_machine_set_params(card, machine, srate, channels, formats);
if (err < 0)
return err;
+ rtd = snd_soc_get_pcm_runtime(card, "es8316-playback"); //wxz
+ if (rtd) {
+ printk("%s===========8316=======es8316-playback=========== %d\n",__func__,__LINE__);
+ dai_params =
+ (struct snd_soc_pcm_stream *)rtd->dai_link->params;
+
+ dai_params->formats = (machine->fmt_via_kcontrol == 2) ?
+ (1ULL << SNDRV_PCM_FORMAT_S32_LE) : formats;
+
+ dai_params->rate_min = srate;
+ //dai_params->channels_min = channels;
+
+ //err = es8316_set_dai_sysclk(rtd->codec_dai, ES8316_SCLK_S_MCLK,aud_mclk, SND_SOC_CLOCK_IN);
+ err = snd_soc_dai_set_sysclk(rtd->codec_dai, ES8316_SCLK_S_MCLK, 12288000,SND_SOC_CLOCK_IN);
+ if (err < 0) {
+ dev_err(card->dev, "codec_dai clock not set\n");
+ return err;
+ }
+ }
+
rtd = snd_soc_get_pcm_runtime(card, "rt565x-playback");
if (rtd) {
dai_params =
@@ -541,6 +569,21 @@ static int tegra_machine_fepi_init(struct snd_soc_pcm_runtime *rtd)
return 0;
}
+static int tegra_machine_es8316_init(struct snd_soc_pcm_runtime *rtd) //wxz
+{
+ struct device *dev = rtd->card->dev;
+ int err;
+
+ //err = es8316_set_dai_sysclk(rtd->codec_dai, ES8316_SCLK_S_MCLK, 11289600,SND_SOC_CLOCK_IN);
+ err = snd_soc_dai_set_sysclk(rtd->codec_dai, ES8316_SCLK_S_MCLK, 12288000,SND_SOC_CLOCK_IN);
+ if (err) {
+ dev_err(dev, "failed to set es8316 sysclk!\n");
+ return err;
+ }
+
+ return 0;
+}
+
static int tegra_machine_rt565x_init(struct snd_soc_pcm_runtime *rtd)
{
struct snd_soc_card *card = rtd->card;
@@ -602,6 +645,8 @@ 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, "es8316-playback")) //wxz
+ dai_links[i].init = tegra_machine_es8316_init;
}
3. dts:
--- a/kernel-dts/common/tegra186-p3636-0001-a00-audio.dtsi
+++ b/kernel-dts/common/tegra186-p3636-0001-a00-audio.dtsi
@@ -21,14 +21,18 @@
#include <audio/tegra-platforms-audio-dai-links.dtsi>
/ {
- hda@3510000 {
+ i2s@2901000 {
status = "okay";
+ bclk-ratio = <4>;
};
+ hda@3510000 {
+ status = "okay";
+ };
tegra_sound: sound {
status = "okay";
compatible = "nvidia,tegra-audio-t186ref-mobile-rt565x";
- nvidia,model = "tegra-snd-t186ref-mobile-rt565x";
+ nvidia,model = "es8316-tegra";
clocks = <&tegra_car TEGRA186_CLK_PLLA>,
<&tegra_car TEGRA186_CLK_PLL_A_OUT0>,
<&tegra_car TEGRA186_CLK_AUD_MCLK>;
@@ -37,16 +41,58 @@
<&tegra_car TEGRA186_CLK_AUD_MCLK>;
assigned-clock-parents = <&tegra_car TEGRA186_CLK_PLLA>,
<&tegra_car TEGRA186_CLK_PLL_A_OUT0>;
+
resets = <&tegra_car TEGRA186_RESET_AUD_MCLK>;
reset-names = "extern1_rst";
mclk-fs = <256>;
+ nvidia,audio-routing =
+ "x Headphone", "x HPOL",
+ "x Headphone", "x HPOR",
+ "x Headphone", "x OUT",
+ "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";
+
+ nvidia,xbar = <&tegra_axbar>;
+
/* TODO Avoid rt565x_dai_link definition by modifying common base file
* since current base does not have definition of dai link as
* rt565x_dai_link, had to add here
*/
- hdr40_snd_link_i2s: rt565x_dai_link: nvidia,dai-link-1 { };
+
+ hdr40_snd_link_i2s: rt565x_dai_link: nvidia,dai-link-1 {
+ link-name = "es8316-playback";
+ cpu-dai = <&tegra_i2s1>;
+ codec-dai = <&es8316_codec>;
+ cpu-dai-name = "I2S1";
+ codec-dai-name = "es8316-hifi";
+ format = "i2s";
+ bitclock-master;
+ frame-master;
+ format = "dsp_a";
+ fsync-width = <0>;
+ bit-format = "s16_le";
+ bclk_ratio = <0>;
+ srate = <48000>;
+ num-channel = <2>;
+ ignore_suspend;
+ name-prefix = "x";
+ status = "okay";
+ };
hdr40_i2c1: i2c@c240000 { };
};
};
diff --git a/kernel-dts/common/tegra186-p3636-0001-common.dtsi b/kernel-dts/common/tegra186-p3636-0001-common.dtsi
index 27009d8..77b753b 100644
--- a/kernel-dts/common/tegra186-p3636-0001-common.dtsi
+++ b/kernel-dts/common/tegra186-p3636-0001-common.dtsi
@@ -36,6 +36,7 @@
#include "tegra186-p3636-0001-a00-comms.dtsi"
#include <dt-bindings/pinctrl/pinctrl-tegra.h>
#include <dt-bindings/gpio/tegra186-gpio.h>
+#include <dt-common/jetson/tegra186-p3509-0000-p3636-0001.h>
#define EXTCON_NONE 0
#define EXTCON_USB 1
@@ -64,6 +65,7 @@
};
serial@c280000 {
+ compatible = "nvidia,tegra186-hsuart";
status = "disabled";
};
@@ -78,19 +80,78 @@
status="okay";
};
+ pinmux@2430000 {
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&hdr40_pinmux>;
+
+ hdr40_pinmux: header-40pin-pinmux {
+ pin7 {
+ nvidia,pins = HDR40_PIN7;
+ nvidia,function = HDR40_CLK;
+ nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+ nvidia,tristate = <TEGRA_PIN_DISABLE>;
+ nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+ };
+
+ pin12 {
+ nvidia,pins = HDR40_PIN12;
+ nvidia,function = HDR40_I2S;
+ nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+ nvidia,tristate = <TEGRA_PIN_DISABLE>;
+ nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+ };
+
+ pin35 {
+ nvidia,pins = HDR40_PIN35;
+ nvidia,function = HDR40_I2S;
+ nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+ nvidia,tristate = <TEGRA_PIN_DISABLE>;
+ nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+ };
+
+ pin38 {
+ nvidia,pins = HDR40_PIN38;
+ nvidia,function = HDR40_I2S;
+ nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+ nvidia,tristate = <TEGRA_PIN_ENABLE>;
+ nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+ };
+
+ pin40 {
+ nvidia,pins = HDR40_PIN40;
+ nvidia,function = HDR40_I2S;
+ nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+ nvidia,tristate = <TEGRA_PIN_DISABLE>;
+ nvidia,enable-input = <TEGRA_PIN_DISABLE>;
+ };
+ };
+
+ };
+
+ clocks {
+ es8316_mclk: es8316_mclk {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <12288000>;
+ clock-output-names = "es8316-mclk";
+ status = "okay";
+ };
+ };
+
norco_mcu: i2c@3160000 {
status="okay";
mcu: mcu@38 {
compatible = "norco,new_mcu";
reg = <0x38>;
};
es8316_codec: es8316@10 {
compatible = "everest,es8316";
reg = <0x10>;
+ clocks = <&tegra_car TEGRA186_CLK_AUD_MCLK>;
+ clock-names = "mclk";
status = "okay";
};
};
-
I2S_ MCK , I2S_ SCK , I2S_ LRCK these pins already have signals :
*Here is the information of codec:
root@nvidia-desktop:~# cat /proc/asound/cards
0 [tegrahdaxnx ]: tegra-hda-xnx - tegra-hda-xnx
tegra-hda-xnx at 0x3518000 irq 66
1 [jetsonxaviernxa]: jetson-xaviernx - jetson-xaviernx-ape
jetson-xaviernx-ape
root@nvidia-desktop:~# sudo cat /sys/kernel/debug/asoc/codecs
tegra186-dspk.1
tegra186-dspk.0
tegra186-asrc
tegra186-arad
tegra210-ope.0
tegra210-mvc.1
tegra210-mvc.0
tegra186-afc.5
tegra186-afc.4
tegra186-afc.3
tegra186-afc.2
tegra186-afc.1
tegra186-afc.0
tegra210-sfc.3
tegra210-sfc.2
tegra210-sfc.1
tegra210-sfc.0
tegra210-mixer
tegra210-adx.3
tegra210-adx.2
tegra210-adx.1
tegra210-adx.0
tegra210-amx.3
tegra210-amx.2
tegra210-amx.1
tegra210-amx.0
tegra210-dmic.3
tegra210-dmic.2
tegra210-dmic.1
tegra210-dmic.0
tegra210-i2s.5
tegra210-i2s.4
tegra210-i2s.3
tegra210-i2s.2
tegra210-i2s.1
tegra210-i2s.0
tegra186-admaif
tegra210-axbar
spdif_dit:spdif-dit.13@d
spdif_dit:spdif-dit.12@c
spdif_dit:spdif-dit.11@b
spdif_dit:spdif-dit.10@a
spdif_dit:spdif-dit.9@9
spdif_dit:spdif-dit.8@8
spdif_dit:spdif-dit.7@7
spdif_dit:spdif-dit.6@6
spdif_dit:spdif-dit.5@5
spdif_dit:spdif-dit.4@4
spdif_dit:spdif-dit.3@3
spdif_dit:spdif-dit.2@2
spdif_dit:spdif-dit.1@1
spdif_dit:spdif-dit.0@0
es8316.1-0010
snd-soc-dummy
- dmesg log:
dmesg.txt (70.7 KB)
amixer -c es8316tegra scontrols
amixer -c es8316tegra controls
amixer -c es8316tegra contents
contents.txt (293.2 KB)
scontrols.txt (48.4 KB)
controls.txt (54.2 KB)
speaker-test -D hw:es8316tegra,0 -c 2 -r 48000 -F S16_LE -t sine -f 500
Use this command to play music without sound , What should I do? We look forward to your help. Thank you very much