[alsa-devel] Codec tlv320aic3401 and SoC im6ul (no i2c input/output, aplay hang up)

tmptmp15 tmptmp15 at gmail.com
Thu Dec 27 10:43:25 CET 2018


Hello !

I try make kernel with ALSA drivers for tlv320aic3401. Platform arm / imx6ul.
CPU:   Freescale i.MX6UL rev1.2 528 MHz (running at 396 MHz)

Kernel config:
$grep SND_ .config |grep -v ^#
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_DMAENGINE_PCM=y
CONFIG_SND_HWDEP=y
CONFIG_SND_RAWMIDI=y
CONFIG_SND_COMPRESS_OFFLOAD=y
CONFIG_SND_JACK=y
CONFIG_SND_SUPPORT_OLD_API=y
CONFIG_SND_VERBOSE_PROCFS=y
CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_DEBUG=y
CONFIG_SND_DEBUG_VERBOSE=y
CONFIG_SND_ARM=y
CONFIG_SND_SPI=y
CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
CONFIG_SND_SOC=y
CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
CONFIG_SND_SOC_FSL_ASRC=y
CONFIG_SND_SOC_FSL_SAI=y
CONFIG_SND_SOC_FSL_SSI=y
CONFIG_SND_SOC_FSL_ESAI=y
CONFIG_SND_SOC_IMX_PCM_DMA=y
CONFIG_SND_SOC_IMX_AUDMUX=y
CONFIG_SND_IMX_SOC=y
CONFIG_SND_SOC_IMX_PCM_FIQ=y
CONFIG_SND_SOC_FSL_ASOC_CARD=y
CONFIG_SND_SOC_IMX_TLV320AIC3X=y
CONFIG_SND_SOC_I2C_AND_SPI=y
CONFIG_SND_SOC_TLV320AIC3X=y

$uname -a
Linux myd-y6ul14x14 4.1.15+ #20 SMP PREEMPT Thu Dec 27 16:00:37 +07
2018 armv7l GNU/Linux

dmesg / i2c:

imx-i2c 21a4000.i2c: <i2c_imx_probe>
i2c i2c-1: adapter [21a4000.i2c] registered
i2c i2c-1: of_i2c: walking child nodes
i2c i2c-1: of_i2c: register /soc/aips-bus at 02100000/i2c at 021a4000/tlv320aic3104 at 18
i2c 1-0018: uevent
i2c i2c-1: client [tlv320aic3104] registered with bus id 1-0018
i2c i2c-1: of_i2c: register /soc/aips-bus at 02100000/i2c at 021a4000/rtc at 68
i2c 1-0068: uevent
i2c i2c-1: client [ds1307] registered with bus id 1-0068
i2c i2c-1: claimed irq 228
i2c i2c-1: device resources: [mem 0x021a4000-0x021a7fff]
i2c i2c-1: adapter name: "21a4000.i2c"
i2c i2c-1: IMX I2C adapter registered
i2c i2c-1: can't request DMA tx channel
i2c i2c-1: can't use DMA

I2C physic work fine: i can access to ds1307, and tlv320 may detect
with i2cdetect (if disable tlv320 in DTS).

On console, dmesg / tlv320:
....
of_get_named_gpiod_flags: parsed 'gpio-reset' property of node
'/soc/aips-bus at 02100000/i2c at 021a4000/tlv320aic3104 at 18[0]' - status (0)
aic3x_i2c_probe: model=3
1-0018 supply IOVDD not found, using dummy regulator
1-0018 supply DVDD not found, using dummy regulator
1-0018 supply AVDD not found, using dummy regulator
1-0018 supply DRVDD not found, using dummy regulator
i2c-core: driver [tlv320aic3x-codec] registered
fsl-asrc 2034000.asrc: driver registered
...
tlv320aic3x sound: tlv320aic3x-hifi <-> 202c000.sai mapping ok
...
ALSA device list:
  #0: tlv320-audio-U
....


Device Tree Source:

