[alsa-devel] Help with wm8731 support for the Utilite (imx6q)
Valentin Raevsky
valentin at compulab.co.il
Tue Oct 21 14:06:10 CEST 2014
Hi Jonathan,
See my comments in line.
Moreover, I'd appreciate it if you could try the CompuLab 3.10.17 kernel
on your board in order to rule out a hw problem.
Take the latest 3.10.17 source from here:
https://github.com/utilite-computer/linux-kernel
tag: v3.10.17-cm-fx6-1-beta1
Build instructions:
# export LOADADDR=0x10008000
# make cm_fx6_defconfig
# make zImage modules -j8 CONFIG_DEBUG_SECTION_MISMATCH=y
# make imx6q-sbc-fx6m.dtb
# make imx6q-sbc-fx6.dtb
imx6q-sbc-fx6m.dtb - Utilite
imx6q-sbc-fx6.dtb - Evaluation Board
Regards,
Valentin.
On 10/20/2014 10:59 PM, Jonathan Bennett wrote:
> With those changes:
> [ 8.656319] wm8731 2-001a: simple-card: set_sysclk error
> [ 8.661964] asoc-simple-card sound: ASoC: failed to init
> 202c000.ssi-wm8731-hifi: -22
> [ 8.670067] asoc-simple-card sound: ASoC: failed to instantiate card -22
> [ 8.678063] Bluetooth: vendor=0x2df, device=0x911b, class=255, fn=3
> [ 8.679996] asoc-simple-card: probe of sound failed with error -22
>
>
> Looking at the 3.10 driver file and digging through some documentation,
> it looks like the wm8731 can be used in either slave or master mode.
> According to Compulab's driver, the supplying clocks when the wm8731 is
> in slave mode are pll4 (IMX6QDL_CLK_PLL4_AUDIO) and ssi.1 (IMX6QDL_CLK_SSI2)
These clocks are correct for slave mode.
>
> In master mode, it's IMX6QDL_CLK_CKO and IMX6QDL_CLK_CKO2.
These clocks are correct for master mode, but do not try make it work.
Master mode requires a hw change on the module.
>
> I have not found an actual schematic to see how it is physically wired.
> Popped open the case, and the codec is on the bottom side of the board
> with the cpu on it, 100% unaccessible during operations. Even at that,
> the cpu and codec are bga, so no probing of pins.
>
> Looking at their driver file, I am also wondering if we need to tweak
> the audmux init. I've played with this some in the dts, but hasn't made
> much difference.
>
> On Mon, Oct 20, 2014 at 11:29 AM, Fabio Estevam <festevam at gmail.com
> <mailto:festevam at gmail.com>> wrote:
>
> On Mon, Oct 20, 2014 at 10:06 AM, Fabio Estevam <festevam at gmail.com
> <mailto:festevam at gmail.com>> wrote:
>
> >> clocks = <&clks IMX6QDL_CLK_SSI2>;
> >
> > This 'clocks' entry does not seem correct.
> >
> > IMX6QDL_CLK_SSI2 is the clock from SSI2 module, which is turned on by
> > the ssi driver.
> >
> > Who provides the MCLK for wm8731 on utilite board? Isn't it mx6 CLKO pin?
> >
> > Are you able to monitor this clock with a scope and make sure that it
> > is actually being turned on?
> >
> > We use CLKO output to drive MCLK pins on mx6qdl-sabresd board with
> > wm8762 codec. You can use it as a reference.
> >
> > Adding the Compulab's folks on Cc.
>
> Do the changes below help? (using IMX6QDL_CLK_CKO)
>
> codec: wm8731 at 1a {
> #sound-dai-cells = <0>;
> compatible = "wlf,wm8731";
> reg = <0x1a>;
> AVDD-supply = <®_3p3v>;
> HPVDD-supply = <®_3p3v>;
> DCVDD-supply = <®_3p3v>;
> DBVDD-supply = <®_3p3v>;
> clocks = <&clks IMX6QDL_CLK_CKO>;
>
> with this one applied:
>
> --- a/sound/soc/codecs/wm8731.c
> +++ b/sound/soc/codecs/wm8731.c
> @@ -13,6 +13,7 @@
> * published by the Free Software Foundation.
> */
>
> +#include <linux/clk.h>
> #include <linux/module.h>
> #include <linux/moduleparam.h>
> #include <linux/init.h>
> @@ -46,6 +47,7 @@ struct wm8731_priv {
> struct regmap *regmap;
> struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES];
> const struct snd_pcm_hw_constraint_list *constraints;
> + struct clk *mclk;
> unsigned int sysclk;
> int sysclk_type;
> int playback_fs;
> @@ -742,6 +744,21 @@ static int wm8731_i2c_probe(struct i2c_client *i2c,
> return ret;
> }
>
> + wm8731->mclk = devm_clk_get(&i2c->dev, NULL);
> + if (IS_ERR(wm8731->mclk)) {
> + ret = PTR_ERR(wm8731->mclk);
> + dev_err(&i2c->dev, "Failed to get mclock: %d\n", ret);
> + /* Defer the probe to see if the clk will be provided later */
> + if (ret == -ENOENT)
> + return -EPROBE_DEFER;
> + }
> +
> + if (!IS_ERR(wm8731->mclk)) {
> + ret = clk_prepare_enable(wm8731->mclk);
> + if (ret)
> + return ret;
> + }
> +
> i2c_set_clientdata(i2c, wm8731);
>
> ret = snd_soc_register_codec(&i2c->dev,
>
>
More information about the Alsa-devel
mailing list