On Mon, Oct 20, 2014 at 10:06 AM, Fabio Estevam festevam@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@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,