[OpenWrt-Devel] Simple Audio Card on MT7688 causes Kernel BUG

Sven Schwermer sven.schwermer at arcor.de
Sat Oct 15 16:12:03 EDT 2016


Hi all,

I am currently trying to get audio output working on a LinkIt Smart
7688 (Mediatek MT7688, MIPS) using a WM8960 codec. I am using the
OpenWrt master branch (kernel 4.4.14). The relevant sections of my
device tree look like this:

/dts-v1/;
#include "mt7628an.dtsi"
/ {
	/* ... */
	sound {
		compatible = "simple-audio-card";
		simple-audio-card,name = "Audio-I2S";
		simple-audio-card,format = "i2s";
		simple-audio-card,bitclock-master = <&dailink0_master>;
		simple-audio-card,frame-master = <&dailink0_master>;
		simple-audio-card,widgets =
			"Headphone", "Headphones";
		simple-audio-card,routing =
			"Headphones", "HP_L",
			"Headphones", "HP_R";
		simple-audio-card,mclk-fs = <256>;

		simple-audio-card,cpu {
			sound-dai = <&i2s>;
		};

		dailink0_master: simple-audio-card,codec {
			sound-dai = <&codec>;
		};
	};
};
&pinctrl {
	/* ... */
	i2s_pins: i2s {
		i2s {
			ralink,group = "i2s";
			ralink,function = "i2s";
		};
	};
	wm8960_mclk_pins: wm8960_mclk {
		wm8960_mclk {
			ralink,group = "refclk";
			ralink,function = "reclk";
		};
	};
};
&i2c {
	compatible = "ralink,rt2880-i2c";
	status = "okay";
	codec: wm8960 at 1a {
		#sound-dai-cells = <0>;
		compatible = "wlf,wm8960";
		reg = <0x1a>;
		wlf,shared-lrclk;
	};
};

&i2s {
	#sound-dai-cells = <0>;
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&i2s_pins>, <&wm8960_mclk_pins>;
};
&gdma {
	status = "okay";
};

I had to manually enable the support for the MT7688 in the I2S driver
by modifying the DEPENDS variable for KernelPackage/sound-mt7620 in
target/linux/ramips/modules.mk. In the kernel configuration I had to
manually enable CONFIG_DMA_RALINK and CONFIG_SND_SIMPLE_CARD.

The drivers seem to be loading fine. The relevant dmesg lines are:
rt2880-pinmux pinctrl: request pin 4 (io4) for 10000900.i2c
rt2880-pinmux pinctrl: request pin 5 (io5) for 10000900.i2c
i2c-ralink 10000900.i2c: clock 100KHz, re-start not support
rt2880-pinmux pinctrl: request pin 0 (io0) for 10000a00.i2s
rt2880-pinmux pinctrl: request pin 1 (io1) for 10000a00.i2s
rt2880-pinmux pinctrl: request pin 2 (io2) for 10000a00.i2s
rt2880-pinmux pinctrl: request pin 3 (io3) for 10000a00.i2s
rt2880-pinmux pinctrl: request pin 36 (io36) for 10000a00.i2s
ralink-i2s 10000a00.i2s: mclk 480KHz
asoc-simple-card sound: wm8960-hifi <-> 10000a00.i2s mapping ok

When running 'alsactl init', I get:
Found hardware: "Audio-I2S" "" "" "" ""
Hardware is initialized using a generic method

However, when trying to play back sounds using madplay, I run into a
kernel BUG with the call trace:
[<871014f0>] snd_pcm_lib_default_mmap+0x30/0x48 [snd_pcm]
[<871015f0>] snd_pcm_mmap_data+0xe8/0xd8c [snd_pcm]

I traced this back to the following statements in dma_mmap_attrs:
struct dma_map_ops *ops = get_dma_ops(dev);
BUG_ON(!ops);

Here, get_dma_ops always returns NULL as CONFIG_SYS_HAS_DMA_OPS is not
defined. Now I am wondering how I could resolve this issue? Any hints
are appreciated!

Thanks, Sven
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list