ASoC: wm8960: Support shared LRCLK
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 13 Sep 2012 03:46:58 +0000 (11:46 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Wed, 19 Sep 2012 03:23:51 +0000 (23:23 -0400)
If the LRCLK is shared and the WM8960 is clock master then we should
enable the LRCM bit to tell the device that it should drive LRCLK when
either ADC or DAC is enabled rather than separately driving the two
LRCLKs.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
include/sound/wm8960.h
sound/soc/codecs/wm8960.c

index 74e9a95529c502de158e6dd04426548135ad4b60..b5a1ab9ebb4a11af34d8c75de5af565d3e66cbe6 100644 (file)
@@ -19,6 +19,8 @@ struct wm8960_data {
        bool capless;  /* Headphone outputs configured in capless mode */
 
        int dres;  /* Discharge resistance for headphone outputs */
+
+       bool shared_lrclk;  /* DAC and ADC LRCLKs are wired together */
 };
 
 #endif
index 066250e3f7f4a5cad7248bdf9a4d9bfd835078d9..782faa0a3b498e0e937d1fa032402a78644d7ee7 100644 (file)
@@ -1036,6 +1036,7 @@ static const struct regmap_config wm8960_regmap = {
 static __devinit int wm8960_i2c_probe(struct i2c_client *i2c,
                                      const struct i2c_device_id *id)
 {
+       struct wm8960_data *pdata = dev_get_platdata(&i2c->dev);
        struct wm8960_priv *wm8960;
        int ret;
 
@@ -1048,6 +1049,16 @@ static __devinit int wm8960_i2c_probe(struct i2c_client *i2c,
        if (IS_ERR(wm8960->regmap))
                return PTR_ERR(wm8960->regmap);
 
+       if (pdata && pdata->shared_lrclk) {
+               ret = regmap_update_bits(wm8960->regmap, WM8960_ADDCTL2,
+                                        0x4, 0x4);
+               if (ret != 0) {
+                       dev_err(&i2c->dev, "Failed to enable LRCM: %d\n",
+                               ret);
+                       return ret;
+               }
+       }
+
        i2c_set_clientdata(i2c, wm8960);
 
        ret = snd_soc_register_codec(&i2c->dev,