[alsa-devel] Help with wm8731 support for the Utilite (imx6q)

Fabio Estevam festevam at gmail.com
Mon Oct 20 18:29:01 CEST 2014


On Mon, Oct 20, 2014 at 10:06 AM, Fabio Estevam <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 = <&reg_3p3v>;
       HPVDD-supply = <&reg_3p3v>;
       DCVDD-supply = <&reg_3p3v>;
       DBVDD-supply = <&reg_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