&i2c2 {
	clock_frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c2>;
	status = "okay";


	codec: tlv320aic3104 at 18 {
		/*   ai3x-micbias-vg = <2>; */
		compatible = "ti,tlv320aic3104";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_gpio_key>;
		reg = <0x18>;
		gpio-reset = <&gpio5 0 GPIO_ACTIVE_LOW>;

		clocks = <&clks IMX6UL_CLK_SAI2>;
		clock-names = "mclk";
/*
		clock-frequency = <19200000>;
*/
		status = "okay";
	};
.....
};

/ {
   .....
	sound {
		compatible = "fsl,imx-audio-tlv320aic3x";
		model = "tlv320-audio-U";
		cpu-dai = <&sai2>;
		audio-codec = <&codec>;
		ssi-controller = <&sai2>;
		mux-int-port = <2>;  /* 1, 2, 7 - SSI */
		mux-ext-port = <5>;  /* 3-6, IOMUX */
		audio-routing =
		    "LINE1L", "Mic Jack",
		    "Headphone Jack", "HPLOUT",
		    "Headphone Jack", "HPROUT",
		    "Mic Jack", "Mic Bias";
	};
  .....
}



Machine driver imx-audio-tlv320aic3x.c not present in kernel sources,
I try some version from Inet. At any case codec driver
sound/soc/codec/tlv320aic3x.c call procedure snd_soc_write() for init
codec registers, but no any messages from i2c for address 0x18 in
dmesg or /var/log/messages. In kernel config i2c debug messages
enable:

CONFIG_I2C_DEBUG_CORE=y
CONFIG_I2C_DEBUG_ALGO=y
CONFIG_I2C_DEBUG_BUS=y

But if I run aplay:

#aplay -vvv x.wav

Playing WAVE 'x.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
Plug PCM: Direct Stream Mixing PCM
Its setup is:
  stream       : PLAYBACK
  access       : RW_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 2
  rate         : 44100
  exact rate   : 44100 (44100/1)
  msbits       : 16
  buffer_size  : 15876
  period_size  : 1764
  period_time  : 40000
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 1764
  period_event : 0
  start_threshold  : 15876
  stop_threshold   : 15876
  silence_threshold: 0
  silence_size : 0
  boundary     : 2080899072
Hardware PCM card 0 'tlv320-audio-U' device 0 subdevice 0
Its setup is:
  stream       : PLAYBACK
  access       : MMAP_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 2
  rate         : 44100
  exact rate   : 44100 (44100/1)
  msbits       : 16
  buffer_size  : 15876
  period_size  : 1764
  period_time  : 40000
  tstamp_mode  : ENABLE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 1764
  period_event : 0
  start_threshold  : 1
  stop_threshold   : 2080899072
  silence_threshold: 0
  silence_size : 2080899072
  boundary     : 2080899072
  appl_ptr     : 0
  hw_ptr       : 0
Max peak (3528 samples): 0x00000000 #                    0%
Max peak (3528 samples): 0x00000285 #                    1%
Max peak (3528 samples): 0x000003dd #                    3%
Max peak (3528 samples): 0x000004b8 #                    3%
Max peak (3528 samples): 0x00001739 ####                 18%
Max peak (3528 samples): 0x0000068d ##                   5%
Max peak (3528 samples): 0x0000058f #                    4%
Max peak (3528 samples): 0x00000534 #                    4%
Max peak (3528 samples): 0x000004a3 #                    3%

Then in /var/log/messages append some messages, like this:
Dec 27 09:29:39 myd-y6ul14x14 user.debug kernel: i2c i2c-1:
master_xfer[0] W, addr=0x18, len=2
and in I2C wire I see some pulses.

And then aplay is locked. :( No pulses at SAI.

Questions:
1) It problem may occur due to my error in DTS ?
2) snd_soc_write() / snd_soc_read() do call direct to i2c or more
complex way ? For what reason can request not always reach i2c?
3) Any advice ?

Thank you!


More information about the Alsa-devel mailing list